TypeScript in the browser, deployed the moment you save it.
Every val is an HTTP endpoint, cron job or email handler.
Fork anyone's val, or hand yours to the rest of the team.
npx plugins add val-town/plugins🗋
npx plugins add val-town/plugins🗋
← install field — note the heavier 2px border
The primary is #00bcff at 48px tall with a 12px radius — and its label is navy #052f4a, never white. The install field is singled out with an unusually heavy 2px #74d4ff border against every other control's 1px.
Capture note: 11 of Val Town's 16 stylesheets are cross-origin, and the 5 readable ones contain zero :hover and :focus rules. The hover and focus states shown above are therefore recommendations consistent with the palette, not captured values. DESIGN.md marks section 4 states and section 10 responsive as not captured for this reason.
Headlines are light and large (400 at 48px) while nav and buttons are heavy (700 at 14–16px) — the inverse of the usual hierarchy, and much of why the page feels friendly. Specimens substitute Fraunces for the custom Sprig Sans and IBM Plex Mono for iA Writer Mono.
There is no shadow scale — depth comes from the drawn illustration, the brown card against white, and borders that deliberately vary in weight. Motion is the signature: a single sway keyframe applied at five staggered durations (6s, 6.8s, 7.6s, 8.4s, 9.2s) across sixteen trees, so the loops never sync. The trees above are live — and stop entirely under prefers-reduced-motion, which the real site honours. Transition durations sit in the cross-origin sheets and are not captured.