CHANGELOG Rebel Girl FM
Kira Chopra: confirmed age, birthday, origin, residence and three languages; reunion with Mei on the train and arrival as the station’s resident tattoo artist.
Profile fields, short summary, full story and lore are synchronized in DE/EN/ES. Kira’s eight existing images remain unchanged; Erzengels Gabriel, Marlon and Rotkäppchen also have confirmed biographies. No music genre or unconfirmed birth year was added.
Kira’s school friendship with Mei: meeting at 14 in PE, which both disliked, parallel classes and her then home in Nuremberg. Learning tattooing at 15 in her well-known uncle’s studio, Mei’s first tattoos and Kira’s reputation as one of Germany’s best tattoo artists at 19.
Characters and media
- Erzengels Gabriel, Kira, Marlon and Rotkäppchen are available in DE/EN/ES and linked at the end of the supporting-character overview. No biographies, relationships, roles or genres were added.
- Because sampled new CDN paths still return 404, 202 selected WebP files (characters, backgrounds and playlist covers; about 15.4 MB) are served as project-owned image copies. Canonical source paths remain separate. No R2 upload or deployment.
- The overview additionally uses 20 locally generated 384-pixel WebP thumbnails (500,640 bytes); full images and sources remain unchanged. Image SEO and the sitemap reference actual project-owned image delivery.
- Compatible package updates include Astro 7.3.6, Vite 8.3.3 and Wrangler 4.148.0; sharp 0.35.5 replaces the vulnerable override. Preact 11 and TypeScript 7 remain excluded by integration/checker peer constraints.
Faster News navigation
- The News page immediately shows the last validated R2 snapshots. Stale song and image lists refresh in the background rather than blocking navigation.
- The YouTube section continues to use only its validated R2 snapshot; no invented videos or links are shown.
- If a source is unavailable, the last valid list remains visible. Without a stored song snapshot, the usual empty state remains until the next successful refresh.
Loading and image discovery
- All gallery images, downloads, filters and the lightbox remain available. Each list renders 48 cards first and adds 48 per click on “Show more”. Without JavaScript, named links keep the remaining items accessible.
- Download headings now use the selected language instead of retaining German text on English and Spanish pages.
- The image sitemap associates 674 images with their own indexable image pages instead of listing each three times under the localized gallery pages. The remaining 115 stay linked to the gallery. All 789 CDN image URLs remain included.
- Repeated structured data in gallery HTML has been reduced. Search ranking cannot be guaranteed.
News and loading time
- The channel’s public YouTube Atom feed returns HTTP 404. A local OAuth service runs every 15 minutes, retrieves the eight latest verified videos through the YouTube Data API, and stores only validated public metadata in R2. The News page reads that snapshot without contacting YouTube; failures preserve the last valid snapshot.
- Existing lists no longer show temporary-source error messages to visitors. Source links and update dates remain visible; an empty-state message remains when no valid list exists.
- OAuth credentials and visitor data are never sent to YouTube from the visitor’s browser.
News for our fans
- News shows eight recent songs from Rebel Girl FM’s Suno profile, eight videos from our official YouTube channel, and eight images from our CDN. New entries replace the oldest; filters show one section or all three.
- Cards keep their dates and a shared dark background. Only their borders differ: violet for Suno, red for YouTube, and sky blue for images. Section headings are centered.
- Sources and honest update times appear in the introduction. A temporary failure to refresh the image list does not display a technical warning above the images.
Media, technology and privacy
- Added a missing Shadowman cover to the CDN; the generated media index now contains 1061 audio files, 1098 videos, 1061 lyrics, and 783 gallery images.
- Compatible updates: Astro 7.3.5, Nanostores 1.5.4, Vite 8.3.1, Wrangler 4.142.0, and Cloudflare Workers Types 5.20260928.1. TypeScript remains at 6.0.3 due to Astro Check’s peer requirement.
- Privacy text in DE/EN/ES describes server-side image selection and image delivery through our Cloudflare CDN. UI keys, placeholders, and translated lore and changelog files were cross-checked.
Technical maintenance
- Updated the lockfile to Astro 7.3.4, Cloudflare adapter 14.3.3, Wrangler 4.137.0 and Workers Types 5.20260923.1.
- Astro Check and project regressions, production build, sitemap checks and npm security audit passed.
- Fixed R2-mode asset validation: static CDN media files are now checked directly with a timeout instead of against a local directory. 27 references checked.
- The three-language desktop navigation no longer overflows horizontally from 1400 pixels upward; smaller widths use the mobile menu.
- The exact
/adminroute now receivesX-Robots-Tag: noindex, nofollow, noarchive, matching all admin subpages. - Privacy notice dated to the reviewed project state; no change to data processing.
- Published directly to Cloudflare Workers on 24 September after full checks and backed up the same source revision to GitHub. A GitHub push alone does not currently trigger a Workers build.
- Local preview: increased desktop navigation spacing; with the new News tab, the longer Spanish menu switches to mobile navigation at narrower desktop widths. This adjustment has not yet been published publicly.
News · latest Suno songs (local preview)
- A new News tab immediately after Home shows the 16 latest public Rebel Girl FM songs from the
@dampferbugSuno profile in DE/EN/ES, with original titles, dates and external Suno links. Other projects on the profile are excluded. - The website checks the Suno list server-side as needed about every 15 minutes, sorts by publication date and automatically removes the oldest entry. The last good list is stored as JSON on the R2 CDN and remains visible during Suno outages. No Suno embed or direct Suno media loading in the browser.
- Privacy information now describes this server-side retrieval. These local changes have not been deployed to Cloudflare or pushed to GitHub.
News · Suno and YouTube (local update, 28 September)
- The heading and description now introduce the latest eight Rebel Girl FM songs on Suno and the latest eight videos on the official YouTube channel. This supersedes the earlier 16-song preview described above.
- New entries automatically replace the oldest; both lists refresh server-side as needed about every 15 minutes and retain the last successful R2 snapshot. Videos are not embedded; privacy information covers the server-side YouTube feed request.
- These changes remain a local preview, not deployed to Cloudflare.
News · CDN images and filters (local update)
- Eight WebP images now appear in CDN upload order. New uploads replace the oldest; the R2 list is checked as needed about every 15 minutes. The last known list remains during outages. If local R2 is empty, the preview uses eight CDN images verified on 28 September.
- Three toggle filters show only Suno songs, YouTube videos or CDN images; with none selected all three sections appear. Not deployed to Cloudflare.
News · refined layout (local preview)
- Removed numeric badges from all song, video and image cards while keeping their dates. All cards return to the same dark fill and red action links; only their borders differ by category: violet for Suno, red for YouTube, sky blue for CDN images.
- Source links and update information for all three sections now live in the introductory description box, not beneath section headings. The local image fallback displays its verified snapshot date instead of a fabricated refresh time.
- The introduction now presents our songs, videos and images directly to fans in Rebel Girl FM’s voice; the source and update lines remain unchanged.
- All three section headings are centered above their cards.
- A temporary failure to refresh the image list no longer produces a warning above the images for visitors; the saved images and their dated source note remain visible.
New navigation
- “ABOUT US” now groups Characters, Lore, and Studio & Building in an accessible dropdown.
- “SOCIAL MEDIA” links directly to the new StorytellerZ channel overview.
New pages
- The character overview separates main and supporting characters and links to their full profiles; the duplicate introductory heading and both redundant link panels on “About Us” were removed.
- The studio page presents exterior views and every floor plan from the ground floor through floors one to five to the roof and roof terrace in a keyboard- and touch-friendly lightbox.
- The “Concert Stage” page presents four CDN stage images in an expandable gallery without claiming a permanent venue or a stage owned by the station.
- The StorytellerZ page identifies StorytellerZ as an independent collaboration partner and groups its official website and Discord in the upper information panel; the 4×3 grid below is reserved exclusively for voluntarily listed member channels and open slots.
Languages and responsive design
- All new content is available in German, English and Spanish.
- Navigation, card grids and the image viewer were checked on mobile and desktop layouts.
- Character cards now follow the approved order with centered continuation rows; the studio introduction and exterior view now use a wider, flatter layout.
- Multi-part page headings now consistently use a second accent colour; headings that were already two-coloured and single-word headings remain unchanged.
- Rebel Player now has the two-colour page heading “REBEL PLAYER”.
- Rebel Player now fully matches audio and video sources against the media index, adds the Devil, Radio Sisters and other available music-video channels, and sorts every source group alphabetically.
Toolchain
- Astro 7.3.3, Cloudflare adapter 14.3.2, Wrangler 4.135.0, and Cloudflare Workers Types 5.20260919.1 are installed.
- TypeScript remains at 6.0.3 for Astro Check compatibility.
- Astro Language Server remains compatibly pinned to 2.16.16 because 2.17.0 has a parser regression affecting the lore page.
Validation
- Astro Check, i18n, admin-security, character-lore and gallery regression checks, asset validation, the production build, and the npm security audit passed.
CDN and media index
- 42 new WebP images were uploaded additively to Cloudflare R2; existing and remote-only objects remained untouched.
- The media index now contains 1,061 audio files, 1,098 videos, 1,061 lyric files, and 778 gallery images.
- One obsolete studio floor-plan entry whose source file no longer exists was removed from the index; all current studio and floor-plan images are included.
- Image and video sitemaps were regenerated from the current media collection.
Validation
- Full R2 comparison, CDN checks, asset validation, project checks, and the production build completed successfully.
CDN and media index
- 13 new files were uploaded to Cloudflare R2; existing and remote-only objects were preserved.
- The media index now contains 1061 audio files, 1098 videos, 1061 lyric files and 737 gallery images.
- The image and video sitemaps were regenerated from the current media collection.
Characters and lore
- Every character profile now shows languages compactly in the existing metadata overview.
- Sofía speaks German, English and Mexican Spanish, but not Demonic.
- Punk-Pussycat speaks only cat language.
- Rebel Girl has basic knowledge of Demonic and is learning Mexican Spanish from Sofía.
- The lore explains Adamitic, Demonic and their linguistic relationship.
Validation
- Astro, TypeScript, i18n, security and character-lore tests, asset checks, production build and sitemap checks completed successfully.
All 16 character profiles now include a compact “Languages” row in the existing profile details with German, English, and the specified additional language skills. Rebel Girl’s basic knowledge of Demonic and her ongoing Mexican Spanish lessons with Sofía are explicitly marked as not yet fully proficient. The detailed lore profiles use the same profile-row format. The lore also explains Adamitic as God’s primordial language and describes the origin, distinctive features, and relationship of the Demonic language.
The authoritative local media collection was synchronized with Cloudflare R2 without deleting remote objects. Four WebM music videos and four WebP song covers featuring the Devil are now available. The media index now contains 1,061 audio files, 1,091 videos, 1,061 lyric files and 731 gallery images. CDN delivery, media index, sitemaps and website were verified afterwards.
Updated Astro to 7.3.2, Cloudflare adapter to 14.3.1 and Wrangler to 4.130.0. Security fixes for Sharp, SVGO, fast-uri and Browserslist. TypeScript remains on compatible 6.0.3 for Astro Check. Data processing is unchanged.
Media update
The CDN sync adds 47 previously missing files: 6 Opus audio tracks, 17 WebM videos, 6 lyrics files and 18 WebP images, including one logo. Existing media is retained.
The automatically generated website index contains 1061 audio tracks, 1087 videos, 1061 lyrics files and 727 gallery images. Image and video sitemaps are regenerated from this library.
Missing local project files were restored from the GitHub backup dated August 22, 2026. Complete saved local changes to BaseHead and the social-media page were recovered. Dependencies were reinstalled from the saved lockfile. This recovery is local only; no public deployment. Later changes without complete backups are not part of this recovery.
Image gallery
- Different spellings of Charlie folder names now collapse into one unique filter each.
- The character filter and separate song-cover filter remain available, but each appears only once.
Validation
- A new regression test checks the real
media-index.jsondata for unique normalized filters.
Fixed
The full desktop navigation was displayed from 768 pixels even though its eight menu entries and language selector could not fit into the header. This widened the entire page far beyond the visible viewport on tablets and smaller desktops.
The compact navigation now remains active below 1536 pixels. On sufficiently wide screens the header uses a larger constrained content width. Browser checks at 780, 1280 and 1536 pixels confirm that the page no longer overflows horizontally.
Maintenance and security
- Updated Nanostores to
1.5.2, Wrangler to4.125.0and Cloudflare Workers Types to5.20260822.1. - TypeScript remains on
6.0.3for compatibility with the current Astro checker. - Reviewed dependencies, security headers, external links, unsafe DOM sinks and possible secret leaks.
Validation
- Astro/TypeScript, i18n, admin security, media and sitemap checks completed successfully.
- Production build and
npm auditcompleted without known vulnerabilities. - The live website was functionally and visually checked after the Cloudflare deployment.
Media and CDN
- Synchronized the authoritative local Object Storage download collection with Cloudflare R2.
- Added 11 Opus audio files, 11 lyric files, 11 WebM videos and 10 WebP images.
- The media index now contains 1,055 audio tracks, 1,070 videos, 1,055 lyric files and 710 gallery images.
Website and discoverability
- Regenerated
media-index.json, the image sitemap and the video sitemap from the current media collection. - The German, English and Spanish website variants use the same updated media index.
- Updated the project documentation and changelog tab to version
3.6.40.
Validation
- Astro/TypeScript, i18n, security and media checks completed successfully.
- Production build and sitemap/robots checks completed successfully.
- CDN, media index and live pages were externally verified after deployment.
Documentation
- Updated the README to version
3.6.39, the current feature set and the latest verification results. - Added this release entry to the changelog tab in German, English and Spanish.
Website, app and generator
- The complete chronicle and all 16 character profiles remain consistent in German, English and Spanish.
- All 16 character pages use verified trilingual lore summaries.
- The Flutter app contains the chronicle and profiles as language-aware local assets.
- The generator loads the complete current profile into song, image and video contexts for all nine generator characters.
Validation
- Website: Astro and TypeScript check completed without errors, warnings or hints; 614 i18n keys per language.
- Media index: 1,044 audio tracks, 1,059 videos, 1,044 lyric files and 700 gallery images verified.
- Security checks and
npm audit: passed with 0 known vulnerabilities. - Production build and sitemap/robots checks: passed.
- Flutter app: analysis, 25 tests and Android debug build completed successfully.
- Generator: 84 tests and deterministic synchronization of all nine profiles completed successfully.
Dependencies
- Updated Astro to
7.2.4, the Cloudflare adapter to14.2.3, and the Preact integration to6.0.4. - Updated Preact to
10.29.8, Nano Stores to1.5.1, Vite to8.2.2, Wrangler to4.124.0, and Cloudflare Workers Types to5.20260820.1. - Tested TypeScript
7.0.2but did not adopt it because it currently breaks the Astro language server. TypeScript remains on the latest compatible version,6.0.3. - Updated transitive packages with
npm audit fix;npm auditreports 0 vulnerabilities.
CDN and media
- Verified the R2 bucket before uploading: only
robots.txtwas present. - Re-uploaded all
4,916files fromdownloads; the bucket now contains4,917objects includingrobots.txt. - Updated
media-index.jsonto1,044audio,1,059video,1,044lyrics,700gallery, and710route entries. - Updated the image and video sitemaps to
700unique images and1,059videos.
Documentation
- Synchronized the README, master configuration, tech stack, media, i18n, and changelog documentation with version
3.6.38.
Validation
npm run check: passed with 0 errors, 0 warnings, 614 i18n keys per language, and a passing admin security test.npm run check:assets,npm run build,npm run check:sitemap, andnpm audit: passed.
Local preview
- The CSP now detects local HTTP requests through loopback, private LAN addresses, and Wrangler’s simulated production domain.
upgrade-insecure-requestsis omitted locally while public HTTP/HTTPS requests retain the production protection.
Lore and characters
- The chronicle and character profiles are synchronized in German, English and Spanish with the expanded canon covering the tour, DoKomi, Wacken and Bremen performances, the app alpha, relationships, and the complete new Nuremberg radio building and studio layout.
- Each of the 16 character pages now displays a highlighted “Story at a glance” with the current, strongly condensed character canon. A dedicated regression test covers every character in German, English and Spanish.
- The Flutter app bundles the complete chronicle and every detailed profile as local assets that automatically follow the selected German, English or Spanish app language.
- The Rebel Girl FM generator loads the complete current profile unchanged for all nine generator characters into song, image and video contexts; a deterministic sync script and 84 passing tests protect the coupling.
Project packages
- Astro was updated to
^7.1.6, the Cloudflare adapter to^14.1.7and the Preact integration to^6.0.2. - Nanostores was updated to
^1.4.2, Vite to^8.2.0and Wrangler to^4.118.0. - Astro Check was updated to
^0.9.10and Cloudflare Workers Types to^5.20260801.1. - Preact
^10.29.7, Tailwind CSS^4.3.3, Astro Sitemap^3.7.3, Nanostores Preact^1.1.0and the security overridesws ^8.21.1andyaml ^2.9.0were already current. - TypeScript
7.0.2was tested but is not yet compatible with the current Astro language server. The project therefore remains on the latest working version,^6.0.3. - Node.js
24.11.1continues to meet the defined Node 24 runtime requirement.
AI content notice
- The footer now states that Rebel Girl FM is a private, non-commercial and fictional AI art project.
- The notice explains that music, voices, texts, images and videos were created entirely or partially with AI, and that the people, shows, events and stories depicted are generally fictional.
- The content is available in German, English and Spanish.
CDN and privacy
- The complete local media collection was compared with Cloudflare R2: 3,767 objects were unchanged and 14 new or modified objects were uploaded.
- The media index now contains 1,002 audio files, 1,055 videos, 1,002 lyric files and 697 gallery images.
- The privacy tab was updated in DE/EN/ES as of August 1, 2026 and aligned with the actual data flows for LocalStorage, YouTube, Twitch, Tally, and Cloudflare DPF/Standard Contractual Clauses.
Documentation
- The README, technology stack, project version and i18n key counts were synchronized with version 3.6.37.
- All AI modules and the Codex, Claude and Gemini entry files were aligned with the actual project; obsolete Song Generator and OpenRouter guidance was removed.
- Historical migrations, changelogs, local Wrangler data and still-referenced sources were deliberately retained. Only reproducible build and test caches were removed.
Security hardening
- The CSP no longer permits unused Google Fonts or YouTube frame sources, and image sources are limited to the hosts actually in use.
AI media labelling
- The video sitemap now contains the complete notice about AI-generated content and fictional people or events; the image sitemap uses Google’s currently documented
image:locformat. - Gallery, audio and video pages display the notice next to the media and additionally expose it through meta, Open Graph and structured image data.
- Search engines control the final presentation; a raw CDN file opened directly cannot technically display an additional HTML notice.
Validation
npm run check: 0 errors, 0 warnings and 0 hints; 614 i18n keys in each language.npm run build: passed with the updated Astro, Cloudflare and Vite stack.- Sitemap/robots validation: 706 routes, 697 images and 1,055 videos.
npm audit: 0 known vulnerabilities.npm run check:assets: all 32 static CDN paths passed validation.
Song generator removed
- The
/song-generator,/en/song-generatorand/es/song-generatorpages were removed. - The song-generator link was removed from the Rebel Player settings menu.
- The OpenRouter proxy, archive API, generator validation, OpenRouter configuration and generator-specific tests were removed.
- Song management used exclusively for the generator archive was removed from the disabled admin area.
- Privacy, i18n, LLM discovery, sitemap and project documentation were aligned with the new state.
- Historical changelog entries and the old D1 migration remain as version history.
CDN and media
- 3,769 local media objects were compared with Cloudflare R2.
- 3,745 files were unchanged; 24 new or changed files were uploaded successfully without deleting existing objects.
- The current media index contains 1,002 audio files, 1,049 videos, 1,002 lyric files and 691 gallery images.
Project packages
- Astro was updated to
^7.1.3, the Cloudflare adapter to^14.1.4, Tailwind CSS to^4.3.3, Nanostores to^1.4.1, Vite to^8.1.5and Wrangler to^4.114.0. - Cloudflare Workers Types were updated to
^5.20260726.1. - TypeScript remains on
^6.0.3, the version supported by@astrojs/check. npm auditreports no known vulnerabilities.
Cleanup
- Orphaned download and song-generator route folders plus local CDN/Wrangler logs were removed.
- Admin statistics no longer return unused event data.
- Dynamic cover columns are cleared without
innerHTML.
Validation
npm run check: 0 errors, 0 warnings and 0 hints; 611 i18n keys in each language.npm run check:assets: all 32 static CDN paths passed.npm run build: passed.- Sitemap/robots validation: 700 routes, 691 images and 1,049 videos.
New station schedule
06:00–09:00: The Brainless Radio Sisters; Mei during day-shift weeks.09:00–12:00: Charlie – The Voice of the South; The Devil as guest.12:00–15:00: The Brainless Radio Sisters; The Devil as guest.15:00–18:00: Charlie – The Voice of the South; Mei during day-shift weeks.18:00–21:00: Rebel Girl and Shadowman; The Little Folk Witch as guest; Mei during night-shift weeks.21:00–00:00: Rebel Girl and Shadowman; The Little Folk Witch as guest.00:00–03:00: Rebel Girl and Shadowman; Rumpelstilzchen as guest.03:00–06:00: Rebel Girl and Shadowman; The Psychotic Girlfriend as guest; Mei during night-shift weeks.
Radio function
- The Rebel Player displays the complete current station schedule directly in the Radio tab.
- Guests and Mei are identified by their respective roles.
- At every shift change, the radio queue is automatically rebuilt and shuffled from songs by the assigned hosts, guests, and intern.
- Mei’s weekly rotation follows the ISO week in the station time zone
Europe/Berlin.
Validation
npm run check: 0 errors, 0 warnings, and 0 hints.- Production build and sitemap validation: passed.
CDN and media index
- All 3,699 local CDN files were compared with the Cloudflare R2 bucket.
- 3,696 files were already identical;
Rebel-Girl-cover-259.webp,Rebel-Girl-cover-260.webp, andShadowman-cover-44.webpwere uploaded. public/media-index.jsonwas regenerated from the local object-storage source and contains 1,002 audio files, 1,009 videos, 1,002 lyric files, and 661 gallery images.- Image and video sitemaps were regenerated from the synchronized media inventory.
Dependencies and documentation
- Astro
^7.0.9, Preact^10.29.7, Vite^8.1.4, Wrangler^4.111.0, and all other installed packages match the current compatible registry versions. - TypeScript intentionally remains on
^6.0.3, the newest major version supported by the current Astro checker. - README and the AI project modules were synchronized to version 3.6.34.
Validation
npm run check: 0 errors, 0 warnings, and 0 hints.npm run check:assets: 32 CDN paths, no errors.npm audit --audit-level=moderate: 0 vulnerabilities.- Production build, sitemap check, and Cloudflare dry run: passed.
Rebel Player and station schedule
- The previously empty radio source now continuously plays songs by the characters assigned to the current shift.
- The current song pool is shuffled whenever radio is switched on, and the next track starts automatically after each song.
- The station schedule uses Berlin time and switches automatically between early, midday, day, handover and night shifts.
- The Brainless Radio Sisters and Charlie cover the day shifts. Rebel Girl, Shadowman, the Little Folk Witch, the Psychotic Girlfriend and Rumpelstilzchen form the night shift.
- As an intern, Mei alternates weekly between the day and night shifts. Her profile and lore were updated accordingly.
Dependencies and documentation
- Astro was updated to
^7.0.9, Preact to^10.29.7, Vite to^8.1.4and Wrangler to^4.111.0. @astrojs/cloudflareis now^14.1.3,@cloudflare/workers-typesis^5.20260715.1, and thewsoverride is^8.21.1.- TypeScript remains on
^6.0.3, the newest version supported by the current Astro checker. - The Workers compatibility date is set to
2026-06-24, the newest date supported by the bundled local runtime. - The build automatically removes the adapter’s obsolete
legacy_envfield, which Wrangler 4.111 no longer accepts, from the generated deployment manifest. - README, project modules, media index and sitemaps were synchronized.
Validation
npm run check: 0 errors, 0 warnings and 0 hints.- i18n: 584 keys per language.
- Song Generator security tests: passed.
npm audit: 0 vulnerabilities.
Social Media
- The former “More Channels” placeholder card was replaced with a Funkwhale card.
- The Funkwhale card links to
https://krasses.berlin/federation/music/libraries/4c2fba08-fe08-4c83-a629-550aa1faff99. - Funkwhale and Storytellerz Discord were reordered so Funkwhale appears on the left and Discord on the right.
- The texts were added for German, English and Spanish.
CDN and Backup
funkwhale.webpis stored atdownloads/Logos/funkwhale.webpand served throughhttps://cdn.rebel-girl-fm.de/downloads/Logos/funkwhale.webp?v=20260704.- The R2/CDN sync checked 3696 objects, left 3694 unchanged and uploaded 2 objects.
- README and changelog were updated to
v3.6.32.
Validation
npm.cmd run check: passed.npm.cmd run check:assets: passed.npm.cmd run build: passed.- CDN HEAD check for
funkwhale.webp:200 OK.
Dependency Update
- Astro was updated from
^7.0.5to^7.0.6. - The Astro integrations were updated:
@astrojs/cloudflareto^14.1.1and@astrojs/preactto^6.0.1. - Preact was updated from
^10.29.3to^10.29.4. - Vite was updated from
^8.1.2to^8.1.3. - Wrangler was updated from
^4.106.0to^4.107.0. @cloudflare/workers-typeswas updated to^5.20260704.1.
Documentation
- README and technical project metadata now reflect the new package set and website version
v3.6.31. - The website changelog tab reads this entry from the localized Markdown sources for German, English and Spanish.
Validation
npm outdated --json: no outdated packages.npm audit --audit-level=moderate:0 vulnerabilities.npm run check: passed.
CDN and Images
- All known CDN references from the media index, code, manifest, image sitemap and video sitemap were checked with real GET/Range requests.
- 3,679 actually used CDN URLs were validated; the final run reported
0errors and0missing local sources. - 20 affected WebP image objects were repaired or made reachable again in R2.
- The website now uses targeted cache busting with
?v=20260702-r2for these 20 image paths because the unversioned Cloudflare cache can still serve old 404 responses. - The image sitemap now generates versioned URLs for the same affected images.
Affected Areas
- Azrael and Seraphine load their team images correctly again.
- Individual song covers for Charlie, The Devil, The Little Folk Witch and Rebel Girl are referenced correctly again.
- Gallery, downloads, about page, character data and image sitemap use the same cache-busting logic.
Project Audit and Cleanup
- Temporary test artifacts such as
.playwright-cli/andtmp/were removed. .gitignorenow permanently ignores these local test/check artifacts.tsconfig.jsonexcludestmpand.playwright-cliso Astro/TypeScript no longer analyzes generated check files.- No domain/content files were blindly deleted; existing user/project changes were left intact.
Validation
npm run check:assets: passed.npm run check: passed with0 errors,0 warnings,0 hints.npm run build: passed.npm audit --audit-level=moderate:0 vulnerabilities.- Sitemap/robots check: 672 routes, 658 images, 1009 videos.
Playlists
- The playlist tab was corrected: the main list now shows all 19 playlists currently visible on Suno for
@dampferbug. - The previous reduction to only five playlists was reverted.
Rebel Girl FM - The Secret Lovenow uses its own key,heimlicheliebe.Rebel Girl FM - Their Loveremains a separate playlist with its own cover and link.- The order follows the current Suno playlist tab and the reference screenshot.
Texts and Covers
- Playlist texts in German, English and Spanish were added for the new
heimlicheliebekey. - The i18n files now contain 569 keys per language.
- All cards use existing CDN covers from
downloads/Bilder/Team/ordownloads/Bilder/playlist-cover/.
Documentation
- README was updated to version 3.6.29, 569 i18n keys per language and the complete 19-playlist list.
- The changelog tab includes this new entry in DE, EN and ES.
Validation and Deploy
npm run check: passed.npm run check:assets: passed.- Alternative Astro build to
tmp/astro-build-check: passed. - Cloudflare deploy succeeded; Worker version
56d407f7-523e-4699-afaa-7f239972f252. - Live check
/playlists:200 OK.
Playlists
- The playlist tab was matched against the current Suno playlist tab for
@dampferbug. - The shared data source
src/lib/playlistData.tsnow shows the five currently visible Suno playlists:Rebel Girl FM - The DevilRebel Girl FM - Charlie (The Voice of the South)Rebel Girl FM - The Secret LoveRebel Girl FM - Mei (The New Intern)Sunshine State FM - The Brainless Radio Sisters
- Old main cards that are no longer visible in the current Suno playlist tab were removed from the main list.
- The StorytellerZ community block remains unchanged.
Texts and Covers
- Playlist texts in German, English and Spanish were synchronized for
teufel,charlie,liebe,meiandradioschwestern. - The new cards use existing CDN covers from
downloads/Bilder/Team/anddownloads/Bilder/playlist-cover/.
Documentation
- README was updated to version 3.6.28, 566 i18n keys per language and the current playlist state.
- The changelog tab includes this new entry in DE, EN and ES.
Validation
npm run check: passed.npm run check:assets: passed.node scripts/check_sitemap.mjs: passed; 672 routes, 658 images, 1009 videos.- Alternative Astro build to
tmp/astro-build-check: passed. - Note: the regular
npm run buildwas locally blocked by a lockeddist/clientfolder withEPERM.
Program Updates
astrowas updated to^7.0.5.@astrojs/cloudflarewas updated to^14.1.0.npm outdatedreports no outdated packages after the update.npm auditreports 0 vulnerabilities.
Documentation and Website Tabs
- README and all files under
ki/were synchronized with the current project state. - The changelog tab now includes this new entry.
- The privacy tab was updated in DE, EN and ES to the current July 2, 2026 status.
CDN and Media Index
- The R2/CDN sync was run against the local object-storage structure.
public/media-index.json,public/image-sitemap.xmlandpublic/video-sitemap.xmlwere regenerated.
Validation
npm run sync:r2: passed; 3695 files checked, 3634 unchanged, 61 uploads, 0 failures.npm run sync: passed.npm run check:assets: passed.npm run check: passed.npm run build: passed.
CDN and Downloads
public/media-index.jsonwas regenerated from the current local object-storage structure.- Audio, video, lyrics and image paths still consistently point to
https://cdn.rebel-girl-fm.de/downloads/.... - The lyrics download tab uses the current
downloads/Audiostructure, matching the lyrics entries in the media index.
Rebel Player
- The Rebel Player loads
media-index.jsonclient-side and builds audio/video URLs from the current CDN base paths. - Audio, video and player-cover paths were checked against the current media inventory.
Documentation
- README and all files under
ki/were synchronized to the current project state.
Validation
npm run sync: passed.npm run sync:images: passed.npm run sync:videos: passed.npm run check:assets: passed.npm run check: passed.npm run build: passed.npm run sync:r2: passed; 3634 files checked, 3634 unchanged, 0 uploads, 0 errors.
Social Media and CDN
- The Suno and Telegram logos in the social media tab now use the
v=20260623version parameter. - This bypasses previously cached logo versions and loads the current WebP files directly from the Cloudflare CDN.
Documentation
- README, website changelog, and all files in
ki/were synchronized to version 3.6.25.
Validation
npm run check: passed.npm run check:assets: passed.npm run build: passed.- Cloudflare deployment and production smoke test: passed.
CDN and Media
- Cloudflare R2/CDN was synchronized against the local media folder: 3503 files checked, 3494 unchanged, 9 missing objects uploaded, 0 failures.
- Three Radio Sisters music videos, three Radio Sisters song covers,
Sunshine-State-FM2.webp, and the Suno and Telegram logos were uploaded. public/media-index.json,public/image-sitemap.xml, andpublic/video-sitemap.xmlwere regenerated.- Current media inventory: 897 audio files, 995 videos, 942 lyric files, and 635 gallery images.
Website and Paths
- The social media tab now includes Suno, Mastodon, and Telegram with CDN logos and localized text in German, English, and Spanish.
- Asset validation now also checks hard-coded CDN paths against the local media inventory.
- R2 object checks now run concurrently, making synchronization significantly faster.
Tooling
- Updated Astro to 7.0.0,
@astrojs/cloudflareto 14.0.0,@astrojs/preactto 6.0.0, and Vite to 8.0.16. - Updated Wrangler to 4.103.0 and Cloudflare Workers Types to 4.20260623.1.
- Removed the unused local Lighthouse dependency; Lighthouse audits remain available through
npx lighthouse. npm auditreports 0 known vulnerabilities andnpm outdatedreports no outdated direct packages.
Validation
npm run check: passed.npm run check:assets: passed.npm run build: passed.- Cloudflare deployment and production smoke test: passed.
- Cloudflare Worker version:
0fbd0eb9-790b-4a24-bd26-1acbe830c079.
CDN and Media
- Cloudflare R2/CDN was synchronized against the local media folder: 3496 files checked, 3489 unchanged, 7 missing objects uploaded, 0 failures.
- Three Charlie song covers were uploaded:
Charlie - Die Stimme des Suedens-cover-4.webp,cover-5.webp, andcover-6.webp. - Three Charlie music videos were uploaded:
Rebel Girl FM - Honky Tonk Gewitter (Live).webm,Rebel Girl FM - Mein Weg zum Mikrofon.webm, andRebel Girl FM - Staub, Schweiss und Radio-Blut.webm. downloads/Promts/bilder promt.txtwas also added to R2.public/media-index.json,public/image-sitemap.xml, andpublic/video-sitemap.xmlwere regenerated from the external downloads folder.- Current media state: 897 audio files, 992 videos, 942 lyrics files, and 631 gallery images.
Tests and Deploy
npm run check: passed.npm run build: passed.- Cloudflare Workers deploy: passed.
Charlie Reed
- Charlie’s backstory was expanded: she grew up on a ranch in the American South and found her love of country, Southern rock and honky tonk early.
- Her path to Hamburg is now clearer: a man persuaded her to move there, but the relationship did not last long.
- After the breakup, Charlie stayed in Hamburg, tried several jobs and eventually landed at a Hamburg radio station.
- Her small on-air slots as a traffic reporter, weather voice and loose voice in the day program now explain why some Hamburg listeners already knew her before Rebel Girl discovered her.
- Singing in bars after work was added as Charlie’s return to her real music before Rebel Girl found her in a small Hamburg bar.
Lore and i18n
src/content/lore/lore.mdandsrc/content/lore/figurenprofile.mdwere expanded with the new Charlie biography.- The English and Spanish lore and character profile files were updated in sync.
- The Charlie character profile and the
about.side.charlie.loretexts in German, English and Spanish were updated.
Tests
npm run check: passed.npm run build: passed.- Cloudflare Workers deploy: passed.
Song Generator
- The OpenRouter proxy now aborts hanging model requests after 8 seconds per model.
- This prevents the generator from staying stuck at
35% // SENDE AN KIwhen a free OpenRouter model does not respond. - The active free model chain was reduced to currently listed free text models.
- Unavailable models such as
moonshotai/kimi-k2.6:freeandz-ai/glm-4.5-air:freewere removed. wrangler.tomlnow usesopenai/gpt-oss-20b:freeas the preferred model andgoogle/gemma-4-31b-it:freeas fallback.
CDN and Media
- Cloudflare R2/CDN was updated with eight media objects: three Charlie music videos, three Charlie song covers,
Rebel-Girl-cover-255.webp, and the updated Charlie team image. - The local media filename
Charlie – Die Stimme des Südens-cover-1..webpwas corrected toCharlie – Die Stimme des Südens-cover-1.webpbecause Cloudflare blocked the double dot in the object key. - All eight updated CDN URLs were verified with HEAD checks and return
200 OK. public/media-index.json,public/image-sitemap.xml, andpublic/video-sitemap.xmlwere resynchronized.- Current media state: 897 audio files, 989 videos, 942 lyrics files, and 628 gallery images.
scripts/generate-image-sitemap.mjsnow writes the image sitemap atomically via a temporary file.
Tests and Deploy
scripts/test_song_generator_security.mjsnow checks the updated model chain and timeout protection.- The live endpoint
/api/song-generator/openrouterwas tested successfully after deploy: status200, modelopenai/gpt-oss-20b:free. npm run check: passed.npm run build: passed.npm run check:sitemap: passed with 637 routes, 628 images, and 989 videos.
Security Fixes
- The admin dashboard no longer renders song and media values via
innerHTML; it now creates DOM nodes and assigns dynamic text throughtextContent. - This closes the stored-XSS path from public song archive titles into the admin table.
- The OpenRouter proxy no longer treats client-provided
systemprompts as trusted model instructions. - The Worker now builds upstream messages server-side and separates user data from the system prompt with
BEGIN_USER_DATA/END_USER_DATA. - Common prompt-injection phrases such as “ignore previous instructions” or “reveal the system prompt” are blocked in song ideas.
Tests
scripts/test_song_generator_security.mjsnow checks that admin rendering does not use.innerHTML.- The same test script checks prompt-injection filters and server-built OpenRouter messages.
Validation
npm run test:song-generator: passed.npm run check: passed.npm run build: passed.
Charlie Reed
- Charlie Reed is integrated as a new day-shift host with her own character page at
/charlie. - The profile page now includes birth date
15.06.1998, role, lore, image and structured image data. - Charlie is connected to lore, the About team structure, gallery, player filters and the song-generator persona.
Gallery and Media
- Gallery and media index were updated to 624 images.
- Charlie images and Charlie song covers are served through CDN/R2.
- The side images on the About page now adapt dynamically to text and card height.
SEO
- Important gallery images now have dedicated SEO detail pages under
/bilder/.... - Gallery, character and image detail pages output
ImageObjectJSON-LD. BaseHeadnow supports multiple JSON-LD entries per page.
Validation and Deploy
npm run check: passed.npm run build: passed.- Deployment via Wrangler succeeded, current Cloudflare version:
ff8bb049-2489-4c41-80fc-ca74bf1a9c59.
About Page
- The team cards on the About page are now grouped into
Nachtschicht,Tagschichtand side characters. - The Brainless Radio Sisters were moved into the day shift.
- The day shift includes two empty placeholder cards for later entries.
- The lore panel now appears below the side-character cards.
Character Display
- Main character cards show artist names instead of legal names, including
SHADOWMANandREBEL GIRL. - Mei is displayed as
MEIin cards and as the character-page heading. - Side characters now use robust translation keys so slugs such as
punk-muschido not render raw key names.
Validation
npm run check: passed.
Update
- Updated
@cloudflare/workers-typesto^4.20260613.1. - Synchronized
package-lock.jsonwith the new package version. - Checked
npm outdated: Vite8.0.16remains intentionally excluded because the previous Astro/Cloudflare build validation failed.
CDN and Documentation
- Checked R2/CDN references for
https://cdn.rebel-girl-fm.deacross the project. - Validated
media-index.jsonin R2 mode. - Updated
media-index.json, image sitemap and video sitemap from the local object-storage source. - Ran CDN/R2 sync: checked 3,479 files, 3,467 unchanged, uploaded 12 missing objects, 0 failures.
- Updated README,
ki/MASTER.md,ki/02-tech-stack.mdandki/09-changelog.md.
Validation
npm outdated: only Vite8.0.16remains open as an intentionally skipped major update.npm audit --audit-level=moderate: still reports known tooling advisories throughesbuild/vite;npm audit fix --forcewould downgrade toastro@2.4.5and was not applied.npm run check: passed.npm run build: passed.
Tooling and Dependencies
- Updated
@astrojs/cloudflareto^13.7.0. - Updated
astroto^6.4.6. - Updated
@cloudflare/workers-typesto^4.20260612.1. - Updated
@tailwindcss/viteandtailwindcssto^4.3.1. - Updated
wranglerto^4.100.0. - Synchronized
package-lock.jsonwith the new package versions.
Compatibility
- Vite
8.0.16was installed and tested, but it breaks the Astro/Cloudflare build withrequire_dist is not a function. - Vite therefore stays on the latest compatible 7.x line,
^7.3.5.
Validation
npm run check: passed.npm run build: passed; sitemap/robots check with 96 routes, 607 images, and 977 videos.npm audit --audit-level=moderate: still reports known tooling advisories throughesbuild/vite;npm audit fix --forcewould downgrade toastro@2.4.5, so it was not applied.
Song Generator
- The topic input field in the Song Generator now shows 5 instead of 3 lines.
- Generated original lyrics are capped client-side at 5000 characters so they can be pasted directly into Suno.
- The AI prompt explicitly tells the model about Suno’s 5000-character limit.
- Archive validation now blocks lyrics and German versions over 5000 characters server-side.
Validation
npm run test:song-generator: passed.npm run check: 0 errors, 0 warnings, 0 hints; i18n remains at 525 keys per language.
Admin Backend V1
- Local admin interface prepared at
/admin, but not enabled for production. - Added protected admin APIs for session, statistics, songs, media listing, and R2 uploads.
- Cloudflare Access is expected as the protection layer;
ADMIN_ACCESS_ENABLED=0keeps the backend disabled in production. - Added D1 migration
migrations/0060_admin_backend.sqlfor media metadata and admin events.
Tooling and Cloudflare
- Updated Astro to
^6.4.4,@astrojs/cloudflareto^13.6.1,@astrojs/preactto^5.1.5, Workers Types to^4.20260607.1, and Wrangler to^4.98.0. - Set Cloudflare
compatibility_dateto2026-06-02, the newest date supported by the local Workers runtime binary. - Vite 8.0.16 was tested, but not adopted because the Astro/Cloudflare runner failed with
require_dist is not a function; Vite stays on the compatible 7.x line.
SEO, Mobile, and Security
- Admin routes are excluded from the sitemap and sitemap check.
- Song Generator security tests now also verify Admin Access headers, the admin kill switch, and admin sitemap exclusion.
- Mobile audit still shows action needed for large headlines on phone viewports.
Validation
npm audit --audit-level=moderate: 0 vulnerabilities.npm run check:assets: passed.npm run check: 0 errors, 0 warnings, 0 hints; i18n remains at 525 keys per language.npm run build: passed; sitemap/robots check with 96 routes and 596 images.
Maintenance and automation
npm run docs:syncsynchronizes README and central AI documentation from changelog, package versions, i18n keys and media index data.npm run changelog:new -- <version>creates German, English and Spanish changelog files from one consistent template.npm run check:sitemapvalidatesdist/client/sitemap-index.xml,dist/client/sitemap-0.xml,public/image-sitemap.xmlandpublic/robots.txt.npm run test:song-generatorchecks song generator validation and API security invariants.npm run checknow also runs the song generator security tests.npm run buildnow runs the sitemap/robots check after the Astro build.
Validation
npm run checkpassed: Astro 0 errors, 0 warnings, 0 hints; i18n remains at 525 keys per language.npm run buildpassed: 96 sitemap routes and 593 unique images validated.
Privacy
- The privacy policy was updated in German, English and Spanish to June 2, 2026.
- Cloudflare Workers, Cloudflare R2/CDN, Cloudflare D1, Worker logs and OpenRouter are described more precisely.
- Song generator data flows were updated: prompt processing, short-term IP processing for rate limits and D1 archive fields.
- LocalStorage, Tally feedback, Twitch, YouTube and FlagCDN were aligned with the current project state.
- The text now clarifies that Rebel Girl FM does not use tracking, Google Analytics, a tag manager or advertising profiling.
Validation
npm run checkpassed successfully.- i18n remains synchronized with 525 keys per language.
Updates
- Astro was updated to
^6.4.2, Vite to^7.3.5, Wrangler to^4.96.0and@cloudflare/workers-typesto^4.20260601.1. npm audit --audit-level=moderatereports no vulnerabilities.
Bug Fixes
- The song generator now allows
JAPANISCHserver-side in the OpenRouter proxy. The UI already exposed Japanese as a target language. - Remaining encoding artifacts were removed from the song generator system prompt.
Pentest Hardening
- Unexpected API exceptions are logged server-side but no longer returned to clients as internal error messages.
sitemap-index.xmlis now explicitly covered by the sitemap cache rule in middleware.- Checks, build, asset check, secret-pattern scan and input-filter smoke tests passed successfully.
Media and CDN
public/media-index.jsonwas regenerated fromD:\sicherheit\Daten\Webseiten\Object Storage\rebel-girl-fm.de\downloads.- The gallery now contains 593 WebP images; audio, video and lyrics remain at 897, 888 and 887 entries.
- Two new Folk-Hexe covers and five new Mei covers were uploaded directly to Cloudflare R2 in the
rebel-girl-fmbucket.
Validation
- The seven new CDN URLs respond to HEAD requests with
200. public/image-sitemap.xmlwas regenerated with 593 images.npm run check:assets,npm run checkandnpm run buildpass successfully.
Documentation
- The README and AI modules were brought up to date with Astro 6, Cloudflare Workers, R2/CDN, D1 archive, AI discovery and multilingual pages.
- The content sources now document the localized lore files in
src/content/lore/en/andsrc/content/lore/es/as well as the localized changelog files insrc/content/changelog/en/andsrc/content/changelog/es/.
Indexing
- Sitemap documentation now points to
sitemap-index.xmlandimage-sitemap.xml. - The build generates the sitemap for the current German, English and Spanish routes, including lore, changelog, downloads and character profiles.
Project Cleanup
- The no longer referenced player voting helpers
isVoted()andgetBaseVotes()were removed. - Local generated folders and dev logs were removed from the working tree;
.envandnode_moduleswere kept for deployment and local work.
Validation
npm run checkruns without errors, warnings or hints.npm run check:assetsconfirms the R2 media index.npm run buildcreates the Cloudflare Worker output without errors.
Playlists
- The Suno playlist
Rebel Girl FM - Die Hirnlosen Radioschwesternwas added to shared playlist data. - The cover uses the existing CDN path for the Radio Sisters team image.
- German, English and Spanish playlist pages now show the same new card with localized text.
Validation
npm run checkconfirms complete i18n keys for DE, EN and ES.npm run buildcreates the Cloudflare Worker output without errors.
AI Discovery
robots.txtnow setsContent-Signal: ai-train=no, search=yes, ai-input=yes.- Public HTML pages return Markdown when requested with
Accept: text/markdown. - Markdown responses remain limited to public pages;
/api/and/admin/are excluded.
Documentation
- README now describes AI discovery endpoints, the content-signal policy and intentionally unpublished OAuth, MCP and API catalog metadata.
Song Generator
EINGABE LEERENnow sits directly next toZUFALLS-SIGNAL.- The old separate button block under the input was removed.
AI Indexing
robots.txtexplicitly allows important AI crawlers for public pages and keeps/api/and/admin/blocked.llms.txtprovides a compact project map.llms-full.txtadds project identity, crawler rules, machine endpoints, main sections and character context.ai.txtpoints to the LLM and sitemap files.
Delivery
- HTML pages link the LLM files as
text/plainalternates. - Public Worker routes set
X-Robots-Tag: index, follow. - API and admin routes set
noindex, nofollow, noarchive. - HTML responses also expose the LLM files through
Linkheaders.
Cloudflare Note
- Cloudflare dashboard bot rules must allow the permitted crawlers.
- The live check showed Cloudflare-managed robot content still being prepended; that zone setting must be disabled.
CDN Assets
- Partner logos now use the existing hyphenated files.
- The logo files were uploaded again to Cloudflare R2 and are reachable through the CDN.
- Old whitespace and
%20paths are no longer emitted on partner pages.
More Robust Image Paths
- Partner pages encode logo filenames before building CDN URLs.
- Playlist pages in DE, EN and ES encode image paths segment by segment.
QA
npm run checkandnpm run buildpassed.- A live asset crawl checked 602 asset URLs without 404 errors.
Song Generator
- The
EINGABE LEERENbutton removes the current topic text and refocuses the input. JAPANISCHwas added to the language selection.- Japanese is passed to the song prompt as a real target language.
QA
npm run checkandnpm run buildpassed.
Song Generator
TRANSMISSION STARTENnow shows progress and status directly in the generator.- Validation errors, OpenRouter issues and archive errors appear under the button.
- The used OpenRouter model is shown after successful generation.
ZUFALLS-SIGNALnow accepts the legitimate scenario and cover random prompts.- If OpenRouter fails, a local fallback text is loaded.
OpenRouter and Free AI Models
- The proxy uses a fixed allowlist of free text models marked with
:free. - Paid models are blocked server-side.
- If one free model fails, the proxy tries the next one in the chain.
Image SEO and CDN
public/image-sitemap.xmlis generated frompublic/media-index.json.- Gallery pages contain crawlable image fallbacks with descriptive alt text and CDN URLs.
Privacy
- Privacy texts now describe the free OpenRouter model chain, Cloudflare Workers, D1 archive and input protection more clearly.
- The fictional-character note remains in DE, EN and ES.
- The privacy date was set to May 27, 2026.
Security Review and QA
- Non-destructive checks covered headers, origin protection, invalid prompts, size limits, script/URL filters and rate limits.
npm.cmd run check,npm.cmd run check:assetsandnpm.cmd run buildpassed.
Media and CDN
- The local downloads folder was synchronized with the Cloudflare R2 bucket.
public/media-index.jsonwas regenerated from the local object-storage structure.- The current media index contains 897 audio files, 888 videos, 887 lyric files and 586 gallery images.
npm run sync:r2is available for future R2 syncs.
Dependencies and Build
- Astro, Cloudflare adapter, sitemap, Workers types and Wrangler were updated.
- Vite remains on the compatible 7.x line.
Privacy
- The privacy page was updated to May 27, 2026.
- The AI note now mentions ChatGPT, Claude and Google Gemini.
- Fictional character, biography, role, age and lore contact details are explicitly marked as fictional.
QA
npm.cmd run check,npm.cmd run check:assetsandnpm.cmd run buildpassed.
Cloudflare Workers
- The project now targets Cloudflare Workers with the Astro runtime.
- Song-generator APIs use Cloudflare bindings through
cloudflare:workers. - Server-side code reads
OPENROUTER_API_KEY,OPENROUTER_MODELand the D1 bindingDB. - Old Pages deployment scripts were removed from npm scripts.
Song Generator
- The page is integrated into the standard site layout with header, navigation, background and language routes.
- Rebel Player links to the song generator from the gear menu.
- Character lore and fixed style rules are included in prompts.
- The generator is available in German, English and Spanish.
Security
- The proxy accepts only the expected song-generator prompt format.
- Characters, languages, moods, durations and formats are validated server-side.
- Browser and server inputs are checked against spam, random characters, links, email addresses, script code and excessive length.
- OpenRouter and archive routes have rate limits, size limits and origin checks.
- The D1 archive blocks duplicate entries for the same idea and character within 15 minutes.
Accessibility and Content
- Lore and About pages now include a browser Speech Synthesis read-aloud function.
- About was realigned to the full station, lore and StorytellerZ context.
- Image alt texts and aria labels were improved.
Rebel Player
- Playlist clicks start the selected track through the central player logic.
- Playback state, source switching and media unloading were stabilized.
- The gear menu contains a direct song-generator link.
SEO, Privacy and Maintenance
- README, privacy notes, sitemap, robots and metadata were updated.
- Temporary logs and Vite cache files were removed and added to
.gitignore.
QA
npm run checkandnpm run buildpassed.- A local non-destructive security smoke test was performed.
Lore
- The lore page now generates a chapter navigation from
##headings. - On desktop the chapter box stays visible at the side.
- On tablet and mobile it appears compactly above the content.
- Chapter links use smooth scrolling.
Playlists
- Playlist covers now use the same square image frame.
- Different source formats are cropped consistently with
object-fit: cover. - The Mei playlist now uses the real Mei image instead of the generic Rebel Girl cover.
- The change applies to German, English and Spanish.
QA
npm run checkandnpm run buildpassed.- Translation files were checked for complete keys, empty values, placeholders and playlist texts.
- An encoding issue in the About lore teaser was fixed.
Media and R2
- The local object-storage structure was cleaned up and uploaded again to Cloudflare R2.
- The
rebel-girl-fmbucket contains 3,223 objects. - Remaining PNG and WAV originals were removed after conversion.
- Current formats are
.opus,.webm,.webp,.txtand.htaccess. public/media-index.jsonwas regenerated.
Rebel Player
Mei-Die-neue-Praktikantinis available as an audio filter.- The Mei player cover points to the matching CDN image.
Playlists and Content
- The Mei and STTZ-AprilScherz Suno playlists were added.
- The lore page shows character images beside profile data.
QA
npm run checkandnpm run buildpassed.
Content and Lore
- The old story workspace was moved into the production content structure.
- The chronicle now lives in
src/content/lore/lore.md. - Official character profiles are available as lore source in
src/content/lore/figurenprofile.md. - Main and side characters have Markdown files under
src/content/characters/.
Character Profiles and About
- The About page now loads characters from the Characters collection.
- Main and side characters are sorted through
category. - Mei was added as a main character and Punk-Muschi moved to side characters.
- Character pages are connected for German, English and Spanish.
Internationalization
- Translation files were synchronized.
- All three languages contain 439 translation keys.
CDN and Media Index
scripts/sync.jscan build the media index from a local object-storage structure.- Gallery scanning is recursive and CDN paths are encoded safely.
Rebel Player
- The fallback image, first loading state and cover URL handling were fixed.
SEO, Security and QA
robots.txtand security headers were cleaned up.npm run checkandnpm run buildpassed.
Build Tooling
- A new
.nvmrcwith24is used by Cloudflare Pages, GitHub Actions and local node managers. .npmrcnow containslegacy-peer-deps=true, solving the TypeScript 6 and@astrojs/checkpeer dependency conflict.
Stack Consistency
- All four partner projects now use the same build base: Node 24 plus npm with
legacy-peer-deps.
Privacy
- The privacy date was updated to April 25, 2026 in DE, EN and ES.
No Content Changes
- Codebase and i18n keys remain unchanged.
Synchronization Release
This entry documents the language rollout for the three partner projects. Rebel Girl FM already had the DE/EN/ES feature set and served as the reference.
Partner Projects Expanded
- dampferburg: New Spanish routes, three inline SVG flags and sitemap i18n.
- dampfermessen: Around 150 new Spanish translation keys and a third flag button.
- noob-town: Spanish as third language with a GDPR-friendly inline flag switcher.
Rebel Girl FM as Reference
The established src/i18n/{de,en,es}.ts pattern served as the model for the other projects.
No Local Code Changes
- The Rebel Girl FM codebase stayed unchanged.
- The privacy date already matched April 24, 2026.
Cloudflare Automation
- A new
wrangler.tomlwith R2 bucket binding was added. npm run setup:cloudflarechecks and creates Cloudflare resources through the CLI.- The setup script uses
npx wranglerfor cross-platform reliability.
Feedback Fallback
- If the Tally form is blocked, a notice with a direct link appears after five seconds.
- Three new translation keys were added per language.
Character Rename
- Dieter Lauerbach was renamed to Karl Lauerbach across translations and documentation.
Dependency Updates
- Astro, TypeScript, Wrangler, Tailwind and Vite dependencies were updated.
CSS and Build Fix
- A Tailwind
@sourcedirective was removed to avoid a rolldown build issue.
Unified Stack
- Rebel Girl FM now shares the same base stack with the partner projects.
Privacy
- The privacy date was updated to April 24, 2026.
Feedback Page
- New
/feedback,/en/feedbackand/es/feedbackpages with embedded Tally form. - The popup button was replaced by an inline form for better privacy and UX.
- Footer feedback links and translation keys were added.
Favicon
- Favicon was moved to the CDN WebP file.
- Duplicate SVG favicon entry was removed.
AI Documentation
- The old docs were replaced by 16 structured modules.
CLAUDE.mdwas updated for the new module structure.
Privacy Update
- A new Tally.so third-party section was added in DE, EN and ES.
- The privacy date was updated to April 19, 2026.
Cleanup and Fixes
- Decap CMS was removed.
- Hero components hydrate faster.
- Video path filtering and ES gallery routing were corrected.
Complete Astro 6 Migration
- The project moved from static HTML/JS to Astro 6, Preact and Tailwind CSS v4.
- 85 pages are now generated with better performance, security and SEO.
- Interactive player, gallery and filters run as isolated Preact islands.
- Nanostores provide global playback state.
- Character profiles and changelog use Astro Content Collections.
- Page transitions run through
<ClientRouter />.
Persona Updates
- A new sexuality field was added to all persona pages.
- All values were translated into German, English and Spanish.
- Persona pages now include structured
PersonJSON-LD.
Rebel Player
- A music-video playlist group was added to the video area.
media-index.jsonis loaded client-side to avoid hydration issues.- A loading indicator appears during player initialization.
SEO and Performance
- RadioStation JSON-LD, OG image dimensions, Twitter/X tags and PWA manifest were added.
- Persona images use eager loading where needed.
- The footer and robots.txt were improved.
Security and Fixes
- CSP was expanded for the media CDN.
- Character image URLs, OG image URLs, playlist loading and deployment settings were fixed.
AI Documentation
CLAUDE.mdand theki/documentation folder were added for AI assistants.
Cloudflare R2 Migration
- All media files are now delivered through
cdn.rebel-girl-fm.deinstead of the local repository. - Media is cached and delivered globally through Cloudflare.
- The
public/downloads/folder was removed from the Git repository.
Cleanup
- Old MP4, WAV and PNG files were removed; only WebM, Opus and WebP remain.
- One-off PowerShell conversion scripts and temporary artifacts were removed.
- TypeScript hints and warnings were resolved.
Updates
- Astro, Preact and security-related dependencies were updated.
- The
zimport was migrated toastro/zod.
Fixes
- Lyrics indexing was corrected from
Audio/toSongtexte/. - A Unicode error in the StorytellerZ logo filename was fixed.
- The Ex-Freund image was added to persona and About pages.
- Teufel’s age display was shortened.
Privacy
- The privacy policy now mentions Cloudflare R2 as the media CDN in all three languages.
Media Updates
- New assets for Stalkerin, Stalker and the Radio Sisters were added and converted to WebP.
- Generated persona images were connected to the matching side-character pages.
- Old PNG files were removed and the media index was rebuilt with
sync.js.
Persona Lore
- All persona pages now show the full background story from the AI prompts.
- A color-matched “Lore:” heading appears before each lore text.
- Older description and story blocks were removed, leaving lore as the main body text.
Persona Data
- Age is now displayed as
DD.MM.YYYY (X years). - Genres were updated to the top three genres from the AI prompts.
- Duplicate role display was removed.
Layout Improvements
- Persona images now fill the full height of the info box.
About and i18n
- The About page received lore-based persona descriptions in DE, EN and ES.
- Translation files were synchronized to 372 keys per language.
- The i18n check script now also detects double-quoted values.
Dependencies and Config
- Astro, Preact and TypeScript path config were updated.
- README was rewritten with project documentation.
SPA Routing Rewrite
- Dual-mode routing: Production uses clean URLs; other environments use hash routing and remain F5-safe.
useCleanUrls()function: Detects the production domain and controls URL handling.- Universal URL detection: Handlers evaluate hash, path and
?p=parameters. - Second
popstatehandler: Added path fallback for clean URLs.
Bugfixes
- Fixed file-not-found errors when pressing F5 on tabs.
- Tabs respond to clicks again.
- Removed a duplicate
}syntax error in the firstpopstatehandler.
Picture Fallback and Media Conversion
- All 52 images received WebP
<source>plus JPG<img>fallback. - 397 JPG fallbacks were generated, 6 MP4 files converted to WebM and 7 PNG duplicates removed.
- Format pairs are complete: Opus/MP3, WebM/MP4 and WebP/JPG.
Character Profiles
- Profiles for Rebel Girl, Shadowman, Folk-Hexe, Punk-Muschi, Freundin and Rumpelstilzchen were added.
i18n Synchronization
- New label keys, duplicate fixes and 29 missing ES keys were added.
- Full coverage: 308 translation keys for DE, EN and ES.
Bugfixes and Routing
- Local file system routing: Hash fallback for local direct page access.
- OnLoad SPA reset: Removed an outdated event listener.
- i18n completion: Missing error-page headings added for DE and ES.
- Asset validator: Fixed an incorrect regex in
check_assets.js.
Compliance and Hosting
- GDPR update: Complete revision of the privacy policy in DE, EN and ES.
- Cloudflare migration: Hosting through Cloudflare Pages and GitHub.
Media and Twitch Integration
- Twitch live streaming: Seamless player integration.
- Auto UI adaptation: Controls are hidden automatically during live streams.
Major Feature Update
- Clean URLs: Full switch to modern routing with the History API.
- Hierarchical playlists: Deeper folder structure for audio sources.
- Modern language selector: Header dropdown for DE, EN and ES.
Security Audit and Hardening
- HTTP security headers, CSP, Permissions-Policy and XSS mitigation.
UX and Accessibility
- Contrast update, focus indicators and revamped 404 page.
Security and Accessibility
- Security hardening: Initial hardening for security headers.
- WCAG compliance: Contrast update for better readability.
- Clean URL setup: Initial setup via 404 redirect.
Global and Accessible
- Full multilingual support: Complete localization through i18n.
- ARIA implementation: Fully translated ARIA labels.
Player and Engine Update
- Playback modes: Shuffle and repeat functions.
- Deduplication: Automated cleanup of redundant media formats.
First Implementation
- Initial routing: SPA hashes and video deduplication.
- Persona integration: Shadowman, Freundin and Rumpelstilzchen playlists.
Performance Push
- Lazy loading, WebP and WebM for faster page and media loading.
Initial Release
- Basic SPA with player, gallery and social features.