Development & releases

Run the server and app locally, publish desktop updates, and deploy this site.

Repository layout

PathWhat's there
apps/workerThe Cloudflare Worker: Hono, D1, Queues, Durable Objects, Workers AI, Vectorize
apps/desktopThe Tauri + React desktop app
apps/siteThis site
infra/gcpTerraform for Google Cloud APIs and Pub/Sub
scriptsrelease.sh, which builds, signs, notarizes and publishes desktop updates

Run locally

Copy apps/worker/.dev.vars.example to .dev.vars and fill it in. Apply migrations to the local database once, and again whenever a new file lands in apps/worker/migrations:

pnpm --filter worker run db:migrate:local

Then run the Worker and the app in two terminals:

pnpm dev:worker
pnpm dev:desktop

Leave VITE_WORKER_URL empty to use the local Worker at http://localhost:8790. Pub/Sub can't reach localhost, so a local Worker gets no live notifications; use Refresh (⇧ R) and Triage inbox.

Release the desktop app

scripts/release.sh builds a universal macOS app, signs and notarizes it, and uploads it to R2. Installed copies update themselves from the Worker's /updates feed. Save your Apple app-specific password once, then release:

make notary-password
make release VERSION=0.2.0 NOTES="What changed"

It needs a Developer ID certificate in your login Keychain and the Tauri updater key at ~/.tauri/echelon-inbox.key. To build and install on your own Mac without publishing, run make install.

If you deploy your own Worker, also change the FEED URL in release.sh and the updater endpoint in apps/desktop/src-tauri/tauri.conf.json.

Deploy this site

The site is static HTML served by a Cloudflare Worker on inbox.echelonone.io. Docs pages are written in apps/site/docs/ and assembled by build.mjs, which adds the shared header and sidebar.

pnpm --filter site run dev      # preview at http://localhost:8787
pnpm --filter site run deploy   # build and publish

To add a docs page, create apps/site/docs/<slug>.html and add it to PAGES in build.mjs.