Status · 24 h
Riverside Bakery225 rec ◆ 0The Orchard56 rec ▲ +10The Orchard Group28 rec ◆ 0poezine.orguptschoonover.comupTEMP44.1°C ▲ +1.6°DISK60.1% ▲ +1.7 ptMEM53% ▲ +1 ptLOAD0.44 ▼ -0.24UP6d 11hTUNNELrunningRADICLEdown
poezine.org

Getting started

From an empty folder to a running republic, then to people using it. Written for version 0.9.0.

§01What you need
  • Node.js 20 or newer. The Git Republic needs nothing else: no database, no package installs, no build step. Check with node --version.
  • git, to get the code and keep copies in step.
  • Optional: Radicle (rad), to replicate copies peer to peer; cloudflared, to put a node online from home.

It runs on macOS, Linux and a Raspberry Pi.

§02Get the code
git clone https://github.com/ttschoonover/entity
cd entity
node cli/index.js help

The code is on GitHub, and the modules are in a separate repository. It is © Timothy Schoonover, all rights reserved: ask before using it for your own group.

Each republic lives in its own folder, with its own copy of the code beside its record, so each can upgrade on its own schedule. The program is called entity; to type it as a command, add this to ~/.zshrc (Mac) or ~/.bashrc (Linux):

entity() { node "$PWD/cli/index.js" "$@"; }
§03Or, without a terminal
node cli/index.js app

This opens a control panel in your browser. Create a republic asks for a name, your member id and a password, lets you pick a starting shape and the modules you want, shows every setting with what it does, and founds and serves the republic. Afterwards the panel starts and stops it, changes its settings, installs modules, publishes it on Radicle and upgrades it. It answers only on your own computer. Everything below can be done either way.

§04Found your first republic
cp -R entity my-republic && cd my-republic
entity preset list
entity preset apply worker-coop
entity found --id you --name "My Republic"
entity serve --settle

Open http://localhost:7780. found makes your key (in ~/.entity/keys/) and the first record; serve --settle runs the page and records each act as soon as it arrives.

A preset sets the starting rules and modules. The ones included are: assembly, worker-coop, housing-coop, society, company, currency, micronation, federation, fandom and proprietor. Everything a preset sets can be changed later, by decision.

§05Sign in, and let people join
  • On the page: use your key file (Use a key file I already have), then add a password or a passkey under Ways to sign in, so you never need the file again.
  • New members open the page and join with a username and a password or passkey. Depending on the rules, they are members at once, or once the members admit them.
  • A password works on any device. A passkey belongs to one device and one web address: add one on each device you use.
§06Decide
  • Propose anything on the page: a change to a setting, an office, a budget, a module. The page picks the rule it needs.
  • Vote on the Votes tab. Each rule has its own quorum, threshold and number of readings: the more a change matters, the harder it is.
  • Edit anything after it is made (titles, seats, terms, a grant's powers) with the Edit form beside it: it proposes the change under the rule that created it.
  • Reverse a mistaken decision from its page (Propose reversing this): a new decision that undoes it. The record itself is never edited.
  • Delegate with grants: a treasurer may be allowed to spend within the budget, and nothing more. Every use is published, and can be undone.
  • Remove a member from their page, by decision, with a reason; the record keeps everything they did.
§07Add what you need: modules

Offices, elections, budgets, meetings, a forum, a wiki, signed agreements, an investment fund and more are modules. Point the republic at a module source once:

entity module source github:ttschoonover/entity-modules@main

Then, on the page: Settings → Install or upgrade modules. Each install is a proposal, pinned to the exact code (its digest) the members approve; once it carries, every copy fetches that code, checks it, and installs it. From the terminal: entity module available, entity module add NAME --as you.

§08Put it online

A Raspberry Pi at home is enough for most groups. With a domain on Cloudflare:

cloudflared tunnel login
cloudflared tunnel create mynode
cloudflared tunnel route dns mynode coop.example.org
cloudflared tunnel run --url http://localhost:7780 mynode

For several sites, list each hostname and its port in ~/.cloudflared/config.yml (ingress:). A node's own settings are in its node.json: settleAfter (seconds to wait before settling; 0 for at once), publishOnSettle, look and colour (the page's default style), and finality.signAs (to sign checkpoints automatically).

§09Keep copies
entity radicle init            # publish on Radicle (add --private for members only)
entity sync --settle           # push and pull, then settle
rad clone rad:z…               # someone else takes a full copy

Every copy replays and checks the whole record. To decide between copies that disagree, install finality and name the validators who sign checkpoints (see Modules).

§10Upgrade
entity upgrade check dir:../entity     # does the record replay exactly with the new code?
entity upgrade propose dir:../entity --as you
entity upgrade apply                   # once the members approve it

Modules upgrade the same way, one at a time (entity module upgrade NAME), or from Settings on the page.

§11Back up

Two things matter: the republic's folder (its record) and your keys (~/.entity/keys/). Copies on Radicle or other members' machines also hold the record; only you hold your key, unless you sign in with a password or passkey.

§12Where next

The Manual covers every part in depth; Commands lists every command; Modules describes each module and its settings; the Cookbook has recipes for common situations; Guarantees lists each promise the software makes, with how it keeps it.