How Wuppy works
Content is files
Section titled “Content is files”Every entry is a Markdown or MDX file with YAML frontmatter, for example content/posts/en/hello.md.
Fields that Wuppy does not know about are kept as they are. Astro reads the same files through its Content
Collections (glob loader), so your templates use the normal Astro APIs.
Other site data (menus, widgets, sections, taxonomies, bylines, settings, redirects) is stored as JSON under
.wuppy/data and is committed the same way.
Every save is a commit
Section titled “Every save is a commit”Saving content, uploading media or changing settings creates a Git commit with the signed-in user as the author. That gives you:
- a full history per entry, with line and field diffs,
- one-click restore of any earlier version,
- no lock-in: the repository is the backup.
Autosave is different: when you pause typing it keeps a recovery copy under .wuppy/autosave/ and never creates a commit.
Runs on Node.js
Section titled “Runs on Node.js”Wuppy is an Astro integration plus a Hono API. It runs as a normal Node.js server (for example
in Docker). Users, sessions and comments are stored in SQLite (node:sqlite) inside .wuppy/.
Packages
Section titled “Packages”| Package | Role |
|---|---|
wuppy |
Content engine, REST API, Astro integration, media, SEO, redirects, webhooks, plugin sandbox, AI and managed sites |
@wuppy/admin |
The React admin panel at /admin |
@wuppy/auth |
Sign-in (Better Auth), roles and permissions |
@wuppy/git |
Commits, history, diffs and reverts |
@wuppy/plugin-types |
Plugin manifest and capability checks |
create-wuppy |
npm create wuppy |