§ 01 / Start
Start a project
$ npm create zn
Or pnpm, yarn, bun.
In your CLI terminal write without quotes "npm create zn". The installer asks what you are building, picks relevant questions and skips every question that cannot change the answer. (If you get a scary error, perhaps you don't yet have Node.js)
zenness.dev/docsDocumentation and CLI reference
§ 03 / Limits
What zenness Is Not For
A content system for non-technical editors
Content is Markdown in version control. Pair it with a hosted editor, or keep WordPress.
A plugin marketplace
A deliberate trade: it is the mechanism behind the security incident rate, and also why you cannot install a slider from a menu.
A heavy in-browser application
If the product is a canvas editor or a spreadsheet, start somewhere else.
Your own checkout
The commerce option scaffolds no payment, tax or fraud code. Shopify does those, and is liable for them.
An upgrade path for an existing project
A scaffolded project diverges from its template the moment it exists. What you generate is yours to maintain.
A complete accounts system
No single sign-on, no multi-factor, no password reset. It scaffolds the part that is only boilerplate.
§ 04 / Positioning
Against the Alternatives
vs WordPress
No third-party code in the runtime
Static files or one small server, instead of a server that must stay patched and a database hit per request.
vs Next.js
No single framework required
React, Vue and Svelte are options rather than the premise, and the setup is a conversation rather than a configuration exercise.
vs Nuxt
The same backend, without the Vue requirement
Both run on Nitro. zenness pairs it with a template-first frontend aimed at content, not at applications.
§ 05 / Use Case 0X
Editorial That Sells, and Proves It
A store publishes real articles and cannot say which article sold what. The usual setup puts the writing in one system and the selling in another, with a seam the customer can see and the analytics cannot cross.
The article is the merchandising
A piece lists the products it features; a Shop the Look block renders them. No shortcodes in the prose.
Prices that are never stale
The article caches hard; price and stock are fetched separately. Inventory moving invalidates nothing.
Attribution that survives ad blockers
First-party throughout, with the join arriving on the order webhook. No third-party pixel to switch off.
A number you can defend
The report prints its own coverage next to every revenue figure, and never blends a guess into a measurement.
Every vendor in this category quotes revenue; the useful question is how much of it they could actually see.
§ 06 / Use Cases
Eight Starting Points
Editorial that sells, and proves which article sold it
A marketing site with a blog, and nothing to pay for while it sits there
A headless API behind an app someone else built
Documentation people can actually search
A small application with accounts, uploads and email
Agency work, scaffolded the same way every time
Getting off WordPress, with clear eyes about the trade
A prototype you are allowed to throw away
Each is one command, and the installer skips every question that cannot change the answer.
§ 07 / Configuration
Configuration by Example
Each configuration file ships beside a sibling listing every option zenness supports, commented out with its default.
- astro.config.mjs
- astro.config.mjs.example
- nitro.config.ts
- nitro.config.ts.example
Changing a setting is uncommenting a line, not opening a documentation tab. The example file is never loaded — it is a learning tool bundled with your exact version.
§ 08 / Features
Features You Choose at the Start
None are on by default. Each is a set of ordinary files you own, rather than a dependency to configure.
rss
A feed built from your content, linked from every page
seo
Social preview tags and structured data, so a shared link does not look broken
search
Site search built during the build. No service to run, no index to keep in sync
auth
Register, log in, log out, and who-am-I — deliberately small and readable end to end
media
Uploads stored once per file, with a record of where each asset is used
forms
A validating endpoint that sends mail, with a trap for bots
§ 09 / Default Inclusions
Every Project Ships the Same Foundation
- Astro
- Pages and components for the site itself
src/pages/ - Nitro
- The API layer, and the server in production
server/routes/ - Vite
- Instant updates while developing, optimised production builds
- Partytown
- Third-party scripts kept off the main thread, so analytics cannot slow the page
- Zod
- Validation, so bad input is refused at the edge rather than stored
src/content.config.ts - Consola
- One tagged logger, used in this page's frontmatter at build time and in its client script alike
src/lib/logger.ts - ofetch
- JSON in and out, and a thrown FetchError carrying the server's own parsed body
src/lib/api.ts - magic-regexp
- Readable, type-safe patterns. This one validates the slug a dynamic route was handed
src/lib/slug.ts
TypeScript works with no configuration, and the command-line tool supports multiple bundlers.
§ 010 / Architecture
One Origin
Nitro serves /api (backend/logic) and Astro renders this page you are on (web-frontend/visuals), and both come off one origin. In development Astro proxies /api to the Nitro dev server; in production Nitro serves Astro's built output directly. No CORS, one deployment, two parts at their best.
Frontend
Astro
Pages, layouts and content, rendered ahead of time
Backend
Nitro
The API, the database and anything that must run on a server
Result
One build
One base to manage. One base to release data from.
API
src/lib/api.ts is an ofetch client pointed at /api on this origin, so the button below calls this project's ownserver/routes/api/hello.ts. Open the browser console first — the same Consola logger runs on both sides of the call.
Click the button to call the API.§ 11 / Guarantees
What the Installer Will Not Do
Ask questions that are not relevant to your build
Choose the backend alone and it won't asks about CSS frameworks.
Quietly downgrade what you asked for
A request it cannot honour stops and says why, rather than scaffolding something else.
Accept a typo in silence
A misspelled option is refused, with the spelling it thinks you meant.
Every answer is echoed before anything is written, and each thing it wires up is named as it happens — so an automated run reports exactly what an interactive one does.
§ 12 / The Whole Setup
One Command, Eleven Decisions
$ npm create zn
Or pnpm, yarn, bun.
Project location
Where to scaffold? Defaults to creating zensite folder to your current folder.
Parts
Frontend, backend, or both
CSS framework
Tailwind CSS, Bootstrap, shadcn/ui, Ant Design
Processors
Sass/SCSS, PostCSS, or neither
UI components
Bring your own components from React, Vue, Svelte, or none
Development tools
Prettier, Autoprefixer, Stylelint, Biome
Deploy preset
Vercel, Firebase, Cloudflare, Zephyr, manual
Basic features
Feed, SEO, search, accounts, media, forms
Database
None, SQLite or PostgreSQL
Sitemap and site URL
Generated, if you want them
§ 13 / The Setup Problem
The Cost of Starting
Before any product work begins, a new web project needs all of this decided and wired together — repeatedly, on every project, by hand.
- A frontend and a backend that agree on one origin
- Cross-origin rules, in development and again in production
- A styling stack, a formatter, and a linter that do not fight
- Logging, validation and an HTTP client, chosen and configured
- A database, its migrations, and somewhere to run them
- A hosting target, and a build that matches it
None of it is the thing anyone set out to build.
Every question the installer asks is a decision that is cheap now and expensive in six months.
A modern full-stack JavaScript framework
zenness
The one command, that starts your next project.
Astro pages and a Nitro API, on one origin.
- Astro
- Nitro
- Vite
- TypeScript
