- Rust 90.5%
- Python 7.6%
- Shell 0.7%
- Nix 0.7%
- WGSL 0.2%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
fuzz / cargo fuzz nightly long-run (push) Has been skipped
darwin / detect relevant changes (push) Successful in 9s
darwin / darwin docs-only no-op (push) Has been skipped
windows / detect relevant changes (push) Successful in 10s
windows / windows docs-only no-op (push) Has been skipped
fuzz / cargo fuzz smoke (per target) (push) Successful in 59s
darwin / build felis (aarch64-darwin) (push) Successful in 1m40s
pr / nix flake check (push) Successful in 1m23s
windows / cargo nextest (Windows) (push) Successful in 2m39s
windows / frontend smoke (Windows) (push) Successful in 2m37s
pr / cargo build / clippy / test / deny (push) Successful in 3m15s
pr / wire schema is compatible with the base (push) Successful in 4s
pr / frontend smoke (x86_64-linux) (push) Successful in 1m53s
windows / cargo clippy (Windows cross) (push) Successful in 15s
Reviewed-on: #239 |
||
| .agents/skills | ||
| .cargo | ||
| .claude | ||
| .config | ||
| .forgejo | ||
| .github | ||
| crates | ||
| dev | ||
| docs | ||
| fuzz | ||
| nix | ||
| share | ||
| skills/felis | ||
| tests | ||
| tools | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| clippy.toml | ||
| CONTRIBUTING.md | ||
| deny.toml | ||
| flake.lock | ||
| flake.nix | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
| release-plz.toml | ||
felis
A daemon-backed terminal emulator for persistent sessions and headless control.
The daemon holds live sessions, terminal state, scrollback, and images in memory; GUI windows and CLI tools connect as clients over a public, versioned IPC.
What felis owns
- Persistent sessions, local and remote. Close a window without killing the shell, a long build, or an agent.
Reattach locally with
felis attach, or put a local GPU window onto a remote daemon withfelis --host user@remote. Because the daemon transfers live terminal state instead of stacking a second emulator, sessions survive disconnects without tmux's protocol degradation or keybind collisions (attach over SSH, tmux workflows without tmux). - Headless control and typed IPC. Every session is reachable without a window.
felis sessionsandfelis bridgelet scripts, editor integrations, and AI agents spawn sessions, inject input, wait for commands to finish, and inspect screen state with--format jsonorjsonl(driving a session without a window, CLI reference, IPC protocol). - Modern protocol fidelity. felis implements Kitty graphics, Kitty text sizing, Kitty keyboard protocol, OSC 8 hyperlinks, OSC 133 prompt marks, OSC 7501 program status, East Asian width, and ligature font shaping (protocol support matrix). Because the daemon retains protocol state in memory, rich TUIs keep their fidelity across detach and reattach (correct by construction).
Quick start
With Nix and flakes enabled:
nix run github:felis-terminal/felis
A window opens on a fresh session, and the shell inside it keeps running once you close the window.
The install guide covers the profile, Home Manager, Homebrew, standalone release archives (Linux, macOS, Windows), and from-source paths. Your first session walks the close-and-reattach loop. One TOML file controls fonts, colors, keybindings, and window appearance (configuration, keybindings).
Performance
felis is measured against Kitty, Alacritty, WezTerm, Ghostty and foot with the in-tree cross-terminal harness
(just bench-vs). On an Apple M4 Max it has the best throughput of the field on every benchmark. On Linux it is faster
than Kitty, WezTerm and Ghostty on every throughput benchmark and splits them with Alacritty, Ghostty's tip build and
foot, while foot and Alacritty keep the lead on keystroke latency, startup, and memory.
Benchmarks summarizes the standing per suite and has every figure.
Scope and design
Each felis window displays one session. Layout (tiling, tabs, workspaces) belongs to your window manager, and workflow belongs to your shell and external programs. There are no in-terminal tabs or splits, and no embedded scripting runtime; session pickers, notification consumers, and editor integrations run as separate tools over the same public CLI and IPC as your own scripts.
Read the vision for where felis draws the line, the design values and testable principles for why, and non-goals for what stays outside the boundary.
Status and compatibility
felis is at 0.x, an early release distributed as a Nix flake and as an archive attached to the release for each supported target. The CLI and IPC are versioned, but expect edges.
Three targets are supported: x86_64-linux and aarch64-darwin are published to the project's binary cache and also
ship as tarballs that run on a host without Nix, and x86_64-pc-windows-msvc ships as a zip. aarch64-linux is
committed and builds from source, but carries no claim. See the
platform matrix for details and the
protocol support matrix for terminal compatibility.
Open work is tracked in Forgejo issues and mirrored on GitHub.
Documentation and development
The manual and its full index live in docs/. For architecture and comparisons with other terminals,
follow the explanation index.
felis is written in Rust with wgpu and winit. The Nix flake owns the development toolchain:
nix develop
cargo build
See CONTRIBUTING.md for the development workflow and verification gates, or the install guide to build and run from source.
License
Apache-2.0. See LICENSE.
One file is excepted: tools/bench/doom-fire-bench.patch is GPL-3.0-or-later, since a patch carries the upstream lines
it modifies and DOOM-fire-zig is GPLv3. It is applied to that project's source at build time by the benchmark dev shell
and reaches no felis binary.