Thanks for wanting to help. The short version of how we work is on this page. Two long-form pages back this up — read both before a non-trivial PR:
outl.app/docs/development — the engineer onramp: how to set up, run, test, debug, and ship the project.
outl.app/docs/contributing — the rules of the game: invariants, what reviewers look at, what we won't block your PR for.
The contributing page is the same content the Copilot reviewer runs against, so you won't be surprised by anything in review.
git clone https://github.com/outlmd/outl.git
cd outl
cargo build --workspace
cargo test --workspaceYou need Rust 1.88+.
rust-toolchain.toml pins the exact version, so rustup will install it for you on first build.
crates/
├── outl-core/ Tree CRDT, op log, storage trait — never depends on UI.
├── outl-md/ Parse/render, sidecar, matching, slugify, inline tokens.
├── outl-actions/ UI-agnostic workspace ops (shared by every client).
├── outl-cli/ The `outl` binary.
├── outl-tui/ The terminal UI.
└── outl-mobile/ Tauri 2 mobile app (iOS first).
docs/ User-facing docs; rendered at outl.app/docs.
Each crate has its own CLAUDE.md describing what it owns and the invariants.
Read it before editing that crate.
feat(tui): visual mode yank
fix(md): preserve sidecar version field on rewrite
docs(sync): walkthrough of the cycle case
refactor(core): extract HLC generator
Subject under 70 chars. Body for the why if it's not obvious from the diff.
- Bug: open an issue with the bug report template. Include repro steps and what you expected.
- Security issue: see SECURITY.md. Don't open a public issue.
- Design discussion: open an issue with the
discussionlabel or a draft PR labeledRFC.
By contributing, you agree your work is licensed under the MIT License (inbound = outbound).