The ask
Seasonal and holiday skins for the Nightwatch Dossier.
Why this is worth more than it looks
The Dossier share card is the only mechanism in the entire marketing plan where
users do the distribution (gates.md H1). It is why the 30-day window and the
card were ungated on 2026-08-16: an acquisition asset locked behind the purchase
it exists to drive is a closed loop.
A card someone shares once is a card they share once. A card that looks
different in October and different again at year end is a card they share
several times. That is the entire argument.
Scope, and the thing to NOT do
Skin the SHARE CARD, not the app.
ThemeMode (domain/model/ThemeMode.kt) is a four-entry enum, NOIR and BRIGHT
free, AMOLED and CANDLELIGHT unlock. Do not extend that enum for seasons. It
would drag every seasonal variant into the entitlement clamp
(FreeTier.effectiveTheme), into the settings normalization pass, and into the
store listing's theme claims, for a feature that only ever needed to change one
rendered bitmap.
The surface is DossierShareSection, ui/dossier/NightwatchDossierScreen.kt:825,
which already renders to a Bitmap and hands it to the existing FileProvider
share path. A skin is a palette plus optional ornament applied at that render,
and nothing above it needs to know.
Feeds directly into #7
Issue #7 is about an unbounded history window so a year-end look-back works in
early January. A winter or year-end skin plus a real year retrospective IS the
Wrapped play, and the two land better together than either does alone. Worth
sequencing them as one push rather than two.
Traps
Do not hard-code a date cutoff. This project already deleted PAID_ERA_CUTOFF
on 2026-08-08 for exactly this failure: a guessed date compiled into a shipped
AAB that could not be corrected without a patch release. A seasonal skin that
auto-switches has the same shape. Either derive the season from the device clock
at render time with no baked constants, or let the user pick the skin and treat
season as a default suggestion. The second option is also more respectful of
people who do not celebrate what the calendar assumes they do.
Keep the Archive Beneath identity. Gold filament on void is the brand. A
holiday skin that goes full red-and-green stops being this app. Read
~/.claude/BRAND.md before drawing anything.
Free or unlock?
Recommend at least one seasonal skin FREE, with the rest as unlock. Gating every
skin recreates the closed loop the 08-16 decision already rejected, since a card
nobody can make is a card nobody shares. One free seasonal variant keeps the
distribution engine running and still leaves something to sell.
Post-2.1.0.
The ask
Seasonal and holiday skins for the Nightwatch Dossier.
Why this is worth more than it looks
The Dossier share card is the only mechanism in the entire marketing plan where
users do the distribution (
gates.mdH1). It is why the 30-day window and thecard were ungated on 2026-08-16: an acquisition asset locked behind the purchase
it exists to drive is a closed loop.
A card someone shares once is a card they share once. A card that looks
different in October and different again at year end is a card they share
several times. That is the entire argument.
Scope, and the thing to NOT do
Skin the SHARE CARD, not the app.
ThemeMode(domain/model/ThemeMode.kt) is a four-entry enum, NOIR and BRIGHTfree, AMOLED and CANDLELIGHT unlock. Do not extend that enum for seasons. It
would drag every seasonal variant into the entitlement clamp
(
FreeTier.effectiveTheme), into the settings normalization pass, and into thestore listing's theme claims, for a feature that only ever needed to change one
rendered bitmap.
The surface is
DossierShareSection,ui/dossier/NightwatchDossierScreen.kt:825,which already renders to a
Bitmapand hands it to the existing FileProvidershare path. A skin is a palette plus optional ornament applied at that render,
and nothing above it needs to know.
Feeds directly into #7
Issue #7 is about an unbounded history window so a year-end look-back works in
early January. A winter or year-end skin plus a real year retrospective IS the
Wrapped play, and the two land better together than either does alone. Worth
sequencing them as one push rather than two.
Traps
Do not hard-code a date cutoff. This project already deleted
PAID_ERA_CUTOFFon 2026-08-08 for exactly this failure: a guessed date compiled into a shipped
AAB that could not be corrected without a patch release. A seasonal skin that
auto-switches has the same shape. Either derive the season from the device clock
at render time with no baked constants, or let the user pick the skin and treat
season as a default suggestion. The second option is also more respectful of
people who do not celebrate what the calendar assumes they do.
Keep the Archive Beneath identity. Gold filament on void is the brand. A
holiday skin that goes full red-and-green stops being this app. Read
~/.claude/BRAND.mdbefore drawing anything.Free or unlock?
Recommend at least one seasonal skin FREE, with the rest as unlock. Gating every
skin recreates the closed loop the 08-16 decision already rejected, since a card
nobody can make is a card nobody shares. One free seasonal variant keeps the
distribution engine running and still leaves something to sell.
Post-2.1.0.