Standard
1.0
Introduction
Standard applies 500 years of typographic refinement to your HTML, automatically. Baseline grids. Golden-ratio proportions. Optimal measures. An OKLCH color engine. Dark mode. Print styles. One Astro integration; no configuration.
This page is set entirely by the framework. Every specification printed below — every size, every color value, every ratio — is measured from the live stylesheet as you read it. The manual cannot drift from the system, because the manual is the system, rendering itself.
npx @stnd/cli new my-projectOr add it to an Astro project you already have:
npm install @stnd/core @astrojs/svelte sass-embedded2.0
The four invariants
2.1
Beauty is default
No one should configure margins to deserve good typography. Your mother's recipe should look like it belongs in a prestige cookbook — without her doing anything.
2.2
Friction is the enemy
Ten seconds from thought to URL. Speed is a form of respect — for the writer, and for the reader.
2.3
The file is yours
Everything is plain text files. Applications are interchangeable readers. If the servers go dark tomorrow, your writing remains intact, legible, and yours.
2.4
Sustainable by architecture
Static first, edge logic, minimal JavaScript, boring technology. Efficient code is an ecological position, not a benchmark.
3.0
The module system
Every feature is a vertical slice: routes, styles, components, and middleware in one folder, declared by one manifest. Modules register themselves; the core compiles everything in memory.
// modules/my-feature/index.module.js
export default {
id: "my-feature",
routes: [{ path: "/feature", entrypoint: "./routes/index.astro" }],
styles: ["./styles/feature.scss"],
hooks: { "header:top": "./components/Banner.astro" },
};Delete the folder and the feature disappears. The app keeps running. That is the litmus test of modularity — and the whole specification.
4.0
The hook system
Modules don't import each other. They publish to named hook zones, and whatever's listening mounts there — neither side has to know the other exists.
hooks: {
"header:top": "./components/Banner.astro", // UI zone — mounts into a page slot
"content:validate": "./hooks/validate.js", // logic hook — reachable via virtual:stnd/hooks
}A hook name resolves to exactly one kind — UI/action zone or logic hook — never both. The loader checks it at build time and fails loudly the moment a module tries to mix them.
5.0
Typography
One base size, one ratio. The whole scale follows. Standard uses the silver ratio (1.414) for type and the golden ratio (1.618) for layout blocks. Measured now, on your screen:
6.0
Color
You choose an ink, a paper, and one accent. The OKLCH engine derives the rest: surfaces and borders from your paper, semantic states by rotating your ink's hue at equal perceived lightness — so the palette agrees with itself no matter what you seed it with. This page seeds the warm red of a federal standards manual, and every value below is measured from the running stylesheet:
accent — the seed
—
surface
—
border
—
success
—
warning
—
error
—
7.0
Spacing
One baseline, plain multiples and divisions — no arbitrary magic numbers. Every gap on this page is --space scaled, measured now, on your screen:
8.0
Table
A bare <table> — no class, no wrapper:
| Token | Value | Used for |
|---|---|---|
--space | 1× baseline | Default gap between blocks |
--scale | 1× base size | Body text |
--color-accent | seed hue | Links, focus states, emphasis |
9.0
Prose
Every other section on this page breaks out to the full sheet. This one doesn't — it sits at --line-width-md, the framework's own optimal reading measure (60–75 characters):
Line length isn't a style choice. Past 75 characters the eye loses its place on the way back to the left margin.
A paragraph at reading width, with an inline link, some inline code, and a short list:
- One idea per line
- No decoration without a job
- The measure serves the reader, not the layout
10.0
Adoption
npm create astro@latest my-site -- --template minimal
cd my-site
npm install @stnd/core @astrojs/svelte sass-embedded// astro.config.mjs
import { defineConfig } from "astro/config";
import standard from "@stnd/core";
export default defineConfig({
integrations: [standard()],
});That is the entire procedure. The manual documents every package, token, and fatal error. The source is open.
11.0
Applications in the field
Standard Garden — a quiet place to think in public. Paste your prose; get a beautiful URL in ten seconds.
L'art d'enseigner — an educational platform for homeschooling families in Quebec.
Two domains with nothing in common, one technical foundation. That is the proof the specification asks for.