Keep your Claude Code sessions side by side in one window: tile and group them,
take over the ones running in other terminals, and get every session back after a restart.
The pictures show made-up projects and sessions.
-
All sessions in view. Every session is a tile, and all tiles are visible at once, in two columns that fill in turn. Drag a tile's header onto another tile's edge to split next to it; the drop zone shows where it lands. Separators snap to a grid over the window as you drag them, so tiles line up (hold Alt to place one freely, or turn it off in Settings).
-
Out of the way when you want. The arrow in a tile's corner collapses it into the side bar; a click puts it back where it was.
-
Groups. Put tiles into a group (right-click a tile, or drag it onto a group): a colored frame with a name. A tile right next to the group stays where it is, and the frame grows around it. A group collapses, moves and leaves the window as one; dissolve it or end all its sessions from its menu.
-
Several windows. Open a new, empty window (toolbar, tray or Ctrl+Shift+N), or drag a tile or a group out of the window and it gets a window of its own; drag it back, or into another window, whenever you like. A window that is still empty when you quit is not brought back on the next start.
-
Workspaces. Save a window under a name (Workspaces in the toolbar) and open it again later, as a window of its own with its tiles, groups and sessions, from the toolbar, the tray or the session list. F11 takes a window to full screen.
-
Session list. The side bar on the left lists the sessions in reframe, the ones running in other terminals and your recent Claude Code sessions, with search. Click or drag one to open it: ended sessions resume, and sessions running elsewhere are taken over (ended there, continued here, history and name included). Select several with Shift or Ctrl+click and open them together from the right-click menu, also as a new group, here or in a new window. Sessions that turn up while reframe runs light up, and the Sessions button gets a dot while the list is hidden.
-
Pull terminal windows in (Windows). Drag a Windows Terminal or console window (or just a tab of it) with a running
claude, on Windows or in WSL, onto reframe: after a short confirmation the session continues in reframe, at the spot you dropped it, and the terminal tab closes if nothing else runs in it. -
WSL (Windows). Start a session in a folder inside WSL (Browse… → Linux, or type
\\wsl.localhost\Ubuntu\home\…) and it runs the Claude Code installed in that distribution, shown asUbuntu ~/project, with its status, notifications and resume after a restart like any other. Dropped files and pasted screenshots come in as Linux paths. The session list shows the sessions of running distributions too, past ones and ones running in a WSL terminal (taken over like any other); a distribution with Claude Code that is not running says so there, with a button to start it. -
Files and screenshots. Drop files onto a session to type in their paths (Claude Code attaches images among them); Ctrl+V (or a right-click) pastes text, files you copied in Explorer or Finder, or a screenshot from the clipboard.
-
Nothing gets lost. Every change is saved right away. Quitting from the tray ends the sessions cleanly, and the next start resumes each one (
claude --resume) in its folder, in its place. -
Runs in the background. Closing a window with sessions asks whether to end them or keep them working in the tray (or does what you chose in Settings). In the tray they keep working, and you get a notification when Claude is done or needs you, unless you are looking at it anyway. A window's title says how many of its sessions need you (on Windows its taskbar button gets a badge, and flashes when one starts waiting unseen), the tray says how many in all, and Ctrl+Shift+Space takes you to the next one.
-
Starts with the system if you like (Settings), quietly in the tray, and updates itself from GitHub Releases.
-
Settings (the ⚙ in the toolbar, or Ctrl+,): the language (English or German, or the system's), the text size, snapping to the grid, what closing a window with sessions does, starting with the system, which Claude Code runs (the one on the PATH, or one you choose: handy with more than one installed), the model and permission mode new sessions start with, and checking for updates.
On macOS, use Cmd instead of Ctrl. Everything else goes to Claude Code as usual.
| Shortcut | What it does |
|---|---|
| Ctrl+1 … 9 | Focus the first … ninth tile in the window |
| Ctrl+Shift+Arrow keys | Focus the neighboring tile in that direction |
| Ctrl+Shift+M | Collapse the focused tile; without a focused tile, bring back the last one |
| Ctrl+Shift+L | Show or hide the session list (and search it) |
| Ctrl+Shift+Space | Go to the next session that needs you (in this window first, then in the others) |
| Ctrl+Shift+F | Find in the focused tile's terminal, its scrollback too (Enter: next, Shift+Enter: previous, Esc: close) |
| Ctrl+Shift+Z | Let the focused tile fill the window, and back (the layout stays as it is) |
| Ctrl+Shift+T | New session |
| Ctrl+Shift+N | New window |
| F11 | Full screen on and off |
| Ctrl+, | Settings |
| Ctrl+= (or +) / Ctrl+- | Larger / smaller text in all terminals (also Ctrl+mouse wheel over a tile); Ctrl+0: back to normal |
| Ctrl+C / Ctrl+V | Copy the selection (otherwise Ctrl+C goes to Claude) / paste text, copied files or an image |
| Right-click | Copy the selection, otherwise paste (like Ctrl+V); in Claude Code's fullscreen mode: Shift+right-click |
Download the installer for your system from the website or Releases. You need Claude Code installed and logged in (claude on your PATH). On Windows, sessions in a WSL folder use the Claude Code installed in that distribution instead.
The builds are not code-signed yet, so the first start needs a confirmation:
- Windows (
reframe-Setup-<version>.exe): installs for your user without admin rights. If SmartScreen warns, choose More info → Run anyway. - Windows, portable (
reframe-<version>-win-portable.zip): unpack it anywhere (a USB stick, say) and startreframe.exe. It keeps its sessions, windows and settings in the folderdatanext to it and runs apart from an installed reframe. Both use the same Claude Code, though: sessions one of them runs show in the other as running elsewhere, and opening one there takes it over (after asking). It does not update itself: it tells you when there is a new version to download. If you let it start with the system and move the folder later, turn that on again. Before unpacking, right-click the ZIP → Properties → tick Unblock: otherwise Windows marks every unpacked file as downloaded, and SmartScreen asks on the first start. - macOS (
.dmg, Apple silicon): drag reframe into Applications, then right-click it → Open the first time (orxattr -dr com.apple.quarantine /Applications/reframe.app). Updates on macOS need a signed build, so for now update by downloading the new version. - Linux: the
.AppImage(make it executable, then run it; it updates itself) or the.deb.
| Platform | Status |
|---|---|
| Windows | Everything above; this is where reframe is developed and tested. |
| macOS | Built in CI, not tested yet. Pulling terminal windows in is not available yet (use the session list to take sessions over). |
| Linux | Built in CI, not tested yet. Pulling terminal windows in is not available yet (planned for X11; on Wayland only the session list). |
If you let reframe start with the system, turn that off first, in Settings (in older versions, in the tray menu). From version 0.6.0 on, the Windows uninstaller does it for you. reframe never changes Claude Code's own settings files, so there is nothing to undo there.
- Windows: Settings → Apps → Installed apps → reframe → Uninstall. Your sessions, windows and settings stay in
%APPDATA%\reframe; delete that folder to remove them too. - Windows, portable: quit reframe and delete its folder (its data is inside).
- macOS: quit reframe and move it from Applications to the Trash. Its data is in
~/Library/Application Support/reframe. - Linux: delete the AppImage, or remove the package (
sudo apt remove reframe). Its data is in~/.config/reframe.
The Windows releases are going to be signed through the SignPath Foundation's free code signing for open source projects (being set up; until then they are unsigned, see Install).
Free code signing provided by SignPath.io, certificate by SignPath Foundation.
- What gets signed: the Windows installer and
reframe.exein the portable ZIP, built by the release workflow on GitHub Actions from this repository's tagged source. Each release is signed only after an approver has approved it. - Committers and reviewers: TheyCallMeJuzou. Changes from anyone else come as pull requests and are merged only after a review.
- Approvers: TheyCallMeJuzou
The policy and the privacy policy below are also on the website.
reframe collects nothing about you and sends nothing about you or your sessions anywhere. Its own use of the network:
- Updates: half a minute after starting and then every six hours, reframe asks this repository's releases on GitHub whether there is a newer version. That is a plain web request, as when you open the page in a browser (GitHub sees your IP address, see GitHub's privacy statement). The installed Windows app and the AppImage then download the new version from there. You can turn this off in Settings (Check for updates, from version 0.6.0 on).
- Links you click (for example in About) open in your browser.
Claude Code, which reframe starts for you, talks to Anthropic the way you have set it up; for that, Anthropic's privacy policy applies.
Requirements: Node.js 24, and on Linux the tools to build node-pty (python3, make, a C++ compiler).
npm install # install scripts are only allowed for node-pty and koffi (allowScripts in package.json)
npm run dev # start with hot reload
npm test # unit tests
npm run test:e2e # builds, then runs the end-to-end tests against a fake claude
npm run typecheck && npm run lint
npm run dist # installers for this system, into dist/ (npm run dist:dir: just the unpacked app)
npm run screenshots # the pictures in this README, taken from the real app with demo sessions
npm install does not download Electron itself: it fetches its program the first time it runs (npm run dev or the tests), so that start needs a network connection. npx install-electron fetches it ahead of time.
A smoke test against the real CLI is opt-in (it starts real sessions; the hooks test sends one short prompt):
REFRAME_E2E_REAL=1 REFRAME_E2E_FOLDER=/path/to/a/trusted/folder npx playwright test real
See CONTRIBUTING.md for how to contribute and docs/RELEASING.md for releases.
| Variable | Purpose |
|---|---|
REFRAME_USER_DATA |
Use another profile directory (state, hook settings, log) |
REFRAME_CLAUDE_BIN |
Path to the claude executable, or a .js stand-in (one chosen in Settings comes first) |
REFRAME_NODE |
Node binary that runs a .js stand-in (needed on Windows) |
REFRAME_CLAUDE_HOME |
Claude Code's config directory (default: CLAUDE_CONFIG_DIR or ~/.claude) |
REFRAME_LOCALE |
Force en or de |
REFRAME_DISABLE_NOTIFICATIONS |
Suppress OS notifications (tests) |
REFRAME_E2E |
Exposes test hooks to the end-to-end tests (set by the tests) |
REFRAME_E2E_APP |
Run the end-to-end tests against a packaged app (e.g. dist/win-unpacked/…) |
The app log is in the profile directory, under logs/main.log.
- The main process owns the state (
state.jsonin the profile, written atomically with a backup) and applies the layout changes the windows ask for. - A PTY host (
utilityProcess) runs eachclaudein a pseudo terminal (node-pty) and mirrors its screen in a headless xterm.js, so any window can attach at any time and get the current screen. That is how tiles move between windows without restarting anything. - Status comes from Claude Code's HTTP hooks (passed per session with
--settings, merged with your own hooks; your settings files are never changed) and from Claude Code's session registry. - Taking over a session that runs elsewhere ends it there the way you would (Ctrl+C), then resumes it in reframe under the same session id. On Windows, reframe follows window drags and new terminal windows (window events through koffi) and maps consoles to their terminal windows. A claude in WSL shows in the console of its terminal's
wsl.exe, which reframe finds by running its own executable (as node) through the interop socket of claude's WSL session (WSL_INTEROP): Windows programs started that way are children of thatwsl.exe.
Design notes and findings (German): docs/PLAN.md, docs/PHASE0-FINDINGS.md.
MIT © reframe Team
reframe is an independent open source project, not affiliated with or endorsed by Anthropic. Claude and Claude Code are trademarks of Anthropic.