CHANGELOG Rebel Girl FM
v3.6.35 2026-07-16
Schedule changed to eight fixed three-hour shiftsShift radio now plays only the characters assigned to each time slotMei continues to alternate weekly between day and night shiftsThe Radio tab now shows the complete station schedule without clipped shiftsSearch and track list remain hidden in the Radio tabAudio and video track lists now extend closer to the bottom of the player boxThe privacy policy now fully documents the native Android/iOS app
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.
v3.6.34 2026-07-15
CDN and media index fully synchronizedThree missing song covers uploaded to Cloudflare R2Project dependencies checked for updates
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.
v3.6.33 2026-07-15
Continuous shift radio in the Rebel PlayerMei alternates weekly between day and night shiftsAstro, Cloudflare and frontend packages updated
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.
v3.6.32 2026-07-04
Funkwhale added to the social media tabCDN/R2 and project documentation updated
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.
v3.6.31 2026-07-04
Frontend and Cloudflare tooling updatedREADME and changelog updated to the latest package set
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.
v3.6.30 2026-07-02
CDN image paths fully checked and repairedProject audit and cautious cleanup completed
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.
v3.6.29 2026-07-02
Playlist tab corrected to all 19 Suno playlistsREADME and changelog updated to the corrected playlist state
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.
v3.6.28 2026-07-02
Playlist tab synchronized with the current Suno playlistsREADME and changelog updated to the new playlist state
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.
v3.6.27 2026-07-02
Updated Astro and the Cloudflare adapter to the latest versionsSynchronized README, privacy, changelog and AI project documentation
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.
v3.6.26 2026-06-24
Media index, CDN paths and sitemaps resynchronizedREADME, changelog and KI project documentation updated
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.
v3.6.25 2026-06-23
Suno and Telegram logos updated with cache bustingREADME, changelog, and AI project documentation synchronized
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.
v3.6.24 2026-06-23
CDN/R2 and media index updatedSocial media tab extended with Suno, Telegram, and MastodonAstro 7, Vite 8, and Cloudflare tooling updated
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.
v3.6.23 2026-06-17
CDN/R2 media state updatedNew Charlie covers and Charlie videos uploadedMedia index and sitemaps updated
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.
v3.6.22 2026-06-17
Charlie Reed lore expandedRanch and Hamburg backstory addedMultilingual character and about texts synchronized
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.
v3.6.21 2026-06-16
Song generator live hang fixedOpenRouter free model chain updatedTimeout protection added for OpenRouter fallbacksCDN/R2 media state updated
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.
v3.6.20 2026-06-15
Admin dashboard hardened against stored XSSSong generator hardened against prompt injectionSecurity regression tests extended
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.
v3.6.19 2026-06-15
Charlie Reed fully integratedGallery and Rebel Player extended with CharlieImage SEO added with detail pages and ImageObject JSON-LD
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.
v3.6.18 2026-06-14
Reworked About team structureShortened Mei display nameUpdated README
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.
v3.6.17 2026-06-14
Updated Cloudflare Workers TypesRevalidated CDN and media index statusSynchronized README and project documentation
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.
v3.6.16 2026-06-13
Project dependencies updatedAstro, Cloudflare adapter, Tailwind, and Wrangler bumpedVite 8 tested and not adopted because of a Cloudflare build failure
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.
v3.6.15 2026-06-12
Song Generator adjusted for Suno lyrics limitTopic input field expanded by two linesArchive validation added for 5000-character lyrics
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.
v3.6.14 2026-06-07
Cloudflare-native Admin Backend V1 prepared locallyAstro, Cloudflare adapter, Workers Types, and Wrangler updatedAdmin protection, sitemap exclusion, and tests expanded
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.
v3.6.13 2026-06-02
Project maintenance checks and documentation sync addedSitemap/robots validation and song generator security tests automatedAI documentation and script output normalized to clean ASCII output
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.
v3.6.12 2026-06-02
Privacy tab updated to June 2, 2026Cloudflare, OpenRouter, D1 and LocalStorage documented more preciselyTracking and profiling clarifications added
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.
v3.6.11 2026-06-01
Dependencies updated and npm audit cleanJapanese enabled server-side for the song generatorAPI error responses and sitemap cache handling hardened
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.
v3.6.10 2026-06-01
Media index updated from the local Object Storage downloads folderSeven new song covers uploaded to Cloudflare R2Image sitemap regenerated with 593 images
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.
v3.6.9 2026-06-01
README and AI project documentation updatedMultilingual lore and changelog sources documentedSitemap state refreshed for the current DE/EN/ES routes
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.
v3.6.8 2026-05-28
Unused voting helpers removedLocal build and cache artifacts cleaned upProject checks rerun after cleanup
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.
v3.6.7 2026-05-28
Suno playlist for the Radio Sisters addedTeam CDN cover used for the new playlistPlaylist texts synchronized for DE, EN and ES
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.
v3.6.6 2026-05-28
Content signal for AI use added to robots.txtMarkdown negotiation enabled for public HTML pagesAI discovery documentation updated in README
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.
v3.6.5 2026-05-28
Song generator buttons placed next to each other at the topAI crawler permissions expanded in robots.txtllms.txt, llms-full.txt and ai.txt added for AI assistantsWorker headers and head links added for machine processing
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.
v3.6.4 2026-05-28
Partner logo paths corrected to hyphenated filenamesPlaylist and partner CDN URLs encoded robustlyLive asset crawl passed without 404 errors
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.
v3.6.3 2026-05-27
Song generator expanded with clear-input buttonJapanese added as song target languageREADME and changelog updated
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.
v3.6.2 2026-05-27
Song generator expanded with progress displayOpenRouter switched to a free text-model fallback chainRandom signal fixed and protected with local fallbackImage SEO improved with image sitemap and crawlable gallery fallbacksPrivacy, README and security checks updated
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.
v3.6.1 2026-05-27
R2 CDN synchronized with local downloads folderMedia index and new images updatedProject packages and Wrangler updatedPrivacy note for fictional AI characters added
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.
v3.6.0 2026-05-21
Astro 6 moved to Cloudflare WorkersSong generator integrated with OpenRouter and D1 archiveAPI and input hardening implementedLore and About pages expanded with read-aloud functionRebel Player play/pause and track switching stabilizedSEO, privacy and project documentation updated
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.
v3.5.2 2026-05-20
Lore page expanded with chapter navigationPlaylist covers formatted consistentlyMei playlist now uses a real Mei imageTranslations and encoding checked
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.
v3.5.1 2026-05-20
R2 object storage fully synchronized with local downloads structureOld PNG/WAV formats replaced by WebP/OpusMei added to Rebel PlayerPlaylists and lore display updated
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.
v3.5.0 2026-05-19
Lore and character profiles centralized in src/contentAll characters connected as Markdown profiles with DE/EN/ESCDN structure and media index updatedRebel Player loading and cover fixesRobots.txt and security headers cleaned up
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.
v3.4.1 2026-04-25
Node 24 as standard.npmrc with legacy-peer-deps=true for CI compatibilityPrivacy date updated to April 25, 2026
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.
v3.4.0 2026-04-24
Stack alignment: Rebel Girl FM remains the DE/EN/ES referenceAll four partner projects now support three languagesi18n, privacy and changelogs synchronized
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.
v3.3.0 2026-04-24
Cloudflare setup scriptAdblocker fallback for Tally feedbackStalker renamed from Dieter to Karl LauerbachTypeScript, Astro and Wrangler updatesPrivacy date updatedUnified stack with partner projects
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.
v3.2.0 2026-04-19
Feedback page with Tally inline embedAI documentation expanded to 16 modulesPrivacy: Tally.so section addedFavicon moved to CDNHydration and video path fixes
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.
v3.1.0 2026-04-08
Complete Astro 6 migrationSexuality field for all personasMusic video playlists in Rebel PlayerSEO and PWA optimizationAI documentationBugfixes for character images and player playlists
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.
v3.0.0 2026-04-07
Media migration to Cloudflare R2 CDNOld formats removedCode cleanup and dependency updates
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.
v2.9.5 2026-04-05
New images for side charactersImage conversion from PNG to WebP
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.
v2.9.4 2026-04-03
Persona lore on all profile pagesAbout page with lore descriptionsi18n 372 keys x 3 languagesDependency and config updates
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.
v2.9.3 2026-03-24
SPA routing rewrite (dual mode)F5 error fixedBroken tab click fixed
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.
v2.9.2 2026-03-24
Picture fallback and media conversionCharacter profiles with data blocksi18n synchronization (308 keys x 3 languages)Astro migration plan created
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.
v2.9.1 2026-03-21
Local file system routing fixi18n completion (284 keys)Asset validator correction
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.
v2.9.0 2026-03-17
GDPR updateTwitch live streaming integrationCloudflare migration
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.
v2.8.0 2026-03-16
Clean URLs (History API)Hierarchical playlistsSecurity audit and hardeningWCAG compliance
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.
v2.7.0 2026-03-16
Security hardening (HSTS/CSP)WCAG compliance (contrast update)Clean URL setup via 404 redirect
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.
v2.6.0 2026-03-16
Full multilingual support (DE, EN, ES)Shuffle and repeat functionsARIA implementation
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.
v2.5.0 2026-03-14
Initial routingPersona integration
First Implementation
- Initial routing: SPA hashes and video deduplication.
- Persona integration: Shadowman, Freundin and Rumpelstilzchen playlists.
v2.0.0 2025-12-23
Lazy loadingWebP and WebM support
Performance Push
- Lazy loading, WebP and WebM for faster page and media loading.
v1.0.0 2025-12-19
Initial releaseBasic SPA with player, gallery and social features
Initial Release
- Basic SPA with player, gallery and social features.