Commands

The stomme command a site runs, the scripts in a site's package.json, the scaffolder that creates a site, and the tools behind them.

stomme

Inside a site, run it through pnpm as pnpm stomme <command>. After npm i -g @gronare/stomme it runs as stomme <command> anywhere, which is how stomme new creates a site outside one. With no command, or with --help, it lists every command; stomme help <command> and <command> --help print one.

Command What it does
stomme new <directory> [--blank | --demo] creates a site, the same as pnpm create stomme; see create-stomme
stomme dev runs the site's scripts/dev.mjs with the options given: the site on http://localhost:4321, the CMS at /admin, the live preview at /preview and every block at /lookbook. A site without that script gets stomme cms, then astro dev
stomme build [--target <target>] stomme cms, then astro build. --target (also --target=<target> or -t <target>) sets STOMME_TARGET to netlify, static, cloudflare, vercel or node; without it the site's own default applies, netlify in a new site. Other options go to astro build
stomme cms regenerates the CMS from the catalog and the site config; see stomme-gen
stomme block new <name> scaffolds src/blocks/<Name>.astro; see stomme-new-block
stomme lint [content] checks the blocks in src/content/ against the catalog; see stomme-lint-content
stomme lint styles runs stomme-lint-styles on the engine's own stylesheet
stomme lint comments [dir] runs stomme-lint-comments
stomme --version prints the engine version

An unknown command, target or option of stomme itself exits with 2 and the usage; otherwise the exit code is that of the step that failed.

Each command runs a tool that also ships under its own name, so a script or a site that calls the older names keeps working:

Older name Same as
stomme-gen stomme cms
stomme-new-block <Name> stomme block new <Name>
stomme-lint-content stomme lint content
stomme-lint-styles stomme lint styles
stomme-lint-comments stomme lint comments
create-stomme <directory> stomme new <directory>

Site scripts

Script What it runs
pnpm dev node scripts/dev.mjs: stomme-gen, clears Astro's content cache, then astro dev with the options given
pnpm dev:web astro dev alone, without regenerating the CMS
pnpm build stomme build, for Netlify
pnpm build:cloudflare stomme build --target cloudflare, for Cloudflare Workers
pnpm build:vercel stomme build --target vercel; needs @astrojs/vercel
pnpm build:node stomme build --target node, a standalone Node server; needs @astrojs/node
pnpm build:static stomme build --target static, a fully static build with no adapter
pnpm preview pnpm build:static, then astro preview of that build on http://localhost:4321: every page, without the server routes such as /api/contact
pnpm cms:gen stomme cms
pnpm block:new <Name> stomme block new <Name>
pnpm lint:content stomme lint content

A host builds with pnpm build, or the build:* script for its target. See Deploy a site.

create-stomme <directory>

Scaffolds a new site into <directory>, which must not exist yet. Run it as pnpm create stomme <directory>, pnpm dlx create-stomme <directory> or stomme new <directory>.

A site made this way depends on the engine from the npm registry, "@gronare/stomme": "^<version>", so no token or registry setting is needed. From a clone of stomme it runs as node stomme/packages/create-stomme/bin/create.mjs <directory> and links the site to the engine in the clone instead, for working on the engine.

Option What it makes
--blank a blank site: a home page with a hero and a text block, a contact page with its form, a thanks page, a neutral theme and placeholder text such as "My site" and hello@example.com. Services, testimonials and the FAQ are off, and it carries no photos
--demo the Wren & Sorrel demo, a finished site for a fictional garden studio with pages, photos, services, testimonials and FAQs

It refuses both options at once, and any other option. With neither option it asks in the terminal, blank by default, and with no terminal it makes the blank site. It runs git init in a site outside any repository, then prints the commands to install and start it.

stomme-gen

stomme cms. Rewrites the regions of public/admin/config.yml between its # >>> <name>:generated and # <<< <name>:generated markers. The names it fills are blocks (every block the site offers), collections (the collection editors), settings, cms (the backend), navlinks, footerlinks, thanksbuttons and tracking. Outside the markers it also sets media_folder and public_folder and each collection's media folders, adds media_libraries, output.omit_empty_optional_fields and the rich-text editor_components when they are missing, and translates the field labels into cmsLocale.

It writes these files, each one replaced on every run:

File What it holds
public/admin/index.html the pinned Sveltia script tag, the editor script, the stomme-auth:generated and stomme-theme:generated regions, and the addon previews tag when there are addon previews
public/admin/stomme-previews.js the live previews of every block and listing
public/admin/stomme-editor.js the editor additions to the CMS
public/admin/stomme-addon-previews.js the addon previews, copied from STOMME_SLOTS_DIR, and removed when there are none
public/admin/stomme-site.css the site's global.css with the engine styles and the theme.md colours, for the previews
public/admin/stomme-theme.css the look of the CMS itself
public/admin/blocks.html the block gallery
public/admin/blocks-manifest.json the fields of the site's own blocks and of library blocks it changed
public/images/ the engine's default images

It only creates these, and never overwrites them: an index page under src/content/pages/ for each listing, an entry for each term collection value, and public/favicon.ico from public/favicon.svg.

Text outside the markers is yours and stays. Run with no public/admin/config.yml, it does nothing; a config with no markers at all stops it with an error.

Variable What it changes
STOMME_SCHEMA the catalog file, default src/blocks/schema.ts
STOMME_CONFIG the CMS config, default public/admin/config.yml
STOMME_SVELTIA_SRC the Sveltia CMS script /admin loads, default the pinned version on unpkg
STOMME_SLOTS_DIR an outside directory whose blocks, CMS editors and previews it adds

stomme-new-block <Name>

stomme block new <Name>. Creates src/blocks/<Name>.astro with a heading prop and prints the two registrations it needs. The file name is the name in PascalCase and the type the same in camelCase, with anything other than letters and digits taken as a word break: PromoBanner, promo banner and promo-banner all make PromoBanner.astro with the type promoBanner. The name must start with a letter, and a -- before it is ignored. It refuses to overwrite a file.

stomme-lint-content

stomme lint content. Reads the blocks: list of every src/content/**/*.md against the site's catalog, src/blocks/schema.ts plus the blocks of STOMME_SLOTS_DIR, and prints by file, line and block:

Finding When
an unknown field the block, one of its groups or a list item holds a key the catalog does not declare; type and anchor are allowed on every block
an older field the key is a renamed field from the package's block-migrations.json, which still renders through a back-compat shim
an unknown block the block's type is not in the catalog
Option What it does
--json prints { files, counts }: each file with its blocks, each block with its line and findings
--strict exits with 1 when anything is reported; without it the exit code is 0

It never writes a file. A site without src/blocks/schema.ts is checked against the engine's catalog. stomme-gen runs the same check and prints one line with the counts when there is anything to report. See Write pages by hand or with an agent.

Engine tools

These work on the engine package itself, reading and writing files inside it. They, and the scripts in the engine's own package.json, are for people working on stomme, not for a site.

Command What it does
stomme-gen-schema writes the package's schema-manifest.json, the fields of every collection
stomme-gen-blocks writes the package's blocks-manifest.json, the fields of every library block
stomme-lint-styles fails on a hardcoded colour outside the :root token block of the package's styles.css; --update rewrites its baseline
stomme-lint-comments [dir] fails on a // comment wrapped over several lines, or one in Swedish, under the directory