Skip to content

Commit b9c4efe

Browse files
committed
SEO
1 parent b20e06a commit b9c4efe

10 files changed

Lines changed: 170 additions & 21 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
/public/
2+
SEO_AUDIT.md
3+
/scripts

assets/manifest.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "{{ .Site.Title }}",
3+
"short_name": "{{ .Site.Title }}",
4+
"start_url": "{{ "/" | relURL }}",
5+
"scope": "{{ "/" | relURL }}",
6+
"display": "standalone",
7+
"background_color": "#ffffff",
8+
"theme_color": "#e66a00",
9+
"icons": [
10+
{
11+
"src": "{{ "img/noScribeLogo.png" | relURL }}",
12+
"sizes": "256x256",
13+
"type": "image/png"
14+
}
15+
]
16+
}

config/_default/hugo.toml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ disableKinds = ["taxonomy"]
1616

1717
enableRobotsTXT = false
1818

19+
# English draft content currently lives under content/en.
20+
# Prevent accidental publishing until proper i18n is enabled.
21+
ignoreFiles = ["^en/"]
22+
1923
[sitemap]
2024
changefreq = "weekly"
2125
priority = 0.5
@@ -37,7 +41,12 @@ enableRobotsTXT = false
3741
BookFavicon = "img/noScribeLogo.png"
3842
DefaultLang = "de"
3943
OgImage = "img/graphic_sw.png"
40-
siteDescription = "Privacy-first, offline transcription for interviews and research."
44+
siteDescription = "Offizielle Website der Open-Source-Transkriptionssoftware noScribe – lokal, datenschutzfreundlich, ohne Cloud."
45+
authorName = "Dr. Kai Dröge"
46+
authorUrl = "https://github.com/kaixxx"
47+
authorSameAs = ["https://github.com/kaixxx"]
48+
codeRepository = "https://github.com/kaixxx/noScribe"
49+
licenseUrl = "https://www.gnu.org/licenses/gpl-3.0.html"
4150

4251
[languages]
4352
[languages.de]

content/_index.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
---
22
title: "noScribe – Interviews mit KI transkribieren"
3-
description: "Datenschutzfreundliche und kostenlose Open-Source-Software für qualitative Sozialforschung, Journalismus und alle anderen, die mit sensiblen Audiodaten zu tun haben."
3+
description: "Offizielle Projektseite der Open-Source-Transkriptionssoftware noScribe (GPL-3.0) – lokal, datenschutzfreundlich, ohne Cloud."
44
bookToC: true
55
---
66

77
# noScribe – Interviews mit KI transkribieren
88

9-
Dies ist die offizielle Webseite der Open-Source-Software noScribe ([GitHub](https://github.com/kaixxx/noScribe)).
9+
Dies ist die offizielle Projektseite der Open-Source-Software noScribe ([GitHub](https://github.com/kaixxx/noScribe)). noScribe ist eine Desktop-App zur Transkription von Interviews und anderen sensiblen Audiodaten – datenschutzfreundlich, ohne Cloud, mit hochwertigen lokalen KI-Modellen.
1010

1111
{{% hint warning %}}
1212
Achtung: Jemand versucht über die Domain noscribe(punkt)ai kostenpflichtige Transkriptionsdienste zu verkaufen. Ich habe damit nichts zu tun. Das echte noScribe ist kostenlos und wird es immer bleiben :)
@@ -21,9 +21,9 @@ Achtung: Jemand versucht über die Domain noscribe(punkt)ai kostenpflichtige Tra
2121
- verfügbar für **Windows, macOS und Linux**
2222
- **Komfortabler Editor** zur Prüfung und Korrektur der Transkripte
2323

24-
Ursprünglich vor allem für die qualitative Sozialforschung entwickelt, wird noScribe heute überall dort eingesetzt, wo wir es mit besonders sensiblen Audiodaten zu tun haben - im Journalismus, in der Medizin, bei Unternehmen, Behörden und NGOs. NoScribe wird von [Universitäten](https://sozmethode.hypotheses.org/2315) und [Hochschulen](https://kbss.site.phbern.ch/db/noscribe) empfohlen, vom [Computermagazin c't](https://www.heise.de/select/ct/2025/2/2433207582191637980), sowie in [Fachpublikationen für Journalist:innen](https://www.journalistin.at/singlenews/uid-968002/nie-wieder-abtippen-profitipps-zum-transkribieren-mit-ki/).
24+
Ursprünglich vor allem für die qualitative Sozialforschung entwickelt, wird noScribe heute überall dort eingesetzt, wo wir es mit besonders schützenswerten Audiodaten zu tun haben - im Journalismus, in der Medizin, bei Unternehmen, Behörden und NGOs. NoScribe wird von [Universitäten](https://sozmethode.hypotheses.org/2315) und [Hochschulen](https://kbss.site.phbern.ch/db/noscribe) empfohlen, vom [Computermagazin c't](https://www.heise.de/select/ct/2025/2/2433207582191637980), sowie in [Fachpublikationen für Journalist:innen](https://www.journalistin.at/singlenews/uid-968002/nie-wieder-abtippen-profitipps-zum-transkribieren-mit-ki/).
2525

26-
{{< img src="img/noScribe_main_window.png" alt="noScribe Hauptfenster" >}}
26+
{{< img src="img/noScribe_main_window.png" alt="noScribe Hauptfenster" loading="eager" fetchpriority="high" >}}
2727
(Der Screenshot zeigt ein [Interview mit der exilrussischen Soziologin Natalia Savelyeva](https://www.youtube.com/watch?v=vOwajAbvPzQ&t=2018s), das ich im Mai 2022 geführt habe.)
2828

2929
## Wie nutze ich noScribe?
@@ -69,7 +69,7 @@ Viele andere Personen haben zu noScribe beigetragen. Mein besonderer Dank gilt P
6969

7070
NoScribe ist kostenlos und wird es auch immer bleiben. Aber die Entwicklung verursacht reale Ausgaben, etwa für diese Webseite, für Testhardware oder eine Apple-Entwicklungslizenz. Wenn Sie das Projekt unterstützen möchten:
7171

72-
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/noscribe)
72+
[![ko-fi](/img/kofi.svg)](https://ko-fi.com/noscribe)
7373

7474
## Warum der Name „noScribe“?
7575

content/en/_index.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
title: "noScribe"
33
description: "Open-source transcription for interviews and research — local, privacy-first, no cloud."
44
bookToC: false
5+
draft: true
6+
cascade:
7+
draft: true
58
---
69

710
# noScribe

layouts/_partials/docs/html-head.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@
33
{{ "-->" | safeHTML }}
44

55
{{- $description := or .Params.description .Description .Summary .Site.Params.siteDescription | plainify | htmlUnescape -}}
6+
{{- $author := .Site.Params.authorName -}}
67

78
<meta charset="UTF-8">
89
<meta name="viewport" content="width=device-width, initial-scale=1.0">
910
<meta name="description" content="{{ $description }}">
11+
{{- if $author }}
12+
<meta name="author" content="{{ $author }}">
13+
{{- end }}
14+
{{- if .Params.noindex -}}
15+
<meta name="robots" content="noindex, nofollow">
16+
{{- else -}}
17+
<meta name="robots" content="index, follow">
18+
{{- end }}
1019
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#ffffff">
1120
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#343a40">
1221
<meta name="color-scheme" content="light dark">
@@ -25,7 +34,7 @@
2534
<link rel="manifest" href="{{ $manifest.RelPermalink }}">
2635
<link rel="canonical" href="{{ .Permalink }}">
2736

28-
{{- $translations := .AllTranslations | append . -}}
37+
{{- $translations := .Translations | append . -}}
2938
{{- range $translations -}}
3039
<link rel="alternate" hreflang="{{ default .Site.LanguageCode .Language.Lang }}" href="{{ .Permalink }}" title="{{ partial "docs/title" . }}">
3140
{{- end -}}

layouts/_partials/opengraph.html

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
{{- $title := partial "docs/html-head-title" . -}}
22
{{- $description := or .Params.description .Description .Summary .Site.Params.siteDescription | plainify | htmlUnescape -}}
33
{{- $url := .Permalink -}}
4-
{{- $image := "" -}}
4+
{{- $imagePath := "" -}}
55
{{- with .Params.image -}}
6-
{{- $image = . | absURL -}}
6+
{{- $imagePath = . -}}
77
{{- else -}}
88
{{- with .Site.Params.OgImage -}}
9-
{{- $image = . | absURL -}}
9+
{{- $imagePath = . -}}
10+
{{- end -}}
11+
{{- end -}}
12+
{{- $image := "" -}}
13+
{{- if $imagePath -}}
14+
{{- $image = $imagePath | absURL -}}
15+
{{- end -}}
16+
{{- $imageWidth := "" -}}
17+
{{- $imageHeight := "" -}}
18+
{{- if and $imagePath (not (urls.Parse $imagePath).Host) -}}
19+
{{- $staticPath := printf "static/%s" (strings.TrimPrefix "/" $imagePath) -}}
20+
{{- if fileExists $staticPath -}}
21+
{{- $imgConfig := imageConfig $staticPath -}}
22+
{{- $imageWidth = $imgConfig.Width -}}
23+
{{- $imageHeight = $imgConfig.Height -}}
1024
{{- end -}}
1125
{{- end -}}
1226

@@ -15,13 +29,21 @@
1529
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
1630
<meta property="og:url" content="{{ $url }}">
1731
<meta property="og:site_name" content="{{ .Site.Title }}">
32+
<meta property="og:locale" content="{{ or .Site.Language.LanguageCode .Site.Language.Lang }}">
33+
{{- $translations := .Translations -}}
34+
{{- range $translations -}}
35+
<meta property="og:locale:alternate" content="{{ or .Language.LanguageCode .Language.Lang }}">
36+
{{- end -}}
1837
{{- if $image -}}
1938
<meta property="og:image" content="{{ $image }}">
39+
{{- with $imageWidth }}<meta property="og:image:width" content="{{ . }}">{{- end }}
40+
{{- with $imageHeight }}<meta property="og:image:height" content="{{ . }}">{{- end }}
2041
{{- end }}
2142

22-
<meta name="twitter:card" content="summary">
43+
<meta name="twitter:card" content="{{ if $image }}summary_large_image{{ else }}summary{{ end }}">
2344
<meta name="twitter:title" content="{{ $title }}">
2445
<meta name="twitter:description" content="{{ $description }}">
46+
<meta name="twitter:url" content="{{ $url }}">
2547
{{- if $image -}}
2648
<meta name="twitter:image" content="{{ $image }}">
2749
{{- end }}

layouts/_partials/schema.html

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,73 @@
1-
{{- $description := or .Params.description .Site.Params.siteDescription | plainify | htmlUnescape -}}
2-
{{- $data := dict
3-
"@context" "https://schema.org"
1+
{{- $siteUrl := strings.TrimSuffix "/" .Site.BaseURL -}}
2+
{{- $pageUrl := .Permalink -}}
3+
{{- $title := partial "docs/html-head-title" . -}}
4+
{{- $description := or .Params.description .Description .Summary .Site.Params.siteDescription | plainify | htmlUnescape -}}
5+
{{- $inLanguage := or .Site.Language.LanguageCode .Site.Language.Lang -}}
6+
{{- $authorName := .Site.Params.authorName | default "Kai Dröge" -}}
7+
{{- $authorUrl := .Site.Params.authorUrl -}}
8+
{{- $authorSameAs := .Site.Params.authorSameAs -}}
9+
{{- $codeRepository := .Site.Params.codeRepository -}}
10+
{{- $licenseUrl := .Site.Params.licenseUrl -}}
11+
12+
{{- $personId := printf "%s/#person" $siteUrl -}}
13+
{{- $websiteId := printf "%s/#website" $siteUrl -}}
14+
{{- $softwareId := printf "%s/#software" $siteUrl -}}
15+
{{- $webpageId := printf "%s/#webpage" (strings.TrimSuffix "/" $pageUrl) -}}
16+
17+
{{- $person := dict "@type" "Person" "@id" $personId "name" $authorName -}}
18+
{{- with $authorUrl -}}
19+
{{- $person = merge $person (dict "url" .) -}}
20+
{{- end -}}
21+
{{- if $authorSameAs -}}
22+
{{- $person = merge $person (dict "sameAs" $authorSameAs) -}}
23+
{{- end -}}
24+
25+
{{- $website := dict
26+
"@type" "WebSite"
27+
"@id" $websiteId
28+
"url" $siteUrl
29+
"name" .Site.Title
30+
"publisher" (dict "@id" $personId)
31+
"inLanguage" $inLanguage
32+
-}}
33+
34+
{{- $webpage := dict
35+
"@type" "WebPage"
36+
"@id" $webpageId
37+
"url" $pageUrl
38+
"name" $title
39+
"isPartOf" (dict "@id" $websiteId)
40+
"inLanguage" $inLanguage
41+
-}}
42+
{{- if .IsHome -}}
43+
{{- $webpage = merge $webpage (dict "mainEntity" (dict "@id" $softwareId)) -}}
44+
{{- end -}}
45+
46+
{{- $software := dict
447
"@type" "SoftwareApplication"
48+
"@id" $softwareId
549
"name" "noScribe"
650
"description" $description
751
"applicationCategory" "MultimediaApplication"
852
"operatingSystem" (slice "Windows" "macOS" "Linux")
953
"offers" (dict "@type" "Offer" "price" "0" "priceCurrency" "EUR" "availability" "https://schema.org/InStock")
10-
"license" "GPL-3.0"
1154
"isAccessibleForFree" true
12-
"codeRepository" "https://github.com/kaixxx/noScribe"
13-
"author" (dict "@type" "Person" "name" "Kai Dröge" "url" "https://github.com/kaixxx")
14-
"sameAs" (slice "https://github.com/kaixxx")
15-
"url" .Site.BaseURL
16-
"inLanguage" (or .Site.Language.LanguageCode .Site.Language.Lang)
55+
"author" (dict "@id" $personId)
56+
"publisher" (dict "@id" $personId)
57+
"url" $siteUrl
58+
"inLanguage" $inLanguage
1759
-}}
18-
<script type="application/ld+json">{{ $data | jsonify }}</script>
60+
{{- with $codeRepository -}}
61+
{{- $software = merge $software (dict "codeRepository" .) -}}
62+
{{- end -}}
63+
{{- with $licenseUrl -}}
64+
{{- $software = merge $software (dict "license" .) -}}
65+
{{- end -}}
66+
67+
{{- $graph := slice $person $website $webpage -}}
68+
{{- if .IsHome -}}
69+
{{- $graph = $graph | append $software -}}
70+
{{- end -}}
71+
{{- $data := dict "@context" "https://schema.org" "@graph" $graph -}}
72+
{{- $json := $data | jsonify (dict "noHTMLEscape" true) -}}
73+
<script type="application/ld+json">{{ $json | safeJS }}</script>

layouts/shortcodes/img.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,27 @@
66
{{- $width := .Get "width" -}}
77
{{- $height := .Get "height" -}}
88
{{- $loading := .Get "loading" -}}
9+
{{- $decoding := .Get "decoding" | default "async" -}}
10+
{{- $fetchpriority := .Get "fetchpriority" -}}
11+
12+
{{- if not $loading -}}
13+
{{- $loading = "lazy" -}}
14+
{{- end -}}
15+
16+
{{- $staticPath := printf "static/%s" (strings.TrimPrefix "/" $src) -}}
17+
{{- if and (not $width) (not $height) (fileExists $staticPath) -}}
18+
{{- $imgConfig := imageConfig $staticPath -}}
19+
{{- $width = $imgConfig.Width -}}
20+
{{- $height = $imgConfig.Height -}}
21+
{{- end -}}
22+
923
<img src="{{ $src | relURL }}" alt="{{ $alt }}"
1024
{{- with $title }} title="{{ . }}"{{- end }}
1125
{{- with $class }} class="{{ . }}"{{- end }}
1226
{{- with $style }} style="{{ . | safeCSS }}"{{- end }}
1327
{{- with $width }} width="{{ . }}"{{- end }}
1428
{{- with $height }} height="{{ . }}"{{- end }}
1529
{{- with $loading }} loading="{{ . }}"{{- end }}
30+
{{- with $decoding }} decoding="{{ . }}"{{- end }}
31+
{{- with $fetchpriority }} fetchpriority="{{ . }}"{{- end }}
1632
/>

0 commit comments

Comments
 (0)