Conversation
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>
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.
Adds
website/: a single-page site for vump, built to static files and shapedfor 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 iswritten down.
Shape
Content is separated from layout.
src/content/holds every fact the pagestates; nothing in it renders. When vump's output changes,
runs.tsis the onlyfile 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 fromsrc/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 acrosscorrectness, suspicious, perf and pedantic with warnings fatal, and Prettier
owning formatting.
npm run checkruns all four the way a workflow eventuallywill. Four lint rules are off, each with its reason in
website/README.md.The social card is generated by
npm run ogfrom a tracked SVG, offline, withfonts read out of
node_modules— so the headline on the card cannot drift fromthe 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.mdsaying what to set for a custom domain against a projectsite. The workflow to add is written out there ready to paste, and
public/.nojekyllis already in place. Nothing is enabled.Not asked for, in this branch
.gitattributesgains LF entries for.ts,.tsx,.css,.html,.mjsand
.svg, matching what the file already does for every other text type.CLAUDE.mdgains a row forwebsite/, since the table is what tells the nextreader where things live.
.claude/launch.jsonis ignored alongside the other machine-local agentsettings.
Cut any of these on review; they are separable from the site itself.