A modern terminal emulator for Linux with workspaces, session persistence, and native rendering quality.
Screenshots coming soon — see CHANGELOG.md for what's shipped.
⚠️ Active development — pre-release. Forgetty v0.1.0-beta is the first public preview. Expect breaking changes, rough edges, and missing features. Not recommended for production use. Bug reports very welcome.
Forgetty is a terminal emulator for Linux built on Ghostty's VT engine (libghostty-vt) and native GTK4 rendering. It matches Ghostty's text quality pixel-for-pixel, then adds what's missing from every Linux terminal: workspaces that persist across reboots, session restore, a live theme browser with 486 themes, and AI-native integrations for developers who work with coding agents daily.
GTK4 + Pango/FreeType — the same text rendering stack as Ghostty on Linux. Subpixel antialiasing, Fontconfig font discovery, full IME support. Powered by libghostty-vt: SIMD-optimized VT parsing, Kitty keyboard protocol, Unicode grapheme clustering, text reflow. No compromises on terminal correctness.
Tabs with CWD-based titles that update automatically. Horizontal and vertical
splits with independent shells. Navigate panes with Alt+Arrow. Each pane has
its own scrollback, search state, zoom level, and cursor.
Browse and switch themes from the appearance sidebar (Ctrl+,). All 485 themes
from iTerm2-Color-Schemes
are bundled, plus you can drop your own into ~/.config/forgetty/themes/. Arrow
keys cycle through themes with live preview on your actual terminal content —
Enter to keep, Escape to revert.
Close your laptop, reopen it, and everything is exactly where you left it — tabs, splits, working directories, scroll position. Auto-saves in the background. You never lose your terminal layout again.
Named workspaces for different projects. Each workspace has its own set of tabs, splits, and layout. Switch between them instantly. Workspaces persist across restarts just like sessions.
Ctrl+Shift+F opens per-pane search. All matches highlighted with an "N of M"
count. Enter/Shift+Enter navigate forward and backward with wrap-around.
Viewport auto-scrolls to center each match.
For developers working with AI coding agents daily:
- Agent notifications — colored ring on pane border, badge on the tab, and desktop notification when a background agent needs attention. No more hunting through tabs.
- Smart clipboard — strips box-drawing characters, trailing whitespace, and normalizes line endings automatically. Copy from Claude Code or any TUI app and paste clean text.
- Socket API — JSON-RPC over Unix socket. Automate Forgetty from scripts, editors, or AI agents — create tabs, send input, read output, manage workspaces programmatically.
- URL detection — hover highlights URLs,
Ctrl+Clickopens in browser - Font zoom —
Ctrl+=/Ctrl+-per pane, grid reflows correctly - Cursor styles — block, bar, underline, hollow block; blink; respects DECSCUSR
- Bell modes — visual flash, audio beep, both, or none
- Config hot reload — edit
config.toml, changes apply instantly to all panes - Right-click context menu — copy, paste, select all, search, open URL
- Command palette —
Ctrl+Shift+Pfor quick access to all actions - Multi-instance — each
forgettyinvocation is a fully independent window - Desktop integration —
.desktopentry, SVG icon, GNOME Activities search - CLI flags —
--working-directory,-e(execute command),--class,--config-file
| Ghostty | Warp | Terminator | GNOME Terminal | Forgetty | |
|---|---|---|---|---|---|
| Rendering | Pango/FreeType | GPU | VTE | VTE | Pango/FreeType |
| VT engine | libghostty | Custom | VTE | VTE | libghostty-vt |
| Tabs + splits | Yes | Yes | Yes | Tabs only | Yes |
| Session persistence | No | Partial | No | No | Full |
| Workspaces | No | No | Layouts (manual) | No | Yes |
| Themes | ~20 | Limited | ~10 | ~10 | 486 + live preview |
| Agent notifications | No | No | No | No | Yes |
| Smart copy | No | Some | No | No | Yes |
| Socket API | No | No | D-Bus (limited) | No | JSON-RPC |
| Config hot reload | Yes | N/A | Partial | No | Yes |
| Open source | Yes | No | Yes | Yes | Yes (MIT) |
# Download from GitHub Releases
sudo dpkg -i forgetty_0.1.0-beta_amd64.debgit clone https://github.com/vikgmdev/forgetty.git
cd forgetty
cargo build --release
./install.shInstalls binary to /usr/local/bin/, shared library to /usr/local/lib/,
desktop entry and icon to ~/.local/share/. Uninstall with ./uninstall.sh.
| Action | Shortcut |
|---|---|
| New tab | Ctrl+Shift+T |
| Close pane/tab | Ctrl+Shift+W |
| Split right | Alt+Shift+= |
| Split down | Alt+Shift+- |
| Navigate panes | Alt+Arrow |
| Copy | Ctrl+Shift+C |
| Paste | Ctrl+Shift+V |
| Search | Ctrl+Shift+F |
| Zoom in / out / reset | Ctrl+= / Ctrl+- / Ctrl+0 |
| Appearance sidebar | Ctrl+, |
| Command palette | Ctrl+Shift+P |
| Keyboard shortcuts | F1 |
| Quit | Ctrl+Shift+Q |
Forgetty is configured via ~/.config/forgetty/config.toml. The config file is
created automatically on first launch with sensible defaults. Changes apply
instantly (hot reload).
font_family = "JetBrains Mono"
font_size = 13.0
theme = "Catppuccin Mocha"
scrollback_lines = 10000
cursor_style = "block" # block | bar | underline | block_hollow
bell_mode = "visual" # visual | audio | both | none
# shell = "/bin/zsh" # default: your login shellOr use the appearance sidebar (Ctrl+,) to change theme, font, and size with live preview.
| Tool | Version | Notes |
|---|---|---|
| Rust | stable | Install via rustup.rs |
| Zig | 0.15+ | Builds libghostty-vt (download) |
| GTK4 | 4.14+ | sudo apt install libgtk-4-dev libadwaita-1-dev |
Tip: If Zig isn't on your
$PATH, setZIG_PATHto its location.
git clone --recursive https://github.com/vikgmdev/forgetty.git
cd forgetty
cargo build --release
cargo run --releaseThe release binary is at target/release/forgetty.
If you have Forgetty already installed (via .deb or install.sh) and want
to test your local changes without touching your daily-driver state, use
./launch-dev.sh. It runs target/release/forgetty inside an XDG-isolated
sandbox at /tmp/forgetty-dev/ — separate sessions, byte logs, identity
key, and socket. Your installed daemon's state under ~/.local/share/forgetty/
is untouched.
./launch-dev.sh # normal launch in the sandbox
./launch-dev.sh --stop # cleanly stop dev daemons (production untouched)
./launch-dev.sh --fresh # stop + wipe sandbox + relaunch
./launch-dev.sh --clean # stop + wipe sandbox + exitsocat is required for --stop (Debian/Ubuntu: sudo apt install socat).
cargo test --workspaceThe daemon is a byte pipe. The client is a terminal. Each Forgetty window
runs its own forgetty-daemon process that owns PTY processes, session
persistence, and networking. The GTK client owns the terminal engine — VT
parsing, screen buffer, scrollback, search, selection, rendering. They
communicate over a Unix socket: JSON-RPC for control (create tab, resize,
subscribe), length-prefixed binary frames for the raw PTY byte stream.
- Closing the window doesn't kill your processes — the daemon keeps them alive
- Sessions persist in
~/.local/share/forgetty/sessions/and restore automatically on next launch - Multi-window — each window is fully independent with its own daemon, socket, and session file
- Cross-device — the daemon accepts remote clients over iroh QUIC, so an Android phone or a second machine can attach to a desktop daemon as a full renderer (pairing required)
Portable core, native UI. The shared Rust crates (VT engine bindings, core types, config, transport) are platform-independent. Porting to Windows or Android means writing a native UI layer that consumes those crates — not reimplementing the terminal.
┌──────────────────────────────────────────────────────┐
│ Client (terminal engine + native UI) │
│ Linux: GTK4 + libadwaita (gtk4-rs) ← current │
│ Windows: native shell ← planned │
│ Android: Jetpack Compose + Rust JNI ← planned │
├──────────────────────────────────────────────────────┤
│ Shared Rust crates (portable) │
│ forgetty-vt libghostty-vt FFI (VT parsing) │
│ forgetty-core Shared types, errors │
│ forgetty-config Config, 486 themes, defaults │
│ forgetty-watcher Config file hot reload │
├──────────────────────────────────────────────────────┤
│ Daemon (headless — process + transport) │
│ forgetty-session PTY processes + byte-log store │
│ forgetty-pty PTY spawn (portable-pty) │
│ forgetty-workspace Session + workspace JSON │
│ forgetty-socket Unix socket: JSON-RPC + frames │
│ forgetty-sync iroh QUIC P2P transport │
├──────────────────────────────────────────────────────┤
│ libghostty-vt.so (Zig, C API — Ghostty project) │
│ SIMD VT parser, Kitty protocol, Unicode graphemes, │
│ scrollback, text reflow — proven by millions of │
│ users via Ghostty │
└──────────────────────────────────────────────────────┘
The decision to use GTK4 instead of wgpu came from learning (the hard way) that GPU-rendered text can never match native Linux quality — no subpixel antialiasing, no Fontconfig, no IME. Pivoting to GTK4 + Pango gave us rendering identical to Ghostty on day one.
See docs/architecture/ARCHITECTURE_DECISIONS.md for the full design rationale.
Next: Windows + WSL support, Android companion app, cross-device sync, web version. See the roadmap in CONTRIBUTING.md for the full plan.
Contributions welcome! See CONTRIBUTING.md for build instructions, code style, and the crate map.
MIT © 2026 TotemLabsForge, LLC
Forgetty is built by one person — Victor Garcia, a self-taught engineer with 10+ years of experience across backend, blockchain, infrastructure, and security. No company, no funding, no team. Just a developer who got tired of losing his terminal layout every time he closed a window.
The project started in early 2026, born from a simple frustration: every terminal emulator treats sessions as disposable. Close the window, lose your work. I wanted a terminal that remembers — tabs, splits, working directories, scroll position — all restored exactly where I left off. And I wanted it to feel native on Linux, not an Electron wrapper or a GPU experiment.
I'd never written Rust before this project. I used Claude Code as a force multiplier — an AI coding agent that let me move at 10x speed in a language I was learning as I built. The entire codebase, from the daemon architecture to the GTK4 renderer to the 486-theme browser, was built this way: one developer + one AI, shipping a feature-complete terminal in weeks instead of months.
Forgetty is the terminal I wanted to exist. If you work with AI coding agents daily — running Claude Code, Copilot, or Cursor in split panes for hours — you need a terminal that's built for that workflow. That's what this is.
No venture capital. No growth metrics. Just a tool that works.
Follow the journey: @vikgmdev
- Ghostty by Mitchell Hashimoto — libghostty-vt provides the terminal emulation engine. Ghostty's VT correctness and SIMD-optimized parsing are what make Forgetty possible.
- iTerm2-Color-Schemes — 485 of our 486 bundled themes come from this collection.
- Claude Code by Anthropic — the AI coding agent that made it possible for a solo developer to build a full terminal emulator in Rust.
- GTK4, libadwaita, Pango, FreeType — the GNOME platform that gives Forgetty its native rendering quality.
- The Rust ecosystem — gtk4-rs, portable-pty, serde, toml, clap, and the many crates Forgetty depends on.