Skip to content

fix(web): unfade light mode; verify and correct docs#289

Merged
Jolah1 merged 3 commits into
mainfrom
fix/light-mode-and-docs
Jul 15, 2026
Merged

fix(web): unfade light mode; verify and correct docs#289
Jolah1 merged 3 commits into
mainfrom
fix/light-mode-and-docs

Conversation

@Jolah1

@Jolah1 Jolah1 commented Jul 15, 2026

Copy link
Copy Markdown
Owner

1. Light mode was faded

It had no separation to work with. The page was #FFFFFF and cards were #FAFAFA — a 2% difference behind a hairline border, so every surface dissolved into the next.

  • Put the tint on the page (#F1F4F7) and make cards pure white, so each card lifts off the page the way dark mode gets separation from its shadows.
  • Fix the headline gradient. --title-gradient-light used a #555 midpoint at 85% alpha, leaving every display heading at roughly mid-grey. That was the other half of "faded". Re-anchored on near-black with a shallower dip, so the brushed-metal sheen survives but a headline reads as a headline.

Verified with before/after screenshots of the landing and sign-in pages in forced light mode.

2. Canonical domain

ghostkeyapp.com 308-redirects to www.ghostkeyapp.com (verified). Docs pointed at ghostkeyapp.vercel.app throughout: README, DEPLOY, SIGNET_E2E_RUNBOOK, MAINNET_DRY_RUN, docs/walkthrough.

Also scheduler.rs defaulted a heir's claim link to the Vercel host. GHOSTKEY_PUBLIC_BASE_URL is set in production (verified via fly secrets list), so live links are correct — but a preview host is the wrong fallback if that secret is ever dropped. MAINNET_DRY_RUN's claim that it's "unset in production" was itself stale.

3. Stale doc claims, checked against code

DESIGN's Tier 1 told a story that stopped being true:

Claimed Reality
"never been driven against a live signet node" Signet and mainnet flows exercised; real heir claimed real funds
"scheduler issues claim tokens but sends nothing" notifier.rs sends via lettre (SMTP) + Twilio
"Add a notifications table" 20260525000001_notifications.sql exists
Owner alarm notifications (todo) Shipped in #273
"no migration path planned for the alpha" Not alpha any more

Each was verified against migrations / notifier.rs / git history rather than against another doc. Master-key rotation stays open — it's the one Tier 1 item with no key-version tagging in code.

4. Em dashes

Replaced with the punctuation each sentence actually wants (full stop, colon, comma, or parentheses), rather than a blind find-replace. README, DESIGN, ARCHITECTURE are now at zero.

Two deliberately remain in ARCHITECTURE's threat-model table, where is an empty cell value, not punctuation. Left alone for the same reason: the dashboard's heir.name ?? "—" empty-value placeholders, which are UI semantics. User-facing prose already had no em dashes — the 319 in src are almost entirely code comments, so I left those rather than create a huge diff with no user benefit. Say if you want that swept too.

Verification

cargo clippy -D warnings ✓ · cargo test -p ghostkey-server (196 pass) ✓ · npm run typecheck ✓ · npm run lint ✓ · npm run build ✓ · no remaining vercel.app references ✓

🤖 Generated with Claude Code

Jolah1 and others added 2 commits July 15, 2026 06:20
Light mode read as washed out because it had no separation to work
with: the page was #FFFFFF and cards were #FAFAFA, a 2% difference
behind a hairline border, so every surface dissolved into the next.
Put the tint on the page (#F1F4F7) and make cards pure white instead,
so each card lifts off the page the way dark mode gets from shadows.

The headline gradient was the other half: a #555 midpoint at 85%
alpha left every display heading at roughly mid-grey. Re-anchor it on
near-black with a shallower dip, keeping the brushed-metal sheen.

Docs pointed at ghostkeyapp.vercel.app throughout. The canonical
domain is www.ghostkeyapp.com (ghostkeyapp.com 308-redirects to it),
so update README, DEPLOY, SIGNET_E2E_RUNBOOK, MAINNET_DRY_RUN and
docs/walkthrough.

Also fix the fallback in scheduler.rs: it defaulted a heir's claim
link to the Vercel host. GHOSTKEY_PUBLIC_BASE_URL is set in
production so live links are correct, but the default should not be
a preview host if that secret is ever dropped. MAINNET_DRY_RUN's
claim that it is unset in production was stale; verified set today.

README em dashes replaced with the punctuation each sentence wants.
User-facing UI copy needed no change: it has no prose em dashes (the
"—" in the dashboard is an empty-value placeholder, not punctuation).

Verified: cargo clippy -D warnings, cargo test -p ghostkey-server
(196 pass), npm run typecheck, npm run build, plus before/after
screenshots of light mode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DESIGN's Tier 1 told a story that stopped being true a while ago:

- "the flow has never been driven against a live signet node" — it
  has, and the full owner + heir flow has since run on mainnet with a
  real heir claiming real funds.
- "the scheduler issues claim tokens but sends nothing" — notifier.rs
  sends email over SMTP (lettre) and SMS/WhatsApp over Twilio, with
  the notifications table and retry policy it says to add.
- owner alarm notifications, listed as todo, shipped in #273.
- "no migration path planned for the alpha" — not alpha any more.

Each correction was checked against the code (migrations, notifier.rs,
git history), not against the other docs. Master-key rotation stays
open; it's the one Tier 1 item with no key-version tagging in code.

Em dashes replaced with the punctuation each sentence wants. The two
left in ARCHITECTURE are empty cells in the threat-model table, where
the dash is the value, not punctuation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 15, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ghost-key Ready Ready Preview, Comment Jul 15, 2026 5:35am

Sweeps the remaining 495 across 27 files, including JOURNAL and the
user-facing xpub guides.

Each dash gets the punctuation its sentence wants, not a blind
find-replace:

- paired dashes become parentheses ("if they stop clicking (they
  died, got hit by a bus, lost their phone) the heir can claim")
- a label, code span, list item or heading takes a colon
- a dash before a conjunction takes a comma; a colon there is
  ungrammatical ("still intact, but reminders stop firing")
- a dash before a subject pronoun becomes a full stop, so it reads as
  two short sentences
- everything else takes a colon: these dashes are nearly always
  "statement: elaboration", and a colon can neither splice two clauses
  the way a comma does nor strand an appositive as a fragment the way
  a full stop does

Left alone on purpose:
- the two dashes in ARCHITECTURE's threat-model table, where the dash
  is an empty cell *value*, not punctuation
- code comments in src/: no reader-facing benefit, and the diff would
  bury everything else

Verified: paren balance unchanged in all 27 files, no code-block line
touched, no indentation altered.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Jolah1
Jolah1 merged commit f3a1eb2 into main Jul 15, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant