Drag to pan · click a node to open it · click a pill to expand the group
Your code, on a canvas.
A visual desktop IDE for people who think in systems — files are pieces, folders are groups, imports are wires drawn from the code itself.
The idea
Code is not just text. It is structure, behavior, and relationships. Litria exists to make that reality usable.
Most IDEs are file-and-tab tools with optional diagrams. Litria starts from relationships and composition first, then connects directly to source code. It is not a no-code tool or a diagram maker — the code inside each piece is genuine, exportable, editable code.
It is built for people who want to think in systems: relationships, flows, dependencies, and intent. The goal is not to replace code text, but to make code meaning visible.
Three things that are true
The canvas is not a picture of your project. It is your project.
Every folder is a group. Every group is a folder.
Empty folders included. Creating a group creates a real directory on disk; deleting one deletes it, with confirmation. Nesting derives from folder containment, so dragging a group carries its whole subtree.
Wires are read from your imports.
On open, existing imports become wires automatically. Draw a wire between two files and Litria writes the real import statement. Imports stay authoritative — the picture cannot drift from the code.
Your layout survives the session.
Positions, viewport, groups, connections, tabs, and split panes persist per project in SQLite. Reopen a project and it is where you left it, down to the scroll position of a pane.
Latest release
1.0.1 is a maintenance release, and the reason for it is worth saying out loud.
Two parser bugs that were damaging real files
Both were found the same afternoon, by opening Litria on the Litria source
and dragging a folder onto the canvas. That is the whole argument for
dogfooding, and it is why the repo now ships a litria.toml of
its own.
- Import writes no longer corrupt multi-line imports. The writer scanned line by line, so it read the opening line of a multi-line import as a whole statement — the duplicate check never matched and the insert landed inside the statement. One folder drag on a real codebase corrupted ten files. Import scanning is now statement-aware.
- Exports after a regex are visible again. The symbol parser
skipped braces inside strings and comments but not inside regex literals,
so a pattern like
/^exports+{/opened a block that never closed and every later top-level export went invisible — missing wires, broken edges, empty symbol pickers, no error. -
Five security-audit findings closed: an absolute-path package-manager
shim, budgeted crash records, LSP sessions validated against a canonical
project root, no current-directory executable search inherited by LSP
children.
cargo audit2 → 0,npm audit0. - Litria has its own icon. Every build through 1.0.0 shipped Tauri's placeholder. The desktop, taskbar, installer, and menu-bar marks are now Litria's.
- Known, unfixed: the macOS Dock icon renders as a black square — the artwork is opaque and macOS does not round icons itself.
shipped new in 1.0.1 known caveat planned
What 1.0.0 established, and 1.0.1 keeps
Two long arcs landed together in the first public build. They are what the canvas is, so they are worth stating even when the newest release did not touch them.
- Wires route orthogonally around obstacles instead of passing under nodes — one canvas-wide pass, so wires can be spaced against each other.
- Where several wires share a corridor they separate into lanes; terminals distribute along a face so converging wires never stack on a point.
- Wires re-anchor to a collapsed group's pill instead of vanishing, and quiet wires hop over loud ones at crossings.
- Empty folders exist on the canvas. No ghost groups that live only in the app's head.
- Group creation is name-first: a preview box appears, you name it, and parentage is decided by where the box sits.
- Collapsing a group hides its whole subtree; dragging one carries every descendant, and status LEDs aggregate from every descendant including the collapsed ones.
Themes, live
These are the real presets. Switch one and this page changes with it.
Four built-in themes across two materials, with a Live/Calm energy axis. The switcher in the top bar drives this whole site from Litria's own token values — colour is orthogonal to material, and energy is a render-time lens.
Parchment and Terminal drop the blur, the glint, and the glow — that is the matte material dispatch, not a different stylesheet. Terminal also promotes the monospace face to body text. Calm softens rims, dims LEDs, and removes every glow, and it turns on automatically if your system asks for reduced motion.
Built like this
Guards are the enforcement of record.
Litria is one developer's project in public beta. Rather than ask you to take that on trust, here is what is checkable in the repo.
| Metric | Current | Where |
|---|---|---|
| Domain modules | 15 | registry: docs/Orchestration.md §2 |
| Architecture guards | 6 | imports, app shell, protected zones, domain contract, settings keys, editor engine |
| JS tests | 1049 | across 85 suites (test/domains/) |
| Rust tests | 257 | |
| ADRs | 25 | |
| Tauri commands | ~81 | registered (registry of record: src-tauri/src/lib.rs) |
| Workspace DB schema | v3 | 2 migrations |
| Theme tokens | 47 | v3 |
| Bundled runtimes | Node 24.14.0, pyright 1.1.411, ts-ls 5.3.0, ts 5.9.3 |
Six build guards enforce import boundaries, the app shell, protected UI zones, domain contracts, settings-key discipline, and the seal around the editor engine. When a document and a guard disagree, the guard wins and the document gets fixed — including this table, which is read out of that document rather than retyped here.
Download
Litria 1.0.1 — public beta
- Windows x64 — the build that gets used daily.
- macOS (Apple Silicon & Intel) — compiles and passes the full suite in CI, but no human has launched it yet.
- Linux x86_64 — AppImage, deb, rpm. Same caveat as macOS.
shipped new in 1.0.1 known caveat planned
Every artifact is unsigned, so your OS will object the first time. That is expected, it is explained in one page, and there is nothing to work around beyond one dialog.