FedTerm is a terminal for macOS that opens with a global shortcut. Press ⌥`` Space and a window appears on top of the app you are working in, including fullscreen apps and other desktops. Type a command, an SSH host or a folder path, press Enter, and the window becomes a terminal. Press the shortcut again to hide it and return focus to the previous app.
The app also records the commands you run, using a zsh hook. Because of that the same window works as a search over your command history, a list of servers you connect to, and a launcher for your Claude Code sessions.
FedTerm lives in the menu bar and has no Dock icon. The shortcut can be changed to any combination you like.
- The shortcut is registered through Carbon, so Accessibility permissions are not needed.
- You can rebind it in the settings. Click the field and press the keys you want. F-keys work without modifiers, other keys need at least one. If the combination is taken by another app, FedTerm says so and keeps the previous one.
- The window floats above other apps and follows you between desktops.
- It hides when you click outside of it. Pin it if you want it to stay open.
- Its size and position are remembered between launches. If the saved position is off-screen, the window opens in the centre.
FedTerm looks at what you type and offers what fits:
| Input | Result |
|---|---|
docker compose up -d |
|
| runs the command in a new tab | |
deploy@prod-1 or ssh -p 2222 host |
|
opens an SSH connection. Flags like -p , -i , -J , -l and ssh:// links are parsed |
|
/Users/me/projects/api or ~/work/api |
|
| opens a Claude Code session in that folder | |
dcup |
|
| matching commands from your history |
Arrow keys move through the list, Enter runs the selected item, Esc clears the field. Matching is fuzzy, so a few letters are usually enough.
Favourite commands. Star a command and it stays at the top of the window. You can rename it and mark it to open in its own tab when the app starts.Saved SSH connections. Pin a server and give it a label. Recent connections are collected on their own and sorted by how recently and how often you used them.Command history. Commands are grouped by age: last hour, six hours, today, yesterday, this week, older. Repeats inside a group are shown once. For the last hour there is also a short summary with counts per tool (git
,docker
,ssh
,npm
and so on) and clickable server names.
Named sessions. Drop a folder on the window or paste a path, then give the session a name. FedTerm starts it with its own session id and later resumes that exact session instead of creating a new one.All past sessions. FedTerm reads~/.claude/projects
, takes the summary or first message of each transcript together with its folder, and lists your sessions grouped by project and by date, with a search field. Results are cached by file modification time, so the list opens without delay.Clean environment.CLAUDE*
andANTHROPIC*
variables are removed from new tabs. A session started from FedTerm behaves like a standalone one even if FedTerm itself was launched from Claude Code.
⌘T opens a tab,⌘W closes it,⌘1–⌘9 switch between tabs,⌘[ and⌘] move left and right.- Tabs can be dragged to reorder and renamed with a double click.
- Open tabs are restored on the next launch. SSH tabs reconnect automatically.
- The tab title follows the shell: current folder, the title set by the running program, or the server name.
- If something is still running, FedTerm asks for confirmation before quitting.
A command can be bound to ⌃1–⌃9 together with a working directory. These shortcuts only fire while the window is open, so they do not affect other apps. Multi-line scripts are saved to a file and run through bash, so loops and conditionals work as written.
There are 13 built-in themes: the Terminal.app palette, One Dark, Dracula, Nord, Gruvbox, both Solarized variants, Tokyo Night, Catppuccin Mocha, Monokai, GitHub Light and two neutral greys. Any theme can be copied and edited: background, text, caret, selection, all 16 ANSI colours and background transparency over the blur. Font family, size and weight are configurable. There is also a thin strokes option for crisper text and a slider that darkens the glass over light wallpapers. Changes apply to open terminals immediately.
The terminal is SwiftTerm: xterm-256color, truecolor and mouse support. ⌘-click opens links, file paths and OSC 8 hyperlinks. The scrollbar gutter is removed, so full-width programs like mc
and htop
use the entire width. ⌃C is written directly to the pty, so it always interrupts. Shortcuts are matched by physical key code and keep working on Cyrillic and other non-Latin layouts. The interface is in Russian on Russian systems and in English everywhere else.
- macOS 13 Ventura or newer, Apple Silicon or Intel
- Xcode Command Line Tools with Swift 5.9 or newer
- zsh, the default shell on macOS. Command history is captured through it
- The
CLI in your
claude
PATH
for the Claude Code features
git clone https://github.com/feddot2517/fedterm.git
cd fedterm
make bundle # builds the release binary and assembles dist/FedTerm.app
open dist/FedTerm.app
make run
does both steps at once. make dev
runs the app from source without building a bundle.
The binary is signed ad-hoc, so Gatekeeper will block the first launch. Right-click the app and choose Open, or remove the quarantine flag:
xattr -dr com.apple.quarantine dist/FedTerm.app
Move the app to /Applications
and add it to System Settings → General → Login Items to have it running all the time.
| Shortcut | Action |
|---|---|
| ⌥Space | |
| show or hide the window (rebindable) | |
| Enter | |
| run the selected item | |
| ↑ ↓ | |
| move through results and history | |
| Esc | |
| clear the field | |
| ⌘T / ⌘W | |
| open or close a tab | |
| ⌘1–⌘9 | |
| switch to a tab | |
| ⌘[ / ⌘] | |
| previous or next tab | |
| ⌃1–⌃9 | |
| run a custom command | |
| ⌘+ / ⌘- / ⌘0 | |
| font size up, down, reset | |
| ⌘-click | |
| open a link or path from the output | |
| ⌃C | |
| interrupt the running program |
All files are local, in ~/Library/Application Support/FedTerm/
:
| File | Contents |
|---|---|
history.jsonl |
|
| commands with timestamp and working directory | |
pins.json , favorites.json |
|
| saved servers and favourite commands | |
state.json |
|
| open tabs for the next launch | |
automations.json , scripts/ |
|
| custom ⌃1–⌃9 commands and generated scripts | |
claude_sessions.json , claude_index.json |
|
| named Claude sessions and the transcript title cache | |
custom_themes.json |
|
| user themes | |
zdotdir/ |
|
| generated zsh files that source your own config and add the history hook |
The app has no networking code, so nothing is uploaded and there is no telemetry. History is a plain text file and can be deleted at any time.
Note that commands are stored exactly as typed. If you paste a token or password inline, it will be in the file. Treat it like ~/.zsh_history
.
Sources/FedTerm/
├─ main.swift, AppDelegate.swift startup, menu bar, window shortcuts
├─ SpotlightPanel.swift floating window, blur, saved position
├─ ContentView.swift, TabsModel.swift tab bar, reordering, persisted state
├─ HomeView.swift search field, results, history
├─ TerminalSession.swift SwiftTerm subclass, shell process, ⌘-click
├─ HistoryStore.swift reading and watching history.jsonl
├─ ShellIntegration.swift generated zsh config with the preexec hook
├─ ClaudeStore.swift, ClaudeUI.swift Claude Code sessions and their browser
├─ AutomationsStore.swift, AutomationEditor.swift custom ⌃1–9 commands
├─ FavoritesStore.swift favourite commands and autostart
├─ Theme.swift, ThemeEditor.swift, SettingsUI.swift themes, fonts, settings
├─ HotkeyManager.swift, HotkeyRecorder.swift global shortcut and rebinding
├─ Models.swift SSH parsing and command classification
└─ L10n.swift Russian and English strings
SwiftTermby Miguel de Icaza does the terminal emulation.- Colour schemes are taken from One Dark, Dracula, Nord, Gruvbox, Solarized, Tokyo Night, Catppuccin and Monokai.