Changelog
v1.15.1
Gallery width fix. The new one-per-row gallery was running wider than the rest of the site and throwing the page off. It now lines up properly. Still one image per row, still full uncropped widescreen.
v1.15.0
Full-width cinematic gallery, and the night the lich came back.
- One image per row. Scene images are cinematic widescreen now, and the old two-up grid was shrinking them. Each scene gets the full width, and since they run in story order the gallery reads like a storyboard of the session.
- Bigger, and no longer cropped. The gallery was quietly cutting the sides off every widescreen image to squeeze it into a square. Fixed. You are seeing the whole frame for the first time.
- July 16 session. Mexoz is back. They killed him again. It will not stick, and there is now a second Moonstone Crown. Full gallery and a "Previously on..." recap over a new crypt-dread track.
- Better recovered audio. Two stretches of the July 16 recording were garbled and nearly lost, including the entire Moonstone Crown reveal. Both were recovered and the bug that hid them is fixed.
- Square character avatars for everyone to drop into their D&D Beyond sheets.
v1.14.0
Cinematic 16:9 gallery, a new image and motion pipeline, two new heroes.
- Widescreen gallery. Scene images are now 16:9 cinematic, matching the video.
- New look. A more detailed cel style (Legend of Vox Machina) with real cinematic camera framing per scene.
- Two new party members. Cartman Sandiego (white dragonborn paladin) and Wrathgar (mountain-man ranger) join the roster; Shirley retired after his heroic death.
- First animated scene. Scene 3 of the July 2 gallery plays a motion clip on hover, our first storyboard-animated card.
- July 2 session with a full gallery and a "Previously on..." recap over a new graveyard-exploration music track.
v1.13.4
Changelog page rendering fixes.
- Entries without bullet items (like v1.13.3) now render their lede line as a subtitle.
- Inline
boldand `code` markdown renders properly instead of showing literal asterisks.
v1.13.3
Oggy crop touch-up. Tighter zoom + a bit of breathing room above his dreadlocks.
v1.13.2
Portrait crop final pass.
- Caelum's hair no longer clips against the top of his card.
- Orion and Oggy zoomed a touch tighter so their faces match the rest of the roster.
v1.13.1
Homepage portrait retune + hero Kimber-sword fix.
- Uniform face size across all 6 portraits. First pass kept Shirley's face dominant while the others looked zoomed-out. Crops retuned so all faces fill a similar share of each card.
- Hero regenerated. v3 gave Kimber a sword; v4 explicitly reserves the Shadow Blade to Oggy. Kimber's hands now swirl bardic sigils.
v1.13.0
Oggy locked, uniform homepage portraits, mobile hero fix.
- Oggy is officially LOCKED (Jesse-approved). The canonical reference is now the full-body pantless variant because the no-pants gag is canon and full-body framing gives scene gen more to anchor on. Illusion-pants variant kept as a secondary for town scenes.
- Homepage portraits unified. All 6 characters now use the same tight Shirley-style bust crop. Caelum noticeably tighter. References stay full-body, homepage portraits are decoupled bust crops via a new
scripts/crop-homepage-portraits.mjs. - Removed portrait card bottom-fade gradient. The overlay was eating detail without adding anything.
- Mobile hero autoplay fixed. iOS Low Power Mode auto-reports reduced-motion, which used to hide the cinemagraph entirely. The hide rule is gone (the ambient loop isn't motion-reduce-worthy) and a JS
.play()safety call handles iOS Safari's autoplay race. - Hero regenerated with new Oggy. New
group-action-v3.webp+ new cinemagraph loop. Oggy visible in the back-left with his purple-black Shadow Blade. - May 21 gallery refreshed. Scenes 4, 6, and 7 (the three with Oggy) regenerated as both still images and videos using the new locked reference.
v1.12.0
6-character cinematic hero + cleaner party grid.
- Homepage hero now features all 6 main party characters (was 4) in a 16:9 cinematic banner. Cinemagraph: Voltedge lightning crawls, Destone runes pulse, Kimber's bardic sigils swirl, embers drift, fur and cloth micro-drift.
image == end_imageloop anchor keeps the seam invisible. - Hero container: 4:3 → 16/9. More banner-y, less of a square block.
- Diego (Maxi) hidden from party grid while on hiatus. Clean 3×2 of the 6 active characters.
v1.11.0
Portrait-forward party roster + image-generation style consistency.
- Homepage party section redesigned: full 2:3 portrait cards replace the tiny avatar circles (3×2 grid on desktop, 2-col tablet, 1-col mobile). Each card features the character's portrait with accent-colored top border, hover lift + scale + glow keyed to their accent color.
- New
/portraits/directory: WebP portraits for Caelum, Orion, Kimber, Idril, Shirley, Oggy. Diego placeholder card while his portrait is pending. - Image generation style consistency:
scripts/generate-images.jsnow auto-includes locked character portraits as input refs to GPT Image 2'simages.editendpoint whenever a scene mentions a registered character. Anchors both style AND likeness across sessions. Newscripts/lib/style.jsis the canonical source of the v4 style block and locked-portrait registry. - Orion portrait LOCKED (David-approved). Oggy v2 generated using locked Orion + Idril as style refs (pending Jesse's approval).
v1.10.0
Animated hero.
- Homepage hero swapped from the static d20 image to a looping cinemagraph of the four canon-locked party members mid-combat. Source: GPT Image 2 group portrait → Seedance 2.0 i2v with
imageandend_imageboth pointing at the same frame to anchor the loop. Cinemagraph motion-only prompt (lightning crawling on Voltedge, embers, magical sigils swirling) keeps the seam invisible. - Video assets:
/video/hero-loop.mp4(2.2 MB, audio stripped, H.264 CRF 26, +faststart),/hero-poster.webp(179 KB first-frame poster). - Hero markup:
<video autoplay muted loop playsinline preload="metadata">with the poster image as fallback.prefers-reduced-motion: reduceusers see the static poster only. - New canon: player-approved visual descriptions locked for Caelum, Kimber, and Shirley.
- New scripts:
scripts/generate-portraits.jsandscripts/generate-group-portrait.js.
v1.9.1
Cinematic recap on the Recap page.
- Recap page now embeds the stitched session video at the top as a "Cinematic Recap" section (no autoplay, uses the first scene image as poster). The "Previously on..." narration audio stays below it, both sections labeled and described.
- Gallery page gets a "Watch the full cinematic recap →" link below the grid that deep-links to the recap page.
- New optional
recapVideofield on the player-summary frontmatter (string path). When unset, both surfaces hide gracefully. - May 7 session is the first session with a published recap (
/video/sessions/2026-05-07/recap-full.mp4, 49 MB, 1:40).
v1.9.0
Animated session gallery.
- Session gallery cards now play their Seedance i2v video clips on hover (muted, looped) and open the full clip with audio in the GLightbox lightbox on click. Backward-compatible: cards without a
video:frontmatter field still render as still images. - "Click for sound" badge in the top-right of each animated card. Keyboard focus, touch tap-and-hold, and mouse hover all trigger the preview.
- New
scripts/stitch-video.jsfor local recap stitching:node scripts/stitch-video.js YYYY-MM-DDconcats everyscene-XX.mp4into a single.video/stitched/YYYY-MM-DD-recap-full.mp4via ffmpeg stream-copy (re-encode fallback if codecs ever drift). Local-only, not shipped to the site. - May 7 session shipped as the first fully animated gallery (10 scenes × 10s at 720p with synchronized audio via
infsh app run falai/seedance-2-i2v). - Schema: optional
videofield added to the image entry insite/src/content.config.ts..gitignoreextended to cover.video/and*.mp4/*.mov/*.webmso video assets ship to Vercel via the CLI like audio. - CLAUDE.md Future Improvements updated: Seedance i2v marked VALIDATED, and a new "narrated video recap" idea captured for a stitched + voiceover cinematic recap.
v1.8.0
Pipeline infrastructure overhaul.
- New
/process-audioslash command wrappingscripts/process-audio.shfor consistency with/process-sessionand/narrate - Mono 16kHz audio compression in process-audio.sh and transcribe-cloud.sh (down from 48kHz stereo). 4x smaller files, more reliable for
gpt-4o-transcribe, native format for both Whisper and GPT-4o - Transcription research doc (
docs/mechanics/transcription-research.md), full A/B testing of whisper-1 vs gpt-4o-transcribe vs gpt-4o-mini-transcribe vs WhisperX. Documented gpt-4o-transcribe's repetition hallucination loops, WhisperX's prompt-injection hallucinations, and silent failure modes. Reverted default to whisper-1. - Open SDK migration:
openai6.29.0 → 6.38.0,dotenv17.3.1 → 17.4.2 - Google SDK migration: deprecated
@google/generative-ai→@google/genai^2.5.0 - OpenAI image model:
gpt-image-1→gpt-image-2in scripts/generate-images.js (released April 21, 2026) - Animation style R&D complete (
.audio/test-style/README.md): v4 prompt validated for western fantasy animation key-frame aesthetic via GPT Image 2 + Seedance 2.0 i2v - Character reference workflow introduced: per-character locked refs in
docs/characters/image-references/. Idril locked as the first (April 16, 2026, Cary's approval). Process documented for the remaining characters. - May 7 session shipped with the new animation style as the first session in the new aesthetic
- Mexoz Valaryn lore canonized: corrected from "Mexos" + added the full DM-read backstory: Serath-Kul empire origin, Black Pilgrimage 40-year wandering, The Ebon Gospel fragments with missing final pages
- Session gallery cleanup: removed the NB2 / GPT Image 2 model toggle from
site/src/components/ImageGallery.astro. Sessions now ship a single set of images in the animation style. The--model nb2|proflags remain inscripts/generate-images.jsfor ad-hoc use. Legacysrc_nb2field kept on the schema as optional so older session frontmatter (Mar 12, Apr 9) still parses without error.
v1.7.1
- Background ambient music mixed into narration via ElevenLabs Music API + ffmpeg
- New mix-narration.js script with configurable volume, intro/outro delay, fade in/out
- Voice-only narration preserved as backup (*-narration-voice.mp3)
- April 9 narration updated with mixed version (dark medieval ambient track at 30%)
- ElevenLabs client timeout bumped to 120s for longer scripts
v1.7.0
- Narration recap promoted to first-class UI: Recap tab in session navigation (conditional, like Gallery)
- "Previously, on Mostly Mortals..." featured card on homepage above session listing
- Headphones badge on session cards linking directly to recap page
- Recap page now uses Session layout with full tab navigation (was standalone Base layout)
- Recap page is now discoverable (removed noindex, shareable URL)
- New LatestRecap.astro component auto-selects most recent narrated session
- Session card markup refactored to support independent badge link
v1.6.2
- Structured image prompt recipe (INPUTS, CHARACTER REFERENCES, CORE COMPOSITION, VISUAL EFFECTS, COLOR SYSTEM, STYLING, LAYOUT DETAILS, CONSTRAINTS, NEGATIVE)
- Recipe documented in docs/mechanics/image-prompt-recipe.md
- generate-images.js updated to parse recipe format (backwards compatible with legacy)
- All 9 session images regenerated with recipe prompts (GPT + NB2)
- Storytelling captions replace technical descriptions in gallery
- /process-session updated to use recipe format and separate captions from prompts
v1.6.1
- Phased validation in /process-session (3 phases: Combat & Events, Items & Quests, Best Moments & Images)
- Deep banter pass: best moments now explicitly extracted as Quotable Quotes, D&D Highlights, and Table Culture
- Audio pipeline auto-detects garbled Whisper chunks and retries with WhisperX fallback
- Unified audio pipeline script (process-audio.sh) with .audio/ directory structure
- WhisperX venv rebuilt for current project path
v1.6.0
- Added Session Stats bar to player summary page (crits, fails, kills with Lucide icons)
- Stats extracted from transcript during /process-session with validation pass
- Stats stored as optional frontmatter in player-summary files
- DM stats section shown only when DM rolled crits or fails
- Cleaned up duplicate site/openspec directory and added working directory rules to CLAUDE.md
v1.5.0
- Every present character now guaranteed inclusion in Player Summary, Session Gallery (8-10 images), and narration recap
- Image prompt count bumped from 6-8 to 8-10 to ensure full party coverage
- Pipeline instructions updated to flag missing characters during validation
v1.4.2
- Added collapsible "Read the narration" transcript on recap page
- Narration text cleaned of Audio Tags and SFX markers for readable display
v1.4.1
- Fixed dark mode audio player visibility on recap page (inverted controls for contrast)
v1.4.0
- Added "Previously on Mostly Mortals..." AI narration via ElevenLabs v3
- Custom "Old Adventurer" voice designed in ElevenLabs Voice Design for v3
/narratecommand generates dramatic recap scripts with v3 Audio Tags ([excited], [sarcastic], [curious], [sighs], [whispers], [clears throat])- Three voices available: Old Adventurer (default), Clint, Oxley via
--voiceflag - Hidden
/recappage for sharing narrations with players (noindex, not linked) - NarrationPlayer component with Grimoire-themed audio player
- Script review and approval step before audio generation
v1.3.2
- Extended left page edge effect (spine line + gradient) through footer for seamless visual flow
- Updated site URL to custom domain mostly-mortals.bydom.io
v1.3.1
- Added MM shield logo to site navigation bar
- Added favicon, apple-touch-icon, and PWA icons generated from logo
- Added web manifest for mobile "Add to Home Screen"
- Added OG and Twitter card meta tags using hero image for link previews
v1.3.0
- Added Quest Log with accordion UI, Lucide icons, status badges, progress fractions
- Added "Current" quest highlighting with gold glow
- Added manual sort order for quests via
sortOrderfield - Added Hooks & Leads section with CircleHelp icons
- Added section navigation (Party / Quests / Hooks / Sessions) with smooth scrolling
- Added completed quests section at 50% opacity
- Migrated 7 quests from knowledgebase to structured content collection
- Updated
/process-sessionwith quest extraction, validation, and dual-file updates
v1.1.0
- Added AI image generation pipeline (
scripts/generate-images.js) - Added GPT Image 1.5 (default), Nano Banana 2, and Nano Banana Pro model support
- Added
--compareflag for side-by-side model testing - Added Session Gallery page with GLightbox for full-size viewing
- Added GPT Image 1.5 / Nano Banana 2 model toggle on gallery
- Added image prompt extraction with framing types (wide/closeup/extreme) to
/process-session - Updated content schema with optional
imagesarray - Generated 6 images for March 12 cemetery/Mexoz session
v1.0.0
- Initial release of the Mostly Mortals campaign website
- Astro static site with "The Grimoire" parchment theme (dark/light toggle)
- Homepage with hero banner, party roster, and session list
- Player Summary, Best Moments, and hidden DM Summary pages
- Session Timeline and Detailed DM Timeline sections
- Content collections with Zod schema validation
- Manual deploy to Vercel via CLI