Read first
The manifesto for why, the decision records for what has already been settled, and the security model for the invariants that are not up for negotiation.
Get started
TacidOS is in active development. Its core and installer have run under software emulation; a supported, everyday desktop release is still ahead. Explore the design here, or try the development environment if you have source access.
Use Linux with Rust 1.90 or later, a C toolchain, and Git. Cloning and the first Cargo build need network access to fetch the source and dependencies. The development demo uses a temporary machine directory and does not install TacidOS on your computer.
git clone https://github.com/TacidOS/TacidOS
cd TacidOS
cargo test --workspace
cargo build -p tacid-cliThe source snapshot dated 2026-09-05 reports 898 tests. No model or Nix is needed for the development demo.
./target/debug/tacid serve \
--root /tmp/machine \
--socket /tmp/tacid.sockLeave this process running. Open a second terminal in the same checkout for the next step.
./target/debug/tacid --socket /tmp/tacid.sock ask --diff install ripgrep
./target/debug/tacid --socket /tmp/tacid.sock ask enable openssh
./target/debug/tacid --socket /tmp/tacid.sock history
./target/debug/tacid --socket /tmp/tacid.sock undoInspect a package change, request a service change, read the history, and undo. The recorded demo below shows the original development flow.
# Reversible, so the agent acts. The diff is the genome, not a summary of it.
$ tacid ask --diff install ripgrep
I will install ripgrep.
+ install ripgrep (cli)
Reversible: system configuration to generation 1.
--- a/mind/agent.nix
+++ b/mind/agent.nix
@@ -5,4 +5,7 @@
# transaction. Your own configuration belongs in owner.nix, which Tacid never writes.
{ ... }:
{
+ tacid.packages.cli = [
+ "ripgrep"
+ ];
}
# Exposure cannot be undone, so the agent stops and says exactly why.
$ tacid ask enable openssh
I will enable openssh.
+ enable the openssh service
This cannot be fully undone:
! enabling openssh would make this machine reachable from the network
Reversible: not by a generation rollback alone.
Waiting for you. Approve it with the keeper, or say no and nothing happens.
# The hash-chained journal. The refusal is a record too.
$ tacid history
History:
6 asked the owner's policy asks before services.enable
5 proposed enable openssh (enable the openssh service)
4 concluded applied as generation 2
3 health passed
2 activated generation 2 (switch, from 1)
1 allowed every effect of this change can be undone
0 proposed install ripgrep (install ripgrep (cli))
# One command back to the previous generation.
$ tacid undo
I have undone the last change and switched the machine back.
# Provenance, including whether this machine built its own code.
$ tacid version
TacidOS 0.0.1 (dev)
protocol 0.1
autonomy reversible
generation 3
self-built this machine is running code it built itself
tacid-cli at revision 43da513on . This historical demo uses a simulated Nix builder and privileged operations. It shows the change flow, not a production installation.Bootable image builds and an installer exist. A release also needs a supported download, a verified update channel, and evidence from real hardware. These are separate milestones.
The installation and generation lifecycle have run in emulated machines. Firmware, graphics, storage, networking, and recovery still need validation on supported hardware.
Signed updates and rollback have implementations and tests. The promotion pipeline, published artifacts, and complete end-to-end channel validation remain release work.
The command line and terminal interface exist. The graphical shell and device/probe tools are still planned. Follow the roadmap for the scope and acceptance criteria.
The manifesto for why, the decision records for what has already been settled, and the security model for the invariants that are not up for negotiation.
Contributions land through the same discipline the machine uses on itself: a written decision before a large change, an acceptance test for every work item, and no hard-coded colours anywhere.
The security model is public and invites attack. The prompt-injection corpus is a continuous-integration gate, and a case that gets past it is the most useful thing you can send.