From d03815f30171b1facda8b08e984b75d91349cbf2 Mon Sep 17 00:00:00 2001 From: Akhilesh Thite Date: Fri, 6 Nov 2026 12:00:33 -0800 Subject: [PATCH 1/2] docs: keep the README short and move the details into docs/ --- AGENTS.md | 11 +- README.md | 678 ++++--------------------------------- docs/commands.md | 373 ++++++++++++++++++++ docs/configuration.md | 138 ++++++++ docs/distributing.md | 141 ++++++++ docs/server.md | 79 +++++ docs/signup-and-billing.md | 4 +- scripts/publish.ts | 2 +- src/parseConfig.test.ts | 2 +- test/docs-defaults.test.ts | 54 +++ test/readme-config.test.ts | 46 --- 11 files changed, 857 insertions(+), 671 deletions(-) create mode 100644 docs/commands.md create mode 100644 docs/configuration.md create mode 100644 docs/distributing.md create mode 100644 docs/server.md create mode 100644 test/docs-defaults.test.ts delete mode 100644 test/readme-config.test.ts diff --git a/AGENTS.md b/AGENTS.md index efa106d..4d39c7a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,17 +26,20 @@ deno run --allow-net --allow-read=. --allow-write=. --allow-sys --allow-env --al ./build/main.js # after building ``` -Available CLI commands: +Available CLI commands (all documented in `docs/commands.md`): +- `chel init` - Generate a template `chel.toml` - `chel keygen` - Generate cryptographic key pairs - `chel manifest` - Create signed contract manifests +- `chel verifySignature` - Check a manifest's signature and file hashes - `chel deploy` - Deploy contracts to a server or directory - `chel serve` - Start the server with contract preloading - `chel pin` - Pin contracts to specific versions - `chel upload` - Upload files to a server or directory +- `chel get` - Print the entry stored under a key - `chel hash` - Compute CID hash of a file - `chel migrate` - Migrate data between database backends -- `chel latestState` - Get latest contract state -- `chel eventsAfter` / `chel eventsBefore` - Query contract events +- `chel eventsAfter` - Query contract events +- `chel version` - Print the version ## Project Structure @@ -187,4 +190,4 @@ Manifests are JSON with signed body: 3. `git diff --exit-code -- build` to confirm the rebuild is reproducible 4. `npm publish --access public` -See the Packaging section of README.md for the full procedure. +See `docs/distributing.md` for the full procedure. diff --git a/README.md b/README.md index 34f69da..edbcf75 100644 --- a/README.md +++ b/README.md @@ -6,502 +6,43 @@ # Chel: Chelonia Command-line Interface -Modern CLI for Chelonia contract development, deployment, and management. - -## All Available Commands - -``` -chel -chel help [command] -chel version -chel pin [--dir ] [--overwrite] -chel test -chel init [--force] [--config ] -chel keygen [--out=] -chel manifest [-k|--key [-k|--key ...]] [--out=] [-s|--slim ] [-V|--contract-version ] -chel deploy [ [ ...]] -chel upload [ [ ...]] -chel serve [options] -chel latestState -chel eventsAfter [--limit N] [--url ] [--keys ] -chel hash -chel migrate --from --to [--from-config ] [--to-config ] -``` - -Note: in many (if not all) instances, the `` parameter can refer to a local folder path, in which case the command will operate without making a network connection, and will instead use the folder's contents to perform its operations. - -Every command also takes `--config `, to use another config file than `./chel.toml` (see [`chel.toml`](#cheltoml--runtime-cli-configuration)). - -### `chel pin` - Per-Contract Versioning System - -🎯 Pin individual contracts to specific versions independently! - -**Key Features:** -- ✅ **Per-contract versioning** using `chelonia.json` configuration -- ✅ **Individual contract pinning** by specifying manifest file path -- ✅ **New directory structure**: `contracts///` -- ✅ **Manifest-based workflow** - requires existing manifest files -- ✅ **Ecosystem-agnostic** - no coupling to Node.js/npm - -**Workflow:** -1. **Generate keys**: Use `chel keygen` to create cryptographic key files (required for production) -2. **Pin from manifest**: Use `chel pin` with the manifest file path -3. **Contract files copied**: Contract files (main/slim) and manifest are copied to new structure - -**Usage Examples:** -```bash -# First, generate cryptographic keys (required for production) -chel keygen - -# Then pin contracts with re-signing` -chel pin - -# Pin specific contract to a version using its manifest (from dist/contracts) -chel pin 2.0.5 dist/contracts/2.0.5/chatroom.2.0.5.manifest.json -chel pin 2.0.0 dist/contracts/2.0.0/group.2.0.0.manifest.json - -# Note: Contracts are pinned to the contracts/ output directory -``` - -**Configuration (`chelonia.json`):** -```json -{ - "contracts": { - "gi.contracts/chatroom": { - "version": "2.0.6", - "path": "contracts/gi.contracts_chatroom/2.0.6/chatroom.2.0.6.manifest.json" - }, - "gi.contracts/group": { - "version": "2.0.0", - "path": "contracts/gi.contracts_group/2.0.0/group.2.0.0.manifest.json" - } - } -} -``` - -**Directory Structure Created:** -``` -contracts/ -├── gi.contracts_chatroom/ -│ ├── 2.0.5/ -│ │ ├── chatroom.js -│ │ └── chatroom-slim.js -│ └── 2.0.6/ -│ ├── chatroom.js -│ └── chatroom-slim.js -└── gi.contracts_group/ - └── 2.0.0/ - ├── group.js - └── group-slim.js -``` - -**Command Options:** -- **`--overwrite`**: Force overwrite existing versions -- **Default**: Create new version by copying from source - -### `chel init` - Generate `chel.toml` - -Generates a template `chel.toml` in the current directory, pre-populated with -sensible defaults and a freshly-generated `server_id`. This is the recommended -way to bootstrap a new server instance. - -``` -chel init [--force] [--config ] -``` - -**Options:** -- `--force`: Overwrite an existing `chel.toml`. Without this flag, `chel init` - refuses to clobber an existing file — a safety against accidentally rotating - `server_id`, which would orphan push subscriptions tagged with the old id - (see [`chel.toml`](#cheltoml--runtime-cli-configuration)). -- `--config `: Write the file there instead of `./chel.toml`. The other - commands then need the same `--config ` to read it. - -**What it writes:** -- A top-level `server_id` (a random UUID). Keep this stable for the lifetime of - the database; do **not** reuse it across environments (prod / staging / dev) - that share a database. -- `[server]` / `[database]` blocks mirroring the defaults from `parseConfig.ts`, - with less-common options left as commented-out lines for guidance. - -**Example:** -```bash -$ chel init -wrote: chel.toml -server_id: 7b3f2c1a-... keep this stable; do not reuse across environments, - and do not rotate it on an existing DB. -``` - -### `chel serve` - Development Server with Contract Preloading - -``` -chel serve [options] - -OPTIONS - ---dashboard-port set dashboard port (default: 8888) ---port set application port (default: 8000) ---dev start in development mode (watch and redeploy contract manifests) -``` - -> [!IMPORTANT] -> **Prerequisites:** Ensure your application directory contains a `contracts/` directory with the correct contract structure before running `chel serve`. The server automatically preloads all contract manifests found in `contracts///` directories into the database on startup in development mode. - -**Example Output:** -```bash -$ chel serve -🚀 Starting Chelonia app server... -📦 Step 1: Preloading contracts... -📋 Found 4 contract manifest(s) to deploy -contracts/gi.contracts_chatroom/2.0.6/chatroom.js: /data/zLAeVmpcc88g... -contracts/gi.contracts_group/2.0.0/group.js: /data/zLAeVmpcc88g... -✅ Successfully preloaded 4 contract(s) into database -🚀 Step 2: Starting dashboard server... -📊 Dashboard server running at: http://localhost:8888 -🚀 Step 3: Starting application server... -``` - -**Usage Examples:** -```bash -# Start with automatic contract preloading -chel serve - -# Serve Group Income app from extracted directory -chel serve ./gi-v2.0.0 - -# Serve with custom ports and SQLite database -chel serve --dashboard-port 8888 --port 8000 ./my-app -``` - -**What happens during startup:** -1. **Contract Discovery** - Scans `contracts///` directories -2. **Manifest Collection** - Finds all `.manifest.json` files -3. **Database Preloading** - Deploys all contracts with content-addressed storage -4. **Server Startup** - Starts dashboard and application servers -5. **Ready for Development** - All historical contracts available for message processing - -### `chel keygen` - -``` -{ - "version": "1.0.0", - "cipher": "algo", - "pubkey": "...", - "privkey": "...", - "encrypted": "algo" -} -``` - -If `"encrypted"` doesn't exist - it means the `"privkey"` was saved in the clear. - -### `chel serve` - -Starts a local development server for Chelonia applications. - -``` -chel serve [options] - -OPTIONS - ---dashboard-port set dashboard port (default: 8888) ---port set application port (default: 8000) -``` - -**Example:** -```bash -# Serve Group Income app from extracted directory -chel serve ./gi-v2.0.0 - -# Serve with custom ports and SQLite database -chel serve --dashboard-port 8888 --port 8000 ./my-app -``` - -The serve command will: -- Start a dashboard server (default: http://localhost:8888, see below) -- Start an application server (default: http://localhost:8000) -- Serve static assets and handle API routes -- Support different database backends (memory, filesystem, SQLite, Redis) - -The dashboard shows the server's registered usernames, the contracts it -stores, how much space each account uses and each account's credits. It never -shows what is inside a contract, since that is encrypted. Because of the -usernames, it has two settings under `[server]` in `chel.toml`: - -- `dashboardListenIP`: the address it listens on, `127.0.0.1` by default, so - only this machine can open it. -- `dashboardAdminPassword`: until this is set, the dashboard shows no data. - Once it is, the browser asks for it (any user name works). To keep it out of - the file, set `server__dashboardAdminPassword` in the environment instead. - The password travels with every request, so put the dashboard behind HTTPS - before opening it to other machines. - -### `chel manifest` - -Let's say you have the following files: - -- `contract-bundle.js` -- `contract-slim.js` - -Running `chel manifest --add-key alex.json --slim contract-slim.js deploy-key.json contract-bundle.js` will generate the following `contract-bundle.manifest.json`: - -``` -{ - "head": { - "manifestVersion": "1.0.0" - }, - "body": JSON.stringify({ - "version": " by default", - "contract": { "hash": "", "file": "contract-bundle.js" }, - "contractSlim": { "hash": "", "file": "contract-slim.js" }, - "authors": [ - {"cipher": "algo", "key": ""}, - {"cipher": "algo", "key": ""} - ] - }), - "signature": { - "key": "", - "signature": "" - } -} -``` - -It will upload both versions of the contracts, and this JSON. - -This format makes it as efficient as possible for using the contract system from both in-app and from the commandline. - -The CLI tool will always use the self-contained contract bundle, whereas apps can load less code by loading the slim version of the contract. You just need to make sure that none of the external dependencies that you're referencing ever change if you do this, as otherwise you will get different state between the two versions of the contracts. - -Note also that Chelonia is fundamentally language agnostic. We started out using Chelonia to build JS apps, but you can use this protocol with any programming language that supports source evaluation at runtime. - -Some commands of this CLI tool (like `latestState`), only support JavaScript, but that is a limitation of resources on our side, and not a fundamental limitation of the protocol. - -### `chel deploy` - -Deploys manifest(s) generated with `chel manifest`. - -Automatically uploads any corresponding contract files. - -Outputs the hash(es) corresponding to the manifest(s). - -Useful command: - -``` -cp -r path/to/contracts/* test/assets/ && ls ./test/assets/*-slim.js | sed -En 's/.*\/(.*)-slim.js/\1/p' | xargs -I {} ./src/main.ts manifest --out=test/assets/{}.manifest.json --slim test/assets/{}-slim.js key.json test/assets/{}.js && ls ./test/assets/*.manifest.json | xargs ./src/main.ts deploy http://127.0.0.1:8888 -``` - -### `chel eventsAfter` - -Displays a JSON array of events that happened in a given contract since a given -height. Older events come first. The output is parseable with tools like `jq`. - -``` -chel eventsAfter [--limit N] [--url ] [--keys ] -``` - -If `--url` is supplied, the remote server's `/eventsAfter` endpoint is queried. -Otherwise, the local database (configured via `chel.toml`) is read directly. - -#### Decrypting events with `--keys` - -By default, encrypted events (`OP_ACTION_ENCRYPTED` and friends) are returned -as opaque envelopes — useful for forensics, but unreadable. Pass `--keys` with -a JSON file of secret keys to decrypt them in place. - -**Current limitation:** decryption only works when the returned event list -starts with the contract's `OP_CONTRACT` event (for example, by querying from -height `0`). If you query from a later height, `decryptOne` has no prior -contract/key state, so encrypted events are returned as raw envelopes with -`no prior contract state` rather than being decrypted. - -**Warning:** this file contains secret key material and grants decryption -capability for any events encrypted to those keys. Do **not** commit it to -version control, include it in logs, or share it casually. Store it with -restrictive file permissions, use it only for local debugging, and delete or -otherwise protect it when you are done. - -The file is a flat object mapping each `keyId` to its serialized secret key: - -```json -{ - "z9brR...sigKeyId": "", - "z9brR...encKeyId": "" -} -``` - -This is exactly the shape Chelonia stores at `rootState.secretKeys` in any app -built with [`libcheloniajs`](https://github.com/okTurtles/libcheloniajs). The -easiest way to generate this file is from a running app: - -**In a browser DevTools console (with the app open):** - -```js -copy(JSON.stringify(await sbp('chelonia/rootState').secretKeys, null, 2)) -// then paste into keys.json -``` - -**Example:** +Chel is the command-line tool for +[Chelonia](https://github.com/okTurtles/libcheloniajs), which implements +[Shelter Protocol](https://shelterprotocol.net) for end-to-end encrypted apps. +It signs and pins your app's contracts, runs the server that stores and relays +their messages, and reads and writes the server's data. + +## Why chel + +- **One tool, from contract to server.** Make a signing key, sign each version + of a contract, pin it, and serve your app: `chel serve` uploads the pinned + contracts when it starts. +- **A native binary from npm.** `npm install` picks the build for your + platform, so you don't need Deno to run it. +- **Your choice of database:** in memory, files, SQLite, Redis, or a mix of + them by key prefix. +- **Ready for a public server.** Signups are limited per IP address, new + accounts have a size cap, storage is counted per account, and the dashboard + only shows its data behind a password. +- **One config file.** `chel.toml` is checked for typos and wrong values when + chel starts, and any setting can also come from an environment variable. + +## Install + +Add it to your project, and run it with `npx chel`: ```bash -chel eventsAfter --keys ./keys.json 0 --limit 10 -``` - -When `--keys` is supplied each event is emitted as: - -```jsonc -{ - "height": 1, - "hash": "z9brR...", - "contractID": "z9brR...", - "op": "ae", - "signingKeyId": "z9brR...", - "innerSigningKeyId": "z9brR...", - "decryptedValue": { /* the inner contract action payload */ }, - "raw": { - "serverMeta": { - "date": "2025-06-09T20:35:43.305Z", - "isKeyOp": true - }, - "message": "{...}" - } -} -``` - -Decryption is best-effort: if the required key is missing or a signature -cannot be verified, the event is still emitted with the original envelope -under `raw`, and `decryptedValue` may be absent or `undefined`. Some failure -cases may also include a per-event `error` and/or print a one-line warning to -`stderr`, but that is not guaranteed for every decryption failure. - -### `chel migrate` - -Performs a non-destructive migration from one backend (`--from`) to another -one (`--to`). For example, this can be used to migrate from the `fs` backend to -the `sqlite` backend. - -Since some backends may require additional configuration, `chel migrate` allows -for specifying additional options for these backends with the `--from-config` -and `--to-config` options. - -By default, the general `chel` configuration will be used both for the `--from` -and `--to` backends (such as the values given in `chel.toml`). However, if -`--from-config` or `--to-config` are specified, those will take precedence. - -The configuration files for `--from-config` and `--to-config` follow the same -syntax and structure as `chel.toml`. This makes it easy to migrate to a new -backend by writing a new `chel.toml` for that backend. - -#### Examples - -```sh -# Migrate from sqlite to redis using default values (possibly overridden in chel.toml) -chel migrate --from sqlite --to redis +npm install --save-dev @chelonia/cli ``` -```sh -# Migrate from sqlite to redis using default values (possibly overridden in chel.toml) -# for redis and the configuration in sqlite.toml for sqlite -chel migrate --from sqlite --from-config sqlite.toml --to redis -``` - -```sh -# Migrate from sqlite to redis using default values (possibly overridden in chel.toml) -# for sqlite and the configuration in redis.toml for redis -chel migrate --from sqlite --to redis --to-config redis.toml -``` - -```sh -# Migrate from sqlite to redis using the configuration in sqlite.toml for sqlite -# and the configuration in redis.toml for redis -chel migrate --from sqlite --from-config sqlite.toml --to redis --to-config redis.toml -``` - -## Configuration Files - -The project uses two separate configuration files for different purposes: - -### `chel.toml` — Runtime CLI Configuration - -`chel.toml` configures the `chel` command itself at runtime. It is read by `nconf` with priority: environment variables > CLI arguments > `chel.toml` > defaults. It controls things like server host/port, database backend selection, and other operational settings. - -By default, `chel` reads `./chel.toml`. To use another file, pass its path with `--config`: +Or install it for your user: ```bash -chel serve --config data/chel.toml dist -``` - -```toml -# Example chel.toml -[server] -host = "0.0.0.0" -port = 8000 -dashboardPort = 8888 -# The dashboard listens on this machine only, unless you change this -dashboardListenIP = "127.0.0.1" -# The dashboard shows no data until this is set to a long, random password -# dashboardAdminPassword = "..." - -[server.vapid] -email = "admin@example.com" - -[database] -backend = "sqlite" - -# Signup size cap and the billing free tier; see -# docs/signup-and-billing.md. -# [server.signup] -# maxFirstMessageBytes = 8192 -# -# [server.billing] -# freeAllowanceBytes = 10485760 +npm install --global @chelonia/cli ``` -### `chelonia.json` — App Properties - -`chelonia.json` is an **app-level properties file** that describes which -contracts make up the application and their pinned versions. It is **not** -runtime configuration for `chel`. Instead, it is: - -- **Created and updated** by `chel pin` when pinning contracts to specific - versions. -- **Read by the server** (`chel serve`) at startup to provide version - information and other app-specific settings to clients. - -The file contains a `contracts` object keyed by the full contract name -(e.g. `gi.contracts/chatroom`), where each entry has: - -| Field | Description | -|-------|-------------| -| `version` | The pinned version string for this contract | -| `path` | Relative path to the manifest file in the `contracts/` directory | - -It may also contain an `appVersion` field for the overall application version. - -**Example:** -```json -{ - "appVersion": "2.0.0", - "contracts": { - "gi.contracts/chatroom": { - "version": "2.0.6", - "path": "contracts/gi.contracts_chatroom/2.0.6/chatroom.2.0.6.manifest.json" - }, - "gi.contracts/group": { - "version": "2.0.0", - "path": "contracts/gi.contracts_group/2.0.0/group.2.0.0.manifest.json" - } - } -} -``` - -**Summary of differences:** - -| | `chel.toml` | `chelonia.json` | -|---|---|---| -| **Purpose** | Runtime configuration of the `chel` CLI | App properties (e.g., contract versions) | -| **Managed by** | Manually by the developer / system administrator | Automatically by `chel pin` | -| **Read by** | `chel` commands (via `nconf`) | The server (at startup), values exposed to clients | -| **Format** | TOML | JSON | -| **Example content** | Database configuration | Contract versions | +`chel --help` lists the commands, and `chel --help` shows the +options of one. ## Supported Platforms @@ -515,144 +56,47 @@ Pre-compiled native binaries are published for the following platforms: | macOS | x64 (Intel) | `@chelonia/cli-x64-darwin` | | macOS | arm64 (Apple Silicon) | `@chelonia/cli-arm64-darwin` | -When you install `@chelonia/cli`, npm automatically selects the correct -sub-package for your platform via `optionalDependencies`. Windows arm64 is -currently **not** supported. - -The Linux binaries are linked against glibc, so Linux distributions built on -musl libc (Alpine, for example) are **not** covered: the native SQLite addon -each Linux binary carries is the glibc build for its platform. Running `chel` -from source with Deno works there instead. Only the SQLite backend is affected, -and selecting it on such a system fails with a message saying so rather than -with a raw loader or missing-module error. +When you install `@chelonia/cli`, npm selects the sub-package for your platform +through `optionalDependencies`. Windows on arm64 is **not** supported. -From source, nothing has to be compiled locally: the SQLite driver ships musl -prebuilds (`prebuilds/linuxmusl-.node`) next to the glibc ones, and its -resolver chooses between them by asking Node whether the process is running -against glibc. Deno hardcoded a glibc version into that answer until Deno -2.8.0 ([denoland/deno#33948](https://github.com/denoland/deno/issues/33948)), -so older versions pick the glibc prebuild on musl and then fail inside the -dynamic loader. +The Linux binaries are linked against glibc, so on musl-based distributions +(Alpine, for example) their SQLite backend does not work. Run chel from source +with Deno 2.8.0 or newer there, or use another database backend. The details +are in [docs/distributing.md](docs/distributing.md#linux-on-musl). -On Deno 2.8.0 or newer this works out of the box. On anything older, either -upgrade Deno or patch `node_modules/better-sqlite3/lib/binding.js` so that -`isLinuxMusl` always returns `true`. Compiling the addon from its C sources -(`npm run build-release`) does **not** help: the resolver returns a matching -prebuild before it ever looks at a locally built copy. +If `chel` cannot start, the launcher explains why rather than printing a stack +trace: exit code 127 means no sub-package for your platform is installed, and +126 means one was found but its binary is missing or not executable (reinstall +with `npm install --force @chelonia/cli`). -The `chel` command itself is always provided by the main `@chelonia/cli` -package, which ships a small launcher that spawns the native binary from the -sub-package npm selected. The sub-packages intentionally declare no command of -their own: if they did, they would compete with the main package for the same -`chel` entry in `node_modules/.bin`, and npm would end up wiring `chel` to a -bare platform binary (or to nothing at all when the main package is the project -root). Because npm therefore never adjusts the binary's permissions at install -time, the executable bit is baked into the published sub-package instead. +## Getting started -This layout is verified against npm 10, pnpm (both its isolated and hoisted -layouts), Yarn 1, and Yarn 4 (both Plug'n'Play and `node-modules`), for local -and global installs. If `chel` cannot start, the launcher explains why rather -than printing a stack trace: exit code 127 means no sub-package for your -platform is installed, and 126 means one was found but its binary is missing or -not executable (reinstall with `npm install --force @chelonia/cli`). - -## Packaging - -Steps to publish a new release of `@chelonia/cli` to npm: - -1. **Login to npm** (prerequisite): - - ```bash - npm login - ``` - - If your account uses 2FA, `npm publish` may prompt for authentication. - Do not rely on `--otp=`: a TOTP code entered at the start of the - release may well have expired by the time the first sub-package is - published. Complete the browser-based authentication flow when prompted, - or use a granular automation token instead. - -2. **Bump the version:** - - ```bash - npm version patch # or minor / major - ``` - - This triggers the `version` lifecycle hook, which runs *after* the version - is bumped but *before* `npm version` commits and tags. The hook: - - Runs `deno task sync-versions` to update `optionalDependencies` in - `package.json` so they match the new version (and stages the change) - - Runs `deno task build` to rebuild the JS bundle (stamped with the new - version in `build/version.json`) and the dashboard - - Stages the rebuilt `build/` artifacts - - As a result, the version commit and tag contain the up-to-date bundle and - the working directory stays clean. The publish step verifies that what it - ships is exactly this committed bundle and refuses to run otherwise. - This also guarantees the maintainer rebuilds the bundle on `master` - (merged PRs can each produce a correct bundle individually, yet the - combined result on `master` may still differ). - -3. **Build the release artifacts** (the tarballs for the GitHub release): - - ```bash - deno task dist - git diff --exit-code -- build # fails if the rebuild diverged from the tag - ``` - - This lints, rebuilds the bundle, compiles one native binary per supported - platform, and packs each one into `dist/chel-v-.tar.gz`, - printing SHA256 checksums. - - The `git diff --exit-code -- build` afterwards confirms the rebuild is - byte-identical to the version commit, i.e. that the build is reproducible. - It also has to pass before publishing, since the next step requires a clean - `build/`. If it fails, do not publish: investigate the divergence first. - -4. **Publish:** - - ```bash - npm publish --access public - ``` - - This triggers the `prepublishOnly` hook, which runs `deno task publish`. - That script: - - Verifies that the committed bundle matches `package.json` (via - `build/version.json`) and that the working tree is clean for `build/` - and `package.json`, refusing to publish otherwise - - Reuses the native binaries from step 3 instead of compiling its own - copies, so a release compiles each binary once and npm and GitHub are - guaranteed to ship identical bytes. If a binary is missing, or was built - from a different bundle, it is compiled here instead — publishing without - step 3 works, it just takes several minutes longer - - Creates and publishes a platform sub-package (`@chelonia/cli--`) for each target - - Reconciles `optionalDependencies` as a final safety check - - After the sub-packages are published, `npm publish` proceeds to publish the - main `@chelonia/cli` package, whose `optionalDependencies` now point to the - freshly published sub-packages. - -5. **Push the version commit and tag:** +```bash +chel init # writes chel.toml, with a fresh server_id +chel keygen # makes a key pair to sign contracts with - ```bash - git push && git push --tags - ``` +# Sign a contract, then pin it into contracts/ and chelonia.json +chel manifest --name my.app/list --contract-version 1.0.0 list.js +chel pin list.1.0.0.manifest.json -### Build caching +# Serve the app in dist/, upload contracts/, and watch it for new versions +chel serve --dev --app-manifest chelonia.json dist +``` -Compiling the five native binaries is by far the slowest part of a release, so -the tarballs and the npm sub-packages share one set of them, kept under the -gitignored `dist/` directory. `deno task dist` remains usable on its own, at -any time, to produce the tarballs without publishing anything. +By default the server keeps everything in memory. Before running it for other +people, read [docs/server.md](docs/server.md#in-production). -The cache operates on content, not on timestamps. When the bundle, the Deno -version, or a compile flag changes, `deno task dist` compiles the binaries -again. When nothing changes, it does no compile work. To compile all binaries -again, set `CHEL_FORCE_COMPILE=1` or delete `dist/`. +## Documentation -To check that a compiled binary loads its SQLite addon, run -`CHEL_SMOKE_COMPILE=1 deno task smoke`. This test compiles a binary and is -therefore not part of `deno task test`. +- [Commands](docs/commands.md): every command and its options. +- [Running a server](docs/server.md): what `chel serve` does, the dashboard, + and production. +- [Configuration](docs/configuration.md): `chel.toml`, its database backends, + and `chelonia.json`. +- [Signup and billing](docs/signup-and-billing.md): the checks on new + accounts, and how storage is charged. +- [Distributing](docs/distributing.md): how chel is built, packaged and + published. ## History diff --git a/docs/commands.md b/docs/commands.md new file mode 100644 index 0000000..9fb8b27 --- /dev/null +++ b/docs/commands.md @@ -0,0 +1,373 @@ +# Commands + +`chel --help` lists the commands, and `chel --help` shows the +options of one. + +Every command also takes `--config `, to use another config file than +`./chel.toml`. These commands read it: `deploy`, `eventsAfter`, `get`, +`migrate`, `pin`, `serve` and `upload`. See [configuration.md](configuration.md). + +| command | what it does | +| --- | --- | +| [`chel init`](#chel-init) | writes a new `chel.toml` | +| [`chel serve`](#chel-serve) | runs the server | +| [`chel keygen`](#chel-keygen) | makes a key pair for signing contracts | +| [`chel manifest`](#chel-manifest) | signs a contract | +| [`chel pin`](#chel-pin) | pins a contract version into `contracts/` | +| [`chel verifySignature`](#chel-verifysignature) | checks a manifest | +| [`chel deploy`](#chel-deploy) | uploads contracts and their manifests | +| [`chel upload`](#chel-upload) | uploads files | +| [`chel get`](#chel-get) | prints the entry stored under a key | +| [`chel eventsAfter`](#chel-eventsafter) | prints a contract's events as JSON | +| [`chel hash`](#chel-hash) | prints the CID of a file | +| [`chel migrate`](#chel-migrate) | copies all data from one database backend to another | +| [`chel version`](#chel-version) | prints the version | + +A contract usually goes through these steps: + +1. `chel keygen` makes a key pair, once. Keep it for as long as the app lives: + clients trust the signing keys of the first manifest they see for a + contract name, and refuse later manifests signed with other keys. +2. `chel manifest` signs each version of each contract. +3. `chel pin` copies that version into `contracts/` and records it in + `chelonia.json`. +4. `chel serve` uploads everything in `contracts/` when it starts. + +## chel init + +``` +chel init [--force] [--config ] +``` + +Writes a template `chel.toml` in the current directory, or at the `--config` +path, with a freshly generated `server_id` and the default settings. The less +common ones are left as comments. + +- `--force`: overwrite an existing file. Without it, `chel init` refuses to, + as a safety against changing `server_id` by accident: push subscriptions are + tagged with it, and the ones tagged with the old id would be orphaned. + +Keep `server_id` the same for the life of the database, and do not reuse it +across environments (production, staging, development) that share a database. + +```bash +$ chel init +wrote: chel.toml +server_id: 7b3f2c1a-... keep this stable; do not reuse across environments, + and do not rotate it on an existing DB. +``` + +## chel serve + +``` +chel serve [options] [directory] +``` + +Runs the server for the app in `directory` (`.` by default). See +[server.md](server.md) for what it does at startup, the dashboard and running +it in production. + +| option | default | | +| --- | --- | --- | +| `-p`, `--port` | `8000` | port of the app and the API | +| `-a`, `--dashboard-port` | `8888` | port of the dashboard | +| `-d`, `--dev` | off | development mode: also watch the manifests folder and upload new versions as they appear | +| `-m`, `--manifests-dir` | `contracts` | where to find the contract manifests to upload | +| `-i`, `--app-manifest` | `chelonia.json` in the app directory | the app's [`chelonia.json`](configuration.md#cheloniajson) | + +## chel keygen + +``` +chel keygen [--out ] [--pubout ] +``` + +Makes a key pair for signing contracts. `--out` is the file for the secret key +and `--pubout` the one for the public key. By default they are named after the +key, as `edwards25519sha512batch-.json` and +`edwards25519sha512batch-.pub.json`, where `` is the last 12 +characters of the key ID. + +The secret key file looks like this, and the public one is the same without +`privkey`: + +```json +{ + "version": "1.0.0", + "pubkey": "...", + "privkey": "..." +} +``` + +The private key is saved unencrypted, so keep the file out of version control +and off the server. + +## chel manifest + +``` +chel manifest [options] +``` + +Signs `contractBundle` with the secret key file `signingKey`, and writes its +manifest. + +| option | default | | +| --- | --- | --- | +| `-n`, `--name ` | the file name, without extension | contract name | +| `-V`, `--contract-version ` | `x` | contract version | +| `--out ` | `..manifest.json`, next to the contract | where to write the manifest. `-` prints it | +| `-s`, `--slim ` | | a slim bundle of the same contract, hashed into the manifest | +| `-k`, `--key ` | | another public key file allowed to sign this contract. Can be repeated | + +For example, with a key `deploy-key.json`, a second public key `alex.pub.json`, +and the two builds `contract-bundle.js` and `contract-slim.js`: + +```bash +chel manifest --name my.app/list --contract-version 1.0.0 \ + -k alex.pub.json --slim contract-slim.js deploy-key.json contract-bundle.js +``` + +writes `contract-bundle.1.0.0.manifest.json`. Its `head` and `body` are JSON +strings, and the signature covers both: + +``` +{ + "head": "{\"manifestVersion\":\"1.0.0\"}", + "body": JSON.stringify({ + "name": "my.app/list", + "version": "1.0.0", + "contract": { "hash": "", "file": "contract-bundle.js" }, + "signingKeys": ["", ""], + "contractSlim": { "file": "contract-slim.js", "hash": "" } + }), + "signature": { + "keyId": "", + "value": "" + } +} +``` + +The manifest records each file by its name only, and `chel deploy` looks for +them next to the manifest, so keep them in the same folder. + +The CLI always uses the self-contained bundle, but apps can load less code by +loading the slim version. That is only safe if the external code the slim +version relies on never changes, or the two versions would build different +state. + +Chelonia is language agnostic. It started out for JavaScript apps, but the +protocol works with any language that can evaluate source at runtime. + +## chel pin + +``` +chel pin [options] [] +``` + +Copies the contract files and the manifest into +`contracts///`, and records the version in +`chelonia.json`. A `/` in the contract name becomes `_` in the folder name. + +| option | | +| --- | --- | +| `-o`, `--overwrite` | replace a version folder that is already there | +| `-d`, `--dir ` | the project folder to pin into, instead of the current one | +| `-i`, `--app-manifest ` | the `chelonia.json` to update | + +If you give `manifest-version`, it must match the version in the manifest. If +`chelonia.json` already pins that version, `chel pin` does nothing. If the +version's folder is there but `chelonia.json` pins another version, it stops +unless you pass `--overwrite`. + +```bash +chel pin dist/contracts/chatroom.2.0.6.manifest.json 2.0.6 +``` + +pins `gi.contracts/chatroom` like this, next to the versions pinned before: + +``` +contracts/ +├── gi.contracts_chatroom/ +│ ├── 2.0.5/ +│ │ ├── chatroom.js +│ │ ├── chatroom-slim.js +│ │ └── chatroom.2.0.5.manifest.json +│ └── 2.0.6/ +│ ├── chatroom.js +│ ├── chatroom-slim.js +│ └── chatroom.2.0.6.manifest.json +└── gi.contracts_group/ + └── 2.0.0/ + └── ... +``` + +## chel verifySignature + +``` +chel verifySignature [-k ] +``` + +Checks a manifest: its signature, that the key it was signed with is listed in +its `signingKeys`, and that the contract files next to it match their hashes. +With `-k`, it also checks that the manifest was signed with that key. + +## chel deploy + +``` +chel deploy [--url ] +``` + +Uploads each manifest and the contract files it points to, and prints where +each one went. A folder means every manifest in it and in its subfolders. + +Without `--url` it writes into the database set in `chel.toml`. With `--url` +it sends them to that server, which only accepts them when it runs with +`NODE_ENV=development`. + +## chel upload + +``` +chel upload [--url ] +``` + +Uploads files, to the database set in `chel.toml` or, with `--url`, to a server +running with `NODE_ENV=development`. + +## chel get + +``` +chel get [--url ] +``` + +Prints the entry stored under `key`, from the database set in `chel.toml` or, +with `--url`, from that server's `/file/`. The output can go to a file: + +```bash +chel get --url https://example.com > file.png +``` + +## chel eventsAfter + +``` +chel eventsAfter [--limit ] [--url ] [--keys ] +``` + +Prints a JSON array of up to `--limit` (default 50) events of a contract, +starting at `height`. Older events come first, and the output works with tools +like `jq`. + +Without `--url` it reads the database set in `chel.toml`. With `--url` it calls +that server's `/eventsAfter` endpoint. + +### Decrypting events with `--keys` + +By default, encrypted events (`OP_ACTION_ENCRYPTED` and friends) are returned +as they are stored: useful for forensics, but unreadable. Pass `--keys` with a +JSON file of secret keys to decrypt them in place. + +**Current limitation:** decryption only works when the returned list starts +with the contract's `OP_CONTRACT` event, for example by querying from height +`0`. From a later height there is no prior contract and key state, so +encrypted events come back as they are, with a `no prior contract state` +error. + +**Warning:** this file holds secret keys, and can decrypt every event +encrypted to them. Do **not** commit it to version control, put it in logs or +share it. Store it with restrictive file permissions, use it only for local +debugging, and delete it when you are done. + +The file maps each key ID to its serialized secret key: + +```json +{ + "z9brR...sigKeyId": "", + "z9brR...encKeyId": "" +} +``` + +This is the shape Chelonia keeps at `rootState.secretKeys` in any app built +with [`@chelonia/lib`](https://github.com/okTurtles/libcheloniajs). The easiest +way to get it is from the browser's developer console, with the app open: + +```js +copy(JSON.stringify(await sbp('chelonia/rootState').secretKeys, null, 2)) +// then paste it into keys.json +``` + +```bash +chel eventsAfter --keys ./keys.json 0 --limit 10 +``` + +With `--keys`, each event comes out like this: + +```jsonc +{ + "height": 1, + "hash": "z9brR...", + "contractID": "z9brR...", + "op": "ae", + "signingKeyId": "z9brR...", + "innerSigningKeyId": "z9brR...", + "decryptedValue": { /* the inner contract action payload */ }, + "raw": { + "serverMeta": { + "date": "2025-06-09T20:35:43.305Z", + "isKeyOp": true + }, + "message": "{...}" + } +} +``` + +An `OP_ATOMIC` event also has `ops`, with one entry per operation in it. + +Decryption is best-effort: if a key is missing or a signature cannot be +verified, the event still comes out with the original message under `raw`, and +`decryptedValue` may be missing. Some failures also add an `error` to the event +or print a warning to `stderr`, but not every one does. + +## chel hash + +``` +chel hash +``` + +Prints the content identifier (CID) of a file. The contents are read as raw +binary data, unless the file name ends in `.json`. + +## chel migrate + +``` +chel migrate --from --to [--from-config ] [--to-config ] +``` + +Copies every key-value pair from one database backend (`--from`) to another +(`--to`), for example from `fs` to `sqlite`. The source is not changed or +deleted, the destination is created if needed, and invalid entries are +skipped. It needs read and write access to the source. + +Both backends use the settings in `chel.toml`, unless `--from-config` or +`--to-config` gives another file. Those files have the same format as +`chel.toml`, so migrating to a new backend can start with writing a +`chel.toml` for it. + +```sh +# From sqlite to redis, both with the settings in chel.toml +chel migrate --from sqlite --to redis + +# sqlite with the settings in sqlite.toml, redis with those in chel.toml +chel migrate --from sqlite --from-config sqlite.toml --to redis + +# sqlite with the settings in chel.toml, redis with those in redis.toml +chel migrate --from sqlite --to redis --to-config redis.toml + +# Each with its own file +chel migrate --from sqlite --from-config sqlite.toml --to redis --to-config redis.toml +``` + +## chel version + +``` +chel version +``` + +Prints the version of chel. diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..e1d72fa --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,138 @@ +# Configuration + +chel uses two files for two different things. `chel.toml` configures the +`chel` command itself, and `chelonia.json` describes your app's contracts. + +## chel.toml + +`chel.toml` configures the `chel` command at runtime: things like the +server's host and ports, the database backend and the signup limits. + +By default, `chel` reads `./chel.toml`. To use another file, pass its path +with `--config`: + +```bash +chel serve --config data/chel.toml dist +``` + +Each setting comes from the first of these that has it: + +1. an environment variable +2. a command-line flag +3. `chel.toml` +4. the built-in default + +Environment variables use the setting's path with `__` between the parts. +Their values are parsed, so numbers and booleans work: + +```bash +server__port=9000 server__signup__disabled=true chel serve dist +``` + +`chel init` writes a starting file with a fresh `server_id` and the default +settings, the less common ones as comments. + +The commands that read the file (`deploy`, `eventsAfter`, `get`, `migrate`, +`pin`, `serve` and `upload`) check it when they start. An unknown key is a +warning, often with the name it looks like, since it is usually a typo. A +value of the wrong type or shape is an error. A missing `./chel.toml` is fine, +and the defaults apply, but a missing `--config` file is an error. + +```toml +# Example chel.toml +server_id = "..." # written by chel init + +[server] +host = "0.0.0.0" +port = 8000 +dashboardPort = 8888 +# The dashboard listens on this machine only, unless you change this +dashboardListenIP = "127.0.0.1" +# The dashboard shows no data until this is set to a long, random password +# dashboardAdminPassword = "..." + +[server.vapid] +email = "admin@example.com" + +[database] +backend = "sqlite" + +# Signup size cap and the billing free tier; see +# signup-and-billing.md. +# [server.signup] +# maxFirstMessageBytes = 8192 +# +# [server.billing] +# freeAllowanceBytes = 10485760 +``` + +### Database backends + +`database.backend` sets where chel keeps its data. Each backend takes its +options from its own table, `[database.backendOptions.]`. + +| backend | options | +| --- | --- | +| `mem` (default) | none. Everything is kept in memory, and lost when chel stops | +| `fs` | `dirname` (default `data`): the folder with one file per entry. `depth` and `keyChunkLength` spread the files over subfolders named after parts of their keys, and `skipFsCaseSensitivityCheck` skips the startup check that the folder is on a case-sensitive filesystem | +| `sqlite` | `filepath` (default `data/chelonia.db`) | +| `redis` | `url`, starting with `redis://` or `rediss://` | +| `router` | sends keys to other backends by prefix: each prefix maps to `{ name, options }`, and an entry for `*` takes every other key | + +With any backend but `mem`, `database.lruNumItems` (default `10000`) sets how +many entries the in-memory cache in front of it holds. + +## chelonia.json + +`chelonia.json` is an **app-level properties file** that describes which +contracts make up the application and their pinned versions. It is **not** +runtime configuration for `chel`. Instead, it is: + +- **Created and updated** by `chel pin` when pinning contracts to specific + versions. +- **Read by the server** (`chel serve`) at startup, which sends every client + that connects the app's version and the version of each contract. + +The file contains a `contracts` object keyed by the full contract name +(e.g. `gi.contracts/chatroom`), where each entry has: + +| Field | Description | +|-------|-------------| +| `version` | The pinned version string for this contract | +| `path` | Relative path to the manifest file in the `contracts/` directory | + +It may also contain an `appVersion` field for the overall application version. +`chel pin` does not write it. + +**Example:** +```json +{ + "appVersion": "2.0.0", + "contracts": { + "gi.contracts/chatroom": { + "version": "2.0.6", + "path": "contracts/gi.contracts_chatroom/2.0.6/chatroom.2.0.6.manifest.json" + }, + "gi.contracts/group": { + "version": "2.0.0", + "path": "contracts/gi.contracts_group/2.0.0/group.2.0.0.manifest.json" + } + } +} +``` + +`chel pin` writes `chelonia.json` in the current folder, but `chel serve` +looks for it in the app folder, unless `--app-manifest` (or `appManifest` in +`chel.toml`) points somewhere else. So when the app is in a subfolder, as in +`chel serve dist`, pass `--app-manifest chelonia.json`. Without it, the server +logs a warning and clients get no version information. + +**Summary of differences:** + +| | `chel.toml` | `chelonia.json` | +|---|---|---| +| **Purpose** | Runtime configuration of the `chel` CLI | App properties (e.g., contract versions) | +| **Managed by** | Manually by the developer / system administrator | Automatically by `chel pin` | +| **Read by** | `chel` commands (via `nconf`) | The server (at startup), values sent to clients | +| **Format** | TOML | JSON | +| **Example content** | Database configuration | Contract versions | diff --git a/docs/distributing.md b/docs/distributing.md new file mode 100644 index 0000000..07c13dc --- /dev/null +++ b/docs/distributing.md @@ -0,0 +1,141 @@ +# Distributing chel + +How chel is built, packaged and published to npm. The list of supported +platforms is in the [README](../README.md#supported-platforms). + +## Publishing a release + +Steps to publish a new release of `@chelonia/cli` to npm: + +1. **Login to npm** (prerequisite): + + ```bash + npm login + ``` + + If your account uses 2FA, `npm publish` may prompt for authentication. + Do not rely on `--otp=`: a TOTP code entered at the start of the + release may well have expired by the time the first sub-package is + published. Complete the browser-based authentication flow when prompted, + or use a granular automation token instead. + +2. **Bump the version:** + + ```bash + npm version patch # or minor / major + ``` + + This triggers the `version` lifecycle hook, which runs *after* the version + is bumped but *before* `npm version` commits and tags. The hook: + - Runs `deno task sync-versions` to update `optionalDependencies` in + `package.json` so they match the new version (and stages the change) + - Runs `deno task build` to rebuild the JS bundle (stamped with the new + version in `build/version.json`) and the dashboard + - Stages the rebuilt `build/` artifacts + + As a result, the version commit and tag contain the up-to-date bundle and + the working directory stays clean. The publish step verifies that what it + ships is exactly this committed bundle and refuses to run otherwise. + This also guarantees the maintainer rebuilds the bundle on `master` + (merged PRs can each produce a correct bundle individually, yet the + combined result on `master` may still differ). + +3. **Build the release artifacts** (the tarballs for the GitHub release): + + ```bash + deno task dist + git diff --exit-code -- build # fails if the rebuild diverged from the tag + ``` + + This lints, rebuilds the bundle, compiles one native binary per supported + platform, and packs each one into `dist/chel-v-.tar.gz`, + printing SHA256 checksums. + + The `git diff --exit-code -- build` afterwards confirms the rebuild is + byte-identical to the version commit, i.e. that the build is reproducible. + It also has to pass before publishing, since the next step requires a clean + `build/`. If it fails, do not publish: investigate the divergence first. + +4. **Publish:** + + ```bash + npm publish --access public + ``` + + This triggers the `prepublishOnly` hook, which runs `deno task publish`. + That script: + - Verifies that the committed bundle matches `package.json` (via + `build/version.json`) and that the working tree is clean for `build/` + and `package.json`, refusing to publish otherwise + - Reuses the native binaries from step 3 instead of compiling its own + copies, so a release compiles each binary once and npm and GitHub are + guaranteed to ship identical bytes. If a binary is missing, or was built + from a different bundle, it is compiled here instead. Publishing without + step 3 works, it just takes several minutes longer + - Creates and publishes a platform sub-package (`@chelonia/cli--`) for each target + - Reconciles `optionalDependencies` as a final safety check + + After the sub-packages are published, `npm publish` proceeds to publish the + main `@chelonia/cli` package, whose `optionalDependencies` now point to the + freshly published sub-packages. + +5. **Push the version commit and tag:** + + ```bash + git push && git push --tags + ``` + +## Build caching + +Compiling the five native binaries is by far the slowest part of a release, so +the tarballs and the npm sub-packages share one set of them, kept under the +gitignored `dist/` directory. `deno task dist` remains usable on its own, at +any time, to produce the tarballs without publishing anything. + +The cache operates on content, not on timestamps. When the bundle, the Deno +version, or a compile flag changes, `deno task dist` compiles the binaries +again. When nothing changes, it does no compile work. To compile all binaries +again, set `CHEL_FORCE_COMPILE=1` or delete `dist/`. + +To check that a compiled binary loads its SQLite addon, run +`CHEL_SMOKE_COMPILE=1 deno task smoke`. This test compiles a binary and is +therefore not part of `deno task test`. + +## How the npm packages work + +The `chel` command itself is always provided by the main `@chelonia/cli` +package, which ships a small launcher that spawns the native binary from the +sub-package npm selected. The sub-packages intentionally declare no command of +their own: if they did, they would compete with the main package for the same +`chel` entry in `node_modules/.bin`, and npm would end up wiring `chel` to a +bare platform binary (or to nothing at all when the main package is the project +root). Because npm therefore never adjusts the binary's permissions at install +time, the executable bit is baked into the published sub-package instead. + +This layout is verified against npm 10, pnpm (both its isolated and hoisted +layouts), Yarn 1, and Yarn 4 (both Plug'n'Play and `node-modules`), for local +and global installs. The launcher's exit codes are listed in the +[README](../README.md#supported-platforms). + +## Linux on musl + +The Linux binaries are linked against glibc, so Linux distributions built on +musl libc (Alpine, for example) are **not** covered: the native SQLite addon +each Linux binary carries is the glibc build for its platform. Running `chel` +from source with Deno works there instead. Only the SQLite backend is affected, +and selecting it on such a system fails with a message saying so rather than +with a raw loader or missing-module error. + +From source, nothing has to be compiled locally: the SQLite driver ships musl +prebuilds (`prebuilds/linuxmusl-.node`) next to the glibc ones, and its +resolver chooses between them by asking Node whether the process is running +against glibc. Deno hardcoded a glibc version into that answer until Deno +2.8.0 ([denoland/deno#33948](https://github.com/denoland/deno/issues/33948)), +so older versions pick the glibc prebuild on musl and then fail inside the +dynamic loader. + +On Deno 2.8.0 or newer this works out of the box. On anything older, either +upgrade Deno or patch `node_modules/better-sqlite3/lib/binding.js` so that +`isLinuxMusl` always returns `true`. Compiling the addon from its C sources +(`npm run build-release`) does **not** help: the resolver returns a matching +prebuild before it ever looks at a locally built copy. diff --git a/docs/server.md b/docs/server.md new file mode 100644 index 0000000..c5ba46a --- /dev/null +++ b/docs/server.md @@ -0,0 +1,79 @@ +# Running a server + +`chel serve` is the whole server: it serves your built app, answers the API, +and runs the websocket that pushes updates to the clients. It also starts a +dashboard on a second port. Its options are in +[commands.md](commands.md#chel-serve). + +## What it serves + +- **The app**, at `/app/`: `index.html` from the app directory, and that + directory's `assets/` folder at `/assets/`. +- **The API and the websocket**, on the same port, `8000` by default. +- **The dashboard**, on its own port, `8888` by default. See + [the dashboard](#the-dashboard). + +## What happens at startup + +1. It checks that `server_id` is set, and refuses to start without it. + `chel init` writes one. +2. It starts the dashboard. +3. It uploads every manifest in the manifests folder (`contracts/` by default, + laid out as `contracts///`) to its database, together with + the contract files they point to. With `--dev` it also keeps watching the + folder, and uploads new versions as they appear. Without `--dev`, a new + version needs a restart or a `chel deploy`. +4. It starts the app server. + +```bash +# The app and its contracts in the current directory +chel serve + +# Other ports +chel serve --port 8001 --dashboard-port 8889 ./my-app + +# Development: also upload contract versions as they are pinned +chel serve --dev ./dist +``` + +## The dashboard + +The dashboard shows the server's registered usernames, the contracts it +stores, how much space each account uses and each account's credits. It never +shows what is inside a contract, since that is encrypted. Because of the +usernames, it has two settings under `[server]` in `chel.toml`: + +- `dashboardListenIP`: the address it listens on, `127.0.0.1` by default, so + only this machine can open it. +- `dashboardAdminPassword`: until this is set, the dashboard shows no data. + Once it is, the browser asks for it (any user name works). To keep it out of + the file, set `server__dashboardAdminPassword` in the environment instead. + The password travels with every request, so put the dashboard behind HTTPS + before opening it to other machines. + +## In production + +```bash +NODE_ENV=production chel serve --app-manifest chelonia.json dist +``` + +- **`NODE_ENV=production`** turns on the signup limits per IP address (see + [signup-and-billing.md](signup-and-billing.md)). Two routes for development + are only there when `NODE_ENV` is exactly `development`: the one + `chel deploy --url` and `chel upload --url` upload through, and one that + prints logs sent by clients. +- **A database that persists.** The default backend, `mem`, loses every + account when the server stops. See + [configuration.md](configuration.md#database-backends). +- **`chelonia.json`.** `contracts/` is read from the current folder, and so is + `chel.toml` unless `--config` says otherwise. But `chelonia.json` is read + from the app folder, unless `--app-manifest` points somewhere else. `chel pin` writes it in the current folder, hence the + flag when the app is in `dist/`. Without it, the server only logs a warning, + and clients get no version information. +- **Behind a reverse proxy.** chel limits signups per client address, and + takes that address from the `X-Real-IP` header when a request has one. So + the proxy must set `X-Real-IP` and pass websocket upgrades through, and + clients must not be able to reach chel directly: they could send their own + `X-Real-IP` and get around the limits. +- **Backups.** Every account is in the database, so back it up, together with + `chel.toml` and its `server_id`. diff --git a/docs/signup-and-billing.md b/docs/signup-and-billing.md index 48d802a..3e9d485 100644 --- a/docs/signup-and-billing.md +++ b/docs/signup-and-billing.md @@ -43,5 +43,5 @@ contract plus everything it owns. `server.billing.freeAllowanceBytes` tier. Storage beyond the allowance is charged by the credits worker, which runs a billing cycle in the background and debits the entity's balance for the bytes it keeps stored. Balances are recorded but not yet enforced: an -entity whose balance drops below zero is not frozen and can keep writing -(see okTurtles/chel#160). +entity whose balance drops below zero is not frozen and can keep writing. +Freezing it is the plan agreed in the discussion of okTurtles/chel#160. diff --git a/scripts/publish.ts b/scripts/publish.ts index 5c4e3ea..56bee72 100644 --- a/scripts/publish.ts +++ b/scripts/publish.ts @@ -118,7 +118,7 @@ async function assertFreshBundle (): Promise { throw new Error( `Untracked files under ${SERVE_DIR}/ or ${DASHBOARD_DIR}/ would be embedded ` + 'into the compiled binaries but are not committed; remove them, or rebuild ' + - 'and amend the version commit (see the release steps in README.md)' + 'and amend the version commit (see the release steps in docs/distributing.md)' ) } } diff --git a/src/parseConfig.test.ts b/src/parseConfig.test.ts index a64b6d6..041adaa 100644 --- a/src/parseConfig.test.ts +++ b/src/parseConfig.test.ts @@ -116,7 +116,7 @@ Deno.test({ }) }) - // What the README says the order is. nconf adds the env store first, so it + // What docs/configuration.md says the order is. nconf adds the env store first, so it // wins over a flag, which surprises most people. await t.step('come from the environment even when a flag is given', async () => { const args = ['serve', '--port', '7777'] diff --git a/test/docs-defaults.test.ts b/test/docs-defaults.test.ts new file mode 100644 index 0000000..4ecd15e --- /dev/null +++ b/test/docs-defaults.test.ts @@ -0,0 +1,54 @@ +// Drift guard for the operator-facing documentation of the defaults. +// +// `chel init` interpolates every default into the generated `chel.toml` and +// `src/init.test.ts` pins that, so the template cannot go stale. The example +// and the backends table in docs/configuration.md and the prose in +// docs/signup-and-billing.md are written by hand, which is where the numbers an +// operator actually reads live, so this test pins those numbers too: a default +// that changes without the documentation following leaves the docs quietly +// wrong. Only the values are checked, not the wording around them, so the prose +// can be edited freely. +import { assert } from 'jsr:@std/assert' +import { nconfDefaults } from '../src/config-defaults.ts' +import { MAX_EVENT_BODY_BYTES } from '../src/serve/constants.ts' + +const config = await Deno.readTextFile('docs/configuration.md') +const doc = await Deno.readTextFile('docs/signup-and-billing.md') + +const assertDocumented = (text: string, description: string, snippet: string) => { + assert( + text.includes(snippet), + `the documentation should cover ${description}. Expected to find: ${snippet}` + ) +} + +Deno.test({ + name: 'the docs document the current defaults', + fn () { + const { server, database } = nconfDefaults + const { signup, billing } = server + + // The example chel.toml in docs/configuration.md + assertDocumented(config, 'the example app port', `port = ${server.port}`) + assertDocumented(config, 'the example dashboard port', `dashboardPort = ${server.dashboardPort}`) + assertDocumented(config, 'the example dashboard address', `dashboardListenIP = "${server.dashboardListenIP}"`) + assertDocumented(config, 'the example first-message cap', `maxFirstMessageBytes = ${signup.maxFirstMessageBytes}`) + assertDocumented(config, 'the example free allowance', `freeAllowanceBytes = ${billing.freeAllowanceBytes}`) + + // The backends table in docs/configuration.md + assertDocumented(config, 'the default backend', `\`${database.backend}\` (default)`) + assertDocumented(config, 'the cache size default', `(default \`${database.lruNumItems}\`)`) + + // The prose in docs/signup-and-billing.md + for (const [window, value] of Object.entries(signup.limit)) { + if (typeof value !== 'number') continue + assertDocumented(doc, `the per-${window} rate limit default`, `\`${value}\``) + } + assertDocumented(doc, 'the first-message cap default', `\`${signup.maxFirstMessageBytes}\``) + assertDocumented(doc, 'the free allowance default', `\`${billing.freeAllowanceBytes}\``) + + // A limit that is enforced elsewhere but bounds these settings in + // practice, and which operators cannot discover from the settings + assertDocumented(doc, 'the POST /event request body limit', `(${MAX_EVENT_BODY_BYTES} bytes)`) + } +}) diff --git a/test/readme-config.test.ts b/test/readme-config.test.ts deleted file mode 100644 index e78e5da..0000000 --- a/test/readme-config.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Drift guard for the operator-facing documentation of the signup and billing -// settings. -// -// `chel init` interpolates every default into the generated `chel.toml` and -// `src/init.test.ts` pins that, so the template cannot go stale. The -// commented-out example in README.md and the prose in docs/signup-and-billing.md -// are written by hand, which is where the numbers an operator actually reads -// live, so this test pins those numbers too: a default that changes without the -// documentation following leaves the docs quietly wrong. Only the values are -// checked, not the wording around them, so the prose can be edited freely. -import { assert } from 'jsr:@std/assert' -import { nconfDefaults } from '../src/config-defaults.ts' -import { MAX_EVENT_BODY_BYTES } from '../src/serve/constants.ts' - -const readme = await Deno.readTextFile('README.md') -const doc = await Deno.readTextFile('docs/signup-and-billing.md') - -const assertDocumented = (text: string, description: string, snippet: string) => { - assert( - text.includes(snippet), - `the documentation should cover ${description}. Expected to find: ${snippet}` - ) -} - -Deno.test({ - name: 'README and docs document the current signup and billing defaults', - fn () { - const { signup, billing } = nconfDefaults.server - - // The commented-out example block near "Runtime CLI Configuration" - assertDocumented(readme, 'the example first-message cap', `maxFirstMessageBytes = ${signup.maxFirstMessageBytes}`) - assertDocumented(readme, 'the example free allowance', `freeAllowanceBytes = ${billing.freeAllowanceBytes}`) - - // The prose in docs/signup-and-billing.md - for (const [window, value] of Object.entries(signup.limit)) { - if (typeof value !== 'number') continue - assertDocumented(doc, `the per-${window} rate limit default`, `\`${value}\``) - } - assertDocumented(doc, 'the first-message cap default', `\`${signup.maxFirstMessageBytes}\``) - assertDocumented(doc, 'the free allowance default', `\`${billing.freeAllowanceBytes}\``) - - // A limit that is enforced elsewhere but bounds these settings in - // practice, and which operators cannot discover from the settings - assertDocumented(doc, 'the POST /event request body limit', `(${MAX_EVENT_BODY_BYTES} bytes)`) - } -}) From 5e1f366733c9904367a59567b6f199db2e51f61f Mon Sep 17 00:00:00 2001 From: Akhilesh Thite Date: Mon, 9 Nov 2026 11:22:16 -0800 Subject: [PATCH 2/2] docs: add a Features section with a dashboard screenshot, and fix review points --- README.md | 12 +++++++++--- build/main.js | 2 +- docs/commands.md | 4 ++-- docs/images/dashboard.png | Bin 0 -> 162302 bytes src/hash.ts | 2 +- test/docs-defaults.test.ts | 38 ++++++++++++++++++++++++++++--------- 6 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 docs/images/dashboard.png diff --git a/README.md b/README.md index edbcf75..eadfb79 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Chel is the command-line tool for It signs and pins your app's contracts, runs the server that stores and relays their messages, and reads and writes the server's data. -## Why chel +## Features - **One tool, from contract to server.** Make a signing key, sign each version of a contract, pin it, and serve your app: `chel serve` uploads the pinned @@ -22,11 +22,17 @@ their messages, and reads and writes the server's data. - **Your choice of database:** in memory, files, SQLite, Redis, or a mix of them by key prefix. - **Ready for a public server.** Signups are limited per IP address, new - accounts have a size cap, storage is counted per account, and the dashboard - only shows its data behind a password. + accounts have a size cap, and storage is counted per account. +- **A dashboard for your server.** `chel serve` also starts a dashboard with + the registered users, the stored contracts, and each account's storage and + credits. It shows this only behind a password, and by default only the + server's own machine can open it. See + [docs/server.md](docs/server.md#the-dashboard). - **One config file.** `chel.toml` is checked for typos and wrong values when chel starts, and any setting can also come from an environment variable. +![The chel dashboard, with the number of users and contracts, the storage used, the newest users and the space usage](docs/images/dashboard.png) + ## Install Add it to your project, and run it with `npx chel`: diff --git a/build/main.js b/build/main.js index 36c1cb3..d1efef5 100644 --- a/build/main.js +++ b/build/main.js @@ -70343,7 +70343,7 @@ var module6 = { }); }, command: "hash ", - describe: "Computes and logs the content identifier (CID) for the given file.\nFile contents will be interpreted as raw binary data, unless the file extension is '.json'.", + describe: "Computes and logs the content identifier (CID) for the given file.\nFile contents are hashed as raw binary data.", postHandler: (argv) => { return void hash2(argv); } diff --git a/docs/commands.md b/docs/commands.md index 9fb8b27..732d993 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -331,8 +331,8 @@ or print a warning to `stderr`, but not every one does. chel hash ``` -Prints the content identifier (CID) of a file. The contents are read as raw -binary data, unless the file name ends in `.json`. +Prints the content identifier (CID) of a file, hashing its contents as raw +binary data. ## chel migrate diff --git a/docs/images/dashboard.png b/docs/images/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bc355992c273ffd379df2d1dd2bf4c6dbee02f GIT binary patch literal 162302 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', describe: 'Computes and logs the content identifier (CID) for the given file.\n' + - 'File contents will be interpreted as raw binary data, unless the file extension is \'.json\'.', + 'File contents are hashed as raw binary data.', postHandler: (argv) => { return void hash(argv) } diff --git a/test/docs-defaults.test.ts b/test/docs-defaults.test.ts index 4ecd15e..d62a840 100644 --- a/test/docs-defaults.test.ts +++ b/test/docs-defaults.test.ts @@ -30,20 +30,40 @@ Deno.test({ // The example chel.toml in docs/configuration.md assertDocumented(config, 'the example app port', `port = ${server.port}`) - assertDocumented(config, 'the example dashboard port', `dashboardPort = ${server.dashboardPort}`) - assertDocumented(config, 'the example dashboard address', `dashboardListenIP = "${server.dashboardListenIP}"`) - assertDocumented(config, 'the example first-message cap', `maxFirstMessageBytes = ${signup.maxFirstMessageBytes}`) - assertDocumented(config, 'the example free allowance', `freeAllowanceBytes = ${billing.freeAllowanceBytes}`) + assertDocumented( + config, + 'the example dashboard port', + `dashboardPort = ${server.dashboardPort}` + ) + assertDocumented( + config, + 'the example dashboard address', + `dashboardListenIP = "${server.dashboardListenIP}"` + ) + assertDocumented( + config, + 'the example first-message cap', + `maxFirstMessageBytes = ${signup.maxFirstMessageBytes}` + ) + assertDocumented( + config, + 'the example free allowance', + `freeAllowanceBytes = ${billing.freeAllowanceBytes}` + ) // The backends table in docs/configuration.md assertDocumented(config, 'the default backend', `\`${database.backend}\` (default)`) assertDocumented(config, 'the cache size default', `(default \`${database.lruNumItems}\`)`) - // The prose in docs/signup-and-billing.md - for (const [window, value] of Object.entries(signup.limit)) { - if (typeof value !== 'number') continue - assertDocumented(doc, `the per-${window} rate limit default`, `\`${value}\``) - } + // The prose in docs/signup-and-billing.md. The three rate limits are + // checked together, in the order the doc lists them, so a changed default + // can't pass by matching another number in the doc. + const { minute, hour, day } = signup.limit + assertDocumented( + doc, + 'the per-minute/hour/day rate limit defaults', + `\`${minute}\`/\`${hour}\`/\`${day}\`` + ) assertDocumented(doc, 'the first-message cap default', `\`${signup.maxFirstMessageBytes}\``) assertDocumented(doc, 'the free allowance default', `\`${billing.freeAllowanceBytes}\``)