A terminal for your toolkit. Not an environment.
This repository has been archived on 2026-09-26. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Rust 89.8%
  • Python 8.2%
  • Shell 0.8%
  • Nix 0.7%
  • WGSL 0.2%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
natsukium 1761d2a035
Some checks failed
fuzz / cargo fuzz nightly long-run (push) Has been skipped
darwin / detect relevant changes (push) Successful in 13s
darwin / darwin docs-only no-op (push) Has been skipped
windows / detect relevant changes (push) Successful in 40s
windows / windows docs-only no-op (push) Has been skipped
darwin / build felis (aarch64-darwin) (push) Successful in 1m19s
fuzz / cargo fuzz smoke (per target) (push) Successful in 1m8s
windows / cargo clippy (Windows cross) (push) Successful in 15s
windows / cargo nextest (Windows) (push) Successful in 11m15s
windows / frontend smoke (Windows) (push) Successful in 2m32s
windows / package felis (x86_64-pc-windows-msvc) (push) Successful in 2m47s
pr / nix flake check (push) Has been cancelled
pr / cargo build / clippy / test / deny (push) Has been cancelled
pr / wire schema is compatible with the base (push) Has been cancelled
pr / frontend smoke (x86_64-linux) (push) Has been cancelled
ci: select runners by the Nix system label (#491)
The runners now advertise their Nix system (x86_64-linux,
aarch64-darwin, x86_64-windows) instead of the ad hoc nix, macos and
windows labels, so runs-on states the platform a job needs rather than
a machine's nickname. The workflows, the comments that name a runner,
and the docs that cite a runner by its label follow.

Assisted-by: Claude Code

Reviewed-on: #491
2026-09-26 17:22:27 +09:00
.agents/skills ci: select runners by the Nix system label (#491) 2026-09-26 17:22:27 +09:00
.cargo Speed up cargo-mutants runs (#274) 2026-09-13 14:57:25 +09:00
.claude claude: remove unused config (#265) 2026-09-12 18:31:57 +09:00
.config refactor: prune redundant and conversational comments across CI, Nix, and configs 2026-09-04 10:17:10 +09:00
.forgejo ci: select runners by the Nix system label (#491) 2026-09-26 17:22:27 +09:00
.github/workflows ci: point the Forgejo repository at felis-terminal/felis (#490) 2026-09-26 16:42:36 +09:00
crates ci: compare a tag's wire schema with the newest release's tag, not a committed copy (#488) 2026-09-26 15:41:29 +09:00
dev ci: move the release workflow's inline Python into tested scripts (#479) 2026-09-26 12:09:35 +09:00
docs ci: select runners by the Nix system label (#491) 2026-09-26 17:22:27 +09:00
fuzz protocol, transport: split the two-way IPC families into a wrapper per direction (#473) 2026-09-26 02:56:17 +09:00
nix docs: audit release documentation, link benchmarks, and point to GitHub organization (#373) 2026-09-24 01:04:35 +09:00
share nix: resolve the archive's terminfo, follow launcher symlinks, ship a desktop entry (#369) 2026-09-23 14:28:54 +09:00
skills/felis docs: fix inconsistencies found by a tree-wide docs and skills audit (#395) 2026-09-25 00:54:54 +09:00
tests docs: fix inconsistencies found by a tree-wide docs and skills audit (#395) 2026-09-25 00:54:54 +09:00
tools ci: point the Forgejo repository at felis-terminal/felis (#490) 2026-09-26 16:42:36 +09:00
.gitattributes refactor: prune redundant and conversational comments across CI, Nix, and configs 2026-09-04 10:17:10 +09:00
.gitignore refactor: prune redundant and conversational comments across CI, Nix, and configs 2026-09-04 10:17:10 +09:00
AGENTS.md docs, skills: realign the pages changed since the last audit with doc-cascade and doc-prose (#475) 2026-09-26 09:46:39 +09:00
Cargo.lock deps: Update Rust crate window-vibrancy to v0.8.1 (#474) 2026-09-26 03:40:45 +09:00
Cargo.toml grid: close the plain-text parse throughput gap (#410) 2026-09-25 03:29:05 +09:00
CHANGELOG.md changelog: fold the pre-release entries into the 0.1.0 section (#476) 2026-09-26 10:59:24 +09:00
clippy.toml config: drop settings that restate a tool default (#264) 2026-09-12 17:55:07 +09:00
CONTRIBUTING.md ci: run the Rust gates and tool self-tests through just (#478) 2026-09-26 11:47:16 +09:00
deny.toml tests: replace workspace guards with repository linters (#294) 2026-09-18 16:08:51 +09:00
flake.lock bench: take kitty 0.49.0 from the locked nixpkgs (#381) 2026-09-24 19:08:05 +09:00
flake.nix ci: ship a runnable aarch64-darwin archive with each release (#363) 2026-09-23 06:12:07 +09:00
justfile ci: compare a tag's wire schema with the newest release's tag, not a committed copy (#488) 2026-09-26 15:41:29 +09:00
LICENSE Lock in license, filesystem layout, OSC 66, and Sixel as permanent reject 2026-05-10 02:19:06 +09:00
README.md ci: point the Forgejo repository at felis-terminal/felis (#490) 2026-09-26 16:42:36 +09:00

felis

A terminal for your toolkit. Not an environment.

felis is a fast, GPU-accelerated terminal that keeps your sessions alive and renders modern protocols with full fidelity, while leaving layout to your window manager and workflow to your tools.

What felis owns

  • Sessions outlive windows. Close the window without killing the shell, a long build, or an agent. Reattach locally or over SSH with the grid and scrollback intact in the daemon. Sessions live in memory; you get process persistence without the double-emulation layer, protocol degradation, or keybind collisions of tmux.
  • Modern protocol fidelity. A narrow scope does not mean reduced capabilities. felis implements modern protocols in full: Kitty graphics, Kitty text sizing, Kitty keyboard protocol, OSC 8 hyperlinks, OSC 133 prompt marks, East Asian width, and ligature font shaping. If a rich TUI runs in Kitty, it runs identically in felis.
  • Engineered for throughput. Because felis declines tabs, splits, and an embedded scripting runtime, engineering focuses strictly on parser dispatch, damage tracking, and GPU rendering. Performance shows where that lands against Kitty, Alacritty, WezTerm, Ghostty, and foot on macOS and Linux.
  • An interface for your tools. Automation belongs outside the terminal process. Typed CLI commands (felis sessions) and a public, versioned IPC let scripts, programs, and AI agents spawn sessions headlessly, inject input, and inspect screen state with --format jsonl.

The rest stays yours

Your window manager handles layout (tiling, tabs, workspaces). Your shell and tools handle workflow. felis provides the interfaces for those tools to interact with it, without moving their logic inside the terminal. There are no in-terminal tabs or splits, and no embedded scripting language.

Small utilities belong alongside the terminal: a session picker, a notification consumer, an editor integration. They can use the same public interfaces as your own scripts. The point is to let you choose and combine dedicated tools, not require an entire environment to use a terminal.

Read the vision for where felis draws the line, and the design values for why.

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.

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. Reattach with felis attach.

The install guide covers the profile, Home Manager, standalone release archives (Linux, macOS, Windows), and from-source paths. Your first session walks the close-and-reattach loop, and tmux workflows without tmux maps everyday tmux patterns to felis.

Working with your tools

felis --host user@remote puts a local window on a remote daemon that keeps its sessions across disconnects (attach over SSH). Session verbs speak JSON (--format json or jsonl) and felis bridge keeps a connection open for a longer-lived integration (driving a session without a window, CLI reference, IPC protocol). One TOML file controls fonts, colors, keybindings, and window appearance (configuration, keybindings).

Status and compatibility

felis is at 0.1.0, 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/.

To understand the design, read the vision, values, and testable principles, in that order. 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.