No description https://sweetgrass.garden
  • Lua 66.3%
  • Go 19.3%
  • Rust 4.9%
  • Shell 4.1%
  • JavaScript 2.7%
  • Other 2.7%
Find a file
e3a5bc70 eabc49d6d0 gatherings: record the /open guest edge as built (gap closed in code)
Updates the deploy-gap section: the taproot guest-admission the prod deploy
exposed is now built + committed (877d3cb taproot, f82fe95 wiring), cloning the
/hook door pattern per S's reuse steer. Live proof pending the next deploy (a
no-auth edge on the real garden — wants explicit go). Skill updated with the
/open pattern so the no-guest-mode gotcha now names its solution.
2026-07-14 09:07:22 +00:00
.forgejo/workflows press: PUBLISH_TOKEN, not FORGEJO_TOKEN (reserved-prefix block) 2026-05-16 15:34:22 +00:00
ci builder: deploy CGI requires Bearer auth + image origin validation 2026-05-03 04:33:43 +00:00
garden gatherings: wire the open door end-to-end (bus + taproot conf + fulfill + fail2ban + page) 2026-07-14 09:05:36 +00:00
keepers Rename stewards → keepers 2026-04-19 01:01:58 +00:00
lua gather: the groundwork that seeds the gathering surface repo 2026-07-14 06:11:34 +00:00
plant docs: stop asserting Hetzner S3 keys are region-scoped — unconfirmed 2026-05-21 20:44:58 +00:00
press press: fix git_domain for co-hosted domains; derive /press section routing 2026-06-23 06:51:34 +00:00
seeds seed media: concrete home URLs, no bytes in-repo — the transplant model 2026-07-12 15:51:59 +00:00
weeds domains: move per-garden under .gardens/<g>/domains, positional ownership 2026-05-20 22:10:10 +00:00
.dev-keys.example Add --dev flag for installing dev SSH keys 2026-01-16 02:49:34 +00:00
.gitignore drop accidentally committed weave build binary; ignore it 2026-07-12 09:09:27 +00:00
.pressignore domains: move per-garden under .gardens/<g>/domains, positional ownership 2026-05-20 22:10:10 +00:00
_BUILDING.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_BYOH.md 5.5 2026-07-08 23:47:44 +00:00
_CONVERGENCE.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_DIGITALOCEAN.md Seed template: drop combination count, use FQDN, rename clone dir 2026-03-28 03:26:51 +00:00
_EDGE-CONTRACT.md docs(edge): reconcile the two edge plans into one contract 2026-06-27 23:48:53 +00:00
_GARDEN.md Remove startup framing from docs, fix plant.lua arg parsing 2026-04-12 18:45:26 +00:00
_GOTCHAS.md sync docs to reality 2026-04-28 08:01:53 +00:00
_LEGAL.md move governance documents to rhizome/governance 2026-04-26 05:34:51 +00:00
_MIRRORING.md Mirroring: pull-mirror topology, trust policy, upstream chain 2026-04-25 03:12:02 +00:00
_PLAN-asset-compaction.md docs(plans): buildability corrections from the audit 2026-07-02 17:22:46 +00:00
_PLAN-assets.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PLAN-bus-operator-mode.md plan: bus operator-mode migration — design handoff from the oikos session 2026-07-03 05:06:47 +00:00
_PLAN-commerce.md docs: commerce plan points at sg-account.js's identity home 2026-07-10 05:12:12 +00:00
_PLAN-constraint-restore.md docs: prune ten retired plan docs; extract open items; re-sync stale headers 2026-07-01 21:52:14 +00:00
_PLAN-context-store.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PLAN-domain-facts.md mail: a verified domain claim gets email + catch-all by default (domain-facts slice) 2026-07-09 20:52:35 +00:00
_PLAN-domains.md docs(plans): buildability corrections from the audit 2026-07-02 17:22:46 +00:00
_PLAN-fulfill.md gatherings/fulfill: capture the 2026-07-13 converged design 2026-07-13 06:09:09 +00:00
_PLAN-gatherings.md gatherings: record the /open guest edge as built (gap closed in code) 2026-07-14 09:07:22 +00:00
_PLAN-node-orchestration.md docs: retire _PLAN-garden-abstraction (superseded); release-sets keeper → _TODO 2026-07-02 17:24:54 +00:00
_PLAN-pistis.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PLAN-podcast.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PLAN-postgres-18-cutover.md docs: mark postgres 17→18 cutover as done + verified live 2026-07-01 07:52:07 +00:00
_PLAN-postgres-ha.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PLAN-press-i18n.md press i18n: step 8 live-verified on .garden — deployed, re-rendered, walk green 2026-07-10 02:49:25 +00:00
_PLAN-qos.md docs(qos): record the SNI/domain axis as built; the original nft-only mechanism was unbuildable 2026-07-02 08:23:31 +00:00
_PLAN-substrate-dissolution.md _PLAN-substrate-dissolution: reconcile to the provisioned-unify refactor 2026-07-12 22:45:39 +00:00
_PLAN-test-suite.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_PRESS.md Remove startup framing from docs, fix plant.lua arg parsing 2026-04-12 18:45:26 +00:00
_QUICKSTART.md domains: move per-garden under .gardens/<g>/domains, positional ownership 2026-05-20 22:10:10 +00:00
_RECOVERY.md sync docs to reality 2026-04-28 08:01:53 +00:00
_SMELLS.md docs: confirm no CUDA stacks in core; delete derivable metrics 2026-07-12 22:39:09 +00:00
_STATE-MODEL.md slice 9: fold the settled model, retire the teardown/nodes/externals plan docs 2026-07-09 16:33:51 +00:00
_TODO.md gather: move the tenant surface out of fulfill into garden/gather/ 2026-07-14 06:05:39 +00:00
_TRUST-SURFACE.md docs: prune ten retired plan docs; extract open items; re-sync stale headers 2026-07-01 21:52:14 +00:00
_WELL-KNOWN.md well-known convention, status banner, env export fix 2026-04-09 19:37:28 +00:00
about.md Rewrite index opening, drop stale 7k line count everywhere 2026-03-27 17:59:50 +00:00
config.lua.example feat(groundwork): per-role bucket region override 2026-06-30 20:05:10 +00:00
index.md Update index.md 2026-06-26 05:29:18 +00:00
LICENSE.txt Update LICENSE.txt 2026-01-12 06:00:28 +00:00
plant.lua nodes slice 5: plant provisions the metal through the planner 2026-07-09 16:33:51 +00:00
prepare.sh 5.5 2026-07-08 23:47:44 +00:00
privacy.md privacy: backup retention split, identity privacy link, policy additions 2026-04-09 01:47:56 +00:00
README.md docs+keepers: register keepers command, fix social-contract link, retire _AUDIT, drop rotting line counts 2026-06-22 18:29:23 +00:00
social-contract.md social contract: name the Four Agreements as the spirit, up top 2026-06-30 07:57:08 +00:00
tend.lua build-digest: delete the plan docs, fold the model into _STATE-MODEL.md 2026-07-07 08:08:11 +00:00
test.lua seed_media_refs: don't truncate parse_media_url's returns; pin ref fields 2026-07-12 16:17:20 +00:00

Sweetgrass

Community infrastructure you can understand, modify, and share.


What this is

Sweetgrass is a set of tools for planting and tending your own corner of the internet — websites, publishing, email, git hosting, video calls — on small, affordable servers that you and your friends control.

Think of it like a community garden. You bring the seeds (your domain, your writing, your projects). The tools help you plant and tend. The infrastructure takes care of itself most of the time, and when it doesn't, you can read the code and fix it. All of it.

Where we are

We're building this right now. The tools work — we've planted multiple gardens and each planting gets smoother. Every one teaches us something new.

This is a barn raising, not a finished house. If that appeals to you — if you want to build something with people instead of buying something from a company — you're welcome here.

What you get

Three scripts named for what they do:

plant.lua        Create infrastructure from scratch
tend.lua         Deploy, update, backup, maintain
lua/compost.lua  Tear everything down (safely, backups first)

The cycle is: plant, tend, compost, plant. Data survives destruction by default.

When you plant, you get a self-organizing cluster with:

your site ── static, always on
  identity ── passkeys and single sign-on
    git ──── your repos (Forgejo)
      press ── push markdown, get a website
        meet ── video conferencing (Jitsi)
  mail ──── email + webmail (docker-mailserver)

Automatic SSL. Encrypted daily backups. Rolling updates with zero downtime. Self-healing via Docker Swarm. The core stack (static through press) fits on a single small server. A 3-node cluster gives you failover and room for meet.

Two ways in

However you join, the social contract is the same: resilience through interdependence, no extraction, invite-based trust, portability.

Plant your own. Get together with friends. Pick your domains. Set up a few small servers. This is the way sweetgrass is meant to grow — many small gardens tended by the people who use them, sharing improvements through the same tools. See QUICKSTART.md.

Grow in the community garden. If you don't want to manage your own infrastructure, you're welcome in ours. It's free, it's invite-only, and your stuff is yours — you can transplant to your own garden or a friend's whenever you want. See GARDEN.md.

The philosophy

No magic. Every operation is a readable Lua script. No hidden state, no declarative DSLs, no frameworks. Just scripts that do things you could do by hand, reliably.

No lock-in. Your domains transplant between gardens. Your content is markdown files in git repos. Your infrastructure is standard Docker on standard servers. Nothing traps you here.

No extraction. We want you not to pay us. We want you to plant your own garden with friends and share what you grow. The code is AGPL — improve it, share it back. The more gardens, the more resilient every garden becomes.

Boring on purpose. The infrastructure is meant to be dull. Pages are simple and lightweight. Servers quietly do what they're supposed to. The most exciting thing about sweetgrass is that it works and you can understand why.

By planting sweetgrass, you're doing something quietly subversive. You're building infrastructure that's democratic by design and resistant to the patterns that turn tools into platforms and communities into products. It doesn't look like much. That's the point.

How it works

The tools call standard unix utilities — ssh, rsync, curl — plus your cloud provider's CLI (hcloud, doctl, or none for BYOH). Docker Swarm handles orchestration. We picked Swarm over Kubernetes because you can understand Swarm in an afternoon.

plant.lua              Create and configure infrastructure
tend.lua               Deploy, update, backup, maintain
lua/compost.lua        Full teardown (backups first)

lua/deploy/            Stack deployment, template rendering
lua/backup/            Encrypted backup to S3-compatible storage (restic)
lua/maintain/          Rolling updates, health, scaling
lua/intake.lua         SSH/rsync gateway for static content
lua/roots/             Swarm, DNS, and network primitives
lua/soil/              Provider layer (Hetzner, DigitalOcean, BYOH)

garden/<name>/conf.lua             Stack definitions (self-describing)
.gardens/<g>/domains/<d>.lua       Domain configurations (per garden)

For the full technical story — why Lua, why Swarm, how the pieces fit, what we've learned — see BUILDING.md.

For the publishing system at the heart of it, see PRESS.md.

The name

Sweetgrass is a plant sacred to many Indigenous peoples of North America. It spreads through underground rhizomes, connecting in ways you can't see, binding the soil together. You can't eradicate it once it's established.

We chose the name because that's what we want this to be. Infrastructure that spreads through communities, that's impossible to shut down, that binds people together. Many small gardens, connected underground.

Contributing

This is community infrastructure. If you see something that could be better, make it better. The whole thing is readable. Start with BUILDING.md.

License

AGPL-3.0 — If you improve it, share it back.


Infrastructure doesn't have to be complicated. It doesn't have to be corporate. It can be ours.