# @glw907/cairn-cms

> Embedded, magic-link, GitHub-committing CMS for SvelteKit/Cloudflare sites.

Latest version **0.97.0** (published 2026-09-23) · MIT license · 967 weekly downloads

## Install

```sh
npm install @glw907/cairn-cms
pnpm add @glw907/cairn-cms
yarn add @glw907/cairn-cms
bun add @glw907/cairn-cms
```

Provides the commands `cairn-audit`, `cairn-guidance`, `cairn-manifest`, `cairn-media-seed`.

## Health

**Score 55/100 (C)** — status: active.

Positive: esm support; no vulnerabilities; has provenance; recently updated; high maintenance score.

Warnings: low downloads; no types; pre 1.0.

Negative: declining downloads.

## Facts

| | |
|---|---|
| Version | 0.97.0 |
| Published | 2026-09-23 |
| First published | 2026-05-26 |
| Weekly downloads | 967 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM |
| Node | >=24 |
| Dependencies | 37 |
| Unpacked size | 7.6 MB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 0 |
| Author | Geoff Wright |
| Maintainers | glw907 |
| Keywords | cms, sveltekit, cloudflare, github, magic-link, markdown |

## Links

- npm: https://www.npmjs.com/package/@glw907/cairn-cms
- Repository: https://github.com/glw907/cairn-cms
- Homepage: https://github.com/glw907/cairn-cms#readme
- Issues: https://github.com/glw907/cairn-cms/issues
- npm.io page: https://npm.io/package/@glw907/cairn-cms

## Dependencies (37)

- [yaml](https://npm.io/package/yaml.md) ^2
- [shiki](https://npm.io/package/shiki.md) ^4.3.0
- [vfile](https://npm.io/package/vfile.md) ^6.0.3
- [esm-env](https://npm.io/package/esm-env.md) ^1.2.2
- [heic-to](https://npm.io/package/heic-to.md) ^1.5.2
- [unified](https://npm.io/package/unified.md) ^11.0.5
- [hastscript](https://npm.io/package/hastscript.md) ^9.0.1
- [rehype-raw](https://npm.io/package/rehype-raw.md) ^7.0.0
- [remark-gfm](https://npm.io/package/remark-gfm.md) ^4
- [@types/hast](https://npm.io/package/@types/hast.md) ^3.0.4
- [gray-matter](https://npm.io/package/gray-matter.md) ^4
- [rehype-slug](https://npm.io/package/rehype-slug.md) ^6.0.0
- [@types/mdast](https://npm.io/package/@types/mdast.md) ^4.0.4
- [rehype-parse](https://npm.io/package/rehype-parse.md) ^9.0.1
- [remark-parse](https://npm.io/package/remark-parse.md) ^11.0.0
- [@lezer/common](https://npm.io/package/@lezer/common.md) ^1.5.2
- [rehype-remark](https://npm.io/package/rehype-remark.md) ^10.0.1
- [remark-rehype](https://npm.io/package/remark-rehype.md) ^11.1.2
- [@lucide/svelte](https://npm.io/package/@lucide/svelte.md) ^1.47.0
- [rehype-sanitize](https://npm.io/package/rehype-sanitize.md) ^6.0.0
- [@codemirror/lint](https://npm.io/package/@codemirror/lint.md) ^6.9.7
- [@codemirror/view](https://npm.io/package/@codemirror/view.md) ^6.43.13
- [@lezer/highlight](https://npm.io/package/@lezer/highlight.md) ^1.2.3
- [rehype-stringify](https://npm.io/package/rehype-stringify.md) ^10.0.1
- [remark-directive](https://npm.io/package/remark-directive.md) ^4.0.0
- [remark-stringify](https://npm.io/package/remark-stringify.md) ^11.0.0
- [unist-util-visit](https://npm.io/package/unist-util-visit.md) ^5.1.0
- [@codemirror/state](https://npm.io/package/@codemirror/state.md) ^6.7.6
- [spellchecker-wasm](https://npm.io/package/spellchecker-wasm.md) ^0.3.3
- [hast-util-sanitize](https://npm.io/package/hast-util-sanitize.md) ^5.0.2
- [hast-util-to-string](https://npm.io/package/hast-util-to-string.md) ^3.0.1
- [@codemirror/commands](https://npm.io/package/@codemirror/commands.md) ^6.11.1
- [@codemirror/language](https://npm.io/package/@codemirror/language.md) ^6.12.3
- [mdast-util-directive](https://npm.io/package/mdast-util-directive.md) ^3.1.0
- [@codemirror/autocomplete](https://npm.io/package/@codemirror/autocomplete.md) ^6.20.2
- [@codemirror/lang-markdown](https://npm.io/package/@codemirror/lang-markdown.md) ^6.5.0
- [@rodrigodagostino/svelte-sortable-list](https://npm.io/package/@rodrigodagostino/svelte-sortable-list.md) ^2.1.17

## Alternatives

- [@mdxeditor/editor](https://npm.io/package/@mdxeditor/editor.md) — 962.4K weekly downloads
- [mmdb-lib](https://npm.io/package/mmdb-lib.md) — 680.9K weekly downloads
- [playcanvas](https://npm.io/package/playcanvas.md) — 36.2K weekly downloads
- [markdown-to-confluence](https://npm.io/package/markdown-to-confluence.md) — 103 weekly downloads
- [@zappar/sharing](https://npm.io/package/@zappar/sharing.md) — 16 weekly downloads

## Recent versions

- 0.97.0 (latest) — 2026-09-23
- 0.95.0-rc.1 (next) — 2026-08-17
- 0.6.0-rc.1 (rc) — 2026-05-30
- 0.96.0 — 2026-08-22
- 0.95.0 — 2026-08-20
- 0.94.0 — 2026-08-07
- 0.94.0-rc.2 — 2026-08-06
- 0.94.0-rc.1 — 2026-08-06
- 0.93.0 — 2026-08-02
- 0.92.0 — 2026-08-01
- 0.91.1 — 2026-07-30
- 0.91.0 — 2026-07-29
- 0.90.1 — 2026-07-25
- 0.90.0 — 2026-07-24
- 0.89.1 — 2026-07-21
- … 78 more at https://npm.io/package/@glw907/cairn-cms/versions

## README

# cairn

cairn is an embedded, magic-link, GitHub-committing CMS for SvelteKit sites on Cloudflare.

```
npx create-cairn-site
```

## Where to start

- **Deciding whether cairn fits?** [Why cairn](./docs/why-cairn.md) covers the reasoning, the
  stack, and the honest trade-offs.
- **Writing for a site built on cairn?** [Welcome, editors](./docs/editors/welcome.md) starts with
  signing in.
- **Setting up a site and won't be writing code?** [The admin track](./docs/admin/README.md)
  takes you from nothing to a live, running site with zero code. Most sites finish here.
- **A Svelte developer extending a site?** Set the site up with the admin track first, then come
  back to [the extend track](./docs/extend/README.md) for custom content, admin screens, and
  everything else past the default.
- **Working on cairn itself?** [CONTRIBUTING](./CONTRIBUTING.md) maps the repository and how a
  change lands. [The `src/lib` map](./docs/internal/src-lib-map.md) goes deeper into the library
  tree itself.

## What cairn is

cairn is two things built as one: an editor-first, git-backed content management system, and a
SvelteKit toolkit a developer extends for their own organization. The premise is that the people
who write an organization's content are often the same people who know what the organization needs
next, and that a developer who builds directly on the editors' own admin surface, rather than a
separate app bolted onto a headless CMS, ships those ideas faster. The admin is a UI toolkit as
much as an editor: a developer's own screen, a member roster, an event calendar, a reservation
form, mounts inside the same admin and shares its components and its sign-in, so what gets added
reads as one product to the people using it, not a second app beside cairn.

A developer builds those extras on cairn's seams: member signups, rosters, event and program
registration, reservations, whatever a small organization's own site needs beyond content. cairn
ships none of it. It ships the frame, the editor, and the documented seams a developer builds on.

## Content and storage

Content is markdown, committed to the site's own GitHub repository, organized as a fixed set of
concepts you declare (Posts and Pages are available out of the box, and you can add your own).
A save holds on a per-entry branch; publishing copies it to the main branch with the editor as
commit author, through a GitHub App created for the site, and the site deploys the way any push
already does. Editors sign in from an emailed link, with no GitHub account and no password, write
in a markdown editor with a live preview rendered through the exact function the public site uses,
and never see any of the branch or commit mechanics underneath.

## Why this stack

cairn commits fully to SvelteKit, Cloudflare, and GitHub, with no layer trying to hide any of the
three, and the admin itself is built in DaisyUI and Tailwind, the idiom a developer's own screens
extend it in. [Why cairn](./docs/why-cairn.md) has the full reasoning and the trade-offs a fixed
stack makes.

## Getting started

`create-cairn-site` scaffolds a complete starter, Waymark: a working site with a component library
already wired in, built to be restyled or replaced rather than started from a blank page. A second,
documentation-focused template, Topo, is planned but not shipped yet.

Already have a SvelteKit app and want to add cairn to it instead?
[Add cairn to a SvelteKit app](./docs/extend/add-cairn-to-a-sveltekit-app.md) starts from
`npm install @glw907/cairn-cms`.

## Where cairn stands

cairn is pre-1.0 and runs in production on two sites today, [ecxc.ski](https://ecxc.ski) and
[907.life](https://907.life). Content stays yours regardless of what happens to cairn: it's
markdown in your own repository, and leaving is a matter of cloning it.

The [docs](./docs/README.md) are where every track above lives in full. History is in the
[CHANGELOG](./CHANGELOG.md), security reporting goes through the [policy](./SECURITY.md), and the
license is [MIT](./LICENSE).

---
_Source: https://npm.io/package/@glw907/cairn-cms · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
