on master help sign in
Add burn and new-oxal from brbenji/burn, document installing every app from ~donmec-sallud with shelf.iko.soy as the list, and expand AGENTS.md's routes, checks and fake-ship testing notes
8369273iko
AGENTS.md+89−49
unifiedsplit
@@ -4,22 +4,24 @@
4
4
5`urbit-apps` is a Nix flake that builds Urbit apps' desks into `.deskjam`
5`urbit-apps` is a Nix flake that builds Urbit apps' desks into `.deskjam`
6files, the upload format of [deskjam](https://github.com/iko-soy/deskjam),
6files, the upload format of [deskjam](https://github.com/iko-soy/deskjam),
7−with each app's frontend glob next to it. `jammer/` is the Rust CLI that packs
7+with its glob next to each one, for an app whose frontend is one. `jammer/`
8−them. `README.md` documents the apps for users: read it before changing what
8+is the Rust CLI that packs them. `README.md` documents the apps for users:
9−the flake builds.
9+read it before changing what the flake builds.
10
10
11## Code map
11## Code map
12
12
13−- `flake.nix`: one input per app, plus any dependencies an app's own build
13+- `flake.nix`: nixpkgs, flake-utils, one input per app, and the commits
14− pins. Each app is an `<app>-desk` built with `mkDeskjam` and exposed as
14+ harness' build pins. Each app is an `<app>-desk` built with `mkDeskjam` and
15− `packages.<system>.<app>`; frontends are `packages.<system>.<app>-glob`.
15+ exposed as `packages.<system>.<app>`. Globs are `packages.<system>.<app>-glob`,
16+ for hits, silo and vita. jammer is `packages.<system>.jammer` and `default`.
16 - `mkDeskjam { desk, src, glob ? null }` packs the desk folder `src` into
17 - `mkDeskjam { desk, src, glob ? null }` packs the desk folder `src` into
17 `$out/<desk>.deskjam` and copies `glob` next to it as `$out/<desk>-glob`.
18 `$out/<desk>.deskjam` and copies `glob` next to it as `$out/<desk>-glob`.
18 - `names-glob` reads a `desk.docket-0` with `urbit eval`, as the docket mark
19 - `names-glob` reads a `desk.docket-0` with `urbit eval`, as the docket mark
19 does. `mkDeskjam` fails the build when the docket names a glob (a
20 does. `mkDeskjam` fails the build when the docket names a glob (a
20 `glob-http` or `glob-ames` clause, and no `site` clause) but has no
21 `glob-http` or `glob-ames` clause, and no `site` clause) but has no
21− `glob`, when it has a `glob` for a docket that names none, and when the
22+ `glob`, when it has a `glob` for a docket that names none, and when Hoon
22− docket isn't valid Hoon.
23+ can't read the docket as a list of clauses. It doesn't check that the
24+ docket has the clauses the mark needs, such as `title`.
23 - `mkGlob` builds a frontend with `buildNpmPackage` (`npm run build`, then
25 - `mkGlob` builds a frontend with `buildNpmPackage` (`npm run build`, then
24 its `dist/`), for apps whose own flakes don't build their globs.
26 its `dist/`), for apps whose own flakes don't build their globs.
25 - `harness-git` and `harness-src` run harness' own `zig build` offline; see
27 - `harness-git` and `harness-src` run harness' own `zig build` offline; see
@@ -33,24 +35,33 @@ the flake builds.
33## Working conventions
35## Working conventions
34
36
35- Use jj, not git, and pass `--git` to `jj diff` and `jj show`. Commit or push
37- Use jj, not git, and pass `--git` to `jj diff` and `jj show`. Commit or push
36− only when asked. Nix only sees files jj tracks. Never write to `/nix` by
38+ only when asked. Never write to `/nix` by hand.
37− hand.
39+- Nix only sees files jj tracks, and jj tracks a new file at its next
40+ command. After adding a file, run `jj status` before building, not
41+ `git add`.
42+- jammer writes `<desk>.deskjam` or `<desk>/` in the current directory, and jj
43+ would track them in this repo. Run it elsewhere, or give `jam` and `unjam`
44+ an `-o` outside the repo; `nix shell .` puts it on your PATH.
38- Don't change the app repos from here. When one needs a change, write a
45- Don't change the app repos from here. When one needs a change, write a
39 prompt the user can give an agent in that repo: the problem, with evidence,
46 prompt the user can give an agent in that repo: the problem, with evidence,
40 the change, and how to check it.
47 the change, and how to check it.
41- Add an app by the first route its repo allows:
48- Add an app by the first route its repo allows:
42− 1. Its flake follows the convention: `packages.<system>.desk` is the full
49+ 1. Its flake builds the full desk, as `packages.<system>.desk`, or as
43− desk, `.glob` is the built frontend if its docket names a glob, and
44− `default` is `desk`. Add it as a flake input, with
50+ `default` if it has no `desk`, like vita's. Add it as a flake input, with
45− `src = app.packages.${system}.desk` and
51+ `src = app.packages.${system}.desk`, or `.default`. If its docket names a
46− `glob = app.packages.${system}.glob`. Have its `nixpkgs` follow this
52+ glob and its flake builds it, use `glob = app.packages.${system}.glob`;
53+ if not, build it here with `mkGlob`, as for hits. Have its `nixpkgs`
47− flake's only if its flake builds no frontend; otherwise keep the nixpkgs
54+ follow this flake's only if its flake builds no frontend; otherwise keep
48− it pins, so its glob is the same build as in its own repo.
55+ the nixpkgs it pins, so its glob is the same build as in its own repo.
49 2. It has no flake, and its `desk/` is the whole desk: a `flake = false`
56 2. It has no flake, and its `desk/` is the whole desk: a `flake = false`
50− input, with `src = "${app}/desk"`.
57+ input, with `src = "${app}/desk"`. If its docket names a glob, build it
58+ with `mkGlob`, starting its `npmDepsHash` at `pkgs.lib.fakeHash`.
51 3. Its own build tool assembles the desk: run that build in Nix, with its
59 3. Its own build tool assembles the desk: run that build in Nix, with its
52− fetches pinned as inputs, as for harness. Don't reimplement its steps,
60+ fetches pinned as inputs, as for harness. Don't reimplement its steps.
61+ Replace only a step that can't run in the sandbox, as `flake.nix` does
62+ for harness' npm steps, with `--replace-fail`, so a change upstream
53− and make the build fail loudly when upstream pins something new.
63+ stops the build. Make the build fail loudly when upstream pins
64+ something new.
54- Before adding an app, check:
65- Before adding an app, check:
55 - that its `sys.kelvin` lists the current kernel, `[%zuse 408]`. Kernel
66 - that its `sys.kelvin` lists the current kernel, `[%zuse 408]`. Kernel
56 numbers count down, so 411 is older than 408. Don't package an app that
67 numbers count down, so 411 is older than 408. Don't package an app that
@@ -58,23 +69,35 @@ the flake builds.
58 - its desk name, from its README or its docket's `base`.
69 - its desk name, from its README or its docket's `base`.
59 - whether its docket names a glob, and where else its frontend could come
70 - whether its docket names a glob, and where else its frontend could come
60 from, such as files its own agent serves from the desk.
71 from, such as files its own agent serves from the desk.
61− - that `jammer jam -v` reports no missing marks, and that the desk has the
72+ - that `jammer jam -v` reports no missing marks, and that deskjam's confirm
62− libraries its Hoon imports.
73+ page, on a fake ship, finds nothing missing that its agents and marks
74+ need. Its warning that other files import files the desk lacks, as for
75+ silo's base-dev libraries, is fine if nothing uses them.
63- The flake supports `x86_64-linux`, `aarch64-linux` and `aarch64-darwin`;
76- The flake supports `x86_64-linux`, `aarch64-linux` and `aarch64-darwin`;
64 nixpkgs 26.11 dropped `x86_64-darwin`. An app's flake must provide its
77 nixpkgs 26.11 dropped `x86_64-darwin`. An app's flake must provide its
65 outputs on all three.
78 outputs on all three.
66−- Keep `README.md` in step with the flake: the app's row in the Apps table
79+- Keep `README.md` in step with the flake. Give the app its row in the Apps
80+ table (description, source link,
67− (description, source link, `nix build github:iko-soy/urbit-apps#<app>`), the
81+ `nix build github:iko-soy/urbit-apps#<app>`), and add it wherever the README
82+ lists apps like it: the glob and build-all commands and their counts, the
68− glob and build-all commands, the Frontends section for an app with a glob,
83+ Frontends section, which names every app, with a glob or without, and
69− and its bullet in "How the desks are built". Write in its voice: short,
84+ "How the desks are built", including its npm hashes. Search the README for
85+ a similar app's name to find them all, and keep the lists in alphabetical
86+ order. Write in the README's voice: short, plain sentences.
70− plain sentences. In a table cell, escape `|` as `\|`, even inside backticks.
87+- In a README table cell, escape `|` as `\|`, even inside backticks. GitHub
88+ drops the cells an unescaped one adds, so a rendered table won't show it.
89+- The README says `~donmec-sallud` publishes every app in its table, and
90+ [shelf.iko.soy](https://shelf.iko.soy) lists the apps it offers. Only the
91+ user can publish an app there: when you add one that shelf.iko.soy doesn't
92+ list, say so in your report.
71- Format `flake.nix` with `nix run --inputs-from . nixpkgs#nixfmt -- flake.nix`.
93- Format `flake.nix` with `nix run --inputs-from . nixpkgs#nixfmt -- flake.nix`.
72- `nix flake update` moves every input except those pinned by a commit in
94- `nix flake update` moves every input except those pinned by a commit in
73 their URL, such as `harness-grubbery` and `harness-tlon`; move those by
95 their URL, such as `harness-grubbery` and `harness-tlon`; move those by
74 editing the URL.
96 editing the URL.
75−- When a frontend's `package-lock.json` changes, its build stops on a hash
97+- When a frontend's `package-lock.json` changes, its build stops with a hash
76− mismatch. Set its hash (`npmDepsHash`, or the `hash` of harness' `npmDeps`)
98+ mismatch, or `npmDepsHash is out of date`. Set its hash (`npmDepsHash`, or
99+ the `hash` of harness' `npmDeps`) to `pkgs.lib.fakeHash`, build, and use
77− to `pkgs.lib.fakeHash`, build, and use the hash shown after `got:`.
100+ the hash shown after `got:`.
78
101
79## Validation
102## Validation
80
103
@@ -84,27 +107,44 @@ Run from the repository root:
84nix run --inputs-from . nixpkgs#nixfmt -- --check flake.nix
107nix run --inputs-from . nixpkgs#nixfmt -- --check flake.nix
85nix flake check --all-systems --no-build
108nix flake check --all-systems --no-build
86nix build --no-link --print-out-paths .#<app>
109nix build --no-link --print-out-paths .#<app>
110+grep '^|' README.md | sed 's/\\|//g' | awk -F'|' 'NF != 6'
87```
111```
88
112
113+The last command prints any README table row with a stray `|`; it should
114+print nothing.
115+
89−For a change that shouldn't change a desk, `cmp` each app's new `.deskjam`
116+For a change that shouldn't change a desk, build every app before and after
90−with its old one. For one that should, `jammer unjam` both, `diff -r` them,
117+it, and `cmp` each `.deskjam`. Store paths don't tell: they change whenever
91−and check that only the expected files changed. `nix build --rebuild` of a
118+jammer is rebuilt. For a change that should, unpack both with
92−glob checks that it's reproducible.
119+`jammer unjam OLD.deskjam -o old` and `jammer unjam NEW.deskjam -o new`, and
93−
120+check that `diff -r old new` shows only the expected changes. To check that a
121+glob is reproducible, build it, then run `nix build --rebuild` on it a few
122+times; `--rebuild` fails on a glob that isn't built yet.
123+
94−For a new app, also compare its deskjam with what the app's own procedure
124+For a new app, check that its deskjam has what the app's install steps make.
95−makes. deskjam's `tests/fakezod/pack.sh` packs a desk folder with
125+`|new-desk` adds `mar/hoon`, `mar/kelvin`, `mar/noun`, `mar/txt` and
96−`urbit eval`, byte for byte as jammer does. Then render the README with
126+`sys.kelvin` from `%base` to what you copy in. Make that folder, pack it with
97−`nix run --inputs-from . nixpkgs#pandoc -- -f gfm -t html README.md`, and
127+deskjam's `tests/fakezod/pack.sh`, which makes the same bytes as jammer with
98−check that every table row has four cells.
128+`urbit eval`, and `cmp` the two. pack.sh stops on a file jammer skips, such
99−
129+as hits' `LICENSE`, which has no extension: pack a copy without such files.
100−To test an app on a ship, use deskjam's fake-ship harness, `tests/fakezod` in
130+
131+To test an app on a ship, clone iko-soy/deskjam outside this repo and use its
132+fake-ship harness, `tests/fakezod`, which keeps its pier in its
133+`tests/fakezod/.work`:
134+
101−iko-soy/deskjam. `bootstrap.sh` boots a fake `~zod` with deskjam, and
135+- `bootstrap.sh` boots a fake `~zod` with deskjam, and a desk `%harness` whose
102−`smoke-test.sh` shows how to drive deskjam's pages with curl. Set `HTTP_PORT`
136+ `%logtap` agent copies the ship's output into the log. This repo's harness
103−and `AMES_PORT`, and don't pick 31337 plus a galaxy's number as the Ames
137+ app is also `%harness`, and replacing that desk deletes logtap: move
104−port: the fake ship sends that galaxy's packets there, so they loop back.
138+ `%logtap` to a desk of its own before installing it.
139+- Set `HTTP_PORT`, and an `AMES_PORT` outside 31337 to 31592. A fake ship
140+ sends galaxy N's packets to port 31337 + N, so a ship on one of those ports
141+ loops them back to itself. The harness' default, 31483, is in that range.
142+- `smoke-test.sh` shows how to drive deskjam's pages with curl. It has no
143+ glob: for an app with one, post the confirm page's **set** form first, as
144+ the README's Frontends section says.
105−Upload a glob at `/docket/upload` as a browser does: a `desk` part, then one
145+- Upload a glob at `/docket/upload` as a browser does: a `desk` part, then one
106−`glob` part per file, named `<folder>/<path>`, with its content type. Stop
146+ `glob` part per file, named `<folder>/<path>`, with its content type.
107−the ship with `stop.sh` when done.
147+- Stop the ship with `stop.sh` when done.
108
148
109Quirks:
149Quirks:
110
150
README.md+32−13
@@ -6,14 +6,20 @@ file. You install it in your ship's web interface with
6[deskjam](https://github.com/iko-soy/deskjam), without access to the ship's
6[deskjam](https://github.com/iko-soy/deskjam), without access to the ship's
7files.
7files.
8
8
9+Every app here is also published from `~donmec-sallud`, so you can install
10+it from that ship instead, with nothing to build: see
11+[Installing from ~donmec-sallud](#installing-from-donmec-sallud).
12+
9## Apps
13## Apps
10
14
11| App | Description | Source | Build |
15| App | Description | Source | Build |
12|---|---|---|---|
16|---|---|---|---|
13| `%accountability` | Watches all 256 galaxies from your ship. Every 10 minutes it checks each one's keys on chain, whether it answers, and which `%kids` OTA it serves, and logs every change. A dashboard at `/apps/accountability` and a public JSON API show the results. It needs `%azimuth` running, as on a livenet ship. | [sigilante/accountability](https://github.com/sigilante/accountability) | `nix build github:iko-soy/urbit-apps#accountability` |
17| `%accountability` | Watches all 256 galaxies from your ship. Every 10 minutes it checks each one's keys on chain, whether it answers, and which `%kids` OTA it serves, and logs every change. A dashboard at `/apps/accountability` and a public JSON API show the results. It needs `%azimuth` running, as on a livenet ship. | [sigilante/accountability](https://github.com/sigilante/accountability) | `nix build github:iko-soy/urbit-apps#accountability` |
18+| `%burn` | Shares a Plex server's media library between ships. Every byte goes over Ames and is checked against its hash, so a ship behind NAT can share with no port forwarding. Its page is new-oxal's `/new-oxal/plex`, so install `%new-oxal` too. | [brbenji/burn](https://github.com/brbenji/burn) | `nix build github:iko-soy/urbit-apps#burn` |
14| `%deskjam` | Install and update apps, and upload and download desks, as deskjam files, in your ship's web interface at `/apps/deskjam`. A fork of [tinnus-napbus/deskjam](https://github.com/tinnus-napbus/deskjam). | [iko-soy/deskjam](https://github.com/iko-soy/deskjam) | `nix build github:iko-soy/urbit-apps#deskjam` |
19| `%deskjam` | Install and update apps, and upload and download desks, as deskjam files, in your ship's web interface at `/apps/deskjam`. A fork of [tinnus-napbus/deskjam](https://github.com/tinnus-napbus/deskjam). | [iko-soy/deskjam](https://github.com/iko-soy/deskjam) | `nix build github:iko-soy/urbit-apps#deskjam` |
15| `%harness` | Runs AI agents on your ship. Talk to them in its web app at `/apps/harness`, in Tlon, or from an editor, while the ship keeps the conversations, permissions and work. Models come from providers you configure, such as OpenRouter, OpenAI or Anthropic. Its Tlon features and its documents need `%groups`. Installing it takes a few minutes, while Clay builds it. | [mopfel-winrux/urbit-agent-harness](https://github.com/mopfel-winrux/urbit-agent-harness) | `nix build github:iko-soy/urbit-apps#harness` |
20| `%harness` | Runs AI agents on your ship. Talk to them in its web app at `/apps/harness`, in Tlon, or from an editor, while the ship keeps the conversations, permissions and work. Models come from providers you configure, such as OpenRouter, OpenAI or Anthropic. Its Tlon features and its documents need `%groups`. Installing it takes a few minutes, while Clay builds it. | [mopfel-winrux/urbit-agent-harness](https://github.com/mopfel-winrux/urbit-agent-harness) | `nix build github:iko-soy/urbit-apps#harness` |
16| `%hits` | Ranks apps by how many installs they have among the ships around you, which gossip their installs to their Pals and the ships they chat with in Tlon. There's no central server. It works without `%pals`, but then hears only from the ships you chat with. It only counts apps that kiln syncs from another ship, as after `\|install`: not ones installed from a deskjam file, or ones you stop kiln syncing. Its frontend is a glob: see [Frontends](#frontends). A fork of [urbit/hits](https://github.com/urbit/hits). | [iko-soy/hits](https://github.com/iko-soy/hits) | `nix build github:iko-soy/urbit-apps#hits` |
21| `%hits` | Ranks apps by how many installs they have among the ships around you, which gossip their installs to their Pals and the ships they chat with in Tlon. There's no central server. It works without `%pals`, but then hears only from the ships you chat with. It only counts apps that kiln syncs from another ship, as after `\|install`: not ones installed from a deskjam file, or ones you stop kiln syncing. Its frontend is a glob: see [Frontends](#frontends). A fork of [urbit/hits](https://github.com/urbit/hits). | [iko-soy/hits](https://github.com/iko-soy/hits) | `nix build github:iko-soy/urbit-apps#hits` |
22+| `%new-oxal` | A networked reactive database, shown as a tree-shaped spreadsheet. Its views include burn's page, at `/new-oxal/plex`, which needs `%burn`. It comes from burn's repo. | [brbenji/burn](https://github.com/brbenji/burn) | `nix build github:iko-soy/urbit-apps#new-oxal` |
17| `%shelf` | A public web page that lists the apps your ship publishes, so anyone can install them on their own ship. It answers at `/shelf`, for a reverse proxy to serve at the root of its own domain, and needs `%landscape`, which fresh ships have. | [iko-soy/shelf](https://github.com/iko-soy/shelf) | `nix build github:iko-soy/urbit-apps#shelf` |
23| `%shelf` | A public web page that lists the apps your ship publishes, so anyone can install them on their own ship. It answers at `/shelf`, for a reverse proxy to serve at the root of its own domain, and needs `%landscape`, which fresh ships have. | [iko-soy/shelf](https://github.com/iko-soy/shelf) | `nix build github:iko-soy/urbit-apps#shelf` |
18| `%silo` | A file manager for the S3 storage your ship uploads to: add a bucket's credentials, then browse its files and upload new ones. It has no agents of its own, and uses `%storage` from `%landscape`, which fresh ships have. Its frontend is a glob: see [Frontends](#frontends). A fork of [arthyn/silo](https://github.com/arthyn/silo). | [iko-soy/silo](https://github.com/iko-soy/silo) | `nix build github:iko-soy/urbit-apps#silo` |
24| `%silo` | A file manager for the S3 storage your ship uploads to: add a bucket's credentials, then browse its files and upload new ones. It has no agents of its own, and uses `%storage` from `%landscape`, which fresh ships have. Its frontend is a glob: see [Frontends](#frontends). A fork of [arthyn/silo](https://github.com/arthyn/silo). | [iko-soy/silo](https://github.com/iko-soy/silo) | `nix build github:iko-soy/urbit-apps#silo` |
19| `%vita` | Tracks how your published apps spread: how many ships sync each of your desks, and the daily active users that apps using its `vita-client` library report, with a dashboard for creating and maintaining apps. Its frontend is a glob: see [Frontends](#frontends). A fork of [assemblycapital/vita](https://github.com/assemblycapital/vita), updated for kernel 408. | [iko-soy/vita](https://github.com/iko-soy/vita) | `nix build github:iko-soy/urbit-apps#vita` |
25| `%vita` | Tracks how your published apps spread: how many ships sync each of your desks, and the daily active users that apps using its `vita-client` library report, with a dashboard for creating and maintaining apps. Its frontend is a glob: see [Frontends](#frontends). A fork of [assemblycapital/vita](https://github.com/assemblycapital/vita), updated for kernel 408. | [iko-soy/vita](https://github.com/iko-soy/vita) | `nix build github:iko-soy/urbit-apps#vita` |
@@ -32,8 +38,8 @@ such as hits, it also writes the glob's files next to it, as
32so a deskjam never comes without its glob.
38so a deskjam never comes without its glob.
33`nix build github:iko-soy/urbit-apps#hits-glob`, or `#silo-glob` or
39`nix build github:iko-soy/urbit-apps#hits-glob`, or `#silo-glob` or
34`#vita-glob`, builds just a glob. In a checkout,
40`#vita-glob`, builds just a glob. In a checkout,
35−`nix build .#accountability .#deskjam .#harness .#hits .#shelf .#silo .#vita`
41+`nix build .#accountability .#burn .#deskjam .#harness .#hits .#new-oxal .#shelf .#silo .#vita`
36−builds all seven, in that order, into `result` and `result-1` to `result-6`.
42+builds all nine, in that order, into `result` and `result-1` to `result-8`.
37The steps below assume one app's `result`.
43The steps below assume one app's `result`.
38
44
39You can install these files on your ship with
45You can install these files on your ship with
@@ -45,6 +51,15 @@ desks. No Hoon is compiled: your ship compiles an app's Hoon when you install
45it. The flake supports `x86_64-linux`, `aarch64-linux` and `aarch64-darwin`
51it. The flake supports `x86_64-linux`, `aarch64-linux` and `aarch64-darwin`
46(Apple silicon Macs).
52(Apple silicon Macs).
47
53
54+## Installing from ~donmec-sallud
55+
56+`~donmec-sallud` publishes every app in the [table](#apps). To install one
57+from it, run `|install ~donmec-sallud` and the app's name in the dojo, your
58+ship's command line, as in `|install ~donmec-sallud %shelf`. Your ship gets
59+the app, frontend included, and its updates from that ship.
60+[shelf.iko.soy](https://shelf.iko.soy) lists all the apps `~donmec-sallud`
61+offers, with the command that installs each.
62+
48## Installing with deskjam
63## Installing with deskjam
49
64
50[deskjam](https://github.com/iko-soy/deskjam) installs and updates apps from
65[deskjam](https://github.com/iko-soy/deskjam) installs and updates apps from
@@ -62,8 +77,8 @@ that doesn't have it yet. The first time, do one of these:
62
77
63- If you can reach your ship's files, follow deskjam's
78- If you can reach your ship's files, follow deskjam's
64 [Installation](https://github.com/iko-soy/deskjam#installation).
79 [Installation](https://github.com/iko-soy/deskjam#installation).
65−- If another ship publishes it, run `|install ~that-ship %deskjam` in the
80+- Install it from `~donmec-sallud`: run `|install ~donmec-sallud %deskjam`
66− dojo, your ship's command line.
81+ in the dojo.
67- If your ship runs upstream deskjam,
82- If your ship runs upstream deskjam,
68 [tinnus-napbus/deskjam](https://github.com/tinnus-napbus/deskjam), upload
83 [tinnus-napbus/deskjam](https://github.com/tinnus-napbus/deskjam), upload
69 `result/deskjam.deskjam` through it, following
84 `result/deskjam.deskjam` through it, following
@@ -115,12 +130,13 @@ instead: deskjam's does. If your ship serves the app's glob, also copy its old
115`result/<desk>-glob` somewhere before you build the new version, and upload it
130`result/<desk>-glob` somewhere before you build the new version, and upload it
116at `/docket/upload` after putting the old version back.
131at `/docket/upload` after putting the old version back.
117
132
118−If the app came from another ship with `|install`, kiln, the part of your
133+If the app came from another ship with `|install`, such as
119−ship that installs and updates apps, keeps it in sync with that ship. That
134+`~donmec-sallud`, kiln, the part of your ship that installs and updates apps,
135+keeps it in sync with that ship. That ship's next release would undo your
120−ship's next release would undo your upload. Tick **stop kiln syncing** on the
136+upload. Tick **stop kiln syncing** on the confirm page to keep yours. That
121−confirm page to keep yours. That stops all of that ship's updates to the
137+stops all of that ship's updates to the desk, until you run
122−desk, until you run `|install ~that-ship %desk` again, which replaces your
138+`|install ~that-ship %desk` again, which replaces your upload with their
123−upload with their latest release.
139+latest release.
124
140
125### Frontends
141### Frontends
126
142
@@ -157,9 +173,9 @@ To let other ships install an app from yours, frontend included, publish it:
157`:treaty|publish %hits` makes it public and lists it in Landscape, and
173`:treaty|publish %hits` makes it public and lists it in Landscape, and
158`|public %hits` is enough for `|install ~your-ship %hits`.
174`|public %hits` is enough for `|install ~your-ship %hits`.
159
175
160−The other apps have no glob: accountability, deskjam, harness and shelf
176+The other apps have no glob: accountability, burn, deskjam, harness,
161−serve their pages from their own agents. harness' frontend is in its desk,
177+new-oxal and shelf serve their pages from their own agents. harness' frontend
162−so `harness.deskjam` already has it.
178+is in its desk, so `harness.deskjam` already has it.
163
179
164### Kernel updates
180### Kernel updates
165
181
@@ -188,6 +204,9 @@ has the details, including what to do when an upload goes wrong.
188 use them.
204 use them.
189- accountability has no flake, and its `desk/` is the whole desk, which
205- accountability has no flake, and its `desk/` is the whole desk, which
190 `flake.nix` packs as it is.
206 `flake.nix` packs as it is.
207+- burn has no flake either. Its repo holds two whole desks, `burn/` and
208+ `new-oxal/`, which `flake.nix` packs as they are, as `%burn` and
209+ `%new-oxal`.
191- harness' repo builds its desk with `zig build`. It builds `fe/`, its
210- harness' repo builds its desk with `zig build`. It builds `fe/`, its
192 frontend, into the desk's `web/`, which harness' own agent serves; fetches
211 frontend, into the desk's `web/`, which harness' own agent serves; fetches
193 grubbery and some of Tlon's files with git, at commits it pins; and patches
212 grubbery and some of Tlon's files with git, at commits it pins; and patches
flake.lock+17
@@ -16,6 +16,22 @@
16 "type": "github"
16 "type": "github"
17 }
17 }
18 },
18 },
19+ "burn": {
20+ "flake": false,
21+ "locked": {
22+ "lastModified": 1786378297,
23+ "narHash": "sha256-wezDIDk5CUhMXP2SDexV0c3xznZ7SbPx9vAoRTQaitM=",
24+ "owner": "brbenji",
25+ "repo": "burn",
26+ "rev": "bcc3613ebec2c20d69cb2b3658b43b5ea4134b69",
27+ "type": "github"
28+ },
29+ "original": {
30+ "owner": "brbenji",
31+ "repo": "burn",
32+ "type": "github"
33+ }
34+ },
19 "deskjam": {
35 "deskjam": {
20 "inputs": {
36 "inputs": {
21 "fang-suite": "fang-suite",
37 "fang-suite": "fang-suite",
@@ -250,6 +266,7 @@
250 "root": {
266 "root": {
251 "inputs": {
267 "inputs": {
252 "accountability": "accountability",
268 "accountability": "accountability",
269+ "burn": "burn",
253 "deskjam": "deskjam",
270 "deskjam": "deskjam",
254 "flake-utils": "flake-utils",
271 "flake-utils": "flake-utils",
255 "harness": "harness",
272 "harness": "harness",
flake.nix+20
@@ -37,6 +37,13 @@
37 flake = false;
37 flake = false;
38 };
38 };
39
39
40+ # Two full desks: burn/, whose agent is the backend, and new-oxal/, which
41+ # serves burn's page at /new-oxal/plex.
42+ burn = {
43+ url = "github:brbenji/burn";
44+ flake = false;
45+ };
46+
40 harness = {
47 harness = {
41 url = "github:mopfel-winrux/urbit-agent-harness";
48 url = "github:mopfel-winrux/urbit-agent-harness";
42 flake = false;
49 flake = false;
@@ -62,6 +69,7 @@
62 silo,
69 silo,
63 vita,
70 vita,
64 accountability,
71 accountability,
72+ burn,
65 harness,
73 harness,
66 harness-grubbery,
74 harness-grubbery,
67 harness-tlon,
75 harness-tlon,
@@ -235,6 +243,16 @@
235 src = "${accountability}/desk";
243 src = "${accountability}/desk";
236 };
244 };
237
245
246+ burn-desk = mkDeskjam {
247+ desk = "burn";
248+ src = "${burn}/burn";
249+ };
250+
251+ new-oxal-desk = mkDeskjam {
252+ desk = "new-oxal";
253+ src = "${burn}/new-oxal";
254+ };
255+
238 # harness' build.zig fetches grubbery, and its scripts/stage-tlon.mjs
256 # harness' build.zig fetches grubbery, and its scripts/stage-tlon.mjs
239 # Tlon's files, with git, at commits they pin. This git answers from
257 # Tlon's files, with git, at commits they pin. This git answers from
240 # the inputs pinned to the same commits, and fails on any other, so a
258 # the inputs pinned to the same commits, and fails on any other, so a
@@ -330,6 +348,8 @@
330 vita-glob = vita.packages.${system}.glob;
348 vita-glob = vita.packages.${system}.glob;
331 accountability = accountability-desk;
349 accountability = accountability-desk;
332 harness = harness-desk;
350 harness = harness-desk;
351+ burn = burn-desk;
352+ new-oxal = new-oxal-desk;
333 default = jammer;
353 default = jammer;
334 };
354 };
335
355