day
Every participant is a URL.
Cream paper under a hazy morning sky. Forest links, terracotta accents, ink that settles soft on the page.
POST /inbox
design system
A natural palette of paper, sky, forest, and lantern. Crimson Pro for headings, IBM Plex Sans for prose, IBM Plex Mono for code.
A scene-in-a-seal: sky, sun, two layered hills inside a thin ink ring. Three moods — day, sunset, night — that the brand chip rotates through based on the visitor's local time. Pure SVG, no wordmark inside the seal.
Moods
day · 06–17
sunset · 18–20
night · 21–05
Scales (day)
128 px
64 px
32 px
20 px
Notes
/static/mark-day.svg, mark-sunset.svg, mark-night.svg. mark.svg is a copy of the day version for any external reference / fallback.new Date().getHours() — local time, not server time.Six families: paper, ink, sky, forest, lantern, surface.
Paper & ink
#f7f1e3#fbf6e8#ece3cc#2d2a24#524c3f#8a826fSky
#e6eef3#c8dde9#88b1cdForest
#b8c79a#6e8b5b#4d6a3eLantern
#e6c073#e3a47a#c87b5dThe night mood from the mark, extended to the whole surface. Ink and paper invert; the sky deepens to indigo; lantern and moss lift a touch so they still carry the room. Same tokens, different values — every component follows automatically.
Side-by-side
day
Cream paper under a hazy morning sky. Forest links, terracotta accents, ink that settles soft on the page.
POST /inbox
night
The same room after sundown. Ink turns to paper; the sky deepens; the lantern glows a touch brighter.
POST /inbox
Proposed surface tokens
#14171c#1b1f25#232830#ece3cc#b8b09a#7d7768Accents (lifted for contrast on night)
#a8cce0#92b27d#b8c79a#f0cd86#eab392#e09478Tokens
/* night: invert paper/ink, lift accents */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--paper: #14171c;
--paper-warm: #1b1f25;
--paper-deep: #232830;
--ink: #ece3cc;
--ink-soft: #b8b09a;
--ink-faint: #7d7768;
--sky-haze: rgba(110, 145, 180, 0.16);
--sky: #6f97b3;
--sky-deep: #a8cce0;
--moss: #b8c79a;
--forest: #92b27d; /* link colour — lifted */
--forest-deep: #b8c79a; /* em / strong */
--gold: #f0cd86;
--sunset: #eab392;
--terracotta: #e09478;
--line: rgba(236, 227, 204, 0.10);
--line-soft: rgba(236, 227, 204, 0.06);
--shadow: 0 1px 2px rgba(0, 0, 0, 0.30),
0 12px 32px rgba(0, 0, 0, 0.40);
}
}
/* explicit override (toggle) */
:root[data-theme="dark"] { /* same overrides as above */ }
Notes
mix-blend-mode: multiply to screen, with opacity dropped to ~0.25 — same texture, doesn't darken an already-dark surface.prefers-color-scheme by default. Expose an explicit override via data-theme on <html>, persisted in localStorage.Three families. Each has one job.
Every participant is a URL.
A fresh humanist grotesque, picked for its warmth and the way its terminals don't read as cold or technical. Reads well at 16–18px for long-form prose.
POST /inbox HTTP/1.1
Content-Type: application/posta+json
Posta-Signature: ed25519 base64...
Display drops sharply; body floats around 17px.
A url is identity.
How it works
POST to send
subsection label
Genuine origin authentication, no central infrastructure.
Receivers return 2xx only after durably storing the verified message.
a messaging protocol
The handful of building blocks the site repeats.
Buttons
Cards
Used in the "How it works" three-up. Italic numeral in terracotta, Crimson Pro title.
The same shell with any leading mark — useful when steps aren't ordinal.
Code blocks
// goldmark + chroma render this server-side
res, err := posta.Attempt(ctx, posta.AttemptInputs{
Sender: "https://alice.example/inbox",
Recipient: "https://bob.example/inbox",
KeyID: "k1",
MsgID: posta.NewRandomID(),
Payload: payload,
})
Pull quote / why-block
If you want to receive a message at alice.example/inbox and know it really came from bob.example/inbox, this is the simplest thing that works.
Link list
Prose elements (as used in /spec)
A paragraph of body text with an inline link, some inline code, and an italic emphasis.
monospace tokenA blockquote sits in moss with a small ornament.
Tables follow:
| Field | Type | Notes |
|---|---|---|
v | integer | protocol version |
sender | string | canonical URL |
id | string | ≤ 256 bytes |
Every visible decision lives in a custom property in style.css.
/* paper + ink */
--paper: #f7f1e3;
--paper-warm: #fbf6e8;
--paper-deep: #ece3cc;
--ink: #2d2a24;
--ink-soft: #524c3f;
--ink-faint: #8a826f;
/* sky */
--sky-haze: #e6eef3;
--sky: #c8dde9;
--sky-deep: #88b1cd;
/* forest */
--moss: #b8c79a;
--forest: #6e8b5b;
--forest-deep: #4d6a3e;
/* lantern */
--gold: #e6c073;
--sunset: #e3a47a;
--terracotta: #c87b5d;
/* surface */
--line: rgba(45, 42, 36, 0.10);
--line-soft: rgba(45, 42, 36, 0.06);
--radius: 14px;
--radius-lg: 22px;