Compare commits

...
3 Commits
Author SHA1 Message Date
lucashahmann 3af888cfa4 Graphyfy
Deploy Hugo Site / deploy (push) Canceled after 0s
2026-10-30 16:57:19 +01:00
lucashahmann a07b8be38a SEO
Deploy Hugo Site / deploy (push) Canceled after 0s
2026-10-30 16:45:29 +01:00
lucashahmann 36a73f6b63 SEO 2026-10-30 16:45:28 +01:00
66 changed files with 1066 additions and 7 deletions

No files matched your search

+2 -1
View File
@@ -5,7 +5,8 @@ Punkrock-Band aus Trier. Hugo-Seite, Deutsch, deployt mit `deploy.ps1`.
## Website
- Inhalte: `content/` (Startseite `_index.md`, Band `about.md`, Musik `music/_index.md`)
- Shows: eine Datei pro Show in `content/shows/` (`title`, `date`, `location`, `poster`; `tba: true` für noch unbekannte Termine)
- Shows: eine Datei pro Show in `content/shows/` (`title`, `date`, `location`, `poster`; `tba: true` für noch unbekannte Termine; optional `city` und `address` für die Event-Daten bei Google, nur bestätigte Adressen)
- SEO: JSON-LD in `layouts/partials/schema.html` (Band auf der Startseite, kommende Shows auf `/shows/`), eigene Sitemap ohne Show-Einzelseiten in `layouts/_default/sitemap.xml`
- Release-Cover: `releases/JJJJMMTT_[Single|Album]_[Name].jpg`. Titel und Datum kommen aus dem Dateinamen.
- Design: `assets/css/main.css`. Farben `--deep #081226`, `--bolt #fff200` (Blitz-Gelb), `--red #e5232b`; Schriften Big Shoulders Display (Überschriften) und Archivo (Text), liegen in `static/fonts/`.
- Links und E-Mail stehen in `hugo.toml` unter `[params]`.
@@ -3,4 +3,5 @@ title: "Pink Future"
date: 2024-06-07
location: Palastgarten Trier
poster: /img/shows/2024_Pink_Future.jpeg
aliases: ["/shows/2024_pink_future-copy/"]
---
+7
View File
@@ -0,0 +1,7 @@
---
title: "Halloween Rock"
date: 2026-10-31
location: Gutweiler
poster: /img/shows/2026_Halloween.jpeg
aliases: ["/shows/2026_haloween/"]
---
-6
View File
@@ -1,6 +0,0 @@
---
title: "Halloween Rock"
date: 2026-10-31
location: Gutweiler
poster: /img/shows/2026_Haloween.jpeg
---
+12
View File
@@ -0,0 +1,12 @@
{
"excludes": [
"themes/",
"themes/**",
"*.jpg",
"*.jpeg",
"*.png",
"*.gif",
"*.svg",
"*.pdf"
]
}
+1
View File
@@ -0,0 +1 @@
{"0": "Templates & Design", "1": "Band, EPK & Regeln", "2": "Gitea Deploy Workflow", "3": "Datenschutz & Impressum", "4": "Show-Schema & Mosel-Gigs", "5": "Shows ↔ EPK Sync", "6": "Pink Future & Skatehalle", "7": "Trierer Umland-Shows", "8": "Rock im Gehege", "9": "Tefftival", "10": "Album Release Party", "11": "Riez Kapellen-Contest", "12": "Altstadtfest Trier", "13": "Halloween Rock", "14": "Deploy-Skript", "15": "Spotify Loader (site.js)", "16": "EPK PDF Build"}
+1
View File
@@ -0,0 +1 @@
C:\Program Files\Python312\python.exe
+1
View File
@@ -0,0 +1 @@
D:\code\www-deepwatersurvival-de
+135
View File
@@ -0,0 +1,135 @@
# Graph Report - www-deepwatersurvival-de (2026-10-30)
## Corpus Check
- Corpus is ~8,291 words - fits in a single context window. You may not need a graph.
## Summary
- 132 nodes · 189 edges · 17 communities (10 shown, 7 thin omitted)
- Extraction: 62% EXTRACTED · 37% INFERRED · 1% AMBIGUOUS · INFERRED: 70 edges (avg confidence: 0.91)
- Token cost: 219,106 input · 0 output
## Community Hubs (Navigation)
- Templates & Design
- Band, EPK & Regeln
- Gitea Deploy Workflow
- Datenschutz & Impressum
- Show-Schema & Mosel-Gigs
- Shows ↔ EPK Sync
- Pink Future & Skatehalle
- Trierer Umland-Shows
- Rock im Gehege
- Tefftival
- Album Release Party
- Riez Kapellen-Contest
- Altstadtfest Trier
- Halloween Rock
## God Nodes (most connected - your core abstractions)
1. `Show Front Matter Schema (title, date, location, poster, tba)` - 19 edges
2. `Shows Section Index` - 18 edges
3. `Base Template (baseof.html)` - 12 edges
4. `epk.html EPK Template` - 10 edges
5. `CLAUDE.md Project Guide (Website & EPK)` - 7 edges
6. `EPK Page 3: Band & Musik (Members, Ocean Tales, 5 Singles)` - 7 edges
7. `Music Page Layout (featured album, discography)` - 7 edges
8. `site.Params (email, spotify, instagram, youtube, photographer)` - 7 edges
9. `[params] links, email, Spotify/Instagram/YouTube` - 6 edges
10. `EPK Page 4: Live & Kontakt (Nächste/Bisherige Shows, Booking)` - 6 edges
## Surprising Connections (you probably didn't know these)
- `Spotify Player Click-to-Load (no data before consent)` --conceptually_related_to--> `[params] links, email, Spotify/Instagram/YouTube` [INFERRED]
content/Datenschutz.md → hugo.toml
- `Single: I'm So Glad (2023)` --conceptually_related_to--> `Singles: Chirus, Let It Go, Addiction, My Own Home` [AMBIGUOUS]
epk/epk.html → content/_index.md
- `Default Content Archetype (draft, date, title from filename)` --conceptually_related_to--> `Show Front Matter Schema (title, date, location, poster, tba)` [INFERRED]
archetypes/default.md → content/shows/2026_Tefftival.md
- `EPK Page 3: Band & Musik (Members, Ocean Tales, 5 Singles)` --implements--> `Release Cover Naming Convention (JJJJMMTT_[Single|Album]_[Name].jpg)` [INFERRED]
epk/epk.html → CLAUDE.md
- `Photo Credit Rule (Lukas Ittenbach @shot__itt always credited)` --rationale_for--> `EPK Page 4: Live & Kontakt (Nächste/Bisherige Shows, Booking)` [INFERRED]
CLAUDE.md → epk/epk.html
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **Upcoming shows after 2026-10-30 (EPK 'Nächste Shows')** — content_shows_2026_halloween_show, content_shows_2026_tefftival_show, content_shows__index_shows [INFERRED 0.75]
- **Shows in the city of Trier** — content_shows_2022_jukufe_light_show, content_shows_2023_pink_future_show, content_shows_2024_pink_future_show, content_shows_2025_album_release_party_show, content_shows_2026_altstadtfest_trier_show, content_shows_2026_luke_show [INFERRED 0.75]
- **Website content manually mirrored into EPK** — claude_epk_manual_sync, content__index_band_bio, content_about_members, content_music__index_music_page, epk_epk_document [INFERRED 0.85]
- **EPK four A4 pages** — epk_epk_cover_page, epk_epk_bio_page, epk_epk_band_music_page, epk_epk_live_contact_page [EXTRACTED 1.00]
- **Privacy-conscious site choices (local fonts, click-to-load Spotify, DSGVO)** — content_datenschutz_local_fonts, content_datenschutz_spotify_click_to_load, content_datenschutz_dsgvo_rights, content_datenschutz_hosting_1blu [INFERRED 0.75]
- **Show listing rendering (home, shows page, card, JSON-LD events)** — layouts_index, layouts_shows_list, layouts_partials_show_card, layouts_partials_schema_musicevent [INFERRED 0.85]
- **Release cover filename parsing feeding music page and album schema** — layouts_partials_releases, layouts_partials_releases_filename_convention, layouts_music_list, layouts_partials_schema_musicgroup [EXTRACTED 1.00]
- **SEO layer (meta tags, JSON-LD, robots, show redirects)** — layouts__default_baseof_seo_meta, layouts_partials_schema, layouts_robots, layouts_shows_single [INFERRED 0.75]
## Communities (17 total, 7 thin omitted)
### Community 0 - "Templates & Design"
Cohesion: 0.11
Nodes (27): Main Stylesheet (main.css), Album Sleeve Vinyl Slide-Out Effect, Design Tokens (--deep, --bolt, --red, fonts, --slant), Flyer Wall (tilted posters with gaffa tape), 404 Page Template (Abgesoffen), Band Page Layout (members, group photo, crew), Crew Section (photographer portrait / initials fallback), Base Template (baseof.html) (+19 more)
### Community 1 - "Band, EPK & Regeln"
Cohesion: 0.13
Nodes (22): Deepwater Survival (Punkrock-Band aus Trier), EPK (Electronic Press Kit, 4 A4 pages), epk/build.ps1 (PDF build), Hugo Website (deutsch, deploy.ps1), CLAUDE.md Project Guide (Website & EPK), Band Bio Text (Identität, Zugehörigkeit, Abschied, Neuanfang), Home Page Content (Punk mit Haltung), Ocean Tales (Debütalbum 2025) (+14 more)
### Community 2 - "Gitea Deploy Workflow"
Cohesion: 0.11
Nodes (17): image, container, env, runs-on, steps, http_proxy, https_proxy, no_proxy (+9 more)
### Community 3 - "Datenschutz & Impressum"
Cohesion: 0.22
Nodes (7): Design System (--deep, --bolt, --red; Big Shoulders Display + Archivo), DSGVO Betroffenenrechte und Rechtsgrundlagen, Externes Hosting bei 1blu GmbH, Datenschutzerklärung, Disclaimer (Inhalte, externe Links, Urheberrecht, Nutzungsbedingungen), Impressum (Lucas Hahmann, Trier), EPK CSS Tokens (:root --deep, --bolt, --red, fonts)
### Community 4 - "Show-Schema & Mosel-Gigs"
Cohesion: 0.25
Nodes (8): Default Content Archetype (draft, date, title from filename), Moselrock, Wasserliesch, Salmtal, Bullenhitze, Kell, Highway to Kell, Show Front Matter Schema (title, date, location, poster, tba)
### Community 5 - "Shows ↔ EPK Sync"
Cohesion: 0.38
Nodes (5): SEO: JSON-LD schema partial and custom sitemap, EPK Page 1: Cover (Roh, laut und ehrlich; 15+ Shows), EPK Page 4: Live & Kontakt (Nächste/Bisherige Shows, Booking), Show History 2022-2026 (15 shows, e.g. Tefftival Tufa, Moselrock, Altstadtfest), Upcoming Shows (31.10.2026 Halloween Rock Gutweiler; 23.12.2026 TBA)
### Community 6 - "Pink Future & Skatehalle"
Cohesion: 0.29
Nodes (7): JUKUFE Light, Skatehalle Trier, Pink Future (recurring), Pink Future 2023, Skatehalle Trier West, Palastgarten Trier, Pink Future 2024
### Community 7 - "Trierer Umland-Shows"
Cohesion: 0.29
Nodes (7): Haus der Jugend Konz, Konz wird Laut, Butzweiler, Rock für Ruanda, Lucky´s Luke, Trier, Shows Section Index
### Community 8 - "Rock im Gehege"
Cohesion: 0.67
Nodes (4): Piesbach, Rock im Gehege (recurring), Rock im Gehege 2022, Rock im Gehege 2024
### Community 9 - "Tefftival"
Cohesion: 0.50
Nodes (4): Tefftival 2022, Tefftival (recurring, Dec 23), Tufa, Tefftival 2026 (TBA)
## Ambiguous Edges - Review These
- `Singles: Chirus, Let It Go, Addiction, My Own Home` → `Single: I'm So Glad (2023)` [AMBIGUOUS]
epk/epk.html · relation: conceptually_related_to
## Knowledge Gaps
- **27 isolated node(s):** `Default Content Archetype (draft, date, title from filename)`, `Haus der Jugend Konz`, `Tufa`, `Wasserliesch`, `Palastgarten Trier` (+22 more)
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 45 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
- **7 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `Show Front Matter Schema (title, date, location, poster, tba)` connect `Show-Schema & Mosel-Gigs` to `Pink Future & Skatehalle`, `Trierer Umland-Shows`, `Rock im Gehege`, `Tefftival`, `Album Release Party`, `Riez Kapellen-Contest`, `Altstadtfest Trier`, `Halloween Rock`?**
_High betweenness centrality (0.037) - this node is a cross-community bridge._
- **Are the 18 inferred relationships involving `Show Front Matter Schema (title, date, location, poster, tba)` (e.g. with `Default Content Archetype (draft, date, title from filename)` and `JUKUFE Light`) actually correct?**
_`Show Front Matter Schema (title, date, location, poster, tba)` has 18 INFERRED edges - model-reasoned connections that need verification._
- **What connects `Default Content Archetype (draft, date, title from filename)`, `Haus der Jugend Konz`, `Tufa` to the rest of the system?**
_27 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Templates & Design` be split into smaller, more focused modules?**
_Cohesion score 0.10837438423645321 - nodes in this community are weakly interconnected._
- **Why does `epk.html EPK Template` connect `Band, EPK & Regeln` to `Datenschutz & Impressum`, `Shows ↔ EPK Sync`?**
_High betweenness centrality (0.036) - this node is a cross-community bridge._
- **Are the 18 inferred relationships involving `Shows Section Index` (e.g. with `JUKUFE Light` and `Konz wird Laut`) actually correct?**
_`Shows Section Index` has 18 INFERRED edges - model-reasoned connections that need verification._
### Low-confidence Hints
_AMBIGUOUS edges — the extractor was unsure. Verify before acting on these._
- **What is the exact relationship between `Singles: Chirus, Let It Go, Addiction, My Own Home` and `Single: I'm So Glad (2023)`?**
_Edge tagged AMBIGUOUS (relation: conceptually_related_to) - confidence is low._
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_deploy_ps1", "label": "deploy.ps1", "file_type": "code", "source_file": "deploy.ps1", "source_location": "L1"}, {"id": "$graphify-root$_deploy_assert_ok", "label": "Assert-Ok()", "file_type": "code", "source_file": "deploy.ps1", "source_location": "L21"}], "edges": [{"source": "$graphify-root$_deploy_ps1", "target": "$graphify-root$_deploy_assert_ok", "relation": "contains", "confidence": "EXTRACTED", "source_file": "deploy.ps1", "source_location": "L21", "weight": 1.0}, {"source": "$graphify-root$_deploy_ps1", "target": "$graphify-root$_deploy_assert_ok", "relation": "calls", "confidence": "EXTRACTED", "source_file": "deploy.ps1", "source_location": "L33", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Set-Location", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L19"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Join-Path", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L25"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Test-Path", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L26"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L31"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "hugo", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L32"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L35"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Join-Path", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L36"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L39"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Get-Item", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L39"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L42"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Get-Date", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L46"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L50"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "scp", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L51"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L54"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "ssh", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L59"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Remove-Item", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L62"}, {"caller_nid": "$graphify-root$_deploy_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "deploy.ps1", "source_location": "L63"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_epk_build_ps1", "label": "build.ps1", "file_type": "code", "source_file": "epk/build.ps1", "source_location": "L1"}], "edges": [], "raw_calls": [{"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Set-Location", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L6"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Where-Object", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L11"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Test-Path", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L11"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Select-Object", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L11"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Resolve-Path", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L14"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Join-Path", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L15"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Test-Path", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L16"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Remove-Item", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L16"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Start-Process", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L19"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Test-Path", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L24"}, {"caller_nid": "$graphify-root$_epk_build_ps1", "callee": "Write-Host", "is_member_call": false, "source_file": "epk/build.ps1", "source_location": "L26"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_gitea_workflows_deploy_yml", "label": "deploy.yml", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L1"}, {"id": "$graphify-root$_gitea_workflows_deploy_name", "label": "name", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L1"}, {"id": "$graphify-root$_gitea_workflows_deploy_on", "label": "on", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L3"}, {"id": "$graphify-root$_gitea_workflows_deploy_on_push", "label": "push", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L4"}, {"id": "$graphify-root$_gitea_workflows_deploy_push_branches", "label": "branches", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L5"}, {"id": "$graphify-root$_gitea_workflows_deploy_jobs", "label": "jobs", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L8"}, {"id": "$graphify-root$_gitea_workflows_deploy_jobs_deploy", "label": "deploy", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L9"}, {"id": "$graphify-root$_gitea_workflows_deploy_deploy_runs_on", "label": "runs-on", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L10"}, {"id": "$graphify-root$_gitea_workflows_deploy_deploy_container", "label": "container", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L11"}, {"id": "$graphify-root$_gitea_workflows_deploy_container_image", "label": "image", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L12"}, {"id": "$graphify-root$_gitea_workflows_deploy_deploy_env", "label": "env", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L14"}, {"id": "$graphify-root$_gitea_workflows_deploy_env_http_proxy", "label": "http_proxy", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L15"}, {"id": "$graphify-root$_gitea_workflows_deploy_env_https_proxy", "label": "https_proxy", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L16"}, {"id": "$graphify-root$_gitea_workflows_deploy_env_no_proxy", "label": "no_proxy", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L17"}, {"id": "$graphify-root$_gitea_workflows_deploy_deploy_steps", "label": "steps", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L19"}, {"id": "$graphify-root$_gitea_workflows_deploy_steps_name", "label": "name", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L20"}, {"id": "$graphify-root$_gitea_workflows_deploy_steps_uses", "label": "uses", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L21"}, {"id": "$graphify-root$_gitea_workflows_deploy_steps_run", "label": "run", "file_type": "code", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L24"}], "edges": [{"source": "$graphify-root$_gitea_workflows_deploy_yml", "target": "$graphify-root$_gitea_workflows_deploy_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_yml", "target": "$graphify-root$_gitea_workflows_deploy_on", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L3", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_on", "target": "$graphify-root$_gitea_workflows_deploy_on_push", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L4", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_on_push", "target": "$graphify-root$_gitea_workflows_deploy_push_branches", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_yml", "target": "$graphify-root$_gitea_workflows_deploy_jobs", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L8", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_jobs", "target": "$graphify-root$_gitea_workflows_deploy_jobs_deploy", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L9", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_jobs_deploy", "target": "$graphify-root$_gitea_workflows_deploy_deploy_runs_on", "relation": "contains", "confidence": "EXTRACTED", "source_file": ".gitea/workflows/deploy.yml", "source_location": "L10", "weight": 1.0}, {"source": "$graphify-root$_gitea_workflows_deploy_jobs_deploy", "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_index", "label": "Homepage Template (hero, intro, live, booking)", "file_type": "code", "source_file": "layouts/index.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_index", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/index.html", "source_location": "L1", "weight": 1.0}, {"source": "layouts_index", "target": "layouts_partials_img", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/index.html", "source_location": "L8", "weight": 1.0}, {"source": "layouts_index", "target": "layouts_partials_show_card", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/index.html", "source_location": "L39", "weight": 1.0}, {"source": "layouts_index", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/index.html", "source_location": "L42", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "epk_epk_document", "label": "epk.html EPK Template", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_css_tokens", "label": "EPK CSS Tokens (:root --deep, --bolt, --red, fonts)", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L13", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_cover_page", "label": "EPK Page 1: Cover (Roh, laut und ehrlich; 15+ Shows)", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L267", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_bio_page", "label": "EPK Page 2: Bio (Punk mit Haltung, Facts)", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L289", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_band_music_page", "label": "EPK Page 3: Band & Musik (Members, Ocean Tales, 5 Singles)", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L320", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_live_contact_page", "label": "EPK Page 4: Live & Kontakt (N\u00e4chste/Bisherige Shows, Booking)", "file_type": "code", "source_file": "epk/epk.html", "source_location": "L353", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_show_history", "label": "Show History 2022-2026 (15 shows, e.g. Tefftival Tufa, Moselrock, Altstadtfest)", "file_type": "concept", "source_file": "epk/epk.html", "source_location": "L369", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_upcoming_shows", "label": "Upcoming Shows (31.10.2026 Halloween Rock Gutweiler; 23.12.2026 TBA)", "file_type": "concept", "source_file": "epk/epk.html", "source_location": "L360", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "epk_epk_single_im_so_glad", "label": "Single: I'm So Glad (2023)", "file_type": "concept", "source_file": "epk/epk.html", "source_location": "L345", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "epk_epk_document", "target": "epk_epk_css_tokens", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L13", "weight": 1.0}, {"source": "epk_epk_document", "target": "epk_epk_cover_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L267", "weight": 1.0}, {"source": "epk_epk_document", "target": "epk_epk_bio_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L289", "weight": 1.0}, {"source": "epk_epk_document", "target": "epk_epk_band_music_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L320", "weight": 1.0}, {"source": "epk_epk_document", "target": "epk_epk_live_contact_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L353", "weight": 1.0}, {"source": "epk_epk_live_contact_page", "target": "epk_epk_show_history", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L369", "weight": 1.0}, {"source": "epk_epk_live_contact_page", "target": "epk_epk_upcoming_shows", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L360", "weight": 1.0}, {"source": "epk_epk_band_music_page", "target": "content__index_ocean_tales", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L332", "weight": 1.0}, {"source": "epk_epk_band_music_page", "target": "content__index_singles", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L341", "weight": 1.0}, {"source": "epk_epk_band_music_page", "target": "epk_epk_single_im_so_glad", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html", "source_location": "L345", "weight": 1.0}, {"source": "epk_epk_band_music_page", "target": "claude_release_cover_naming", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "epk/epk.html", "source_location": "L332", "weight": 1.0}, {"source": "epk_epk_cover_page", "target": "epk_epk_show_history", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "epk/epk.html", "source_location": "L283", "weight": 1.0}, {"source"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2022_jukufe_light_show", "label": "JUKUFE Light", "file_type": "document", "source_file": "content/shows/2022_Jukufe_light.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2022-08-22", "location": "Skatehalle Trier"}, {"id": "content_shows_2022_jukufe_light_skatehalle_trier", "label": "Skatehalle Trier", "file_type": "concept", "source_file": "content/shows/2022_Jukufe_light.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2022_jukufe_light_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Jukufe_light.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_jukufe_light_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Jukufe_light.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_jukufe_light_show", "target": "content_shows_2022_jukufe_light_skatehalle_trier", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Jukufe_light.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts__default_list", "label": "Default List Layout", "file_type": "code", "source_file": "layouts/_default/list.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts__default_list", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/_default/list.html", "source_location": "L1", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2022_konz_wird_laut_show", "label": "Konz wird Laut", "file_type": "document", "source_file": "content/shows/2022_Konz_wird_laut.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2022-07-09", "location": "Haus der Jugend Konz"}, {"id": "content_shows_2022_konz_wird_laut_haus_der_jugend_konz", "label": "Haus der Jugend Konz", "file_type": "concept", "source_file": "content/shows/2022_Konz_wird_laut.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2022_konz_wird_laut_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Konz_wird_laut.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_konz_wird_laut_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Konz_wird_laut.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_konz_wird_laut_show", "target": "content_shows_2022_konz_wird_laut_haus_der_jugend_konz", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Konz_wird_laut.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2025_bullenhitze_show", "label": "Bullenhitze", "file_type": "document", "source_file": "content/shows/2025_Bullenhitze.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2025-08-30", "location": "Salmtal"}, {"id": "content_shows_2025_bullenhitze_salmtal", "label": "Salmtal", "file_type": "concept", "source_file": "content/shows/2025_Bullenhitze.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2025_bullenhitze_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Bullenhitze.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_bullenhitze_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Bullenhitze.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_bullenhitze_show", "target": "content_shows_2025_bullenhitze_salmtal", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2025_Bullenhitze.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2023_pink_future_show", "label": "Pink Future 2023", "file_type": "document", "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2023-09-15", "location": "Skatehalle Trier West"}, {"id": "content_shows_2023_pink_future_skatehalle_trier_west", "label": "Skatehalle Trier West", "file_type": "concept", "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_shows_2023_pink_future_pink_future_series", "label": "Pink Future (recurring)", "file_type": "concept", "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2023_pink_future_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_pink_future_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_pink_future_show", "target": "content_shows_2023_pink_future_skatehalle_trier_west", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_pink_future_show", "target": "content_shows_2023_pink_future_pink_future_series", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_pink_future_skatehalle_trier_west", "target": "content_shows_2022_jukufe_light_skatehalle_trier", "relation": "semantically_similar_to", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/2023_Pink_Future.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2025_riez_kapellenkontest_show", "label": "Riez Kapellen-Contest", "file_type": "document", "source_file": "content/shows/2025_Riez_Kapellenkontest.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2025-02-01", "location": "Riez Rockbar, Bausendorf"}, {"id": "content_shows_2025_riez_kapellenkontest_riez_rockbar_bausendorf", "label": "Riez Rockbar, Bausendorf", "file_type": "concept", "source_file": "content/shows/2025_Riez_Kapellenkontest.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2025_riez_kapellenkontest_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Riez_Kapellenkontest.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_riez_kapellenkontest_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Riez_Kapellenkontest.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_riez_kapellenkontest_show", "target": "content_shows_2025_riez_kapellenkontest_riez_rockbar_bausendorf", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2025_Riez_Kapellenkontest.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows__index_shows", "label": "Shows Section Index", "file_type": "document", "source_file": "content/shows/_index.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "description": "Kommende Konzerte und alle bisherigen Shows von Deepwater Survival."}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "content/shows/_index.md", "source_location": null, "weight": 1.0}], "hyperedges": [{"id": "upcoming_shows_2026", "label": "Upcoming shows after 2026-10-30 (EPK 'N\u00e4chste Shows')", "nodes": ["content_shows_2026_halloween_show", "content_shows_2026_tefftival_show", "content_shows__index_shows"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/_index.md"}, {"id": "trier_city_shows", "label": "Shows in the city of Trier", "nodes": ["content_shows_2022_jukufe_light_show", "content_shows_2023_pink_future_show", "content_shows_2024_pink_future_show", "content_shows_2025_album_release_party_show", "content_shows_2026_altstadtfest_trier_show", "content_shows_2026_luke_show"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/_index.md"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_music__index_music_page", "label": "Music Page (Musik)", "file_type": "document", "source_file": "content/music/_index.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_music__index_music_page", "target": "content__index_ocean_tales", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/music/_index.md", "source_location": "L3", "weight": 1.0}, {"source": "content_music__index_music_page", "target": "content__index_singles", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/music/_index.md", "source_location": "L4", "weight": 1.0}, {"source": "content_music__index_music_page", "target": "epk_epk_band_music_page", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/music/_index.md", "source_location": "L4", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts__default_single", "label": "Default Single Layout (legal prose)", "file_type": "code", "source_file": "layouts/_default/single.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts__default_single", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/_default/single.html", "source_location": "L1", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_releases", "label": "Releases Partial (parse cover filenames)", "file_type": "code", "source_file": "layouts/partials/releases.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts_partials_releases_filename_convention", "label": "Release Filename Convention JJJJMMTT_Kind_Name.jpg", "file_type": "concept", "source_file": "layouts/partials/releases.html", "source_location": "L1-4", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_partials_releases_filename_convention", "target": "layouts_partials_releases", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/releases.html", "source_location": "L1-4", "weight": 1.0}], "hyperedges": [{"id": "release_data_pipeline", "label": "Release cover filename parsing feeding music page and album schema", "nodes": ["layouts_partials_releases", "layouts_partials_releases_filename_convention", "layouts_music_list", "layouts_partials_schema_musicgroup"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/releases.html"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2022_tefftival_show", "label": "Tefftival 2022", "file_type": "document", "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2022-12-23", "location": "Tufa"}, {"id": "content_shows_2022_tefftival_tufa", "label": "Tufa", "file_type": "concept", "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_shows_2022_tefftival_tefftival_series", "label": "Tefftival (recurring, Dec 23)", "file_type": "concept", "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2022_tefftival_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_tefftival_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_tefftival_show", "target": "content_shows_2022_tefftival_tufa", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_tefftival_show", "target": "content_shows_2022_tefftival_tefftival_series", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Tefftival.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_music_list", "label": "Music Page Layout (featured album, discography)", "file_type": "code", "source_file": "layouts/music/list.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts_music_list_featured_release", "label": "Featured Release Selection (newest album, else newest release)", "file_type": "rationale", "source_file": "layouts/music/list.html", "source_location": "L3-5", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_music_list", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/music/list.html", "source_location": "L1", "weight": 1.0}, {"source": "layouts_music_list", "target": "layouts_partials_releases", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/music/list.html", "source_location": "L2", "weight": 1.0}, {"source": "layouts_music_list", "target": "layouts_partials_img", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/music/list.html", "source_location": "L17", "weight": 1.0}, {"source": "layouts_music_list", "target": "layouts_partials_spotify", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/music/list.html", "source_location": "L50", "weight": 1.0}, {"source": "layouts_music_list_featured_release", "target": "layouts_music_list", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/music/list.html", "source_location": "L3", "weight": 1.0}, {"source": "layouts_music_list", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/music/list.html", "source_location": "L24", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_about_band_page", "label": "Band Page (about.md)", "file_type": "document", "source_file": "content/about.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_about_members", "label": "Band Members (Olly, Lucas, Ahrens, Felix)", "file_type": "concept", "source_file": "content/about.md", "source_location": "L6", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_about_crew_lukas_ittenbach", "label": "Crew: Lukas Ittenbach (Video und Fotografie)", "file_type": "concept", "source_file": "content/about.md", "source_location": "L20", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_about_band_page", "target": "content_about_members", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/about.md", "source_location": "L6", "weight": 1.0}, {"source": "content_about_band_page", "target": "content_about_crew_lukas_ittenbach", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/about.md", "source_location": "L20", "weight": 1.0}, {"source": "content_about_members", "target": "epk_epk_band_music_page", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/about.md", "source_location": "L6", "weight": 1.0}, {"source": "content_about_members", "target": "claude_deepwater_survival", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/about.md", "source_location": "L27", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2024_pink_future_show", "label": "Pink Future 2024", "file_type": "document", "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2024-06-07", "location": "Palastgarten Trier"}, {"id": "content_shows_2024_pink_future_palastgarten_trier", "label": "Palastgarten Trier", "file_type": "concept", "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2024_pink_future_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_pink_future_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_pink_future_show", "target": "content_shows_2024_pink_future_palastgarten_trier", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_pink_future_show", "target": "content_shows_2023_pink_future_pink_future_series", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2024_Pink_Future.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_header", "label": "Header Partial (logo, main nav with aria-current)", "file_type": "code", "source_file": "layouts/partials/header.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2026_tefftival_show_front_matter_schema", "label": "Show Front Matter Schema (title, date, location, poster, tba)", "file_type": "concept", "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "rationale": "date is mandatory and used for sorting; title optional (fallback 'Neue Show'); location optional (fallback 'Ort folgt'); tba:true marks unannounced shows"}, {"id": "content_shows_2026_tefftival_show", "label": "Tefftival 2026 (TBA)", "file_type": "document", "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2026-12-23", "location": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_tefftival_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_tefftival_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_tefftival_show", "target": "content_shows_2022_tefftival_tefftival_series", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_tefftival_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2026_Tefftival.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts__default_band", "label": "Band Page Layout (members, group photo, crew)", "file_type": "code", "source_file": "layouts/_default/band.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts__default_band_crew_section", "label": "Crew Section (photographer portrait / initials fallback)", "file_type": "code", "source_file": "layouts/_default/band.html", "source_location": "L27-47", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts__default_band", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/_default/band.html", "source_location": "L1", "weight": 1.0}, {"source": "layouts__default_band", "target": "layouts_partials_img", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/band.html", "source_location": "L12", "weight": 1.0}, {"source": "layouts__default_band_crew_section", "target": "layouts__default_band", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/band.html", "source_location": "L27-47", "weight": 1.0}, {"source": "layouts__default_band_crew_section", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/band.html", "source_location": "L43", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2022_rock_im_gehege_show", "label": "Rock im Gehege 2022", "file_type": "document", "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2022-07-22", "location": "Piesbach"}, {"id": "content_shows_2022_rock_im_gehege_piesbach", "label": "Piesbach", "file_type": "concept", "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_shows_2022_rock_im_gehege_rock_im_gehege_series", "label": "Rock im Gehege (recurring)", "file_type": "concept", "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2022_rock_im_gehege_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_rock_im_gehege_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_rock_im_gehege_show", "target": "content_shows_2022_rock_im_gehege_piesbach", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2022_rock_im_gehege_show", "target": "content_shows_2022_rock_im_gehege_rock_im_gehege_series", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2022_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2026_halloween_show", "label": "Halloween Rock", "file_type": "document", "source_file": "content/shows/2026_Halloween.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2026-10-31", "location": "Gutweiler"}, {"id": "content_shows_2026_halloween_gutweiler", "label": "Gutweiler", "file_type": "concept", "source_file": "content/shows/2026_Halloween.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_halloween_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Halloween.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_halloween_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Halloween.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_halloween_show", "target": "content_shows_2026_halloween_gutweiler", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2026_Halloween.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_shows_single", "label": "Show Single Redirect (noindex, redirect to /shows/)", "file_type": "code", "source_file": "layouts/shows/single.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_shows_single", "target": "layouts_shows_list", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/shows/single.html", "source_location": "L7-8", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2026_luke_show", "label": "Lucky\u00b4s Luke", "file_type": "document", "source_file": "content/shows/2026_Luke.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2026-05-30", "location": "Trier"}, {"id": "content_shows_2026_luke_trier", "label": "Trier", "file_type": "concept", "source_file": "content/shows/2026_Luke.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_luke_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Luke.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_luke_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Luke.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_luke_show", "target": "content_shows_2026_luke_trier", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2026_Luke.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "claude_project_guide", "label": "CLAUDE.md Project Guide (Website & EPK)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_deepwater_survival", "label": "Deepwater Survival (Punkrock-Band aus Trier)", "file_type": "concept", "source_file": "CLAUDE.md", "source_location": "L3", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_hugo_website", "label": "Hugo Website (deutsch, deploy.ps1)", "file_type": "concept", "source_file": "CLAUDE.md", "source_location": "L3", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_shows_content_model", "label": "Shows Content Model (one file per show, tba, city/address)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L8", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_seo_jsonld_sitemap", "label": "SEO: JSON-LD schema partial and custom sitemap", "file_type": "concept", "source_file": "CLAUDE.md", "source_location": "L9", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_release_cover_naming", "label": "Release Cover Naming Convention (JJJJMMTT_[Single|Album]_[Name].jpg)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L10", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_design_system", "label": "Design System (--deep, --bolt, --red; Big Shoulders Display + Archivo)", "file_type": "concept", "source_file": "CLAUDE.md", "source_location": "L11", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_epk", "label": "EPK (Electronic Press Kit, 4 A4 pages)", "file_type": "concept", "source_file": "CLAUDE.md", "source_location": "L14", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_epk_manual_sync", "label": "EPK Manual Sync Rule (keep epk.html in step with website)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L19", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_fixed_a4_overflow", "label": "Fixed A4 Page with overflow:hidden (check PDF for clipping)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L20", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_no_invented_facts", "label": "No Invented Facts Policy (only band-confirmed claims)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L21", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_photo_credit_rule", "label": "Photo Credit Rule (Lukas Ittenbach @shot__itt always credited)", "file_type": "rationale", "source_file": "CLAUDE.md", "source_location": "L22", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claude_epk_build_script", "label": "epk/build.ps1 (PDF build)", "file_type": "code", "source_file": "CLAUDE.md", "source_location": "L17", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "claude_project_guide", "target": "claude_hugo_website", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L3", "weight": 1.0}, {"source": "claude_project_guide", "target": "claude_epk", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L14", "weight": 1.0}, {"source": "claude_hugo_website", "target": "claude_deepwater_survival", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L3", "weight": 1.0}, {"source": "claude_project_guide", "target": "content__index_home", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L7", "weight": 1.0}, {"source": "claude_project_guide", "target": "content_about_band_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L7", "weight": 1.0}, {"source": "claude_project_guide", "target": "content_music__index_music_page", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L7", "weight": 1.0}, {"source": "claude_project_guide", "target": "epk_epk_document", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L16", "weight": 1.0}, {"source": "claude_epk_build_script", "target": "epk_epk_document", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "sLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2026_highway_to_kell_show", "label": "Highway to Kell", "file_type": "document", "source_file": "content/shows/2026_Highway_to_Kell.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2026-07-24", "location": "Kell"}, {"id": "content_shows_2026_highway_to_kell_kell", "label": "Kell", "file_type": "concept", "source_file": "content/shows/2026_Highway_to_Kell.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_highway_to_kell_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Highway_to_Kell.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_highway_to_kell_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Highway_to_Kell.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_highway_to_kell_show", "target": "content_shows_2026_highway_to_kell_kell", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2026_Highway_to_Kell.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2025_album_release_party_show", "label": "Album Release Party", "file_type": "document", "source_file": "content/shows/2025_Album_Release_Party.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2025-07-18", "location": "Rothaus Trier"}, {"id": "content_shows_2025_album_release_party_rothaus_trier", "label": "Rothaus Trier", "file_type": "concept", "source_file": "content/shows/2025_Album_Release_Party.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2025_album_release_party_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Album_Release_Party.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_album_release_party_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2025_Album_Release_Party.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2025_album_release_party_show", "target": "content_shows_2025_album_release_party_rothaus_trier", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2025_Album_Release_Party.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content__index_home", "label": "Home Page Content (Punk mit Haltung)", "file_type": "document", "source_file": "content/_index.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content__index_band_bio", "label": "Band Bio Text (Identit\u00e4t, Zugeh\u00f6rigkeit, Abschied, Neuanfang)", "file_type": "concept", "source_file": "content/_index.md", "source_location": "L6", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content__index_ocean_tales", "label": "Ocean Tales (Deb\u00fctalbum 2025)", "file_type": "concept", "source_file": "content/_index.md", "source_location": "L8", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content__index_singles", "label": "Singles: Chirus, Let It Go, Addiction, My Own Home", "file_type": "concept", "source_file": "content/_index.md", "source_location": "L8", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content__index_home", "target": "content__index_band_bio", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/_index.md", "source_location": "L6", "weight": 1.0}, {"source": "content__index_band_bio", "target": "content__index_ocean_tales", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/_index.md", "source_location": "L8", "weight": 1.0}, {"source": "content__index_band_bio", "target": "content__index_singles", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/_index.md", "source_location": "L8", "weight": 1.0}, {"source": "content__index_singles", "target": "content__index_ocean_tales", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/_index.md", "source_location": "L8", "weight": 1.0}, {"source": "content__index_band_bio", "target": "epk_epk_bio_page", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/_index.md", "source_location": "L6", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "archetypes_default_archetype", "label": "Default Content Archetype (draft, date, title from filename)", "file_type": "code", "source_file": "archetypes/default.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "archetypes_default_archetype", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.65, "source_file": "archetypes/default.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts__default_baseof", "label": "Base Template (baseof.html)", "file_type": "code", "source_file": "layouts/_default/baseof.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts__default_baseof_seo_meta", "label": "SEO / Open Graph Meta Tags", "file_type": "code", "source_file": "layouts/_default/baseof.html", "source_location": "L6-20", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts__default_baseof", "target": "layouts_partials_header", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/baseof.html", "source_location": "L30", "weight": 1.0}, {"source": "layouts__default_baseof", "target": "layouts_partials_footer", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/baseof.html", "source_location": "L34", "weight": 1.0}, {"source": "layouts__default_baseof", "target": "layouts_partials_schema", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/baseof.html", "source_location": "L26", "weight": 1.0}, {"source": "layouts__default_baseof_seo_meta", "target": "layouts__default_baseof", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/_default/baseof.html", "source_location": "L6-20", "weight": 1.0}, {"source": "layouts__default_baseof_seo_meta", "target": "layouts_partials_schema", "relation": "semantically_similar_to", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "layouts/_default/baseof.html", "source_location": "L6-26", "weight": 1.0}], "hyperedges": [{"id": "seo_layer", "label": "SEO layer (meta tags, JSON-LD, robots, show redirects)", "nodes": ["layouts__default_baseof_seo_meta", "layouts_partials_schema", "layouts_robots", "layouts_shows_single"], "relation": "form", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "layouts/_default/baseof.html"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2026_altstadtfest_trier_show", "label": "Altstadtfest Trier", "file_type": "document", "source_file": "content/shows/2026_Altstadtfest_Trier.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2026-06-28", "location": "Hauptmarkt B\u00fchne"}, {"id": "content_shows_2026_altstadtfest_trier_hauptmarkt_b\u00fchne", "label": "Hauptmarkt B\u00fchne", "file_type": "concept", "source_file": "content/shows/2026_Altstadtfest_Trier.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2026_altstadtfest_trier_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Altstadtfest_Trier.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_altstadtfest_trier_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2026_Altstadtfest_Trier.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2026_altstadtfest_trier_show", "target": "content_shows_2026_altstadtfest_trier_hauptmarkt_b\u00fchne", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2026_Altstadtfest_Trier.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_robots", "label": "robots.txt Template", "file_type": "code", "source_file": "layouts/robots.txt", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_robots", "target": "layouts__default_baseof_seo_meta", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.65, "source_file": "layouts/robots.txt", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_schema", "label": "JSON-LD Schema Partial", "file_type": "code", "source_file": "layouts/partials/schema.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts_partials_schema_musicgroup", "label": "MusicGroup JSON-LD (band, members, albums)", "file_type": "concept", "source_file": "layouts/partials/schema.html", "source_location": "L8-39", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "layouts_partials_schema_musicevent", "label": "MusicEvent JSON-LD (upcoming non-TBA shows)", "file_type": "concept", "source_file": "layouts/partials/schema.html", "source_location": "L41-64", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_partials_schema", "target": "layouts_partials_releases", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/schema.html", "source_location": "L31", "weight": 1.0}, {"source": "layouts_partials_schema_musicgroup", "target": "layouts_partials_schema", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/schema.html", "source_location": "L8-39", "weight": 1.0}, {"source": "layouts_partials_schema_musicevent", "target": "layouts_partials_schema", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/schema.html", "source_location": "L41-64", "weight": 1.0}, {"source": "layouts_partials_schema_musicevent", "target": "layouts_partials_schema_musicgroup", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/schema.html", "source_location": "L54", "weight": 1.0}, {"source": "layouts_partials_schema_musicgroup", "target": "layouts__default_band", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/partials/schema.html", "source_location": "L23", "weight": 1.0}, {"source": "layouts_partials_schema_musicevent", "target": "layouts_shows_list", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "layouts/partials/schema.html", "source_location": "L41-43", "weight": 1.0}, {"source": "layouts_partials_schema", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/schema.html", "source_location": "L13-18", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_spotify", "label": "Spotify Consent Embed Partial (click-to-load)", "file_type": "code", "source_file": "layouts/partials/spotify.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_partials_spotify", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/spotify.html", "source_location": "L1", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_show_card", "label": "Show Card Partial (flyer / TBA poster)", "file_type": "code", "source_file": "layouts/partials/show-card.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_partials_show_card", "target": "layouts_partials_img", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/show-card.html", "source_location": "L14", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_shows_list", "label": "Shows List Layout (upcoming + archive by year)", "file_type": "code", "source_file": "layouts/shows/list.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_shows_list", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/shows/list.html", "source_location": "L1", "weight": 1.0}, {"source": "layouts_shows_list", "target": "layouts_partials_show_card", "relation": "calls", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/shows/list.html", "source_location": "L14", "weight": 1.0}, {"source": "layouts_shows_list", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/shows/list.html", "source_location": "L17", "weight": 1.0}], "hyperedges": [{"id": "show_rendering_flow", "label": "Show listing rendering (home, shows page, card, JSON-LD events)", "nodes": ["layouts_index", "layouts_shows_list", "layouts_partials_show_card", "layouts_partials_schema_musicevent"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "layouts/shows/list.html"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_impressum_page", "label": "Impressum (Lucas Hahmann, Trier)", "file_type": "document", "source_file": "content/Impressum.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_impressum_disclaimer", "label": "Disclaimer (Inhalte, externe Links, Urheberrecht, Nutzungsbedingungen)", "file_type": "concept", "source_file": "content/Impressum.md", "source_location": "L16", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_impressum_page", "target": "content_impressum_disclaimer", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/Impressum.md", "source_location": "L16", "weight": 1.0}, {"source": "content_impressum_page", "target": "content_datenschutz_page", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "content/Impressum.md", "source_location": "L8", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2024_rock_fuer_ruanda_show", "label": "Rock f\u00fcr Ruanda", "file_type": "document", "source_file": "content/shows/2024_Rock_fuer_Ruanda.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2024-07-22", "location": "Butzweiler"}, {"id": "content_shows_2024_rock_fuer_ruanda_butzweiler", "label": "Butzweiler", "file_type": "concept", "source_file": "content/shows/2024_Rock_fuer_Ruanda.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2024_rock_fuer_ruanda_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Rock_fuer_Ruanda.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_rock_fuer_ruanda_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Rock_fuer_Ruanda.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_rock_fuer_ruanda_show", "target": "content_shows_2024_rock_fuer_ruanda_butzweiler", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2024_Rock_fuer_Ruanda.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_datenschutz_page", "label": "Datenschutzerkl\u00e4rung", "file_type": "document", "source_file": "content/Datenschutz.md", "source_location": "L1", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_datenschutz_hosting_1blu", "label": "Externes Hosting bei 1blu GmbH", "file_type": "concept", "source_file": "content/Datenschutz.md", "source_location": "L31", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_datenschutz_local_fonts", "label": "Lokal gehostete Schriftarten (keine Google-Verbindung)", "file_type": "rationale", "source_file": "content/Datenschutz.md", "source_location": "L138", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_datenschutz_spotify_click_to_load", "label": "Spotify Player Click-to-Load (no data before consent)", "file_type": "rationale", "source_file": "content/Datenschutz.md", "source_location": "L141", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "content_datenschutz_dsgvo_rights", "label": "DSGVO Betroffenenrechte und Rechtsgrundlagen", "file_type": "concept", "source_file": "content/Datenschutz.md", "source_location": "L73", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_datenschutz_page", "target": "content_datenschutz_hosting_1blu", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/Datenschutz.md", "source_location": "L44", "weight": 1.0}, {"source": "content_datenschutz_page", "target": "content_datenschutz_local_fonts", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/Datenschutz.md", "source_location": "L138", "weight": 1.0}, {"source": "content_datenschutz_page", "target": "content_datenschutz_spotify_click_to_load", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/Datenschutz.md", "source_location": "L141", "weight": 1.0}, {"source": "content_datenschutz_page", "target": "content_datenschutz_dsgvo_rights", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/Datenschutz.md", "source_location": "L73", "weight": 1.0}, {"source": "content_datenschutz_local_fonts", "target": "claude_design_system", "relation": "rationale_for", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "content/Datenschutz.md", "source_location": "L139", "weight": 1.0}], "hyperedges": [{"id": "privacy_by_design_choices", "label": "Privacy-conscious site choices (local fonts, click-to-load Spotify, DSGVO)", "nodes": ["content_datenschutz_local_fonts", "content_datenschutz_spotify_click_to_load", "content_datenschutz_dsgvo_rights", "content_datenschutz_hosting_1blu"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/Datenschutz.md"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2023_moselrock_show", "label": "Moselrock", "file_type": "document", "source_file": "content/shows/2023_Moselrock.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2023-05-27", "location": "Wasserliesch"}, {"id": "content_shows_2023_moselrock_wasserliesch", "label": "Wasserliesch", "file_type": "concept", "source_file": "content/shows/2023_Moselrock.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2023_moselrock_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2023_Moselrock.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_moselrock_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2023_Moselrock.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2023_moselrock_show", "target": "content_shows_2023_moselrock_wasserliesch", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2023_Moselrock.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_404", "label": "404 Page Template (Abgesoffen)", "file_type": "code", "source_file": "layouts/404.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_404", "target": "layouts__default_baseof", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "layouts/404.html", "source_location": "L1", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_footer", "label": "Footer Partial (contact, social, photographer credit)", "file_type": "code", "source_file": "layouts/partials/footer.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "site_params", "label": "site.Params (email, spotify, instagram, youtube, photographer)", "file_type": "concept", "source_file": "layouts/partials/footer.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "layouts_partials_footer", "target": "site_params", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/footer.html", "source_location": "L5-15", "weight": 1.0}], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "layouts_partials_img", "label": "Responsive Image Partial (WebP srcset)", "file_type": "code", "source_file": "layouts/partials/img.html", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [], "hyperedges": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "content_shows_2024_rock_im_gehege_show", "label": "Rock im Gehege 2024", "file_type": "document", "source_file": "content/shows/2024_Rock_im_Gehege.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null, "date": "2024-12-11", "location": "Piesbach"}], "edges": [{"source": "content_shows__index_shows", "target": "content_shows_2024_rock_im_gehege_show", "relation": "references", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_rock_im_gehege_show", "target": "content_shows_2026_tefftival_show_front_matter_schema", "relation": "implements", "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "content/shows/2024_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_rock_im_gehege_show", "target": "content_shows_2022_rock_im_gehege_piesbach", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2024_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}, {"source": "content_shows_2024_rock_im_gehege_show", "target": "content_shows_2022_rock_im_gehege_rock_im_gehege_series", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "content/shows/2024_Rock_im_Gehege.md", "source_location": null, "weight": 1.0}], "hyperedges": []}
+1
View File
@@ -0,0 +1 @@
{".gitea/workflows/deploy.yml":{"size":1458,"mtime_ns":1792436508111369300,"indexed_at_ns":1793375385815978900,"word_count":129,"hashes":{".gitea/workflows/deploy.yml":"ed68d03614efce04be3bf55ba1e50b25ad79fb649ceca637fc4158fa0080df2a"}},"CLAUDE.md":{"size":1894,"mtime_ns":1793374882185068300,"indexed_at_ns":1793375386047068900,"word_count":248,"hashes":{"claude.md":"a007e39e610ee7e90f8086a1fc118f38027bb8e1e63a6e3f18e8a3f729a2de74"}},"archetypes/default.md":{"size":109,"mtime_ns":1779119062703551900,"indexed_at_ns":1793375386056320800,"word_count":21,"hashes":{"archetypes/default.md":"ad9cd1c0edd793a660ce78ee6129c748171fa3b6592ad9f25ed61eac81f30a29"}},"assets/js/site.js":{"size":717,"mtime_ns":1792428051347229000,"indexed_at_ns":1793375349820849300,"word_count":55},"content/Datenschutz.md":{"size":20501,"mtime_ns":1792427965125507300,"indexed_at_ns":1793375386058828200,"word_count":2652,"hashes":{"content/datenschutz.md":"ddb1ed36c1e59f7c77ab773dbbadb04628353ff37b7d1f7f219f69a5c4afc747"}},"content/Impressum.md":{"size":3050,"mtime_ns":1792427965124507000,"indexed_at_ns":1793375386060832800,"word_count":378,"hashes":{"content/impressum.md":"cbc0ca707890d890b7a23ffd6ad68bed4c2ec6e14fce478c4d134c7c55d3f11e"}},"content/_index.md":{"size":968,"mtime_ns":1792427946806149100,"indexed_at_ns":1793375386062829000,"word_count":135,"hashes":{"content/_index.md":"a9641b981c8177894357d1199d68fb1131076b23e7c04687db55f8ee0af8dc74"}},"content/about.md":{"size":886,"mtime_ns":1792438093690571400,"indexed_at_ns":1793375386064828200,"word_count":97,"hashes":{"content/about.md":"5e8459a4f345d974cbd460e54ac0b9429a6ca6207ff7c6cd1d33907c7475030e"}},"content/music/_index.md":{"size":299,"mtime_ns":1792437673297200200,"indexed_at_ns":1793375386066829100,"word_count":41,"hashes":{"content/music/_index.md":"3f300eca0e04e9c20b9d757385677d12e53b744224a3171ad8a67f372081d674"}},"content/shows/2022_Jukufe_light.md":{"size":130,"mtime_ns":1779119062706614200,"indexed_at_ns":1793375386069337000,"word_count":12,"hashes":{"content/shows/2022_jukufe_light.md":"1f2ec8f4bf35d894b35b69931ca5c9b8f4c344de4b9b255bc280d31f134349de"}},"content/shows/2022_Konz_wird_laut.md":{"size":138,"mtime_ns":1779119062707613700,"indexed_at_ns":1793375386071336800,"word_count":15,"hashes":{"content/shows/2022_konz_wird_laut.md":"2ed990a95efdd8caf9400f29fcce267ad43a8254af84edc3bf1ef17de9684607"}},"content/shows/2022_Rock_im_Gehege.md":{"size":126,"mtime_ns":1779119062707613700,"indexed_at_ns":1793375386073337600,"word_count":12,"hashes":{"content/shows/2022_rock_im_gehege.md":"7e3d0ae5d3b6d6d3ce461bceef1192743bb26099fd00e918b54e8498d22a1466"}},"content/shows/2022_Tefftival.md":{"size":112,"mtime_ns":1779119062707613700,"indexed_at_ns":1793375386075337000,"word_count":10,"hashes":{"content/shows/2022_tefftival.md":"4fc7b90a2cfd813e6b653e81b82208e07d7c226579d666ee74f07c9e092b856d"}},"content/shows/2023_Moselrock.md":{"size":120,"mtime_ns":1779119062707613700,"indexed_at_ns":1793375386076336700,"word_count":10,"hashes":{"content/shows/2023_moselrock.md":"e280dddce737cc1826c3b120534b0a298edf1a61076e2dbe2ecf9e5a81a1899f"}},"content/shows/2023_Pink_Future.md":{"size":129,"mtime_ns":1792427947035097000,"indexed_at_ns":1793375386079354600,"word_count":13,"hashes":{"content/shows/2023_pink_future.md":"3276889b42dbebcbe3d612601b785296af99f8d16b1e51bcce00c59188da2878"}},"content/shows/2024_Pink_Future.md":{"size":159,"mtime_ns":1793374815668919700,"indexed_at_ns":1793375386081354100,"word_count":14,"hashes":{"content/shows/2024_pink_future.md":"656824162f4490609650cc560bf533dea73f91dcc129afcafb7856a594037b87"}},"content/shows/2024_Rock_fuer_Ruanda.md":{"size":132,"mtime_ns":1779119062708613700,"indexed_at_ns":1793375386083353700,"word_count":12,"hashes":{"content/shows/2024_rock_fuer_ruanda.md":"d5d2792abf0c0447f581287abe1ffae7a83e4c1d88da199484062b3621331c51"}},"content/shows/2024_Rock_im_Gehege.md":{"size":126,"mtime_ns":1779119062708613700,"indexed_at_ns":1793375386085353700,"word_count":12,"hashes":{"content/shows/2024_rock_im_gehege.md":"f6c3c6f6df517c38f7eddf9c4db4b6f04ffd405146c7e4edbb42617bb3cca2cd"}},"content/shows/2025_Album_Release_Party.md":{"size":127,"mtime_ns":1792435816801631900,"indexed_at_ns":1793375386086354100,"word_count":13,"hashes":{"content/shows/2025_album_release_party.md":"a2bbe3ed8f10e656b7bdf7e4ec2fe46f6b709af35a777ed2f39fef74b2700746"}},"content/shows/2025_Bullenhitze.md":{"size":105,"mtime_ns":1792436153820609500,"indexed_at_ns":1793375386088862100,"word_count":10,"hashes":{"content/shows/2025_bullenhitze.md":"303d96901bce528e0524e560f56eede50e80955376736ba3141a2476003d5b5a"}},"content/shows/2025_Riez_Kapellenkontest.md":{"size":151,"mtime_ns":1792427947085265000,"indexed_at_ns":1793375386090862100,"word_count":13,"hashes":{"content/shows/2025_riez_kapellenkontest.md":"3376a10eefb2b55c4473f0181e16b3a6319934819347192e65ee2d378f75b36b"}},"content/shows/2026_Altstadtfest_Trier.md":{"size":123,"mtime_ns":1792435301873360300,"indexed_at_ns":17933753860Line truncated
+12
View File
@@ -0,0 +1,12 @@
{
"runs": [
{
"date": "2026-10-30T15:53:50.702625+00:00",
"input_tokens": 219106,
"output_tokens": 0,
"files": 47
}
],
"total_input_tokens": 219106,
"total_output_tokens": 0
}
+474
View File
@@ -0,0 +1,474 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>graphify - graphify-out/graph.html</title>
<script src="https://unpkg.com/vis-network@9.1.6/standalone/umd/vis-network.min.js"
integrity="sha384-Ux6phic9PEHJ38YtrijhkzyJ8yQlH8i/+buBR8s3mAZOJrP1gwyvAcIYl3GWtpX1"
crossorigin="anonymous"></script>
<style>
:root {
--bg: #0f0f1a; --panel: #1a1a2e; --border: #2a2a4e; --input-border: #3a3a5e;
--text: #e0e0e0; --text-2: #aaa; --text-3: #ccc; --muted: #555; --count: #666;
--neighbor-border: #333; --node-label: #ffffff;
}
[data-theme="light"] {
--bg: #ffffff; --panel: #f8f9fa; --border: #d9dee5; --input-border: #c3cad4;
--text: #222222; --text-2: #666666; --text-3: #333333; --muted: #888888; --count: #777777;
--neighbor-border: #ccc; --node-label: #222222;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; display: flex; height: 100vh; overflow: hidden; }
#graph { flex: 1; }
#sidebar { width: 280px; background: var(--panel); border-left: 1px solid var(--border); display: flex; flex-direction: column; overflow: hidden; }
#search-wrap { padding: 12px; border-bottom: 1px solid var(--border); }
#search { width: 100%; background: var(--bg); border: 1px solid var(--input-border); color: var(--text); padding: 7px 10px; border-radius: 6px; font-size: 13px; outline: none; }
#search:focus { border-color: #4E79A7; }
#search-results { max-height: 140px; overflow-y: auto; padding: 4px 12px; border-bottom: 1px solid var(--border); display: none; }
.search-item { padding: 4px 6px; cursor: pointer; border-radius: 4px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-item:hover { background: var(--border); }
#info-panel { padding: 14px; border-bottom: 1px solid var(--border); min-height: 140px; }
#info-panel h3 { font-size: 13px; color: var(--text-2); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em; }
#info-content { font-size: 13px; color: var(--text-3); line-height: 1.6; }
#info-content .field { margin-bottom: 5px; }
#info-content .field b { color: var(--text); }
#info-content .empty { color: var(--muted); font-style: italic; }
.neighbor-link { display: block; padding: 2px 6px; margin: 2px 0; border-radius: 3px; cursor: pointer; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid var(--neighbor-border); }
.neighbor-link:hover { background: var(--border); }
#neighbors-list { max-height: 160px; overflow-y: auto; margin-top: 4px; }
#legend-wrap { flex: 1; overflow-y: auto; padding: 12px; }
#legend-wrap h3 { font-size: 13px; color: var(--text-2); margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em; }
.legend-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; cursor: pointer; border-radius: 4px; font-size: 12px; }
.legend-item:hover { background: var(--border); padding-left: 4px; }
.legend-item.dimmed { opacity: 0.35; }
.legend-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; }
.legend-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.legend-count { color: var(--count); font-size: 11px; }
#stats { padding: 10px 14px; border-top: 1px solid var(--border); font-size: 11px; color: var(--muted); }
#legend-controls { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; padding: 4px 0; }
#legend-controls label { display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 12px; color: var(--text-2); user-select: none; }
#legend-controls label:hover { color: var(--text); }
.legend-cb, #select-all-cb { appearance: none; -webkit-appearance: none; width: 14px; height: 14px; border: 1.5px solid var(--input-border); border-radius: 3px; background: var(--bg); cursor: pointer; position: relative; flex-shrink: 0; }
.legend-cb:checked, #select-all-cb:checked { background: #4E79A7; border-color: #4E79A7; }
.legend-cb:checked::after, #select-all-cb:checked::after { content: ''; position: absolute; left: 3.5px; top: 1px; width: 4px; height: 7px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }
#select-all-cb:indeterminate { background: #4E79A7; border-color: #4E79A7; }
#select-all-cb:indeterminate::after { content: ''; position: absolute; left: 2px; top: 5px; width: 8px; height: 2px; background: #fff; border: none; transform: none; }
#theme-wrap { display: flex; gap: 4px; padding: 8px 12px; border-bottom: 1px solid var(--border); }
#theme-wrap button { flex: 1; background: var(--bg); color: var(--text-2); border: 1px solid var(--input-border); border-radius: 4px; padding: 3px 0; font-size: 11px; cursor: pointer; }
#theme-wrap button:hover { color: var(--text); }
#theme-wrap button[aria-pressed="true"] { background: #4E79A7; border-color: #4E79A7; color: #fff; }
</style>
<script id="graphify-theme-init">
// Apply the saved theme before first paint (#3894). No saved choice keeps the
// historical dark look; "system" follows prefers-color-scheme.
(function () {
var pref = null;
try { pref = localStorage.getItem('graphify-theme'); } catch (e) {}
var t = pref === 'light' ? 'light'
: pref === 'system' && window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches ? 'light'
: 'dark';
document.documentElement.setAttribute('data-theme', t);
})();
</script>
</head>
<body>
<div id="graph"></div>
<div id="sidebar">
<div id="theme-wrap" role="group" aria-label="Theme">
<button type="button" data-theme-choice="light">Light</button>
<button type="button" data-theme-choice="dark">Dark</button>
<button type="button" data-theme-choice="system">System</button>
</div>
<div id="search-wrap">
<input id="search" type="text" placeholder="Search nodes..." autocomplete="off">
<div id="search-results"></div>
</div>
<div id="info-panel">
<h3>Node Info</h3>
<div id="info-content"><span class="empty">Click a node to inspect it</span></div>
</div>
<div id="legend-wrap">
<h3>Communities</h3>
<div id="legend-controls">
<label><input type="checkbox" id="select-all-cb" checked onchange="toggleAllCommunities(!this.checked)">Select All</label>
</div>
<div id="legend"></div>
</div>
<div id="stats">132 nodes &middot; 189 edges &middot; 17 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "deploy", "label": "deploy.ps1", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "deploy.ps1", "community": 14, "community_name": "Deploy-Skript", "source_file": "deploy.ps1", "file_type": "code", "degree": 1}, {"id": "deploy_assert_ok", "label": "Assert-Ok()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "Assert-Ok()", "community": 14, "community_name": "Deploy-Skript", "source_file": "deploy.ps1", "file_type": "code", "degree": 1}, {"id": "assets_js_site", "label": "site.js", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "site.js", "community": 15, "community_name": "Spotify Loader (site.js)", "source_file": "assets/js/site.js", "file_type": "code", "degree": 0}, {"id": "epk_build", "label": "build.ps1", "color": {"background": "#B07AA1", "border": "#B07AA1", "highlight": {"background": "#ffffff", "border": "#B07AA1"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "build.ps1", "community": 16, "community_name": "EPK PDF Build", "source_file": "epk/build.ps1", "file_type": "code", "degree": 0}, {"id": "gitea_workflows_deploy", "label": "deploy.yml", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 14.7, "font": {"size": 12, "color": "#ffffff"}, "title": "deploy.yml", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 3}, {"id": "gitea_workflows_deploy_container_image", "label": "image", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "image", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 1}, {"id": "gitea_workflows_deploy_deploy_container", "label": "container", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 13.2, "font": {"size": 0, "color": "#ffffff"}, "title": "container", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 2}, {"id": "gitea_workflows_deploy_deploy_env", "label": "env", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 16.3, "font": {"size": 12, "color": "#ffffff"}, "title": "env", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 4}, {"id": "gitea_workflows_deploy_deploy_runs_on", "label": "runs-on", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "runs-on", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 1}, {"id": "gitea_workflows_deploy_deploy_steps", "label": "steps", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 16.3, "font": {"size": 12, "color": "#ffffff"}, "title": "steps", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 4}, {"id": "gitea_workflows_deploy_env_http_proxy", "label": "http_proxy", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "http_proxy", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 1}, {"id": "gitea_workflows_deploy_env_https_proxy", "label": "https_proxy", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "https_proxy", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file": ".gitea/workflows/deploy.yml", "file_type": "code", "degree": 1}, {"id": "gitea_workflows_deploy_env_no_proxy", "label": "no_proxy", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 11.6, "font": {"size": 0, "color": "#ffffff"}, "title": "no_proxy", "community": 2, "community_name": "Gitea Deploy Workflow", "source_file":Line truncated
const RAW_EDGES = [{"from": "deploy", "to": "deploy_assert_ok", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy", "to": "gitea_workflows_deploy_name", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy", "to": "gitea_workflows_deploy_on", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy", "to": "gitea_workflows_deploy_jobs", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_container", "to": "gitea_workflows_deploy_container_image", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_jobs_deploy", "to": "gitea_workflows_deploy_deploy_container", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_env", "to": "gitea_workflows_deploy_env_http_proxy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_env", "to": "gitea_workflows_deploy_env_https_proxy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_env", "to": "gitea_workflows_deploy_env_no_proxy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_jobs_deploy", "to": "gitea_workflows_deploy_deploy_env", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_jobs_deploy", "to": "gitea_workflows_deploy_deploy_runs_on", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_steps", "to": "gitea_workflows_deploy_steps_uses", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_steps", "to": "gitea_workflows_deploy_steps_name", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_deploy_steps", "to": "gitea_workflows_deploy_steps_run", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_jobs_deploy", "to": "gitea_workflows_deploy_deploy_steps", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_jobs", "to": "gitea_workflows_deploy_jobs_deploy", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_on", "to": "gitea_workflows_deploy_on_push", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "gitea_workflows_deploy_on_push", "to": "gitea_workflows_deploy_push_branches", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "assets_css_main_design_tokens", "to": "assets_css_main", "label": "conceptually_related_to", "title": "conceptually_related_to [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "assets_css_main_flyer_wall", "to": "assets_css_main", "label": "conceptually_related_to", "title": "conceptually_related_to [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "layouts__default_baseof", "to": "assets_css_main", "label": "references", "title": "references [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "layouts_404", "to": "layouts__default_baseof", "label": "implements", "title": "implements [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "layouts__default_band", "to": "layouts_partials_img", "label": "calls", "title": "callsLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Templates &amp; Design", "count": 29}, {"cid": 1, "color": "#F28E2B", "label": "Band, EPK &amp; Regeln", "count": 27}, {"cid": 2, "color": "#E15759", "label": "Gitea Deploy Workflow", "count": 18}, {"cid": 3, "color": "#76B7B2", "label": "Datenschutz &amp; Impressum", "count": 9}, {"cid": 4, "color": "#59A14F", "label": "Show-Schema &amp; Mosel-Gigs", "count": 8}, {"cid": 5, "color": "#EDC948", "label": "Shows \u2194 EPK Sync", "count": 7}, {"cid": 6, "color": "#B07AA1", "label": "Pink Future &amp; Skatehalle", "count": 7}, {"cid": 7, "color": "#FF9DA7", "label": "Trierer Umland-Shows", "count": 7}, {"cid": 8, "color": "#9C755F", "label": "Rock im Gehege", "count": 4}, {"cid": 9, "color": "#BAB0AC", "label": "Tefftival", "count": 4}, {"cid": 10, "color": "#4E79A7", "label": "Album Release Party", "count": 2}, {"cid": 11, "color": "#F28E2B", "label": "Riez Kapellen-Contest", "count": 2}, {"cid": 12, "color": "#E15759", "label": "Altstadtfest Trier", "count": 2}, {"cid": 13, "color": "#76B7B2", "label": "Halloween Rock", "count": 2}, {"cid": 14, "color": "#59A14F", "label": "Deploy-Skript", "count": 2}, {"cid": 15, "color": "#EDC948", "label": "Spotify Loader (site.js)", "count": 1}, {"cid": 16, "color": "#B07AA1", "label": "EPK PDF Build", "count": 1}];
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;');
}
// Build vis datasets
const nodesDS = new vis.DataSet(RAW_NODES.map((n, i) => ({
id: n.id, label: n.label, color: n.color, size: n.size,
font: n.font, title: n.title,
// Fermat/golden-angle spiral seed positions (#3699): spreading nodes out
// before physics runs keeps avoidOverlap from computing near-zero-distance
// repulsion that blows the BarnesHut recursion into a stack overflow on large
// graphs. `i` is the map index — physics still settles small graphs identically.
x: 30 * Math.sqrt(i) * Math.cos(i * 2.4),
y: 30 * Math.sqrt(i) * Math.sin(i * 2.4),
community: n.community, community_name: n.community_name,
source_file: n.source_file, file_type: n.file_type, degree: n.degree,
member_count: n.member_count,
})));
const edgesDS = new vis.DataSet(RAW_EDGES.map((e, i) => ({
id: i, from: e.from, to: e.to,
label: '',
title: e.title,
dashes: e.dashes,
width: e.width,
color: e.color,
arrows: { to: { enabled: true, scaleFactor: 0.5 } },
})));
const container = document.getElementById('graph');
const network = new vis.Network(container, { nodes: nodesDS, edges: edgesDS }, {
physics: {
enabled: true,
solver: 'forceAtlas2Based',
forceAtlas2Based: {
gravitationalConstant: -60,
centralGravity: 0.005,
springLength: 120,
springConstant: 0.08,
damping: 0.4,
avoidOverlap: 0.8,
},
stabilization: { iterations: 200, fit: true },
},
interaction: {
hover: true,
tooltipDelay: 100,
hideEdgesOnDrag: true,
navigationButtons: false,
keyboard: false,
},
nodes: { shape: 'dot', borderWidth: 1.5 },
edges: { smooth: { type: 'continuous', roundness: 0.2 }, selectionWidth: 3 },
});
// Theme toggle (#3894): Light / Dark / System, persisted in localStorage.
const THEME_KEY = 'graphify-theme';
const themeMQ = window.matchMedia ? window.matchMedia('(prefers-color-scheme: light)') : null;
let themeLabelColor = '#ffffff'; // matches the per-node font color set in Python
function themePref() {
let p = null;
try { p = localStorage.getItem(THEME_KEY); } catch (e) {}
return (p === 'light' || p === 'dark' || p === 'system') ? p : null;
}
function applyTheme(pref) {
const t = pref === 'light' ? 'light' : (pref === 'system' && themeMQ && themeMQ.matches) ? 'light' : 'dark';
const root = document.documentElement;
if (!root) return;
root.setAttribute('data-theme', t);
document.querySelectorAll('[data-theme-choice]').forEach(b => {
b.setAttribute('aria-pressed', String(b.dataset.themeChoice === (pref || 'dark')));
});
const labelColor = getComputedStyle(root).getPropertyValue('--node-label').trim();
if (labelColor && labelColor !== themeLabelColor) {
themeLabelColor = labelColor;
nodesDS.update(nodesDS.get().map(n => ({ id: n.id, font: Object.assign({}, n.font, { color: labelColor }) })));
}
}
document.querySelectorAll('[data-theme-choice]').forEach(b => {
b.addEventListener('click', () => {
const pref = b.dataset.themeChoice;
try { localStorage.setItem(THEME_KEY, pref); } catch (e) {}
applyTheme(pref);
});
});
if (themeMQ) {
const onSchemeChange = () => { if (themePref() === 'system') applyTheme('system'); };
if (themeMQ.addEventListener) themeMQ.addEventListener('change', onSchemeChange);
else if (themeMQ.addListener) themeMQ.addListener(onSchemeChange);
}
applyTheme(themePref());
network.once('stabilizationIterationsDone', () => {
network.setOptions({ physics: { enabled: false } });
});
function showInfo(nodeId) {
const n = nodesDS.get(nodeId);
if (!n) return;
const neighborIds = network.getConnectedNodes(nodeId);
const neighborItems = neighborIds.map(nid => {
const nb = nodesDS.get(nid);
const color = nb ? nb.color.background : '#555';
return `<span class="neighbor-link" style="border-left-color:${esc(color)}" data-nid="${esc(nid)}">${esc(nb ? nb.label : nid)}</span>`;
}).join('');
const isMetaNode = !n.file_type && !n.source_file;
let html = `<div class="field"><b>${esc(n.label)}</b></div>`;
if (!isMetaNode) {
html += `<div class="field">Type: ${esc(n.file_type || 'unknown')}</div>`;
}
html += `<div class="field">Community: ${esc(n.community_name || '')}</div>`;
if (!isMetaNode) {
html += `<div class="field">Source: ${esc(n.source_file || '-')}</div>`;
} else if (n.member_count !== undefined && n.member_count !== null) {
html += `<div class="field">Members: ${esc(n.member_count)}</div>`;
}
html += `<div class="field">Degree: ${n.degree}</div>`;
if (neighborIds.length) {
html += `<div class="field" style="margin-top:8px;color:var(--text-2);font-size:11px">Neighbors (${neighborIds.length})</div><div id="neighbors-list">${neighborItems}</div>`;
}
document.getElementById('info-content').innerHTML = html;
}
function focusNode(nodeId) {
network.focus(nodeId, { scale: 1.4, animation: true });
network.selectNodes([nodeId]);
showInfo(nodeId);
}
// Neighbor links use a data attribute + one delegated listener rather than an
// inline onclick. A node id/label sourced from a document or a scraped URL
// (graphify add) can contain a double-quote; dropping the stringified id
// unescaped into a quoted onclick both broke every link and allowed a hostile
// source to inject an event handler into the local report (stored XSS, #1838).
// esc() on data-nid keeps the value inside the attribute; the listener reads it
// back verbatim. Bound to document so it survives the innerHTML rebuild that
// recreates #neighbors-list on each showInfo().
document.addEventListener('click', e => {
const el = e.target.closest('.neighbor-link');
if (el && el.dataset.nid !== undefined) focusNode(el.dataset.nid);
});
// Sidebar tooltips reuse vis-network's .vis-tooltip style and 100ms tooltipDelay.
// Names get one only when CSS ellipsis truncates them (the full text is still in
// the DOM); counts always get one, to say what the number is. Text is set with
// textContent only (labels are untrusted). Delegated on document so rows rebuilt
// later (search results, showInfo()) are covered.
const sidebarTip = document.createElement('div');
sidebarTip.className = 'vis-tooltip';
sidebarTip.style.cssText = 'white-space: normal; max-width: 360px; overflow-wrap: break-word;';
document.body.appendChild(sidebarTip);
let sidebarTipTimer = null;
let sidebarTipEl = null; // element whose text the tooltip shows
let sidebarTipZone = null; // element the pointer must leave to hide it
function hideSidebarTip() {
clearTimeout(sidebarTipTimer);
sidebarTip.style.visibility = 'hidden';
sidebarTip.textContent = '';
sidebarTipEl = sidebarTipZone = null;
}
document.addEventListener('mouseover', e => {
const zone = e.target.closest && e.target.closest('.legend-count, .legend-item, .search-item, .neighbor-link');
// Anywhere on a legend row except its count (dot, checkbox, gaps, padding)
// stands for the row's name, so moving within the row never re-triggers it.
const el = zone && zone.classList.contains('legend-item') ? zone.querySelector('.legend-label') : zone;
if (!el || el === sidebarTipEl) return;
hideSidebarTip();
const isCount = el.classList.contains('legend-count');
if (!isCount && el.scrollWidth <= el.clientWidth) return;
const text = isCount ? `${el.textContent} ${el.textContent === '1' ? 'node' : 'nodes'}` : el.textContent;
sidebarTipEl = el;
sidebarTipZone = zone;
const x = e.clientX, y = e.clientY;
sidebarTipTimer = setTimeout(() => {
sidebarTip.textContent = text;
sidebarTip.style.left = sidebarTip.style.top = '0px'; // measure at full max-width
sidebarTip.style.visibility = 'visible';
const w = sidebarTip.offsetWidth, h = sidebarTip.offsetHeight;
sidebarTip.style.left = Math.max(4, Math.min(x + 12, window.innerWidth - w - 4)) + 'px';
sidebarTip.style.top = (y + 16 + h > window.innerHeight ? Math.max(4, y - h - 8) : y + 16) + 'px';
}, 100);
});
document.addEventListener('mouseout', e => {
if (sidebarTipZone && !sidebarTipZone.contains(e.relatedTarget)) hideSidebarTip();
});
// A click rebuilds or hides the row (showInfo(), search pick) without a mouseout.
document.addEventListener('mousedown', hideSidebarTip);
// Track hovered node — hover detection is more reliable than click params
let hoveredNodeId = null;
network.on('hoverNode', params => {
hoveredNodeId = params.node;
container.style.cursor = 'pointer';
});
network.on('blurNode', () => {
hoveredNodeId = null;
container.style.cursor = 'default';
});
container.addEventListener('click', () => {
if (hoveredNodeId !== null) {
showInfo(hoveredNodeId);
network.selectNodes([hoveredNodeId]);
}
});
network.on('click', params => {
if (params.nodes.length > 0) {
showInfo(params.nodes[0]);
} else if (hoveredNodeId === null) {
document.getElementById('info-content').innerHTML = '<span class="empty">Click a node to inspect it</span>';
}
});
const searchInput = document.getElementById('search');
const searchResults = document.getElementById('search-results');
searchInput.addEventListener('input', () => {
const q = searchInput.value.toLowerCase().trim();
searchResults.innerHTML = '';
if (!q) { searchResults.style.display = 'none'; return; }
const matches = RAW_NODES.filter(n => n.label.toLowerCase().includes(q)).slice(0, 20);
if (!matches.length) { searchResults.style.display = 'none'; return; }
searchResults.style.display = 'block';
matches.forEach(n => {
const el = document.createElement('div');
el.className = 'search-item';
el.textContent = n.label;
el.style.borderLeft = `3px solid ${n.color.background}`;
el.style.paddingLeft = '8px';
el.onclick = () => {
network.focus(n.id, { scale: 1.5, animation: true });
network.selectNodes([n.id]);
showInfo(n.id);
searchResults.style.display = 'none';
searchInput.value = '';
};
searchResults.appendChild(el);
});
});
document.addEventListener('click', e => {
if (!searchResults.contains(e.target) && e.target !== searchInput)
searchResults.style.display = 'none';
});
const hiddenCommunities = new Set();
const selectAllCb = document.getElementById('select-all-cb');
function updateSelectAllState() {
const total = LEGEND.length;
const hidden = hiddenCommunities.size;
selectAllCb.checked = hidden === 0;
selectAllCb.indeterminate = hidden > 0 && hidden < total;
}
function toggleAllCommunities(hide) {
document.querySelectorAll('.legend-item').forEach(item => {
hide ? item.classList.add('dimmed') : item.classList.remove('dimmed');
});
document.querySelectorAll('.legend-cb').forEach(cb => {
cb.checked = !hide;
});
LEGEND.forEach(c => {
if (hide) hiddenCommunities.add(c.cid); else hiddenCommunities.delete(c.cid);
});
const updates = RAW_NODES.map(n => ({ id: n.id, hidden: hide }));
nodesDS.update(updates);
updateSelectAllState();
}
const legendEl = document.getElementById('legend');
LEGEND.forEach(c => {
const item = document.createElement('div');
item.className = 'legend-item';
const cb = document.createElement('input');
cb.type = 'checkbox';
cb.className = 'legend-cb';
cb.checked = true;
cb.addEventListener('change', (e) => {
e.stopPropagation();
if (cb.checked) {
hiddenCommunities.delete(c.cid);
item.classList.remove('dimmed');
} else {
hiddenCommunities.add(c.cid);
item.classList.add('dimmed');
}
const updates = RAW_NODES
.filter(n => n.community === c.cid)
.map(n => ({ id: n.id, hidden: !cb.checked }));
nodesDS.update(updates);
updateSelectAllState();
});
item.innerHTML = `<div class="legend-dot" style="background:${c.color}"></div>
<span class="legend-label">${c.label}</span>
<span class="legend-count">${c.count}</span>`;
item.prepend(cb);
item.onclick = (e) => {
if (e.target === cb) return;
cb.checked = !cb.checked;
cb.dispatchEvent(new Event('change'));
};
legendEl.appendChild(item);
});
</script>
<script>
// Render hyperedges as shaded regions
const hyperedges = [{"id": "epk_four_page_layout", "label": "EPK four A4 pages", "nodes": ["epk_epk_cover_page", "epk_epk_bio_page", "epk_epk_band_music_page", "epk_epk_live_contact_page"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "epk/epk.html"}, {"id": "release_data_pipeline", "label": "Release cover filename parsing feeding music page and album schema", "nodes": ["layouts_partials_releases", "layouts_partials_releases_filename_convention", "layouts_music_list", "layouts_partials_schema_musicgroup"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "layouts/partials/releases.html"}, {"id": "privacy_by_design_choices", "label": "Privacy-conscious site choices (local fonts, click-to-load Spotify, DSGVO)", "nodes": ["content_datenschutz_local_fonts", "content_datenschutz_spotify_click_to_load", "content_datenschutz_dsgvo_rights", "content_datenschutz_hosting_1blu"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/Datenschutz.md"}, {"id": "seo_layer", "label": "SEO layer (meta tags, JSON-LD, robots, show redirects)", "nodes": ["layouts__default_baseof_seo_meta", "layouts_partials_schema", "layouts_robots", "layouts_shows_single"], "relation": "form", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "layouts/_default/baseof.html"}, {"id": "trier_city_shows", "label": "Shows in the city of Trier", "nodes": ["content_shows_2022_jukufe_light_show", "content_shows_2023_pink_future_show", "content_shows_2024_pink_future_show", "content_shows_2025_album_release_party_show", "content_shows_2026_altstadtfest_trier_show", "content_shows_2026_luke_show"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/_index.md"}, {"id": "upcoming_shows_2026", "label": "Upcoming shows after 2026-10-30 (EPK 'N\u00e4chste Shows')", "nodes": ["content_shows_2026_halloween_show", "content_shows_2026_tefftival_show", "content_shows__index_shows"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "content/shows/_index.md"}, {"id": "epk_website_manual_sync_flow", "label": "Website content manually mirrored into EPK", "nodes": ["claude_epk_manual_sync", "content__index_band_bio", "content_about_members", "content_music__index_music_page", "epk_epk_document"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "CLAUDE.md"}, {"id": "show_rendering_flow", "label": "Show listing rendering (home, shows page, card, JSON-LD events)", "nodes": ["layouts_index", "layouts_shows_list", "layouts_partials_show_card", "layouts_partials_schema_musicevent"], "relation": "participate_in", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "layouts/shows/list.html"}];
// afterDrawing passes ctx already transformed to network coordinate space.
// Draw node positions raw — no manual pan/zoom/DPR math needed.
// Andrew's monotone chain. Returns the hull in counter-clockwise order, which
// is what the perimeter must be traced in. Collinear and duplicate points
// collapse to the extremes, so degenerate member sets render as a segment
// rather than a zero-area crossed path.
function convexHull(pts) {
const p = pts.slice().sort((a, b) => (a.x - b.x) || (a.y - b.y));
if (p.length < 3) return p;
const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
const build = seq => {
const out = [];
for (const q of seq) {
while (out.length >= 2 && cross(out[out.length - 2], out[out.length - 1], q) <= 0) out.pop();
out.push(q);
}
out.pop();
return out;
};
const hull = build(p).concat(build(p.slice().reverse()));
return hull.length >= 3 ? hull : p;
}
network.on('afterDrawing', function(ctx) {
hyperedges.forEach(h => {
const positions = h.nodes
.map(nid => network.getPositions([nid])[nid])
.filter(p => p !== undefined);
if (positions.length < 2) return;
ctx.save();
ctx.globalAlpha = 0.12;
ctx.fillStyle = '#6366f1';
ctx.strokeStyle = '#6366f1';
ctx.lineWidth = 2;
ctx.beginPath();
// Centroid and expanded hull in network coordinates.
// The perimeter must follow hull order, not h.nodes order: tracing the
// raw member order self-intersects whenever the layout does not happen
// to place members in angular order, filling as crossed wedges.
const cx = positions.reduce((s, p) => s + p.x, 0) / positions.length;
const cy = positions.reduce((s, p) => s + p.y, 0) / positions.length;
const hull = convexHull(positions);
const expanded = hull.map(p => ({
x: cx + (p.x - cx) * 1.15,
y: cy + (p.y - cy) * 1.15
}));
ctx.moveTo(expanded[0].x, expanded[0].y);
expanded.slice(1).forEach(p => ctx.lineTo(p.x, p.y));
ctx.closePath();
ctx.fill();
ctx.globalAlpha = 0.4;
ctx.stroke();
// Label
ctx.globalAlpha = 0.8;
ctx.fillStyle = '#4f46e5';
ctx.font = 'bold 11px sans-serif';
ctx.textAlign = 'center';
ctx.fillText(h.label, cx, cy - 5);
ctx.restore();
});
});
</script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
{"directed":false,"multigraph":false,"graph":{"hyperedges":[{"id":"epk_four_page_layout","label":"EPK four A4 pages","nodes":["epk_epk_cover_page","epk_epk_bio_page","epk_epk_band_music_page","epk_epk_live_contact_page"],"relation":"form","confidence":"EXTRACTED","confidence_score":1.0,"source_file":"epk/epk.html"},{"id":"release_data_pipeline","label":"Release cover filename parsing feeding music page and album schema","nodes":["layouts_partials_releases","layouts_partials_releases_filename_convention","layouts_music_list","layouts_partials_schema_musicgroup"],"relation":"form","confidence":"EXTRACTED","confidence_score":1.0,"source_file":"layouts/partials/releases.html"},{"id":"privacy_by_design_choices","label":"Privacy-conscious site choices (local fonts, click-to-load Spotify, DSGVO)","nodes":["content_datenschutz_local_fonts","content_datenschutz_spotify_click_to_load","content_datenschutz_dsgvo_rights","content_datenschutz_hosting_1blu"],"relation":"participate_in","confidence":"INFERRED","confidence_score":0.75,"source_file":"content/Datenschutz.md"},{"id":"seo_layer","label":"SEO layer (meta tags, JSON-LD, robots, show redirects)","nodes":["layouts__default_baseof_seo_meta","layouts_partials_schema","layouts_robots","layouts_shows_single"],"relation":"form","confidence":"INFERRED","confidence_score":0.75,"source_file":"layouts/_default/baseof.html"},{"id":"trier_city_shows","label":"Shows in the city of Trier","nodes":["content_shows_2022_jukufe_light_show","content_shows_2023_pink_future_show","content_shows_2024_pink_future_show","content_shows_2025_album_release_party_show","content_shows_2026_altstadtfest_trier_show","content_shows_2026_luke_show"],"relation":"participate_in","confidence":"INFERRED","confidence_score":0.75,"source_file":"content/shows/_index.md"},{"id":"upcoming_shows_2026","label":"Upcoming shows after 2026-10-30 (EPK 'N\u00e4chste Shows')","nodes":["content_shows_2026_halloween_show","content_shows_2026_tefftival_show","content_shows__index_shows"],"relation":"participate_in","confidence":"INFERRED","confidence_score":0.75,"source_file":"content/shows/_index.md"},{"id":"epk_website_manual_sync_flow","label":"Website content manually mirrored into EPK","nodes":["claude_epk_manual_sync","content__index_band_bio","content_about_members","content_music__index_music_page","epk_epk_document"],"relation":"participate_in","confidence":"INFERRED","confidence_score":0.85,"source_file":"CLAUDE.md"},{"id":"show_rendering_flow","label":"Show listing rendering (home, shows page, card, JSON-LD events)","nodes":["layouts_index","layouts_shows_list","layouts_partials_show_card","layouts_partials_schema_musicevent"],"relation":"participate_in","confidence":"INFERRED","confidence_score":0.85,"source_file":"layouts/shows/list.html"}],"schema_version":1,"graphify_version":"0.9.97"},"nodes":[{"id":"deploy","label":"deploy.ps1","_origin":"ast","community":14,"community_name":"Deploy-Skript","file_type":"code","norm_label":"deploy.ps1","source_file":"deploy.ps1","source_location":"L1"},{"id":"deploy_assert_ok","label":"Assert-Ok()","_origin":"ast","community":14,"community_name":"Deploy-Skript","file_type":"code","norm_label":"assert-ok()","source_file":"deploy.ps1","source_location":"L21"},{"id":"assets_js_site","label":"site.js","_origin":"ast","community":15,"community_name":"Spotify Loader (site.js)","file_type":"code","norm_label":"site.js","source_file":"assets/js/site.js","source_location":"L1"},{"id":"epk_build","label":"build.ps1","_origin":"ast","community":16,"community_name":"EPK PDF Build","file_type":"code","norm_label":"build.ps1","source_file":"epk/build.ps1","source_location":"L1"},{"id":"gitea_workflows_deploy","label":"deploy.yml","_origin":"ast","community":2,"community_name":"Gitea Deploy Workflow","file_type":"code","norm_label":"deploy.yml","source_file":".gitea/workflows/deploy.yml","source_location":"L1"},{"id":"gitea_workflows_deploy_container_image","label":"image","_origin":"ast","community":2,"community_name":"Gitea Deploy Workflow","file_type":"code","norm_label":"image","source_file":".gitea/workflows/deploy.yml","source_location":"L12"},{"id":"gitea_workflows_deploy_deploy_container","label":"container","_origin":"ast","community":2,"community_name":"Gitea Deploy Workflow","file_type":"code","norm_label":"container","source_file":".gitea/workflows/deploy.yml","source_location":"L11"},{"id":"gitea_workflows_deploy_deploy_env","label":"env","_origin":"ast","community":2,"community_name":"Gitea Deploy Workflow","file_type":"code","norm_label":"env","source_file":".gitea/workflows/deploy.yml","source_location":"L14"},{"id":"gitea_workflows_deploy_deploy_runs_on","label":"runs-on","_origin":"ast","community":2,"community_name":"Gitea Deploy Workflow","file_type":"code","norm_label":"runs-on","source_file":".gitea/workflows/deploy.yml","source_location":"L10"},{"id":"gitea_workflows_deploy_deploy_steps","label":"steps","_origin":"ast","community":2,"community_name":"Gitea Line truncated
+284
View File
@@ -0,0 +1,284 @@
{
".gitea/workflows/deploy.yml": {
"mtime": 1792436508.1113694,
"seen": 1793375630.6811461,
"ast_hash": "586da739996d36d4573e9010c336b8f5",
"semantic_hash": "586da739996d36d4573e9010c336b8f5"
},
"assets/js/site.js": {
"mtime": 1792428051.347229,
"seen": 1793375630.6811461,
"ast_hash": "4f3a97a77436926df1e0ffb8b7bd9433",
"semantic_hash": "4f3a97a77436926df1e0ffb8b7bd9433"
},
"deploy.ps1": {
"mtime": 1792439721.9094982,
"seen": 1793375630.6811461,
"ast_hash": "9769be30a5e3fac69615581a1d7766ac",
"semantic_hash": "9769be30a5e3fac69615581a1d7766ac"
},
"epk/build.ps1": {
"mtime": 1792441385.0702047,
"seen": 1793375630.6811461,
"ast_hash": "5f39994f7595891549f59732569f3b55",
"semantic_hash": "5f39994f7595891549f59732569f3b55"
},
"CLAUDE.md": {
"mtime": 1793374882.1850684,
"seen": 1793375630.6811461,
"ast_hash": "bbcfa8bc7030d36d30c5d965107fdfb0",
"semantic_hash": "bbcfa8bc7030d36d30c5d965107fdfb0"
},
"archetypes/default.md": {
"mtime": 1779119062.703552,
"seen": 1793375630.6811461,
"ast_hash": "89064672db31fdc98e72345241a0919f",
"semantic_hash": "89064672db31fdc98e72345241a0919f"
},
"content/Datenschutz.md": {
"mtime": 1792427965.1255074,
"seen": 1793375630.6811461,
"ast_hash": "801aa0befa8fe48c86f3d54a5e324877",
"semantic_hash": "801aa0befa8fe48c86f3d54a5e324877"
},
"content/Impressum.md": {
"mtime": 1792427965.124507,
"seen": 1793375630.6811461,
"ast_hash": "e448a039e0697a57a78069955c0cbcde",
"semantic_hash": "e448a039e0697a57a78069955c0cbcde"
},
"content/_index.md": {
"mtime": 1792427946.806149,
"seen": 1793375630.6811461,
"ast_hash": "cf0e83830cf2373f514c11e4575e9a71",
"semantic_hash": "cf0e83830cf2373f514c11e4575e9a71"
},
"content/about.md": {
"mtime": 1792438093.6905713,
"seen": 1793375630.6811461,
"ast_hash": "c887d819271e6e5590377e00d8ed482f",
"semantic_hash": "c887d819271e6e5590377e00d8ed482f"
},
"content/music/_index.md": {
"mtime": 1792437673.2972002,
"seen": 1793375630.6811461,
"ast_hash": "e27d2ca6914d7e2d24449869fc1fc29d",
"semantic_hash": "e27d2ca6914d7e2d24449869fc1fc29d"
},
"content/shows/2022_Jukufe_light.md": {
"mtime": 1779119062.7066143,
"seen": 1793375630.6811461,
"ast_hash": "dbb9bf801e33d4cf46cc6be783cd5ecd",
"semantic_hash": "dbb9bf801e33d4cf46cc6be783cd5ecd"
},
"content/shows/2022_Konz_wird_laut.md": {
"mtime": 1779119062.7076137,
"seen": 1793375630.6811461,
"ast_hash": "66a008810041f547f43964884c208b37",
"semantic_hash": "66a008810041f547f43964884c208b37"
},
"content/shows/2022_Rock_im_Gehege.md": {
"mtime": 1779119062.7076137,
"seen": 1793375630.6811461,
"ast_hash": "c9be2cb8d0e08720a17360a68079697b",
"semantic_hash": "c9be2cb8d0e08720a17360a68079697b"
},
"content/shows/2022_Tefftival.md": {
"mtime": 1779119062.7076137,
"seen": 1793375630.6811461,
"ast_hash": "40a646f2a9950463cea4a4c1db072d52",
"semantic_hash": "40a646f2a9950463cea4a4c1db072d52"
},
"content/shows/2023_Moselrock.md": {
"mtime": 1779119062.7076137,
"seen": 1793375630.6811461,
"ast_hash": "e1cac874ba92686c9e93b69ff8f25ca2",
"semantic_hash": "e1cac874ba92686c9e93b69ff8f25ca2"
},
"content/shows/2023_Pink_Future.md": {
"mtime": 1792427947.035097,
"seen": 1793375630.6811461,
"ast_hash": "6c069f3c0905199fc71964302788a3b2",
"semantic_hash": "6c069f3c0905199fc71964302788a3b2"
},
"content/shows/2024_Pink_Future.md": {
"mtime": 1793374815.6689198,
"seen": 1793375630.6811461,
"ast_hash": "6c7dffee2a8ddef3aab20046a31dfcab",
"semantic_hash": "6c7dffee2a8ddef3aab20046a31dfcab"
},
"content/shows/2024_Rock_fuer_Ruanda.md": {
"mtime": 1779119062.7086136,
"seen": 1793375630.6811461,
"ast_hash": "61ad5d561e4baeb73f98c92c5bda5132",
"semantic_hash": "61ad5d561e4baeb73f98c92c5bda5132"
},
"content/shows/2024_Rock_im_Gehege.md": {
"mtime": 1779119062.7086136,
"seen": 1793375630.6811461,
"ast_hash": "921ef9bb8cd31bf013d49fa5cf67b52b",
"semantic_hash": "921ef9bb8cd31bf013d49fa5cf67b52b"
},
"content/shows/2025_Album_Release_Party.md": {
"mtime": 1792435816.801632,
"seen": 1793375630.6811461,
"ast_hash": "19b2a4e1d791a749fd96ed92563c9a13",
"semantic_hash": "19b2a4e1d791a749fd96ed92563c9a13"
},
"content/shows/2025_Bullenhitze.md": {
"mtime": 1792436153.8206096,
"seen": 1793375630.6811461,
"ast_hash": "964b3ad0b776203d5c132eb4890e9237",
"semantic_hash": "964b3ad0b776203d5c132eb4890e9237"
},
"content/shows/2025_Riez_Kapellenkontest.md": {
"mtime": 1792427947.085265,
"seen": 1793375630.6811461,
"ast_hash": "ba49c824c77a5834bced087e1ef8b8a2",
"semantic_hash": "ba49c824c77a5834bced087e1ef8b8a2"
},
"content/shows/2026_Altstadtfest_Trier.md": {
"mtime": 1792435301.8733604,
"seen": 1793375630.6811461,
"ast_hash": "2a2ab6188c4f100a95f948550b3d67c1",
"semantic_hash": "2a2ab6188c4f100a95f948550b3d67c1"
},
"content/shows/2026_Halloween.md": {
"mtime": 1793374815.6498969,
"seen": 1793375630.6811461,
"ast_hash": "6c36d994220091f6db37298850d931cf",
"semantic_hash": "6c36d994220091f6db37298850d931cf"
},
"content/shows/2026_Highway_to_Kell.md": {
"mtime": 1792436187.7946775,
"seen": 1793375630.6811461,
"ast_hash": "95e1272d92c319bf6338192bf3bce62b",
"semantic_hash": "95e1272d92c319bf6338192bf3bce62b"
},
"content/shows/2026_Luke.md": {
"mtime": 1792435449.494565,
"seen": 1793375630.6811461,
"ast_hash": "8958c7f15452cb736d5f6df3fddfc379",
"semantic_hash": "8958c7f15452cb736d5f6df3fddfc379"
},
"content/shows/2026_Tefftival.md": {
"mtime": 1792436877.4647188,
"seen": 1793375630.6811461,
"ast_hash": "0adc06b7718f73fa8e60eec7be5a53af",
"semantic_hash": "0adc06b7718f73fa8e60eec7be5a53af"
},
"content/shows/_index.md": {
"mtime": 1792428085.075345,
"seen": 1793375630.6811461,
"ast_hash": "eb937e61fa9a192bf7a90293ee41740e",
"semantic_hash": "eb937e61fa9a192bf7a90293ee41740e"
},
"epk/epk.html": {
"mtime": 1792441190.7920048,
"seen": 1793375630.6811461,
"ast_hash": "18c65a3c8fbaf6d00789168918336eec",
"semantic_hash": "18c65a3c8fbaf6d00789168918336eec"
},
"layouts/404.html": {
"mtime": 1792427930.2489362,
"seen": 1793375630.6811461,
"ast_hash": "737e308941ae0919e20f2df5af3506cb",
"semantic_hash": "737e308941ae0919e20f2df5af3506cb"
},
"layouts/_default/band.html": {
"mtime": 1792438116.8336325,
"seen": 1793375630.6811461,
"ast_hash": "7360a1b4ec02791fbfdb3ea7ce702d5a",
"semantic_hash": "7360a1b4ec02791fbfdb3ea7ce702d5a"
},
"layouts/_default/baseof.html": {
"mtime": 1793374865.1657135,
"seen": 1793375630.6811461,
"ast_hash": "60f2a1a9fb6bb0e66e58dc37032992a3",
"semantic_hash": "60f2a1a9fb6bb0e66e58dc37032992a3"
},
"layouts/_default/list.html": {
"mtime": 1792427929.1876495,
"seen": 1793375630.6811461,
"ast_hash": "0ceee9c1e524868aceb3cfa02d0505e5",
"semantic_hash": "0ceee9c1e524868aceb3cfa02d0505e5"
},
"layouts/_default/single.html": {
"mtime": 1792427928.103781,
"seen": 1793375630.6811461,
"ast_hash": "9e1860e9098202d2737db3f543b99f1f",
"semantic_hash": "9e1860e9098202d2737db3f543b99f1f"
},
"layouts/index.html": {
"mtime": 1792436553.057485,
"seen": 1793375630.6811461,
"ast_hash": "36cbbdf1d3a2e88d9722fb0fc1458617",
"semantic_hash": "36cbbdf1d3a2e88d9722fb0fc1458617"
},
"layouts/music/list.html": {
"mtime": 1792437676.4604757,
"seen": 1793375630.6811461,
"ast_hash": "27d3bbdcb8a26508116f91c3f0e71c88",
"semantic_hash": "27d3bbdcb8a26508116f91c3f0e71c88"
},
"layouts/partials/footer.html": {
"mtime": 1792438077.2061362,
"seen": 1793375630.6811461,
"ast_hash": "041f2f4ba559ce00354c0f6ca5c324c7",
"semantic_hash": "041f2f4ba559ce00354c0f6ca5c324c7"
},
"layouts/partials/header.html": {
"mtime": 1792427957.2606187,
"seen": 1793375630.6811461,
"ast_hash": "cc60cdb7274d2f241a66aef491fd4af0",
"semantic_hash": "cc60cdb7274d2f241a66aef491fd4af0"
},
"layouts/partials/img.html": {
"mtime": 1792437654.353445,
"seen": 1793375630.6811461,
"ast_hash": "fc397069f2f4fa9249ee959f7694a63e",
"semantic_hash": "fc397069f2f4fa9249ee959f7694a63e"
},
"layouts/partials/releases.html": {
"mtime": 1792437655.4155233,
"seen": 1793375630.6811461,
"ast_hash": "de1660688b6b38926d53e9674c13f211",
"semantic_hash": "de1660688b6b38926d53e9674c13f211"
},
"layouts/partials/schema.html": {
"mtime": 1793374856.2443554,
"seen": 1793375630.6811461,
"ast_hash": "042c009492de79ef01b59e488d23afbe",
"semantic_hash": "042c009492de79ef01b59e488d23afbe"
},
"layouts/partials/show-card.html": {
"mtime": 1792436684.4066665,
"seen": 1793375630.6811461,
"ast_hash": "59cf866d687ab013af16144c672c5731",
"semantic_hash": "59cf866d687ab013af16144c672c5731"
},
"layouts/partials/spotify.html": {
"mtime": 1792427891.8614888,
"seen": 1793375630.6811461,
"ast_hash": "37aa573154e707ff7af871d1bde6fe60",
"semantic_hash": "37aa573154e707ff7af871d1bde6fe60"
},
"layouts/robots.txt": {
"mtime": 1793374831.4034257,
"seen": 1793375630.6811461,
"ast_hash": "73658f017f7da8ee2d3098e78d9806d5",
"semantic_hash": "73658f017f7da8ee2d3098e78d9806d5"
},
"layouts/shows/list.html": {
"mtime": 1792427924.881836,
"seen": 1793375630.6811461,
"ast_hash": "d606aa8ca7c0152b8baab7a35e592757",
"semantic_hash": "d606aa8ca7c0152b8baab7a35e592757"
},
"layouts/shows/single.html": {
"mtime": 1792428085.1042292,
"seen": 1793375630.6811461,
"ast_hash": "9fb7cc1072114103cead8f7250e99ce8",
"semantic_hash": "9fb7cc1072114103cead8f7250e99ce8"
}
}
+1
View File
@@ -3,6 +3,7 @@ baseURL = "https://www.deepwatersurvival.de/"
languageCode = "de"
defaultContentLanguage = "de"
disableKinds = ["taxonomy", "term", "RSS"]
enableRobotsTXT = true
# Shows liegen in der Zukunft – ohne diese Option würde Hugo sie nicht bauen.
buildFuture = true
+1
View File
@@ -23,6 +23,7 @@
<link rel="preload" href="/fonts/archivo-latin-400-normal.woff2" as="font" type="font/woff2" crossorigin>
{{ $css := resources.Get "css/main.css" | minify | fingerprint }}
<link rel="stylesheet" href="{{ $css.RelPermalink }}" integrity="{{ $css.Data.Integrity }}">
{{ partial "schema.html" . }}
</head>
<body class="{{ if .IsHome }}is-home{{ end }}">
<a class="skip-link" href="#inhalt">Zum Inhalt springen</a>
+18
View File
@@ -0,0 +1,18 @@
{{- /*
Eigene Sitemap: Die Einzelseiten unter /shows/ sind noindex-Weiterleitungen
auf /shows/ und gehören nicht hinein. lastmod in der Zukunft (kommt von
kommenden Shows) wird weggelassen.
*/ -}}
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{{- range .Pages }}
{{- if and .Permalink (not (and (eq .Section "shows") (eq .Kind "page"))) }}
<url>
<loc>{{ .Permalink }}</loc>
{{- if and (not .Lastmod.IsZero) (le .Lastmod now) }}
<lastmod>{{ safeHTML (.Lastmod.Format "2006-01-02T15:04:05-07:00") }}</lastmod>
{{- end }}
</url>
{{- end }}
{{- end }}
</urlset>
+64
View File
@@ -0,0 +1,64 @@
{{/*
JSON-LD für Suchmaschinen.
Startseite: die Band (MusicGroup) mit Besetzung, Album und Profilen.
/shows/: ein MusicEvent pro kommender Show mit Ort (TBA-Termine fehlen).
Optional im Show-Front-Matter: city (Ort, sonst wird location genommen)
und address (Straße und Hausnummer). Nur bestätigte Adressen eintragen.
*/}}
{{- $bandID := "/#band" | absURL -}}
{{- $band := dict "@type" "MusicGroup" "@id" $bandID "name" site.Title "url" site.Home.Permalink -}}
{{- if .IsHome -}}
{{- $band = merge $band (dict
"description" site.Params.description
"genre" "Punkrock"
"email" site.Params.email
"logo" ("/img/logo-crop.png" | absURL)
"location" (dict "@type" "Place" "name" "Trier" "address" (dict "@type" "PostalAddress" "addressLocality" "Trier" "addressCountry" "DE"))
"sameAs" (slice site.Params.spotify site.Params.instagram site.Params.youtube)
) -}}
{{- with resources.Get "img/AlbumReleaseParty_Stage_compressed.jpg" }}{{ with .Resize "1200x jpg q80" }}
{{- $band = merge $band (dict "image" .Permalink) -}}
{{- end }}{{ end -}}
{{- with site.GetPage "/about" }}{{ with .Params.members }}
{{- $members := slice -}}
{{- range . }}
{{- $members = $members | append (dict "@type" "OrganizationRole" "roleName" .role "member" (dict "@type" "Person" "name" .name)) -}}
{{- end }}
{{- $band = merge $band (dict "member" $members) -}}
{{- end }}{{ end -}}
{{- $albums := slice -}}
{{- range where (partial "releases.html" .) "kind" "Album" }}
{{- $album := dict "@type" "MusicAlbum" "name" .title "datePublished" (.date.Format "2006-01-02") "byArtist" (dict "@id" $bandID) -}}
{{- with .cover.Resize "800x webp q78" }}{{ $album = merge $album (dict "image" .Permalink) }}{{ end -}}
{{- $albums = $albums | append $album -}}
{{- end }}
{{- with $albums }}{{ $band = merge $band (dict "album" .) }}{{ end -}}
{{- $data := merge (dict "@context" "https://schema.org") $band }}
<script type="application/ld+json">{{ $data | jsonify | safeJS }}</script>
{{- end -}}
{{- if and (eq .Kind "section") (eq .Section "shows") -}}
{{- $events := slice -}}
{{- range (where .Pages "Date" "ge" now).ByDate }}
{{- if and (not .Params.tba) .Params.location }}
{{- $address := dict "@type" "PostalAddress" "addressLocality" (.Params.city | default .Params.location) "addressCountry" "DE" -}}
{{- with .Params.address }}{{ $address = merge $address (dict "streetAddress" .) }}{{ end -}}
{{- $event := dict
"@type" "MusicEvent"
"name" (printf "%s mit %s" .Title site.Title)
"startDate" (.Date.Format "2006-01-02")
"eventStatus" "https://schema.org/EventScheduled"
"eventAttendanceMode" "https://schema.org/OfflineEventAttendanceMode"
"location" (dict "@type" "Place" "name" .Params.location "address" $address)
"performer" $band
"url" $.Permalink
-}}
{{- with .Params.poster }}{{ $event = merge $event (dict "image" (. | absURL)) }}{{ end -}}
{{- $events = $events | append $event -}}
{{- end }}
{{- end }}
{{- with $events }}
<script type="application/ld+json">{{ dict "@context" "https://schema.org" "@graph" . | jsonify | safeJS }}</script>
{{- end }}
{{- end -}}
+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: {{ "sitemap.xml" | absURL }}
File renamed without changes.

Before

Width:  |  Height:  |  Size: 236 KiB

After

Width:  |  Height:  |  Size: 236 KiB