desktop environment, OS, pain in the ass to work on
  • Rust 89.4%
  • Python 5.1%
  • Shell 1.8%
  • JavaScript 1.5%
  • Fluent 1.1%
  • Other 0.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
qwolff 3db39b61e7
fix(relay): the store folds away writes stuck behind a change their writer never sent
Records written before a page's writes waited for their record can hold a
write built on a change its writer let go unsent. The relay's fold could not
apply it and kept it beside its snapshot, so every newcomer was sent it and
refused the record as incomplete. The snapshot also carried the stuck change
itself, waiting.

The governor, which every write of a record reaches, now names the writes of
its history stuck behind a change their writer never sent. A keyed fold that
finds writes it cannot apply asks it, and folds again without those: they
leave the record for good, are kept in the store's archive as their writer
sealed and signed them, and are logged with workspace, record, writer and
sequence. The fold's snapshot holds only what applied, and a fold whose
writes do not load as one batch (a change under a sequence another change
holds) takes each write on its own and keeps a refused one as it is, rather
than never folding the channel again. The governor's own
compaction of such a record compacts it into what reads, rather than failing
until its history fills, and its whole-record read counts it whole.

A store kept from an earlier run is repaired as the relay starts: every
sealed record whose governor finds such writes is folded without them then,
not at whatever write next brings its fold.

Nothing changes on the wire or on disk: the fold is the sealed compaction it
already wrote, now covering the stuck writes too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 14:28:54 -08:00
.cargo feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
.codex codex hooks: fixtures named after what they carry 2026-10-27 13:57:26 -07:00
.config feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
.cursor feat(agent-loop): an isolated session for testing an app's agent experience 2026-10-02 11:53:07 -07:00
.forgejo ci: test binaries are built without their symbol table, as t builds them 2026-11-12 09:52:19 -08:00
.githooks fix(copy): a generated locale registry names its catalog's messages 2026-11-12 10:41:59 -08:00
.github feat(sdk): license the app framework as MIT and document contributions 2026-10-24 16:10:13 -07:00
apps fix(tilolang): the moment a snooze is set is the time the window waits for 2026-11-12 14:26:08 -08:00
crates fix(relay): the store folds away writes stuck behind a change their writer never sent 2026-11-12 14:28:54 -08:00
dist feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
docs feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
examples fix(apps): reword empty states and setup errors 2026-11-12 14:21:32 -08:00
fuzz chore(deps): drop the dependencies nothing uses any more 2026-10-22 22:18:54 +02:00
keys docs: remove the remaining mentions of the t tool 2026-10-29 18:20:03 -07:00
os feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
scripts test(e2e): read a window once the session reports it drawn 2026-11-12 14:15:23 -08:00
sdk fix(terminal): the published surface names a run's output as content 2026-11-12 14:16:34 -08:00
shots docs: replace the doc sprawl with a small accurate set 2026-10-29 18:20:03 -07:00
tools fix(ui): restore camera and slides labels still in use, lower copy baselines 2026-11-12 14:21:33 -08:00
vendor fix(session): name tilo-session where the deleted shell was still named 2026-11-12 08:59:16 -08:00
.containerignore chore: rename qOS to Tilo 2026-09-17 02:52:26 +00:00
.gitattributes ci: remove the unused t tool's config, checks and docs 2026-10-29 18:20:03 -07:00
.gitignore docs: replace the doc sprawl with a small accurate set 2026-10-29 18:20:03 -07:00
AGENTS.md feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
Cargo.lock feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
Cargo.toml feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
clippy.toml feat(ui): every widget draws its children through a keyed path 2026-11-11 02:52:24 -08:00
CONTRIBUTING.md feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
deny.toml fix(deps): clip off the yanked clipboard-win, crypto-bigint and iroh-blobs 2026-11-12 09:47:31 -08:00
flake.lock build: package desktop session across Linux distros 2026-09-01 01:16:10 +02:00
flake.nix Expose Cargo vendor validation as Nix check 2026-09-30 11:05:18 +02:00
LICENSE chore: add AGPL-3.0 licence 2026-08-26 14:53:40 +02:00
LICENSE-MIT feat(sdk): license the app framework as MIT and document contributions 2026-10-24 16:10:13 -07:00
LICENSING.md feat(licensing): the app language's lexer is MIT, beside an AGPL compiler 2026-11-10 19:00:06 -08:00
README.md feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00
rust-toolchain.toml fix(web): tilo-ui builds for the web again 2026-10-28 00:05:21 -07:00
SECURITY.md chore: name tilo.sh as the Tilo app's site, in place of tilo.coffee 2026-11-08 17:49:03 -08:00
t.toml feat(dev): cargo desktop, cargo headless and cargo web run Tilo from a checkout 2026-11-12 14:19:26 -08:00

Tilo — a desktop for doing things together.

Website · Contribute · Build an app · Source & issues

Tilo is a Linux desktop built around collaboration and around working across your own devices. You share a workspace with someone and work together in every Tilo app, with full history, undo, search and sync between devices and people. You can add AI agents too, with their own permissions and history.

We build the desktop, the apps and the system underneath them together. Tilo is early alpha: expect things to break, and don't trust it with your only copy of important data.

How it works

  • Workspaces are the unit of collaboration. Each has its own members, roles, apps, layout and data, and is on every device of every member.
  • People and devices are separate. A member is an identity; each of their devices has its own key. Devices sync directly over iroh, end to end encrypted with MLS. A server is just a device that stores more.
  • All shared state is CRDT. Edits from several people and devices merge.
  • Apps are resources, actions and views. An app declares its typed state and the actions that change it; collaboration, history and undo, permissions, sync and search come from that. Scripts, assistive technology and agents use the same actions as the buttons.
  • The shell is built like an app. Launcher, top bar and settings run on the same toolkit and model as every other app. Windows sit in horizontally scrolling strips; tabs can group different apps.

The architecture overview explains the model and where it lives in the code; workspace.md is the full specification. The apps directory lists the apps.

Try it

There is no public release download yet. Getting started covers virtual machines, adding the desktop to an existing Linux system and installing the OS. From a checkout, one command runs it:

cargo desktop     # the desktop in a window on your desktop
cargo headless    # the session with no window, for agents and tests
cargo web         # the web desktop on the local hosting stack

CONTRIBUTING.md says what each needs and does.

Help build it

You don't need to understand the whole system to help, or even to program: bug reports, small fixes, accessibility testing, translations, documentation and design feedback all count. CONTRIBUTING.md takes you from a checkout to a pull request; Build an app covers the app SDK.

Our home is code.tilo.so/tilo/tilo. GitHub is a mirror; please send issues and pull requests to Forgejo. People and coding agents are both welcome; if you use an agent, understand the change you submit and say what you tested. AGENTS.md is for the agent.

License and security

Tilo is open source: everything you need to publish an app is MIT, the rest is AGPL 3.0. See LICENSING.md.

Please report vulnerabilities privately as described in SECURITY.md, not in a public issue.