Silo is a desktop app for working with cloud-hosted development workspaces.
The app gives the user a local UI for:
- managing projects
- creating and resuming remote workspaces
- opening terminals, browser tabs, and files inside those workspaces
- tracking workspace activity and lifecycle state
At a high level:
- the frontend is a Vite + React app in
src - the website is a standalone Next.js app in
website - the desktop shell and backend are Tauri + Rust in
src-tauri - cloud workspaces are remote VMs managed through
gcloud - a small Rust daemon,
workspace-agent, runs inside each workspace VM - a repo-local
driverCLI drives the live desktop app over Playwright + CDP for verification and automation
Silo spans local and remote state, so most behavior crosses multiple layers:
- the local React UI renders project and workspace state
- Tauri commands in the Rust backend manage config, process orchestration, and cloud operations
- remote workspace VMs host terminals, browser/file attachments, and the workspace agent
gcloudis the control plane for workspace lifecycle and metadata
The main backend areas in src-tauri/src are:
projects.rsfor local project config and discoveryworkspaces.rsfor workspace lifecycle and metadataremote.rsfor remote command execution overgcloud compute sshterminal.rs,browser.rs, andfiles.rsfor workspace attachments
The main frontend areas in src are:
src/appfor app bootstrap, routing, and the main shellsrc/dashboardfor the home/dashboard screensrc/projectsfor project APIs and sidebar flowssrc/workspacesfor workspace state, routes, and layout
tools/workspace-agent is deployed inside each remote workspace VM as /home/silo/.silo/bin/workspace-agent.
It is responsible for:
- publishing workspace activity and heartbeat metadata back to the VM
- observing terminal and assistant session state
- tracking unread and working status for remote sessions
- managing a small runtime state directory under
/home/silo/.silo/workspace-agent - exposing file tree/read/write and file watch commands for workspace file attachments
Key pieces:
src/cli.rsdefines the command surfacesrc/daemon/mod.rsruns the long-lived observer/publisher loopsrc/daemon/state.rsmodels published session and file-watch statesrc/assistant.rswraps assistant commands and emits activity eventssrc/runtime.rsmanages the FIFO, pidfile, and persisted runtime state
driver is a repo-local automation layer for launching and driving the real desktop app over Playwright + CDP.
Use it for:
- live app inspection
- scripted verification
- coding-agent automation
- trace collection with stable JSON output
Typical flow:
bun run driver -- session launch
bun run driver -- app status --session <id>
bun run driver -- page snapshot --session <id>
bun run driver -- session close --session <id>Useful commands:
bun run driver -- helpbun run driver -- schemabun run driver -- historybun run driver -- batch --session <id> --file ./steps.jsonbun run driver -- session listbun run driver -- app service-status --session <id>bun run driver -- element click --session <id> --selector testid:...
More detail lives in driver/README.md.
Use Bun for JS/TS tasks in this repo.
Install dependencies:
bun installRun the frontend dev server:
bun run devRun the website:
bun run website:devRun the desktop app:
bun run tauri devbun run tauri dev launches the isolated development app identity (Silo Dev) and uses ~/.silo-dev unless SILO_STATE_DIR is set. Production builds keep the Silo app identity and default to ~/.silo.
Build the frontend:
bun run buildBuild the website:
bun run website:buildCheck frontend types:
bun x tsc --noEmitCheck the Rust backend:
cd src-tauri && cargo checkFrontend and repo checks:
bun run checkRust library tests:
cd src-tauri && cargo test --libWorkspace agent tests:
cd tools/workspace-agent && cargo testLive e2e preflight:
bun run e2e:preflightLive e2e smoke:
bun run e2eThe e2e suite lives in tests/e2e and currently targets the live desktop app over Playwright.
Pushes to main trigger .github/workflows/release.yml, which builds the production macOS app, publishes a GitHub Release, and uploads the updater artifacts and latest.json.
Production clients do not talk to GitHub directly:
- the app checks
https://silo.new/update - fresh installs use
https://silo.new/download - the
silo.newwebsite routes resolve the current GitHub Release assets and redirect to the exact installer or updater bundle
The website supports these optional server-side environment variables so the backing GitHub repository or installer asset can change without shipping a new desktop build:
SILO_RELEASE_GITHUB_REPOSITORYdefaults tonorth-brook/siloSILO_RELEASE_INSTALLER_ASSET_NAMEdefaults toSilo-macos-arm64.dmg
Update those environment variables on the silo.new deployment and redeploy the website when the backing release repository or installer asset name changes.
Required GitHub secrets:
SILO_UPDATER_PUBLIC_KEYTAURI_SIGNING_PRIVATE_KEYTAURI_SIGNING_PRIVATE_KEY_PASSWORDAPPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITYAPPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID
src: frontend appsrc-tauri: desktop shell and backenddriver: live desktop automation CLItests/e2e: live Playwright coveragescripts: repo utilities and e2e preflight entrypointstools/workspace-agent: remote VM agenttools/base-image: shared base image publisher for workspaces
The shared workspace base image is built manually by developers and is not part of the Tauri app runtime. The implementation lives in tools/base-image and publishes a versioned image into a stable image family that user projects can reference through gcloud.image_project and gcloud.image_family.
Example config:
[gcloud]
image_family = "silo-base"
image_project = "silo-489618"Dry run:
cd tools/base-image
cargo run -- \
--project silo-images \
--family silo-base \
--dry-runPublish:
cd tools/base-image
cargo run -- \
--project silo-images \
--family silo-baseThe tool will:
- create a temporary Ubuntu 24.04 builder VM
- provision the shared toolchain, including Rust and Docker Engine
- create a new versioned image in the target family
- grant
roles/compute.imageUseron the image toallAuthenticatedUsersplus any additional configured IAM members - delete the builder VM unless
--keep-builder-on-failureis set