create-loopier
v0.1.0
Published
One-command self-hosted Loopier. `npm create loopier` preflights Docker, downloads a pinned release, generates fresh secrets + Supabase JWTs (no demo keys, ever), patches Kong, brings the stack up, applies migrations, and creates account #1.
Maintainers
Readme
create-loopier
Self-host Loopier in one command:
npm create loopier
# == npx create-loopier == pnpm create loopier == yarn create loopierThat's the whole install. The CLI:
- Preflights your machine — Docker CLI + Compose v2, free ports
(3000/8000 by default), ~4 GB of disk. No Docker? It prints the guided
manual path from
SELF-HOST.mdand exits cleanly. - Downloads a pinned release of
loopier/loopier(the tag matching this CLI's version;--refoverrides), verified against the release's sha256 checksums. The installer never embeds app source. - Generates every secret fresh with
node:crypto:POSTGRES_PASSWORD, a 64-charJWT_SECRET, Realtime keys, and — because Supabase self-host uses a shared HMAC secret — it mints youranon+service_roleHS256 JWTs (iss=supabase, 10-year expiry). The public Supabase demo JWTs never exist in your install. Everything lands inself-host/.env.self-host(chmod 600, never echoed), and the twokeyauth_credentialsinself-host/kong.ymlare patched in place — the manual key-rotation step fromSELF-HOST.md§5, automated. - Builds + starts the stack:
docker compose --env-file self-host/.env.self-host up -d --build. The first run builds the tracker image locally (your fresh anon key is inlined into the client bundle at build time — that's why there is no prebuilt image) and takes several minutes. - Applies migrations in filename order via
docker compose exec -T db psql. - Creates account #1 with the tracker's own idempotent
scripts/self-host-bootstrap.mjs(prompts for an email; generates a strong password if you don't pass one — shown once, never again). - Opens
http://localhost:3000/loginand prints next steps: teammates + SMTP, backups, upgrades, and the dark-mode statement.
Dark by default
A self-hosted Loopier makes zero outbound calls — no feed, no telemetry,
no phone-home. Opting into the Loopier network is per-object and explicit:
set LOOPIER_NETWORK_URL + LOOPIER_PUBLISH_TOKEN in
self-host/.env.self-host (see SELF-HOST.md §7). Unset them at any time to
go fully dark again.
Modes and flags
| Flag | What it does |
| --- | --- |
| --dry-run | Scaffold (to a temp dir by default) + print every command. Zero docker calls. |
| --byo-supabase | Run only the tracker against your own Supabase (--supabase-url, --supabase-anon-key). |
| --no-docker | Print the guided manual path and exit 0. |
| --dir <path> | Install directory (default ./loopier). |
| --port / --kong-port | Remap tracker/API ports (also rewrites SITE_URL / SUPABASE_PUBLIC_URL). |
| --ref <tag> | Install a specific release tag instead of the pinned one. |
| --archive <path> (+ --sha256) | Install from a local release tarball. |
| --email / --password / --name / --workspace | Account #1 inputs (prompted/generated otherwise). |
| --no-bootstrap, --no-open, -y/--yes | Skip account creation / browser open / all prompts. |
Upgrades and re-runs
Re-run npm create loopier in the same directory: it detects the existing
install, reuses self-host/.env.self-host (secrets are never regenerated
over live data), unpacks the new release, re-patches kong.yml to your
existing keys, rebuilds, and applies only new migrations.
Requirements
- Node >= 18.17 (to run this CLI)
- Docker with Compose v2, ~4 GB disk (to run the stack)
License
Apache-2.0. The tracker it installs is AGPL-3.0-only — see SELF-HOST.md
and README-OSS.md in the release for the full open/closed map.
