Skip to content

Web App Private Preview

The web app is a private-preview Blazor Server experience deployed to app.jickleji.me. This first slice is protected by one shared site password and focuses on published campaign portals: / shows campaign cards for campaigns with published sessions, and each campaign links into a campaign overview, session archive, session overview, session recap, and generated hero images. It is intentionally named and deployed as the broader web app because future player and DM features will live here too.

Access model

  • Jime:Web:SitePassword gates the entire site, including /.
  • Successful entry sets a secure, HTTP-only cookie for 30 days by default.
  • Static assets, password endpoints, health, and error pages bypass the gate.
  • Player accounts and invite onboarding are intentionally out of the first launch path.

Publishing workflow

  1. Ingest or transcribe a session document.
  2. Create a dated campaign session.
  3. Link the session's source document and mark it primary.
  4. Create a recap draft with MCP or CLI.
  5. Review the generated draft content in the CLI.
  6. Edit the draft into a new version until the text is ready.
  7. Generate one or more hero images for the draft version, optionally iterating on a prior image with feedback.
  8. Approve any images you want visible on the website, then mark the primary one as featured.
  9. Explicitly publish the draft.
jime campaign session add "The Lost Tombs" --date 2026-05-03 --number 12 --title "The Blood Door"
jime campaign session link-document <session-id> "#12" --role transcript --primary
jime recap draft <session-id>
jime recap show <version-id>
jime recap edit <version-id>
jime recap image <version-id>
jime recap image <version-id> --based-on <image-id> --direction "keep the composition, add more lantern glow"
jime recap image-feedback <image-id> "Keep the mood, but make the riverbed feel drier."
jime recap image-feature <image-id>
jime recap images <version-id>
jime recap publish <version-id>

jime recap image-feature <image-id> automatically marks that image as published. To publish additional non-featured recap images anywhere on the site, use the MCP set_recap_image_published tool.

Hero image generation requires both Jime:ImageModelDeployment (an Azure OpenAI image deployment such as gpt-image-1) and Jime:StorageEndpoint so the generated bytes can be persisted to Blob Storage.

Recap edits are versioned: jime recap edit and jime recap edit-file create a new draft version instead of mutating the original generated output. Generated recap art is also iterative: each recap version can accumulate multiple root image concepts, and each image can spawn additional versions through --based-on.

Published campaign cards on / link to player-safe campaign overview pages, and published sessions now live under a campaign-first route family such as:

/campaigns/{campaign-guid}/overview
/campaigns/{campaign-guid}/sessions
/campaigns/{campaign-guid}/sessions/{recap-guid}
/campaigns/{campaign-guid}/sessions/{recap-guid}/recap
/campaigns/{campaign-guid}/sessions/{recap-guid}/transcript

Today, the public session subtree uses the published recap GUID as its route key. Do not substitute CampaignSessionId values into these URLs; those routes will not resolve until a future read-model expansion changes the public key.

Players can browse every published image attached to a campaign's currently published recap versions at:

/campaigns/{campaign-guid}/art

Use /campaigns/{campaign-guid}/art to browse the published recap images for a single campaign. Each gallery card links back to the session overview for the owning recap and shows the campaign, recap title, session played date, source file name, and accessible image caption. Images continue to be served through /recap-images/{ImageId} so blob storage names stay private.

Campaign overview, sessions, and campaign-scoped art pages now share a visible local campaign switcher so users can move between those sibling destinations without relying on a separate back-link. Campaign overview pages still act as hubs: they show recent sessions and a small art preview without collapsing the campaign into a mixed-content dump. Session overview pages do the same one level down: they keep the session route as the parent page, then link into sibling Recap and Transcript child routes. The transcript card on session overview is stateful and shows Transcript available, Transcript restricted, or Transcript unavailable before users click through. Session overview, recap, and transcript pages also share a visible local session switcher with stronger active-state cues and larger stacked tap targets on narrow screens.

Campaign cards, session archive cards, and recap pages use the featured published image for a published recap when one is set. If no image is featured yet, they fall back to the newest published image for that recap version. Recap detail pages show only the published images attached to the published recap version in a manual carousel, starting with the featured image when one is set and otherwise starting with the newest published image. Players can click or tap the selected image to open an accessible full-size lightbox, with the raw image URL still available as a fallback when JavaScript is unavailable.

The shared session route family is designed to stay stable even when visibility changes later. When the linked session transcript document is public, the shared route /campaigns/{campaign-guid}/sessions/{recap-guid}/transcript renders the full transcript text directly and leads with the session played date plus source metadata instead of promoting the raw file name to the page heading. When that linked document is hidden or DM-only, the same route shows an explicit access state instead of exposing the document.

Campaign overview previews, session archive cards, recap detail pages, and art cards show the session played date from campaign_sessions.played_on and the linked source file name. If no session date is available for migrated legacy data, the UI says the session date is unavailable instead of treating recap creation time as the play date:

Source: session-12-audio.m4a

Local preview

For local UI iteration, disable the shared-password gate and run the web app against your normal local JickleJime configuration:

export JIME__Jime__Web__DisableSitePassword=true
dotnet run --project src/JickleJime.Web

That uses the same local database and secrets the rest of the app expects; it just removes the password prompt so route and layout changes are faster to review.

Content boundaries

Published recaps should be player-safe by default. Do not publish unrevealed secrets, future prep, hidden monster stats, or DM-only document content unless a future private DM recap mode explicitly supports it.

Use jime recap show <version-id> to review the generated title, teaser, body, image prompt seed, alt text, and edit lineage before publishing.