fix(web): unfade light mode; verify and correct docs#289
Merged
Conversation
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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. Light mode was faded
It had no separation to work with. The page was
#FFFFFFand cards were#FAFAFA— a 2% difference behind a hairline border, so every surface dissolved into the next.#F1F4F7) and make cards pure white, so each card lifts off the page the way dark mode gets separation from its shadows.--title-gradient-lightused a#555midpoint 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.com308-redirects towww.ghostkeyapp.com(verified). Docs pointed atghostkeyapp.vercel.appthroughout: README, DEPLOY, SIGNET_E2E_RUNBOOK, MAINNET_DRY_RUN, docs/walkthrough.Also
scheduler.rsdefaulted a heir's claim link to the Vercel host.GHOSTKEY_PUBLIC_BASE_URLis set in production (verified viafly 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:
notifier.rssends vialettre(SMTP) + Twilionotificationstable"20260525000001_notifications.sqlexistsEach 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'sheir.name ?? "—"empty-value placeholders, which are UI semantics. User-facing prose already had no em dashes — the 319 insrcare 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 remainingvercel.appreferences ✓🤖 Generated with Claude Code