DRAKIMACORE // ENGINEERING HANDBOOK

Media, sprites and folder conventions

Common character folders, turnaround versions, outfit review, sprite replacement, recovery and media ownership.

Reviewed 2026-11-07 · Public chapters

Ask Akari about this chapter
Source: docs/current/media-and-sprites.md Download Markdown

Shared deterministic media cleanup 1.1.2 recognizes pink and purple magenta keys as a two-channel matte. It uses normalized chroma distance and skips single-channel despill for these keys, preserving warm skin and green costumes. Green-screen cleanup retains its existing behavior. Legend Maker consumes versioned core/WPF NuGet packages; its run-video imports retain the source color, tuning and engine version in each receipt. Existing receipts remain evidence of their recorded engine.

Processing/package evidence is separate from website deployment and live-provider acceptance. Use verification for the current two active model streams and storage ownership for current budgets. Historical October 15 test totals and storage measurements do not describe today's installation. Legend Maker's Sora/Thornveil video review remains recorded in its handbook.

Small curated JSON/SVG contracts belong in source control. Public image/audio/video bytes belong in the configured external public asset store. Private voices, drafts and protected media retain their private storage owners. Artwork prompts, source masters and review receipts are provenance, not developer onboarding documentation.

Shared bat cursors

Public pages, Admin Console and the standalone Studio editors/previews share five native 48px PNG cursors: Mochi, Velvet, Onyx, Luna and Pip. The first six clickable-control hover visits use the normal cursor; the seventh shows a bat, then the seven-hover cycle resets. Each bat appearance advances to the next design. Moving between a control's text and icon or clicking it does not count another visit; leaving and returning does. Same-origin navigation and frames share the tab's sequence through optional session storage; storage denial falls back to an in-page sequence. Touch, text entry, disabled controls, drag and resize cursors retain their normal behavior. CSS pointer controls participate alongside links, buttons and semantic controls; custom controls may explicitly opt in with data-bat-cursor.

The approved black/purple/grey concepts are reduced without recoloring. Their source hashes, prompts, delivery hashes and center hotspots are in Content/PublicAssets/drakima-bat-cursors-v1.json. Delivery bytes live in public-assets/images/cursors/bats under the configured external media root and are registered in external-public-assets.json. Web Shared owns _BatCursor.cshtml, bat-cursor.css and bat-cursor.js; the partial is included in shared and standalone page shells. The Gallery-only heart cursor is superseded. The isolated Tests/Browser/bat-cursor.test.cjs and Gallery fixture verify hover transitions and the lightbox without starting the application.

Character and game media

The owner-approved November 5 Akari SIGN05 rear balcony pause refresh replaces the single akari-kawaii-dress-sign05-rear-balcony-pause-v2.png in the canonical external media store, retaining its public hard-link aliases and slot identity. The generated 1024 × 1536 PNG preserves alpha, uses vibrant pink hair and removes the thick white outline. Content/PublicAssets/akari-balcony-refresh-20261105.json records its prompt, references and hashes; the current public inventory/adoption receipt is updated. Character cards, prompts and other sprites are unchanged.

The nineteen Community author avatars are generated from the individual characters' existing reaction pictographs. Their versioned close-ups live at public-assets/images/gynoids/<slug>/cards/profile/community-avatar-v1/<slug>-community-avatar-v1.webp. Content/PublicAssets/community-avatars-v1.json records the built-in image generation prompts, source reference hashes and final 256 × 256 WebP hashes. Community selects these explicitly without changing the characters' general profile portraits, room artwork or cards.

The three Gynara campaign covers use the current Neuro-X identity-v1, Kuroneko identity-v5 and Rykara identity-v2 designs alongside their actual ground arenas. Selected PNGs live at public-assets/images/arcade/gynara-campaigns/v1 in the existing external media store. Content/PublicAssets/gynara-campaign-covers-20261021.json records exact prompts, reference roles, generation attempts and accepted hashes. These public marketing illustrations are separate from protected gameplay packs.

Presentation startup reads installed images from the configured external public-assets mount and follows the reviewed folder relocations. Missing artwork has been retired from this installation: startup skips new registrations for it, preserves existing records and authored selections, and does not recreate copies or require the old archive. External storage never falls back to stale local images. Ordinary verification excludes the historical binary collection audits. Their manifests and other metadata tests remain available; explicitly set DRAKIMA_VERIFY_RETIRED_ARTWORK=1 only when deliberately auditing a mounted historical collection. This opt-in does not authorize restoring or backing up files.

Startup's legacy Akari VN artwork migration owns only a-date-with-akari, a-date-with-akari-training-03 and akari-neon-office-consultation. Creator-owned stories keep their authored costumes, combat poses, scene bindings and expressions even when Akari is the lead. Global character presentation is not permission to rewrite a campaign's captured art direction.

Common character folders

All twenty external images/gynoids/<slug> roots share these categories:

<slug>/
  cards/
    profile/
    visual-novel/
  creative-assets/
  props/
  reactions/
  spaces/
  sprite-packs/
  turnarounds/
  video-generation/

Empty categories are intentional. They reserve a consistent location without claiming that artwork, an identity, an outfit or a published room exists. Nineteen characters use installed room catalogs; Aster uses managed authoring. Identity versions, outfit keys, image filenames and managed immutable asset keys remain distinct and unchanged.

Poke, Lift and pictograph packs now live under reactions/<pack>. Outfit-specific companions use reactions/<pack>/identity-vN/outfits/<outfit-key>. Props formerly under authored-spontaneity live in props/authored-spontaneity/identity-vN. Visual-novel cards use cards/visual-novel/v1; profile cards use cards/profile/<identity>. Turnaround studies formerly mixed into performance packs now live in turnarounds/<identity>/outfits/<outfit-key>/<set>. Other existing turnaround set keys stay intact. Performance sprites retain the layout below. Do not infer a companion URL from a performance folder; the registered manifest supplies it.

Content/PublicAssets/gynoid-folder-layout-v1.json is the reviewed relocation and category contract. The application embeds that same plan for retained image/JSON URL redirects and saved-reference reads. Saved drafts, published releases and historical generation receipts keep their original paths and hashes. The migration does not publish characters, modify database records, replace artwork or delete image bytes. See storage recovery for applying, validating and reversing the external migration with its matching application version.

Current sprite layout

public-assets/images/gynoids/<slug>/sprite-packs/physical-emotes-v1/
  identity-vN/
    outfit-registry.json          (where registered)
    outfits/<outfit-key>/
      manifest.json               (or registered private-room-manifest.json)
      dgss-manifest.json          (where a separate core catalog exists)
      <approved sprite files>

The package-owned small manifests and server registry choose the actual paths. External JSON copies are compatibility metadata, not a second authoring source. All nineteen installed Gynoids use outfit folders for current sprites. Keep established keys such as original, purple-date-dress and crimson-date-dress. A 120-slot performance pack can reuse approved artwork; 120 slots does not imply 120 unique image files. The gynoids-dream-2026-v1 outfits for Valkyrie (identity-v1) and Lilith (identity-v2) each contain 120 distinct transparent 1024 × 1536 performances, an initial seven reaction/Lift/Poke companions supplemented by reviewed additions, eight individual emojis and a four-by-two reaction atlas. Both are additional wardrobe choices; Valkyrie retains original and Lilith retains gynara-maiden as defaults. Reviewed origins and actual view labels live in their manifests, with hashes in Content/PublicAssets/gynoids-dream-sprites-20260929.json. Generated source files, exact prompts, rejected candidates and review/contact sheets remain in the external artwork provenance collection.

Akari's purple dress uses akari/sprite-packs/physical-emotes-v1/identity-v2/outfits/original. Its complete pack and smaller DGSS catalog share the outfit directory. Retained old image/manifest URLs resolve through the explicit relocation map. Do not adopt the archived identity-first proposal or delete aliases merely because current pages use new URLs.

The Meet rooms also register Akari's akari-kawaii-dress (identity-v2), Kuroneko's kuroneko-dress (identity-v5), and Sora's sora-dress (identity-v2). The first two are the registry defaults; Sora retains original. Existing explicit device choices take precedence. Older outfits remain selectable. Each new dress has 120 performances, standing/seated scene assignments and its own Lift, Poke and four-by-two reaction pictograph atlas. Kuroneko's production sprite-pack-manifest.json is provenance; the package-owned manifest.json is the room contract, including reviewed pose meanings, hip/ground origins and required seat props. Akari's, Sora's and Kuroneko's reaction companions use their outfit-scoped folders under reactions. Register those exact companion paths rather than inferring them. Switching back to original restores its base reactions even when it is no longer the registry default. The room's registered original manifest remains the framing reference.

Current outfit manifests mark one reviewed rear standing conversation entry with balconyOpening: true. The room uses that pose for a balcony entrance before normal expression selection resumes. All 31 installed outfits have at least five distinct rear conversation images. Akari's kawaii dress has four new rear variants; Reika and Kuroneko's original outfit have new reaching-back invitations. The versioned file paths, hashes and generation evidence live in Content/PublicAssets/balcony-sprites-20260928.json; old artwork and historical reviews stay intact. For a managed private character, assign a rear conversation pose to lead-the-way and name the balcony location explicitly. Validate and create a staff playtest without changing the character's visibility.

Public directory cards and profile heroes use editor-selected welcoming poses from the current outfits, including Akari's kawaii-dress gentle smile. GynoidPresentationSeedService supplies neutral portraits for initial setup and upgrades known prior defaults, preserving custom Admin selections and existing scenery. Private-room framing catalogs and retained visual-novel artwork keep their original contracts.

Reaction coverage

Each registered outfit should provide at least two distinct Poke images for each combination of standing or sitting posture and front or rear angle, plus at least one Lift for each of those four combinations. Extra approved variants remain available. Count reviewed manifest entries and distinct current artwork hashes, rather than files in a reaction folder: a manifest may reuse an approved performance sprite, and historical or unregistered files do not establish active room coverage.

Run node Tools/AssetPipeline/audit_reaction_coverage.mjs against the canonical external public assets. Use --output <path> to retain a report or --slugs <comma-separated-slugs> for a subset. It audits the installed character/outfit registrations, reports missing combinations and invalid references, and leaves unregistered characters out of the active-room totals. Review pose, angle, costume, transparency and placement visually before adding an image; names alone cannot certify those properties.

Managed characters use their authoring state's typed pose mappings and need a separate coverage count. Aster's reactions/poke-kawaii-v1/manifest-supplemental-v1.json and accompanying mapping templates contain reviewed assets prepared for managed import. They do not register an installed outfit or modify a managed draft or published release; prepared images must not be counted as active managed reactions before import.

Seated Lift variants belong in poses.seated.lifts, with explicit view metadata and seated origins. The runtime prefers an exact-angle authored seated Lift, retaining its existing standing and legacy fallbacks for incomplete packs. Keep skipped or rejected generation slots visible in the audit; a fallback does not satisfy the authored-coverage target. Preserve original costumes and existing images. Accepted additions use new versioned filenames, package-owned manifest entries and small hash receipts under Content/PublicAssets; prompts, candidate files and review sheets remain in external provenance. Register new public paths in the external asset installation manifest without rewriting historical receipts for existing live-image replacements.

Character turnaround library

Admin Console → Sprite Packs → Character Turnarounds opens /Admin/Turnarounds on Studio. It requires the same Admin or Editor role as Sprite Packs. The directory filters by character and design/outfit text. Each character/version pair has its own stable page, ordered full-size views, individual downloads, and links to the character's other versions. The old /Gallery/Turnarounds pages are removed, along with public Gallery, Meet, footer and sitemap links. The first story collection includes Valkyrie, Lilith, Hana (blue eyes), Miyu, and Sora from A Gynoid's Dream, alongside retained outfit studies. The artwork stays in its existing media location; this change restricts the browsing pages.

Use Create turnaround set for a new character/version pair and Edit set to change its title, identity/outfit label, collection, description, library order and labeled image views. Character and version key stay fixed after creation. Add, remove, replace or move views up/down; the first view is the cover. Saves accept 1–50 distinct still PNG, JPEG or WebP images, up to 20 MB and 16 megapixels each and 100 MB per request. New images are decoded and stored as immutable PNGs behind the staff-only image endpoint. Existing packaged references keep their media paths. Delete this set → Delete set removes it from the active library; Deleted sets → Restore set brings its details and views back.

IGynoidTurnaroundLibrary, IGynoidTurnaroundEditor and the Runtime Infrastructure adapter merge Content/Gynoids/turnarounds-v1.json with durable staff overrides. Both published and unpublished canonical Gynoids are available to staff; project-local copies are excluded. Missing artwork retains its label and an unavailable notice. An old compatibility copy cannot revive a removed image. This archive does not change identity defaults, sprite packs, CMS Media, or Gallery Artwork records. All mutations require Admin/Editor authorization and antiforgery validation. A file lease serializes writers across processes; revision checks reject stale tabs and duplicate version creation. New uploads cannot select arbitrary existing paths or another set's images. Deployment retains the shared authoring store; it never rewrites the packaged baseline.

The store is MediaRootPath/protected/character-turnarounds (fallback: host App_Data/character-turnarounds when no media root is configured). sets.json is atomically replaced; history/*.before.json preserves the previous overlay before every mutation, including the empty overlay before first use. Actor and timestamp accompany each snapshot; images/ keeps immutable uploads, including replaced/removed views and uploads from a failed save. No automatic pruning runs. Back up this whole directory alongside the packaged catalog and original external image bundles. For operator recovery, stop writers, copy a chosen snapshot and its images into an isolated store, verify metadata and image availability, then restore the reviewed snapshot as sets.json and restart. TurnaroundAuthoringTests exercises this restore drill without touching live media. Normal deleted-set recovery uses the Restore button. No schema or existing-media migration is required.

Replacing artwork

The October 1 metadata reconciliation is recorded in Content/PublicAssets/manual-artwork-adoption-20261001.json. It adopts current owner-updated artwork and earlier approved cleanup into 27 package manifests without changing image bytes. Sweetie's missing VAR03 conversation/Poke source explicitly reuses the existing SIGN07 rear laughing pose and its origin; 120 logical performance slots remain available with 119 distinct images. Kuroneko's original outfit now has 117 distinct images after three former fallback pairs received individual artwork. Historical generation and installation receipts remain unchanged; current hash checks follow the explicit adoption record rather than treating a historical generation hash as the current image. Subsequent direct image swaps still use the live revision projection below. A changed canvas needs a reviewed manifest update.

Hana's current rear drag and dynamic rear Kawaii reaction images use 1248×1248 canvases. Their package-owned reaction manifests record those dimensions and current revisions while retaining the normalized placement origins. Live revision projection refreshes hashes, not canvas metadata; pose contract checks must compare declared dimensions with the PNG header after an image replacement.

Studio's Sprite Packs → Installed room outfits reads GynoidRoomCharacterCatalog and its package-owned outfit registries/manifests on each request. All registered characters and their latest outfits are browsable without a CMS import, including standing/seated performances and explicitly registered outfit reactions/pictographs. The registry supplies packaged defaults; an Admin can override each character in Sprite Packs → Installed room outfits → any outfit → Default chat-room outfit. Select an installed outfit and Save room default, or Restore packaged default to undo the override. The setting applies site-wide on the next room visit. A member's explicit device outfit choice still wins. Editors can preview outfits, but only Admins can save this setting. Stale saves require a fresh review. GynoidOutfits/Details accepts a character slug and optional outfit key; omitting the key selects the current room default. Search matches pose IDs, labels, expressions, postures and views.

IGynoidRoomOutfitDefaults resolves overrides against the current installed catalog. Its shared file adapter stores one atomic current.json per character under MediaRootPath/protected/room-outfit-defaults (or App_Data/room-outfit-defaults without external storage), with a cross-process lease and retained previous snapshots in history. It does not edit package manifests or immutable room releases. Missing, retired or malformed selections fall back to the packaged outfit. Back up this protected directory; for recovery, stop editorial writes, copy a retained complete snapshot into an independent staging directory, validate its character/outfit against the installed catalog, then replace that character's current.json atomically. Tests exercise independent host reads, stale/concurrent saves and an isolated snapshot restore. The public page passes only the resolved outfit key to its existing wardrobe loader. Installed outfits group slots into Standing Front/Side/Rear and Sitting Front/Side/Rear, with reactions and unspecified poses separate. Three-quarter front/rear views join their matching front/rear group; explicit side views remain side even with a slight front turn. Group filters combine with search. Each group retains its unfiltered expected slot count, available artwork count and missing-artwork count so filtering cannot hide an incomplete outfit. Expected counts come from the registered manifest, including slots that share approved artwork; these are not counts inferred from filenames or visual pose recognition. The original view and posture remain on every preview for manual drift review. Unused groups are marked explicitly.

Each installed image has an Edit image action. It opens that outfit's current artwork, its expected canvas dimensions and any slots sharing the same file. Upload a replacement, preview background cleanup or choose Use without processing, then Save sprite image. Save and Cancel return to the same search/posture/angle filters. The editor preserves slot IDs, pose metadata and room placement contracts; the replacement must match the existing dimensions and retain transparency. PNG/WebP uploads are bounded to 20 MB and 8 megapixels. Processing keeps the input canvas by default.

IInstalledGynoidSpriteEditor and its Runtime Infrastructure adapter validate selection against the registered outfit before resolving paths. Saves compare the current content hash, use a shared file lease, retain independent content-addressed recovery copies and atomically replace the live directory entry. Known compatibility links are refreshed without writing through links into immutable releases. Recovery and staff audit records stay under BackupRootPath/installed-sprites, or protected external storage when no backup root is configured. Restore previous image exchanges the last two versions with the same concurrency check. Shared-file replacements affect every listed slot; the editor does not change manifests or import duplicate CMS records. Previewing, downloading or canceling does not save artwork.

The library's Editable packs and earlier identities retains the existing CMS records and revision history. Their details also link to current outfits. Reviewed folder relocations resolve to existing files; deleted historical art displays an unavailable notice rather than substituting another identity. No database migration, media rewrite or duplicate sprite import is involved.

IInstalledGynoidSpriteCatalog owns the read contract; Infrastructure/Media/InstalledGynoidSpriteCatalog reads manifests through the shared web file provider and checks the canonical public media mount. When external storage is enabled, an old local compatibility copy cannot make removed artwork available. IGynoidArtworkCharacters and its focused persistence adapter supply character names, including private characters, without adding database access to Web. Studio owns the views and filters.

Standalone background removal

Open Admin Console → Gynoid Authoring → Background Remover, or the same link in Sprite Packs. Upload one PNG, WebP or JPEG, review the original and processed preview, then download the transparent PNG. This tool does not require or create a Gynoid, pack, media asset or revision. Processing is in memory; download each result before selecting another image or leaving the page.

Keep original dimensions and placement is enabled by default. Disable it for the existing 1664-square room-sprite fit. The sprite editor retains its standard fit. Both flows share IGynoidSpritePreparationService, the local deterministic keyer, one concurrent request per host, 20 MB/8 megapixel limits and cancellation. Images must be 256–4096 pixels per side. Cleanup strength, edge softness and enclosed-gap removal remain adjustable; check hair and clothing before using a result. The standalone page and sprite editor share the preview module and never overwrite original files.

Use the existing managed import/editor or asset pipeline. Preserve image dimensions, alpha, placement, pose IDs, ownership and scene compatibility. Review contact sheets and actual room framing. Large masters and rejected candidates stay outside the public mount. Akari's palette-specific green-residue repair is not a general keyer for artwork containing intentional green or yellow.

Public assets can be compatibility hardlinks into the external store. Identical visible paths are not proof of independent duplicate bytes. Live-image delivery validates replacements per image with bounded decode concurrency, and caches manifest projections with dependency invalidation. Changed or newly available image dependencies must invalidate the affected projection. Never edit an immutable room/VN release to force an asset migration to pass.

Live image, preview and sprite-manifest requests stop immediately if the caller has already disconnected. Cancellation during reading or delivery is handled at the image middleware boundary: an unstarted response becomes non-cacheable 499 without rendering a status page, while an already-started response keeps its headers. Shared validation remains available to other readers. Independent cancellation still propagates, and genuine storage failures retain the retryable 503 response. Regression coverage uses synthetic media in Tests/DrakimaCore.Tests/DrakimaLiveImageCancellationTests.cs, without application startup, database access or compatibility recovery copies.

Replacing a live image directly at its existing MediaRootPath/public-assets/images/... filename is supported without changing the installation manifest's recorded byte count. Startup and live requests refresh detached compatibility links; stale bytes are retained independently in MediaRootPath/asset-link-recovery. Current hashes invalidate image and manifest responses. Finish copying the replacement before requesting it, and preserve its canvas, alpha and placement contracts. Windows hard-link creation uses extended-length paths for both source and destination, including temporary relink names, so deeply nested sprite-pack paths do not fail at the classic 260-character boundary. Regression tests cover long-path installation, replacement and restoration from the retained recovery copy.

Startup checks every asset with fresh file identities. Windows checks use metadata-only handles and reuse each source identity only while checking that asset's aliases; the source pathname is held against replacement until those checks finish. Identities are not cached across assets or launches, and equal file sizes or timestamps do not hide a replaced image. Path components still reject symbolic links and junctions. The bootstrap log reports the asset reconciliation time separately from seed stages.

Gallery uploads and group art have their own images/gallery and images/groups owners. Character creative uploads retain managed immutable keys. Do not place private recordings or source receipts under a public character URL.

Implementation evidence: Content/PublicAssets, Tools/AssetPipeline, scripts/Move-DrakimaGynoidSpritePacks.ps1, scripts/Move-DrakimaGynoidFolderLayout.ps1, scripts/Get-DrakimaGynoidAssetLayout.ps1, scripts/Repair-AkariSpriteResidue.py, src/DrakimaCore.Web.Shared/wwwroot/images/gynoids, Services/Gynoids, Infrastructure/DrakimaExternalPublicAssetCompatibility.cs, Infrastructure/DrakimaLiveImagePaths.cs, Tests/DrakimaCore.Tests/DrakimaLivePublicImagesTests.cs.

Private novel artwork storage

Novel artwork lives at <MediaRootPath>/protected/novel-artwork/<publication-slug> when external storage is enabled, otherwise App_Data/novel-artwork/<publication-slug>. It is outside static public mounts. workspace.json is the atomic current catalog; history retains prior catalog snapshots and files retains immutable GUID-named media. Back up the entire collection together. Stop editorial writes for recovery, copy the collection to an independent staging location, restore the chosen history catalog there as workspace.json, verify all referenced files and hashes, then arrange a controlled switch. Never remove prior media as part of choosing a different version. Revisions reject stale saves; a cross-process lease serializes commands. Snapshots use unique names so recovery/retries cannot overwrite an earlier receipt.

Uploads admit fully decoded PNG/JPEG/WebP stills up to 25 MB and 24 megapixels, or MP4/WebM containers up to 250 MB. Video admission checks the container signature; authors must preview browser playback before publishing. No transcoding or remote URL fetching occurs. Public chapter file responses support range requests with private/no-store caching and re-check publication and placement on every request.

Tools/AssetPipeline/import_novel_artwork.py imports an existing reviewed PNG bundle into a new collection only. It verifies independent copies, retains the source manifest/prompts/references in provenance, writes an import receipt and initial recovery catalog, and leaves the original bundle untouched. Run with --source <bundle> --media-root <root> --slug <slug> --title <title>; an existing destination is rejected. Later revisions belong in Studio. This importer neither changes manuscripts nor publishes artwork. The recovery behavior is exercised in NovelArtworkLibraryTests.

Profile and Home artwork composition

Admin Console → Gynoid Wizard → Profile card opens the focused composition step. The advanced character editor retains the same composition fields. Choose a background and transparent character separately. The combined preview uses the same visible-alpha fitting as Meet listing cards and profiles; the final frame adapts to its container. Save the profile to apply both layers. With no background, the portrait is the single image. Available choices include published non-mature Media, current saved layers, character-library portraits/backgrounds, saved non-archived pack sprites and registered installed outfit poses that exist on disk. An installed outfit does not need a duplicate Media import. Upload backgrounds and portraits in the wizard's character library to select them directly. Background removal is available in Sprites and asset uploads, as well as its unchanged standalone location. Asset cleanup preserves canvas dimensions. Identity Card Studio edits the character's identity/system prompt, not this visual composition.

Admin Console → Home featured carousel → Compose featured items manages custom carousel slides. Use Add featured item or Edit, choose/upload a main image and optional transparent overlay, set the copy, button destination, display order and publication checkbox, then save. The live preview shows artwork and text together on desktop and narrow screens. Upload, Media selection or path edits update the preview; a deliberate path edit clears earlier upload/library selections so the saved source matches the preview. HTTPS artwork paths remain HTTPS. Known finished theme artwork suppresses an extra character layer using the same embedded-character markers as public Home. Leave the overlay empty for other finished artwork. The preview does not save uploads or change public content. Saving a published item applies it immediately; uncheck publication to retain a private editorial item. Existing upload validation/storage ownership stays with the Media service. No flattened image files or backups are created by previewing a composition.

Home items retain their own artwork and copy; changing a Gynoid profile does not overwrite a manually curated carousel item. Update that item's overlay independently when changing its featured outfit. The initial and legacy Home selections use finished story cards for Akari, Mimi and Vyxara from /images/gynoid-cards/optimized/, without a sprite overlay. Akari uses akari-stories-v2.webp, the owner-approved seated portrait with wider framing and restored original facial likeness. Existing managed cards remain authoritative; update their main artwork and clear the overlay in the editor to use these defaults. On tablet and phone layouts, Home cards stack artwork above the copy in a 4:3 frame without cropping. Phone carousel controls wrap into separate selection and navigation rows with touch-sized targets. The Meet directory and profile introductions use Public.Web/wwwroot/css/gynoid-profile-cards.css. The views load this Public Razor library stylesheet through its /_content/DrakimaCore.Public.Web/ URL. Below 992px they stack artwork above the text, retain a bounded portrait frame and wrap action buttons. The shared visible-alpha fitter gives directory characters the same head/foot clearance as Akari/Faye, using the full card height and a 4:5 reference frame for profiles/Studio. It ignores transparent canvas margins and does not shrink the body to fit wide hair, wings or outstretched poses; those outer details may extend beyond the sides of a narrow frame. Heads and feet stay visible, proportions are preserved, and taller biography rows enlarge their artwork to avoid excess space above the character. Mobile uses the available frame height. Profile artwork is curated per character: welcoming gestures, playful poses and confident stances can be mixed without imposing Akari's gentle-smile pose on the entire cast. Startup presentation upgrades replace only empty portraits or known old defaults, preserving other catalog poses selected in Studio along with their background and publication state. Regression coverage for repeated startup lives in GynoidProfileSelectionPersistenceTests.

Studio owns the forms and profile image choices; Web.Shared/wwwroot/js/artwork-composer.js owns live source selection and preview lifecycle, and gynoid-portrait-framing.js shares profile framing. GynoidThemeArtworkPresentation.EmbeddedCharacterMarkers supplies the Home preview's overlay rules. Existing PortraitPath/BannerPath and HomeFeaturedItem fields persist the layers; no schema migration.