Deployment infrastructure for digital autonomy https://celilo.computer
  • TypeScript 96%
  • Shell 1.6%
  • Astro 1.1%
  • Go Template 0.5%
  • Smarty 0.3%
  • Other 0.3%
Find a file
Peter Banka 7669a9073b
Some checks are pending
ci / validate (push) Waiting to run
npm-consumer-smoke / npm-consumer-smoke (push) Successful in 3s
Merge pull request 'Sweep config for paths from both ends, and tell an author when a hook reaches for its own namespace (hook-process-boundary group E)' (#1181) from hook-boundary-group-e into main
Group E of hook-process-boundary stage 2: tasks 4.2b, 4.2c and 4.2e.

Rebased onto main and the tasks.md conflict with celilo#1187 resolved as the
union of the two sides. The branch ticks 4.2b and 4.2e and rewrites 4.2c's
entry; main's caller landing ticked 4.2, 4.2i, 4.2j, 4.2k, 4.3 and 4.9. The two
sets are disjoint, verified by diffing the resolution against both parents.

Counts measured from the boxes rather than added up: group 4 at 14 of 32, the
change at 41 of 73.

All six checks green on c05a3e7e, ci/validate in 10m46s.
2026-08-26 14:39:17 +00:00
.beads chore: slim CLAUDE.md to celilo-specifics, ignore beads working files 2026-08-11 22:07:16 -07:00
.changeset Merge pull request 'Sweep config for paths from both ends, and tell an author when a hook reaches for its own namespace (hook-process-boundary group E)' (#1181) from hook-boundary-group-e into main 2026-08-26 14:39:17 +00:00
.claude feat(skill): add /celilo-triage, bounded unattended issue work 2026-08-19 23:33:26 -07:00
.cspell chore(cspell): add celilo/infra domain terms to the custom dictionary 2026-07-24 09:37:24 -07:00
.forgejo/workflows ci(hook-jail): the AppArmor profile now has a gate that can fail 2026-08-25 23:33:04 -07:00
.vscode ci: lint and typecheck every directory that ships code, not just the two apps 2026-08-05 19:25:54 -07:00
apps feat(policy): tell an author when a hook reaches for its own namespace 2026-08-26 07:16:28 -07:00
branding Lunacycle branding assets 2026-03-03 11:03:49 -08:00
docs fix(cli): set rawOutput on every JSON-emitting command so the payload parses 2026-08-13 00:00:37 -07:00
e2e test(e2e): publish a .netapp in the consumer-shape smoke test 2026-08-23 15:20:25 -07:00
modules refactor(modules): read the provider view through its type, not through a cast 2026-08-26 04:38:21 -07:00
openspec docs(openspec): sweep config for paths from both ends, because one end is blind 2026-08-26 07:16:28 -07:00
packages Merge pull request 'chore: version packages' (#1166) from changeset-release/main into main 2026-08-26 08:47:37 +00:00
packaging Merge pull request 'celilo-mgr would not be jailed: ship bubblewrap with the .deb and with celilo-mgmt' (#1184) from bwrap-deb-depends into main 2026-08-26 08:33:15 +00:00
reference docs(hooks): stateDir is not backed up and is never pruned 2026-08-22 09:48:50 -07:00
schemas Merge origin/main into multi-instance-impl, and finish the branch's work 2026-08-25 09:55:20 -07:00
scripts fix(packaging): ship bubblewrap with celilo, so a real management server can jail a hook 2026-08-25 23:37:45 -07:00
.envrc Set up nix for mgmt server 2026-02-08 17:58:40 -08:00
.gitignore feat(console-server): ship the SPA inside the package 2026-08-26 03:18:16 -07:00
.mise.toml chore: pin node in the toolchain so verdaccio can actually start 2026-07-31 15:20:22 -07:00
biome.json feat(visualizer): the zone topology generator, and its tuning playground 2026-08-23 15:43:57 -07:00
bun.lock chore: version packages 2026-08-26 06:46:07 +00:00
cele2e feat(cele2e): single-command full e2e regression (ISS-0013) 2026-06-12 21:12:48 -07:00
celilo Fix celilo wrapper: update path to apps/celilo 2026-04-14 12:16:04 -07:00
CLAUDE.md docs: an agent's hard-won knowledge should not depend on its working directory 2026-08-26 01:36:04 -07:00
cspell.json ci: lint and typecheck every directory that ships code, not just the two apps 2026-08-05 19:25:54 -07:00
env-example add env example 2026-05-01 09:51:21 -07:00
GLOSSARY.md docs: name the fan-out, and say how often it actually fires 2026-08-21 15:53:03 -07:00
LICENSE chore: add AGPL-3.0 license, public README, gitignore celilo-data 2026-06-14 11:18:09 -07:00
package.json fix(ci): cover the other two legs of test:unit 2026-08-19 17:25:18 -07:00
README.md docs: migrate design docs to OpenSpec (specs + changes), retire v2/design/plans 2026-07-23 20:49:16 -07:00
VISION.md fix(zones): secure-mgmt is a real zone everywhere; move signal onto it (#436) 2026-07-30 20:07:07 +00:00

Celilo

Celilo is an application-deployment and orchestration tool for opinionated, zone-segmented networks — built to grow a home lab (or any small fleet) from a single Linux box into a multi-zone, internet-facing deployment, one capability at a time.

You describe what you want running; Celilo figures out where it can go, generates standard Infrastructure-as-Code (Terraform + Ansible), and drives the deployment. It orchestrates industry-standard tools rather than replacing them — the generated projects are normal Terraform/Ansible you can read and modify.

Status: early development (alpha). This project recently graduated from a private home-lab repo to a public one. Interfaces, schemas, and module formats change without notice, and there is no stability or backward-compatibility guarantee yet. Use it to learn and experiment, not (yet) to run anything you can't afford to rebuild.

The idea: networks that grow with you

Celilo models a network as up to six zones, but assumes you start with only one and unlock the rest as you add infrastructure:

Zone Purpose
internal Secured client network — the one zone you always have.
external The public internet (unlocked by adding a VPS).
dmz Internet-reachable services, no VPN required (unlocked by a firewall).
app More sensitive services, reachable only from dmz + management.
secure The most sensitive services, reachable only from app + management.
management Privileged-access clients.

A module (e.g. a public website, DNS, a firewall) declares which zones it prefers and which it can tolerate. Deploy a public-web module on a box with no firewall and it still runs on internal; add a firewall and a border gateway later and Celilo offers to promote it into the dmz with real TLS certificates. Modules share data through capabilities — a firewall module provides the zones and port-forwarding a website module requires. See VISION.md, PRINCIPLES.md, and GLOSSARY.md for the full model, and design/ for the architecture documents.

Tech stack

  • Core: TypeScript on Bun, SQLite + Drizzle ORM, a SQLite-backed event bus
  • Remote API: drive the CLI on the management server over SSH (celilo --remote) — a typed, streamed NDJSON protocol with per-operation authz; no new inbound port (see openspec/changes/replace-ssh-cli-api/proposal.md)
  • Generated IaC: Terraform (HCL) + Ansible (YAML)
  • CLI/TUI: Ink (React 19) terminal UI (a React/Vite/Tailwind web UI is planned, not yet built)
  • Tooling: Biome (lint/format), Vitest/bun test

Repository layout

apps/celilo/      # the Celilo CLI + backend (TypeScript/Bun)
modules/          # deployable modules (caddy, dns, firewall, forgejo, …)
packages/         # shared workspace packages (capabilities, cli-display, e2e, …)
design/           # architecture & technical design documents

Quick start

bun run setup                       # installs workspace + per-module script deps
cd apps/celilo
bun run src/cli/index.ts --help     # explore the CLI
bun test                            # unit tests

Use bun run setup, not a bare bun install. Each module under modules/*/scripts has its own dependencies that the workspace install does not cover; bun run setup installs both. Skipping it makes ~10 unit tests fail with Cannot find module '@celilo/capabilities'.

The CLI walks you through initializing a system, adding machines or container services, importing modules, and deploying them. Start with system init and --help on each subcommand.

License

AGPL-3.0 © Peter Banka (psbanka). If you run a modified version as a network service, the AGPL requires you to make your changes available to its users.