# pardes
A text environment in the acme tradition: columns of panes, each pane a tag line
plus a body, where the body is a live terminal, a file, an image, or a PDF. The
mouse carries meaning — left selects, middle executes, right looks — and
everything on screen is text that is equally alive, whether a shell printed it or
you typed it.
One program, five thin shells. The core is a library in the way ghostty-vt is a
library: you feed it events, it returns a surface and a list of effects, and it
performs no IO itself. Everything a shell does is translate native input into
`pardes.Event`, render `pardes.Surface`, and perform `pardes.Effect`.
## Requirements
Zig **0.16.0** (`build.zig.zon` pins `minimum_zig_version`). Dependencies are
fetched and pinned by the manifest; no system package is required for the
terminal build. The SDL shell builds SDL3 and FreeType from source. Native PDF
support builds MuPDF and is on by default (`-Dmupdf=false` to drop it).
## Build
```
zig build
```
That is the whole of it, and it is an *install*: it builds both native shells and
puts them in `~/.local/bin`.
```
~/.local/bin/pardes the terminal shell (libvaxis)
~/.local/bin/pardes-gui the SDL3 window
```
Override with `--prefix
`. Six development binaries install under
`/dev` so they never land on a `PATH` by accident: `perf`,
`fs-bench`, `lspbench`, `pdf-scroll-bench`, `hxdiff` and the isolated build.
The other steps below build what they need and install nothing.
```
pardes --version e.g. pardes 0.0.1 (e61bbb2e86bd)
pardes --help every flag
```
The version comes from `build.zig.zon`'s `.version`; the commit is read from
`git` at configure time and is simply absent when there is no repository to ask.
## The five platforms
| build | what it is |
|---|---|
| `zig build` | the terminal shell and the SDL window, together |
| `zig build -Dplatform=tty` | the terminal shell alone |
| `zig build -Dplatform=gui` | the SDL3 window alone |
| `zig build web` | a freestanding wasm core plus vanilla JavaScript, rendered as HTML/CSS |
| `zig build -Dplatform=macos` | an AppKit and CoreText app over a static `libpardes.a` |
| `zig build -Dplatform=esp32p4 -Desp32p4-firmware` | firmware for an ESP32-P4: a freestanding riscv32 object driving libvaxis down a UART, in 384 KiB of heap |
The board build needs an ESP-IDF checkout for its register headers, and adds
`esp32p4-flash`, `esp32p4-attach`, `esp32p4-run`, `esp32p4-reset`,
`esp32p4-image-size`, `esp32p4-image-check` and `esp32p4-test`.
## Detached sessions
A shell need not be in the same process as the core.
```
pardes --detach=work a core with no terminal of its own
pardes --attach=work become a frontend of it
pardes-gui --attach=work ...the SDL window can attach too
```
Several frontends may be attached at once and all see the same screen. The
detached core performs every effect that needs a disk or a process table, so its
pane shells outlive every frontend; a frontend keeps only what needs the human's
own display. From inside the editor, `Attach` and `Detach` do the same thing as
words. See `docs/detached.md`.
## Tests
```
zig build unit-test module and shell unit tests
zig build snap scripted input traces against frozen golden grids
zig build hxdiff differential suite against helix's own behaviour
zig build hxparity file-pane vs pty-pane editing parity
zig build mupdf-check compile, link, render and search docs/design.pdf
zig build web-snap browser touch/LOOK snapshots
zig build web-e2e Chrome-driven DOM end-to-end suite
```
`snap` and `hxdiff` take `-- --update` and explicit case files respectively. The
benchmark steps — `perf`, `pdf-bench`, `pdf-scroll-bench`, `pdf-sections-bench`,
`lspbench`, `fs-bench` — all accept `-- --json`.
## Documentation
`docs/design.pdf` (from `docs/design.typ`) is the architecture document and the
place to start. It is also a test fixture: `mupdf-check` renders and searches it.
| file | subject |
|---|---|
| `docs/design.typ` | architecture: the seams, the data model, the build graph |
| `docs/detached.md` | one core, many frontends, over a unix socket |
| `docs/config.md` | build options and runtime configuration |
| `docs/acme-fs.md` | the acme control filesystem (`--fs`) |
| `docs/lsp.md` | the in-process ZLS backend |
| `docs/lsp-evaluation.md` | why that backend, measured against the alternatives |
| `docs/helix-keys.md` | the helix-compatible key model and its differential suite |
| `docs/macos.md` | the native macOS shell, its bundle and its signing |
| `docs/web.md` | the browser shell |
| `docs/ghostty-macos-notes.md` | notes on the ghostty dependency |
| `docs/ideas.typ` | scratch notes; nothing compiles it, and it says so |
`next-steps.txt` is a wishlist with a status header saying which items have
shipped; `transactions.txt` records one open structural gap against helix, and
says which waiver proves it is still open.
## Layout
```
src/ the core (pardes.zig) and one module per platform
src/detached/ the wire, the detached core, the frontend client
src/lsp/ the in-process language backend
test/ harnesses, snapshot goldens, helix cases
build/ build-time helpers (the snapshot suite)
docs/ see above
```