Skip to content

Add a landing page for vump - #24

Merged
okcodes merged 4 commits into
mainfrom
website
Sep 10, 2026
Merged

okcodes merged 4 commits into
mainfrom
website

Conversation

@okcodes

@okcodes okcodes commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Adds website/: a single-page site for vump, built to static files and shaped
for GitHub Pages. Nothing outside that directory changes except three lines of
repository housekeeping.

What it says, and why only one page

The page covers, in the order someone meets the tool: the defect it prevents,
the rule that makes it scriptable, the files it writes, the transitions it
allows, CI, monorepos, what it refuses, and installing it. Everything deeper
links to the repository.

There is deliberately no documentation section. A docs site is a second copy of
the manual, and a second copy drifts — so the page is written to sell the idea
and hand the reader to README.md, which stays the only place the behaviour is
written down.

Shape

Content is separated from layout. src/content/ holds every fact the page
states; nothing in it renders. When vump's output changes, runs.ts is the only
file to revisit.

The terminal panes are real output. The marks, the column alignment, the
wording of each error and the blank line before To push: are copied from
src/cli/render.rs, not invented for the screenshot — including the ✓/✗
pair the binary uses when it detects a terminal. Output is modelled as tinted
segments rather than pre-formatted strings, so the accent lands on the version
that changed and nothing else.

The page states no version number. The release chip reads the newest
published release from the GitHub API as the page loads and renders nothing at
all when that fails. A version written into a marketing site is a version nobody
bumps.

Terminal surfaces stay dark in the light theme. Rendered command output
should read as output, not as a styled quotation — and it gives the light theme
something to hold on to.

Colour is spent on one thing: what changed. A new version, a passing mark, a
highlighted line. Amber marks a refusal, red a failure, nothing else is coloured.

Tooling

TypeScript in strict mode with noUncheckedIndexedAccess, oxlint across
correctness, suspicious, perf and pedantic with warnings fatal, and Prettier
owning formatting. npm run check runs all four the way a workflow eventually
will. Four lint rules are off, each with its reason in website/README.md.

The social card is generated by npm run og from a tracked SVG, offline, with
fonts read out of node_modules — so the headline on the card cannot drift from
the headline on the page.

Deployment is prepared, not wired

The base path is baked into every asset URL at build time and the domain is not
settled, so both it and the site URL are environment variables with a table in
website/README.md saying what to set for a custom domain against a project
site. The workflow to add is written out there ready to paste, and
public/.nojekyll is already in place. Nothing is enabled.

Not asked for, in this branch

  • .gitattributes gains LF entries for .ts, .tsx, .css, .html, .mjs
    and .svg, matching what the file already does for every other text type.
  • CLAUDE.md gains a row for website/, since the table is what tells the next
    reader where things live.
  • .claude/launch.json is ignored alongside the other machine-local agent
    settings.

Cut any of these on review; they are separable from the site itself.

okcodes and others added 4 commits September 10, 2026 00:14
A static marketing site, built and served as one page. The stack is chosen
for what deploying to GitHub Pages needs and nothing more: Vite emits plain
files, so there is no server, no hydration step, and no framework runtime to
keep current.

Tooling is configured to be the thing that catches mundane mistakes, so
review can be about the design: TypeScript in strict mode with
noUncheckedIndexedAccess, oxlint over correctness, suspicious, perf and
pedantic, and Prettier owning formatting outright. `npm run check` runs all
four the way CI eventually will.

The palette is defined once as semantic roles flipped by a data-theme
attribute, so no component names a literal colour and the two themes cannot
drift. Terminal surfaces are held dark in both, because rendered command
output should read as output rather than as a styled quotation.

The package declares no version. It is never published and vump does not
track it, and a number nobody maintains is exactly the kind of lie this
repository exists to prevent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
One page, eight sections, in the order someone meets the tool: the defect it
prevents, the rule that makes it scriptable, the files it writes, the
transitions it allows, CI, monorepos, what it refuses, and installing it.

Every terminal pane reproduces what the binary actually prints — the marks,
the column alignment, the wording of each error, the blank line before "To
push:". Output is modelled as tinted segments rather than pre-formatted
strings so the accent lands on the version that changed and nothing else.
Showing friendlier output than the tool produces would be advertising
something that does not exist.

The page keeps no copy of vump's version number. The release chip reads the
newest published release from GitHub as the page loads and renders nothing at
all when that fails, because a version a marketing site states is a version
nobody bumps.

Two things worth knowing about the layout: terminal surfaces stay dark in the
light theme, since rendered output should read as output rather than as a
styled quotation; and every grid item that can hold a scrolling pane carries
min-width:0, without which the file tab strip sizes its track to its own
content and drags the whole document — the fixed masthead included — wider
than a phone screen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The card is rendered from a tracked SVG by `npm run og` rather than drawn by
hand, so the headline it shows cannot drift from the headline on the page.
Fonts come from node_modules and are decompressed from woff2 in the script,
because the renderer reads TrueType only — no browser, no network, and the
same bytes on any machine.

Its check marks are drawn as paths. U+2713 is outside the latin subset the
site loads, and typing it produces a notdef box in a font that does not carry
it. In the page the same character falls back to a system glyph, which
measures within a third of a percent of the mono advance and so leaves the
columns aligned.

Deployment itself is deliberately not wired up: the base path is baked into
every asset URL at build time and the domain is not settled. Both values are
environment variables with a table in the README saying what to set for a
custom domain against a project site, and the workflow to add is written out
there ready to paste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entering was driven entirely by an IntersectionObserver, which only reports
during a rendering update. A tab that is throttled or has not painted yet can
hold its first callback indefinitely, and since content waits at opacity zero
for that callback, the page could stay blank — reproducibly so in a browser
pane that is not being displayed.

An element already in view now answers from its own geometry on a short
timer, which also lets the first frame paint at rest so the hero fades in
rather than appearing finished. The observer still handles everything below
the fold.

The observer's top inset went with it. Insetting both edges left a dead band
under the masthead where an element could sit permanently unrevealed; only
the bottom edge needs holding back.

Alongside: the tab strip is a real tablist, with roving focus and arrow keys;
small labels were below 4.5:1 in both themes and are lifted; the backdrop
grid gets its own token, since hairlines that read as structure on a dark
ground read as graph paper on a light one; and the .NET row says what it
covers, because .fsproj, .vbproj and Directory.Build.targets are read too and
a targets file overrides a version rather than defaulting it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@okcodes
okcodes merged commit 31c05ec into main Sep 10, 2026
8 checks passed
@okcodes
okcodes deleted the website branch September 10, 2026 07:59
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