Vol. 0 · Built in publicPre-alpha · Rust · Open source
Neopress
Preserving the open web. Replacing its engine.

Neopress is a publishing system for the open web, written in Rust: the familiar block editor, themes and plugins people know from WordPress, rebuilt as one unified, memory-safe stack (frontend, backend and database) with native MCP integration so AI agents can work safely inside the CMS. Its promise, from the manifesto: preserve the open web, replace its engine. The brand dresses it like what it makes — a well-edited publication. Paper, ink, generous margins, serif headlines, hairline rules, and a house collection of textured art prints in place of stock imagery. Product screenshots are shown like figures in a magazine feature: framed, numbered, captioned.

Three ideas carry everything:

  1. Editorial, not "SaaS". Rules and whitespace group things; boxes, shadows and gradients don't.
  2. Art and product alternate. A plate from the art collection, then a real screenshot, then text. Never a wall of either.
  3. Proof over adjectives. Speed, memory and safety are stated as real figures in mono (0.8 ms, 38 MB), not as "blazing fast".
SystemNeopress
ThemesDaylight · Night edition
Tokens16 colours · 13 type styles
Components8
Last change2026-10-29
01

Voice

  • Write like a good editor: short declarative sentences, concrete nouns, real numbers. "Imports 20 years of posts in 90 seconds." not "Lightning-fast seamless migration."
  • Address the reader as you; Neopress speaks as we (the project), never "I".
  • Sentence case everywhere — headlines, buttons, nav. ALL CAPS only in the kicker style.
  • The product name is Neopress in sentences; the wordmark sets it lowercase with a full stop: neopress. Never "NeoPress", "Neo Press" or "NP".
  • Respect the pioneer, name the debt. WordPress "built the modern web" — say so — and then be direct about the problem: technical debt, stacked plugins, colliding third-party code, endless patching. Criticise the architecture, never the people or the community. No snark, no logos of competitors.
  • Speak in the manifesto's register: confident, pragmatic, a little defiant. Strong verbs (compile, replace, reset), short paired contrasts ("Stop patching the past and start compiling the future.").
  • Rust is a reason, not a personality: memory safety means "classic exploits simply cannot compile"; speed is "native to the architecture", not a caching add-on. No crab jokes, no 🦀.
  • AI is plumbing, not a gimmick: talk about agents building features, writing boilerplate and configuring settings through MCP — never "chatbot", "magic" or sparkle icons.
  • Big claims ("blazingly fast", "secure by default") are allowed in the manifesto and headlines only when a real figure in meta sits nearby to back them.
  • No emoji in product or marketing copy. Use — em dashes and real typographic quotes.
  • Kicker → headline → dek is the house pattern: RELEASE 1.0 / "Compiled themes, sandboxed crates" / "The first stable release is here — and it is small."

The house vocabulary: plugins are crates; themes are themes; the site admin is the desk; a site's dark theme is the Night edition.

02

Manifesto

The manifesto is the brand's source text. Quote it verbatim; don't paraphrase it into marketing copy. On the web it is set as a long read: kicker chapter numbers, display-l chapter titles, reading body copy at measure, one Plate per chapter, and the closing line as an oxide PullQuote.

Chapter Title Plate
01 The Pioneer's Plateau Plate I — Oxide Sun
02 The Fragile Foundation Plate VI — Marginalia
03 Safety, Speed, and a Clean Slate Plate IV — Compiler
04 The Architecture of Tomorrow Plate II — Typecase
05 The Engine the Web Deserves Plate III — Strata

01 · The Pioneer's Plateau

WordPress built the modern web and gave millions a platform. We respect its immense versatility and iconic interface, but its core architecture is now struggling to carry the weight of the modern internet. The technology that democratized publishing is being held back by decades of technical debt, forcing developers to fight the framework rather than build on it.

02 · The Fragile Foundation

Today's WordPress ecosystem is crippled by a reliance on endless workarounds. You are forced to stack plugins just to pass basic performance tests, creating a fragile house of cards. Furthermore, the unchecked plugin model has become a massive liability, where colliding third-party code creates constant security vulnerabilities. We waste too much time patching holes, resolving conflicts, and dreading updates. A versatile platform should never sacrifice basic safety and stability.

03 · Safety, Speed, and a Clean Slate

We are building Neopress in Rust to fundamentally change how a CMS operates. By prioritizing raw performance and strict memory safety, we ensure classic exploits simply cannot compile. Speed isn't a premium feature achieved through a labyrinth of caching tools, it is native to the architecture. We are choosing uncompromising quality and stability over a bloated marketplace.

04 · The Architecture of Tomorrow

While headless platforms gave developers freedom, they alienated everyday publishers. Neopress works as a unified stack combining the frontend, backend, and database. We are also building natively for the AI era. Instead of bolting on trendy chatbots, our native MCP integration allows your AI agents to safely build features, write boilerplate code, or configure settings directly inside your CMS workspace.

05 · The Engine the Web Deserves

We are done debugging plugin conflicts, managing endless maintenance cycles, and patching a framework that hit its technical ceiling years ago. Neopress is a pragmatic reset for developers tired of spaghetti code and creators who demand a platform that is secure by default and blazingly fast. We are preserving the open web, but we are replacing its engine.

Stop patching the past and start compiling the future.

Lines to lift

Use these as headlines, pull quotes and social cards — verbatim:

  • "Stop patching the past and start compiling the future." — the closing line; oxide PullQuote, hero of the manifesto page.
  • "We are preserving the open web, but we are replacing its engine." — homepage dek.
  • "Classic exploits simply cannot compile." — security feature headline.
  • "Speed isn't a premium feature. It's native to the architecture." — performance feature headline (the one allowed trim).
  • "A pragmatic reset." — kicker-length summary for ads and bios.
04

Colour

Paper and ink do 90% of the work. Oxide is the brand. Press blue belongs to the product. Moss and ochre are mostly for art.

  • Ground every page on paper; lift cards, menus and the editor canvas to paper-raised; sink code, inputs and the footer into paper-sunk.
  • Text is ink; captions, bylines and datelines are ink-muted. Both pass AA on all three papers in both themes.
  • oxide (Rust's colour) marks the brand: primary buttons, kickers, in-copy link underlines, the logo's full stop. Text on oxide is on-oxide. At most one oxide block per viewport.
  • press (the open-web blue) is the product's working colour: selection, the active block in the editor, scheduled states, focus. Text on it is on-press.
  • moss = published / success; ochre = draft and highlighter. Ochre is not a text colour on light paper (1.9:1) — use it as a fill with on-ochre.
  • Lines: rule for hairlines between rows and columns (decorative only), rule-strong for the masthead, section rules, control borders and screenshot frames.
  • Themes: Daylight (light) is primary; Night edition (dark) is warm charcoal, never pure black, with the accents lifted (oxide → #e8744a) and dark text on accent fills.
paperDaylight #f3eee4Night #111214

Page ground — the newsprint. Every page starts here; never pure white or pure black.

paper-raisedDaylight #fbf8f2Night #1a1c1f

Cards, plates' mats, the editor canvas, menus that float over paper.

paper-sunkDaylight #e7e0d1Night #0a0b0c

Wells: code blocks, input fields, table stripes, the footer band.

inkDaylight #16171aNight #efe9de

Primary text and headlines on paper, paper-raised and paper-sunk (≥13:1 in both themes).

ink-mutedDaylight #5a5852Night #a7a297

Captions, bylines, datelines, secondary copy on any paper (≥5.4:1 light, ≥6.7:1 dark).

ruleDaylight #16171a2eNight #efe9de2e

Hairlines between columns, table rows and list items. Decorative only — never the sole border of a control.

rule-strongDaylight #16171aNight #efe9de

The masthead rule, section rules, control borders and the frame around screenshots (meets 3:1 everywhere).

oxideDaylight #a8401bNight #e8744a

Brand accent — Rust's oxide. Primary buttons, kickers, links in body copy, the ink dot in the mark. Text on any paper ≥4.6:1.

on-oxideDaylight #fff8f0Night #160d08

Text and icons on an oxide fill (5.8:1 light, 6.4:1 dark).

pressDaylight #2a3bd0Night #93a1ff

Press blue — the open-web inheritance. Product UI links, selection, the editor's active block, focus. Text on any paper ≥6:1.

on-pressDaylight #ffffffNight #0b0e2b

Text and icons on a press fill (8:1 in both themes).

mossDaylight #3d5a39Night #93b98a

Art and secondary accent: success states, 'published' badges, plate backgrounds. Text-safe on any paper.

ochreDaylight #d9a42aNight #e6b84a

Highlighter. Art plates, marker underlines, the 'draft' badge fill. NOT text-safe on light paper (1.9:1) — use as a fill with ink on it.

on-ochreDaylight #16171aNight #16171a

Text on an ochre fill (7.9:1 light, 9.7:1 dark).

focusDaylight {press}Night {press}

Focus ring: 2px solid, 2px offset, on every interactive element (≥6:1 on every paper).

selectionDaylight #2a3bd02eNight #93a1ff3d

Text selection and the editor's selected-block wash.

05

Typography

Three families, all open-licensed (SIL OFL) and shipped as files in fonts/:

  • Newsreader (serif, variable opsz 6–72, wght 200–800, roman + italic) for everything editorial: display-xl, display-l, headline, title, dek, reading. Light weights (300–400) at large sizes; let the optical size axis do the work.
  • Schibsted Grotesk (sans, variable 400–900) for interface: body-l, body, label, caption, kicker.
  • IBM Plex Mono for code and meta — versions, datelines, figure numbers and every performance number.

Rules: - One display-xl per page. Headlines in Newsreader at negative tracking; never bold a Newsreader headline above 500. - The dek (italic Newsreader) always follows a headline in long-form and features; it's the brand's most recognisable texture after the art. - kicker sits 8px (space-2) above every headline, in oxide, uppercase, 0.14em tracking. - Reading copy is reading at 19/1.62 with measure (64ch) max width. UI copy is body 15/24. - Numbers that prove something are set in meta or code: 0.8 ms, v1.0.0, 2,914 posts.

Display · Newsreader

display-xl112px / 0.92 · 300 · -0.03em

One per page: the hero headline. Light weight, tight leading.

Publishing, rewritten.
display-l72px / 0.98 · 350 · -0.025em

Section openers and plate titles.

Fast by default
headline44px / 1.08 · 400 · -0.015em

Article headlines, feature titles.

A block editor that never waits
title28px / 1.18 · 500 · -0.01em

Card titles, H3 in long reads.

Themes compiled to the metal
dek22px / 1.45 · 350 · italic

Standfirst under a headline; pull quotes at smaller sizes.

Everything you love about the open web's favourite CMS — with a memory-safe core.
reading19px / 1.62 · 400

Long-read body copy in the blog and docs, measure 64ch.

Neopress renders a page in under a millisecond.

Interface · Schibsted Grotesk

body-l18px / 28px · 400

Marketing paragraphs and intros.

Install a plugin with one command.
body15px / 24px · 400

Default UI and card copy.

Drafts autosave every few seconds.
label14px / 20px · 600

Buttons, nav items, form labels.

Publish
caption13px / 18px · 400

Captions under plates and screenshots, in ink-muted.

Plate IV — Strata, 2026. Generative print.
kicker12px / 16px · 700 · 0.14em

All-caps section kicker above headlines, in oxide.

RELEASE 1.0

Code · IBM Plex Mono

code14px / 22px · 400

Code blocks and inline code on paper-sunk.

cargo install neopress
meta12px / 16px · 500 · 0.02em

Version stamps, figure numbers, datelines, benchmark figures.

v1.0.0 · 0.8 ms TTFB
06

Layout

  • 12-column grid inside width-wide (1160px), space-6 (24px) gutters; long reads in width-text (720px); plates may bleed to width-full.
  • Space generously: space-24 between page chapters, space-16 section padding, space-32 above the hero.
  • Group with rules, not boxes: a rule-strong top rule over each column or card (newspaper style), rule hairlines between rows. Cards have no background, border or shadow.
  • Corners are square (radius-none) for plates, screenshots and layout; radius-sm for inputs, code and badges; radius-md for buttons and menus only; radius-pill for dots and filter chips.
  • One shadow exists — shadow-plate — and it is only for lifting an art plate or a screenshot off the paper.

Spacing

space-14px

Icon-to-label gap, hairline offsets.

space-28px

Tight stacks: kicker to headline, badge padding.

space-312px

Button vertical padding x2, caption to image.

space-416px

Mobile gutter, card inner gaps.

space-624px

Card padding, column gutter.

space-832px

Between paragraphs groups and blocks.

space-1248px

Between related sections.

space-1664px

Section padding on desktop.

space-2496px

Between chapters of a page.

space-32128px

Hero top padding; the generous editorial breath.

Radius

radius-none0px

Default for plates, screenshots, cards and rules — Neopress is square.

radius-sm2px

Inputs, code blocks, badges.

radius-md6px

Buttons and menus only.

radius-pill999px

Status dots and tag chips; the ink dot.

Shadow

shadow-plateper theme

The one shadow: lifts a screenshot or art plate off the paper. Never on cards or buttons.

Widths

measure64ch

Max line length for reading copy.

width-text720px

Article column.

width-wide1160px

Grid container for marketing pages.

width-full1440px

Bleed plates and the masthead max width.

07

The art collection

The brand's imagery is a numbered series of generative prints, Plates I–VI (assets/Art/), made only from the palette, with risograph-style overprinting (multiply blends, slight misregistration) and paper grain.

  • Use plates for heroes, section openers, blog covers, social cards and empty states. Caption them like prints: "Plate IV — Compiler, 2026" (the Plate component).
  • Plate V — Night Edition is the hero for anything about dark mode or the Night-edition theme.
  • New plates follow the same recipe: palette colours only, flat geometric or torn-paper shapes, multiply overprint, grain, no text, no faces, no literal objects (no servers, rockets, crabs).
  • Never use stock photography, 3D renders, or AI-looking glossy gradients.

The Neopress art collection — Plates I–VI, original generative prints in the palette with multiply overprint and paper grain. I Oxide Sun (heroes), II Typecase (themes/type), III Strata (portrait; long reads, migration), IV Compiler (performance, releases), V Night Edition (dark mode), VI Marginalia (writing, editor). Caption as "Plate N — Title, 2026".

plate-01-oxide-sun.svg
assets/Art/plate-01-oxide-sun.svg2.5 KB
plate-02-typecase.svg
assets/Art/plate-02-typecase.svg9.0 KB
plate-03-strata.svg
assets/Art/plate-03-strata.svg11.9 KB
plate-04-compiler.svg
assets/Art/plate-04-compiler.svg3.5 KB
plate-05-night-edition.svg
assets/Art/plate-05-night-edition.svg8.6 KB
plate-06-marginalia.svg
assets/Art/plate-06-marginalia.svg4.1 KB
08

Product screenshots

Screenshots (assets/Screens/) are captured at 1600 × 1000 from real Neopress UI with real-looking content (never lorem ipsum), and shown with the FeatureShot component: a hairline browser frame, shadow-plate, a figure number ("Fig. 2") and an editorial caption.

  • screen-editor.webp — the block editor (Fig. 1 on the homepage).
  • screen-dashboard.webp — the desk with performance stats.
  • screen-crates.webp — crates (plugins) in the Night edition.
  • screen-terminal.webp — the CLI: install, new site, WordPress import, serve.
  • No device mock-ups, no tilted 3D perspective, no fake cursors or confetti. Crop by showing less UI, not by zooming in.

Product screenshots at 1600×1000 WebP for the FeatureShot component: editor (Daylight), dashboard/desk (Daylight), crates (Night edition), terminal (CLI). Show in a hairline frame with a figure number.

screen-editor.webp
assets/Screens/screen-editor.webp144.3 KB
screen-dashboard.webp
assets/Screens/screen-dashboard.webp46.4 KB
screen-crates.webp
assets/Screens/screen-crates.webp46.5 KB
screen-terminal.webp
assets/Screens/screen-terminal.webp34.9 KB
09

Texture, icons, motion

  • A fine paper grain (assets/Textures/paper-grain.svg) sits on plates and story images via the np-grain class (multiply in Daylight, a faint screen in Night edition).
  • Grain is for imagery only. Text grounds stay clean paper for legibility.
  • The double rule under the masthead and the heavy top rule on pull quotes are the brand's "printed" textures — use them as given, don't invent new ornaments.

Iconography

  • Neopress has no icon set yet. In the product use simple 1.5px-stroke line icons (Lucide is the closest match) in ink, 16–20px, always beside a label. Flagged: an own icon set is still to be drawn.
  • Marketing pages avoid icons entirely — use a kicker, a figure number, or a plate.
  • Arrows in text links are the typographic →, not an icon.

Motion

Quiet and quick: 120–200 ms ease-out for hover and state changes; images scale by at most 2% on hover. No parallax, no scroll-jacking, no bouncing. Respect prefers-reduced-motion by removing all transforms.

States and accessibility

  • Focus: a 2px solid focus ring (press blue) with a 2px offset on every interactive element; ≥6:1 on every paper in both themes.
  • Hover: inversion to ink/paper for buttons; an oxide underline for links and nav.
  • Disabled: 45% opacity and not-allowed cursor; never the only way to explain why.
  • Status always carries a word (Badge) — never colour alone. Ochre is never text on light paper.

Paper grain tile (600×600, transparent ink noise). Applied by the `np-grain` class over images only — multiply in Daylight, inverted screen in Night edition.

paper-grain.svg
assets/Textures/paper-grain.svg0.9 KB
10

Components

Masthead, Button, Badge, Plate, FeatureShot, StoryCard, PullQuote, Command. A homepage is typically: Masthead → display-xl hero with a Plate → three FeatureShots alternating sides with plates between → a PullQuote → Command (cargo install neopress) → a StoryCard row from the blog.

Each component below is rendered live from the system's bundle, and follows the theme switch at the top.

Button

Buttons start an action: oxide primary for the one action that matters on a view, ink-outline secondary beside it, and quiet (an oxide-underlined text button) for tertiary moves.

Consumer provides: children (a verb, sentence case), optional variant (primary default), size (sm · md · lg), href to render as a link, any native button props.

  • One primary per view. In the editor that is always Publish; on marketing pages Get Neopress.
  • Labels are verbs in sentence case: "Install crate", not "Crate Installation" and never ALL CAPS.
  • Hover inverts to ink / paper — the press imprint. No shadows, no gradients.
  • Radius is radius-md (6px) — the only rounded control in a square system.
  • Don't put two primaries side by side; don't use oxide text buttons in body copy (links are underlined text).

Badge

DraftPublishedScheduledsandbox: strict

A small status label for posts and crates: draft (ochre fill), published (moss fill), scheduled (press outline), sandboxed (moss mono outline).

Consumer provides: status, optionally children to override the label (e.g. sandbox: strict).

  • Always carries its word — colour is never the only signal.
  • Square-ish (radius-sm), 11px semibold; never pill-shaped, never with an icon.

Masthead

neopress
Vol. 1 · Thursday 29 October 2026v1.0.0 · 0.8 ms median render

The site header, set like a newspaper masthead: the wordmark, a sans nav, one primary action, a double rule-strong underline and an optional mono "edition" dateline strip.

Consumer provides: items ({label, href, current}), action (usually a small primary Button), optional edition content, optional logoSrc (the ink wordmark on light pages; omit it to set the name in type, which follows the theme).

  • Current page shows an oxide underline; nothing else is coloured.
  • Max five nav items. The edition strip carries a date and one true metric — never marketing copy.

Plate

An artwork from the Neopress art collection, framed like a gallery print: lifted by shadow-plate, with a numbered caption above a hairline.

Consumer provides: src (an asset from the Art group), alt, number (Roman numeral), title, caption, optional mat (paper or ink for a border around the print).

  • Plates are the brand's imagery: use them for heroes, section openers, blog covers and empty states. Never use stock photography.
  • Always caption with number and title ("Plate IV — Compiler"). Plates keep their natural aspect; don't crop below 4:3.
  • The grain overlay is part of the look — keep np-grain on the frame.
  • Pair at most one plate with one screenshot per viewport — art and product alternate, they don't pile up.

FeatureShot

A product screenshot in a hairline browser frame, beside a numbered editorial caption — how Neopress shows features.

Consumer provides: src (an asset from the Screens group), title, optional kicker, figure ("Fig. 2"), path (the URL shown in the frame chrome), align (right puts the text on the right), and children (one or two short paragraphs, optionally a quiet Button).

  • Screenshots are real product UI at 1600 × 1000, never mock-ups with lorem ipsum.
  • Alternate align down the page. Number figures in page order.
  • The frame is a 1px rule-strong hairline plus shadow-plate; no device mock-ups, no tilted perspectives.

StoryCard

A blog or news teaser: plate image, oxide kicker, serif headline, optional italic dek and a mono dateline, under a top rule.

Consumer provides: title, href, optional image (a plate), kicker, dek, meta ("28 Oct 2026 · 7 min").

  • Lay out in a 3-column grid with space-6–space-8 gutters; the top rule aligns the row like newspaper columns.
  • No card boxes, borders or shadows — the rule and whitespace do the grouping.

PullQuote

We moved twenty years of archives on a Tuesday afternoon. Nobody noticed — except the page speed.

Ana R., editor at The Long Field

Stop patching the past and start compiling the future.

The Neopress manifesto

A large italic Newsreader quote between a heavy top rule and a hairline, with an oxide hanging quotation mark; oxide tone sets it reversed on an oxide block for manifesto lines.

Consumer provides: children (the quote, ≤ 30 words), cite (person and role/publication).

  • Use real quotes from real users only. One per page section.
  • The oxide tone is for the brand's own voice (manifesto lines), at most once per page.

Command

cargo install neopress
neopress import --from wordpress ./export.xml✓ 2,914 posts · 88 s

One shell command on paper-sunk with an oxide $ prompt, an optional moss result and a copy button.

Consumer provides: children (the command as a plain string), optional result.

  • One command per Command; stack them for a sequence. Commands are real and copy-pasteable.
  • Set in code (IBM Plex Mono 14/22). Never syntax-colour beyond prompt and result.