@@ -6,30 +6,41 @@ file. You install it in your ship's web interface with
66[deskjam](https://github.com/iko-soy/deskjam), without access to the ship's
77files.
88
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+
913## Apps
1014
1115| App | Description | Source | Build |
1216|---|---|---|---|
13−| `%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 .#deskjam` |
14−| `%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. 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 .#hits` |
15−| `%mcp` | An MCP (Model Context Protocol) server at `/mcp` that lets AI tools use your ship, and a proxy at `/apps/mcp/mcp` that offers its tools together with those of remote MCP and OpenAPI servers. A fork of [gwbtc/urbit-mcp](https://github.com/gwbtc/urbit-mcp). | [tloncorp/mcp](https://github.com/tloncorp/mcp) | `nix build .#mcp` |
16−| `%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 .#shelf` |
17−| `%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. | [arthyn/silo](https://github.com/arthyn/silo) | `nix build .#silo` |
18−
19−Run the build commands in a checkout of this repo, with Nix and flakes
20−enabled. If flakes aren't enabled, put
21−`--extra-experimental-features 'nix-command flakes'` after `nix`. Without a
22−checkout, give the repo's address instead of `.`, such as
23−`nix build github:iko-soy/urbit-apps#shelf`. Nix fetches each app's source
24−itself, at the version `flake.lock` pins.
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` |
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` |
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` |
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` |
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` |
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` |
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` |
26+
27+The build commands need Nix with flakes enabled, but no clone of this repo:
28+Nix fetches it from GitHub, and each app's source at the version `flake.lock`
29+pins. If flakes aren't enabled, put
30+`--extra-experimental-features 'nix-command flakes'` after `nix`. In a
31+checkout of this repo, `.` builds your working copy instead, as in
32+`nix build .#shelf`.
2533
2634Each build writes `result/<desk>.deskjam`, such as `result/shelf.deskjam`, in
27−place of the last build's `result`. For an app with a web frontend, a glob,
28−it also writes the glob's files next to it, as `result/<desk>-glob`, and the
29−build fails if `flake.nix` doesn't build them, so a deskjam never comes
30−without its glob. `nix build .#hits-glob` or `.#silo-glob` builds just a glob.
31−`nix build .#deskjam .#hits .#mcp .#shelf .#silo` builds all five, into
32−`result`, `result-1`, `result-2`, `result-3` and `result-4`.
35+place of the last build's `result`. For an app whose web frontend is a glob,
36+such as hits, it also writes the glob's files next to it, as
37+`result/<desk>-glob`, and the build fails if `flake.nix` doesn't build them,
38+so a deskjam never comes without its glob.
39+`nix build github:iko-soy/urbit-apps#hits-glob`, or `#silo-glob` or
40+`#vita-glob`, builds just a glob. In a checkout,
41+`nix build .#accountability .#burn .#deskjam .#harness .#hits .#new-oxal .#shelf .#silo .#vita`
42+builds all nine, in that order, into `result` and `result-1` to `result-8`.
43+The steps below assume one app's `result`.
3344
3445You can install these files on your ship with
3546[iko-soy/deskjam](https://github.com/iko-soy/deskjam): see
@@ -40,6 +51,15 @@ desks. No Hoon is compiled: your ship compiles an app's Hoon when you install
4051it. The flake supports `x86_64-linux`, `aarch64-linux` and `aarch64-darwin`
4152(Apple silicon Macs).
4253
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+
4363## Installing with deskjam
4464
4565[deskjam](https://github.com/iko-soy/deskjam) installs and updates apps from
@@ -47,7 +67,8 @@ these files. Only install apps you trust: an app's agents, its programs, run
4767as your ship, and can read and change anything on it.
4868
4969If you build on another machine, such as the server your ship runs on, copy
50−the file to the computer your browser runs on first, for example with `scp`.
70+the file, and its `<desk>-glob` folder if it has one, to the computer your
71+browser runs on first, for example with `scp -r`.
5172
5273### Getting deskjam
5374
@@ -56,8 +77,8 @@ that doesn't have it yet. The first time, do one of these:
5677
5778- If you can reach your ship's files, follow deskjam's
5879 [Installation](https://github.com/iko-soy/deskjam#installation).
59−- If another ship publishes it, run `|install ~that-ship %deskjam` in the
60− dojo, your ship's command line.
80+- Install it from `~donmec-sallud`: run `|install ~donmec-sallud %deskjam`
81+ in the dojo.
6182- If your ship runs upstream deskjam,
6283 [tinnus-napbus/deskjam](https://github.com/tinnus-napbus/deskjam), upload
6384 `result/deskjam.deskjam` through it, following
@@ -76,61 +97,85 @@ After that, update deskjam like any other app, as below.
76972. Under **upload deskjam**, choose the file, such as `result/shelf.deskjam`,
7798 and click **upload**.
78993. Under **Install it as a new desk**, keep the name and click **next**.
79−4. On the confirm page, tick **start its agents after uploading** (for an app
80− without agents, such as silo, **mark it running after uploading**), and
81− click **confirm**.
100+4. On the confirm page, if the app's frontend is a glob, first click **set**
101+ in the glob box, as [Frontends](#frontends) says. Then tick
102+ **start its agents after uploading** (for an app without agents, such as
103+ silo, **mark it running after uploading**), and click **confirm**.
821045. The status page says whether the app runs.
83105
84−Once it runs, see the app's README for how to set it up. mcp's README
85−describes an operator console at `/apps/mcp/`, which this version of mcp
86−doesn't have. MCP clients send mcp's API key in an `X-Api-Key` header, and
87−`.^(@t %gx /=mcp-proxy=/client-key/noun)` in the dojo prints it.
106+Once it runs, see the app's README for how to set it up.
88107
89108### Updating an app
90109
91110Apps installed this way don't update on their own. To update one:
92111
93−1. Move its pin to the latest commit of its repo, such as with
94− `nix flake update shelf`, and build it again. `nix flake update` moves
95− every app, and nixpkgs.
112+1. Build it again. Nix reuses a copy of this repo it fetched in the last hour,
113+ so add `--refresh` to get the pins it has now:
114+ `nix build --refresh github:iko-soy/urbit-apps#shelf`. To build an app's
115+ newest commit before this repo pins it, add
116+ `--override-input shelf github:iko-soy/shelf`. In a checkout,
117+ `nix flake update shelf` moves the pin, and `nix flake update` moves every
118+ app, and nixpkgs.
961192. Upload the new file as above. Under **Update an existing desk**, choose the
97120 app's desk, select **replace it**, and click **next**. Replace makes the
98121 desk exactly the upload, so files a new version removed don't linger.
991223. The confirm page offers a download of the desk as it is now. Keep it if
100− you might want to go back, then click **confirm**.
123+ you might want to go back. If your ship serves the app's glob, click
124+ **set** in the glob box first. Then click **confirm**.
101125
102126Uploading the kept copy with **replace it** puts the old version back. If the
103127update changed the state an agent keeps, that usually fails, and nothing
104128changes. But some agents start afresh from state they can't read, and lose it
105−instead: deskjam's and mcp's do. For mcp, that means a new API key, and its
106−remote servers and OAuth grants are gone.
107−
108−If the app came from another ship with `|install`, kiln, the part of your
109−ship that installs and updates apps, keeps it in sync with that ship. That
110−ship's next release would undo your upload. Tick **stop kiln syncing** on the
111−confirm page to keep yours. That stops all of that ship's updates to the
112−desk, until you run `|install ~that-ship %desk` again, which replaces your
113−upload with their latest release.
129+instead: deskjam's does. If your ship serves the app's glob, also copy its old
130+`result/<desk>-glob` somewhere before you build the new version, and upload it
131+at `/docket/upload` after putting the old version back.
132+
133+If the app came from another ship with `|install`, such as
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
136+upload. Tick **stop kiln syncing** on the confirm page to keep yours. That
137+stops all of that ship's updates to the desk, until you run
138+`|install ~that-ship %desk` again, which replaces your upload with their
139+latest release.
114140
115141### Frontends
116142
117−An app's web frontend, its glob, isn't part of its desk. Landscape's
118−`%docket` agent gets it as the app's docket says, and the build puts it next
119−to the deskjam, as `result/<desk>-glob`:
120−
121−- silo's docket has `%docket` download its glob from a url, so `silo.deskjam`
122− works on any ship. You need `result/silo-glob` only to serve the frontend
123− from your own ship instead, as deskjam's
124− [Serving a glob from your ship](https://github.com/iko-soy/deskjam/blob/main/docs/globs.md#serving-a-glob-from-your-ship)
125− says.
126−- hits' docket has `%docket` get its glob from `~donmec-sallud` over Ames,
127− with a placeholder hash, so `hits.deskjam` is for that ship. There, install
128− it, then open `/docket/upload`, choose the desk `hits` and the folder
129− `result/hits-glob`, and click **glob!**. When you update hits with deskjam,
130− click **set** in the glob box on the confirm page first, or hits loses its
131− frontend until you upload it again. Other ships get hits, frontend
132− included, from that ship once it publishes hits:
133− `|install ~donmec-sallud %hits`.
143+Some apps' web frontends are globs, which aren't part of their desks.
144+Landscape's `%docket` agent gets an app's glob as its docket says, and the
145+build puts the glob's files next to the deskjam, as `result/<desk>-glob`. That
146+folder is what you upload at `/docket/upload`: choose the app's desk and the
147+folder, and click **glob!**. Use a browser other than Safari, which can't
148+upload folders.
149+
150+hits', silo's and vita's dockets have `%docket` get their globs from
151+`~donmec-sallud` over Ames, with a placeholder hash. On your ship:
152+
153+1. When you install the deskjam, click **set** in the glob box on the confirm
154+ page first, so your ship serves the glob instead. **set** reloads the page
155+ and clears the boxes below it, so tick **start its agents after uploading**
156+ after it, then confirm.
157+2. Once the app runs, upload its `result/<desk>-glob`.
158+
159+On `~donmec-sallud`, their dockets already name your ship, so skip **set**,
160+and just upload the glob. Without its glob, an app runs, but has no frontend.
161+deskjam's
162+[Serving a glob from your ship](https://github.com/iko-soy/deskjam/blob/main/docs/globs.md#serving-a-glob-from-your-ship)
163+has the details.
164+
165+When you update an app whose glob your ship serves, click **set** in the glob
166+box on the confirm page first, which keeps the glob your ship serves now.
167+Then upload the new `result/<desk>-glob`, so the frontend matches the new
168+version. If the app was suspended, as after a kernel update, `%docket`
169+forgets its glob when the app starts again, even after **set**: upload it
170+again.
171+
172+To let other ships install an app from yours, frontend included, publish it:
173+`:treaty|publish %hits` makes it public and lists it in Landscape, and
174+`|public %hits` is enough for `|install ~your-ship %hits`.
175+
176+The other apps have no glob: accountability, burn, deskjam, harness,
177+new-oxal and shelf serve their pages from their own agents. harness' frontend
178+is in its desk, so `harness.deskjam` already has it.
134179
135180### Kernel updates
136181
@@ -147,23 +192,45 @@ has the details, including what to do when an upload goes wrong.
147192
148193## How the desks are built
149194
150−- deskjam's, hits' and shelf's own flakes build their desks, so each
151− `.deskjam` file has the files that repo's own build makes. jammer leaves
152− out the files a `|commit` would skip too, such as hits' `LICENSE`, which has
153− no extension.
154−- mcp's repo builds its desk with `zig build`, which copies some files from
155− other repos at pinned commits. `flake.nix` copies the same files from the
156− same commits. After moving mcp's pin, check that its `build.zig` still lists
157− the same files and commits, and change `flake.nix` to match if not: nothing
158− checks this for you.
159−- silo has no flake. Its CI deploys all of urbit's `pkg/base-dev`, then
160− landscape's `desk-dev`, then its own `desk/`, and `flake.nix` builds the
161− same, with landscape at `master`, as the CI takes it, and urbit at
162− `408k-2`, since the CI's tag isn't public. After moving silo's pin, check
163− its `.github/helpers/deploy.sh`.
164−- A desk whose docket names a glob only builds with its glob, which
165− `flake.nix` builds from the app's `ui/`. A glob for a desk whose docket
166− names none fails the build too.
195+- deskjam's, hits', shelf's, silo's and vita's own flakes build their desks,
196+ so each `.deskjam` file has the files that repo's own build makes. jammer
197+ leaves out the files a `|commit` would skip too, such as hits' `LICENSE`,
198+ which has no extension. silo's and vita's flakes build their globs too, and
199+ this flake takes them as they are, with the nixpkgs those flakes pin: so
200+ `github:iko-soy/urbit-apps#silo-glob` is the same build as
201+ `github:iko-soy/silo#glob`. Their desks
202+ include all of urbit's base-dev, so deskjam's confirm page warns about a
203+ few of its libraries that import files the desks lack, but the apps don't
204+ use them.
205+- accountability has no flake, and its `desk/` is the whole desk, which
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`.
210+- harness' repo builds its desk with `zig build`. It builds `fe/`, its
211+ frontend, into the desk's `web/`, which harness' own agent serves; fetches
212+ grubbery and some of Tlon's files with git, at commits it pins; and patches
213+ grubbery's desk under harness' own. `flake.nix` runs the same `zig build`
214+ with npm's packages fetched ahead, and a stand-in `git` that answers from
215+ inputs pinned to the same commits, and fails if the build asks for any
216+ other. When a new version of harness pins other commits, change the commit
217+ in `harness-grubbery`'s or `harness-tlon`'s url in `flake.nix` to the one
218+ the error names: `nix flake update` won't move them. The build also fails
219+ if the desk has no `web/index.html`, so it can't come out without its
220+ frontend. Two of grubbery's libraries in it, `lib/verb.hoon` and
221+ `lib/xray.hoon`, import files the desk lacks, so deskjam's confirm page
222+ warns about them, but harness doesn't use them.
223+- A desk whose docket names a glob only builds with its glob, and a glob for
224+ a desk whose docket names none fails the build too. `flake.nix` reads each
225+ docket as the docket mark does, with Hoon's own parser in `urbit eval`, so
226+ this holds however the docket is laid out, and a docket that isn't valid
227+ fails the build.
228+- A hash in `flake.nix` pins the npm packages of the frontends it builds
229+ itself: `hits-glob`'s `npmDepsHash`, and the `hash` of harness' `npmDeps`.
230+ silo's and vita's are in their own flakes. When moving an app's pin changes
231+ its `package-lock.json`, its build stops with a hash mismatch, or
232+ `npmDepsHash is out of date`. Set that hash to `pkgs.lib.fakeHash`, build
233+ again, and put the hash the error shows after `got:` in its place.
167234
168235## jammer
169236