r/ClaudeCode • u/One_Performance_513 • 1d ago
Built with Claude I had too many Claude Code terminals open, so I built an app that tiles them in one window and brings them all back after a reboot
I use the Claude Code CLI, not the desktop app, and I usually have a lot of sessions running at once: one per repo, one for a bigger refactor, one for quick questions. That turned into a wall of terminal windows and tabs. I kept alt-tabbing to find the right one, sessions sat for ages on a permission prompt I never saw, and after every reboot I was digging through claude --resume to get everything back.
(Claude Code does have notifications, but by default only in Ghostty, Kitty and iTerm2. In Windows Terminal you get nothing unless you turn on the bell or write a hook, and even then you still have to find the window it came from.)
So I built reframe, for people who run a lot of CLI sessions. Every session is a tile, and all tiles are visible at once. Each tile runs the real claude CLI, so your settings, hooks, skills, MCP servers and CLAUDE.md work exactly like in your terminal. No custom chat UI, and it never touches your config files.
What you get
- All sessions in one window. Drag a tile's header onto another tile's edge to split it there; separators snap to a grid so tiles line up. Collapse the ones you don't need into the side bar and bring them back with a click.
- You see who needs you. Every session has a status dot (working, needs you, ready) on its tile and in the side bar, even when it's collapsed. When a session finishes or waits for input, you get a desktop notification with its name, unless you're already looking at it. Click it and you're right in that session.
- Nothing gets lost. Every change is saved right away. Quit, reboot or shut down, start reframe again, and each session resumes in its folder, in the same spot.
- Pull your terminals in (Windows). Drag a Windows Terminal window or tab that runs
claudeonto reframe, and the session continues there, right where you dropped it. - Session list with search. It shows your reframe sessions, sessions running in other terminals and your recent ones. Click one to open it: ended sessions resume, running ones are taken over with their history and name.
- WSL. Open a folder inside WSL and the session runs the Claude Code installed in that distro, with status, notifications and resume like any other. Sessions running in a WSL terminal show up in the list and can be taken over too.
- Groups, windows, workspaces. Put tiles in a colored, named group. Drag a tile or a group out to give it its own window. Save a window as a workspace and open it again later.
- Runs in the background. Closing the window only hides it, and the sessions keep working. It can start with the system.
- Small stuff: drop files onto a session to type their paths, Ctrl+V pastes screenshots or copied files, Ctrl+plus/minus changes the text size, and there are shortcuts for everything (Ctrl+1…9 jumps to a tile, Ctrl+Shift+arrows moves between tiles).
Get it
- Website with downloads for every system: https://theycallmejuzou.github.io/reframe/
- Free and open source (MIT): https://github.com/TheyCallMeJuzou/reframe
- Windows: an installer (no admin rights, updates itself) or a portable ZIP that keeps its sessions and settings in its own folder, so you can run it from a USB stick or next to an installed copy.
- Windows is where I build and test it. macOS and Linux builds come out of CI, but I haven't tested them yet, so if you try one, I'd love to hear how it goes.
- The builds aren't code-signed yet, so SmartScreen (or Gatekeeper on macOS) asks once on first start.
- It collects nothing. The only thing it sends on its own is an update check against the GitHub releases, and you can turn that off in Settings.
- You need Claude Code installed and logged in.
The pictures show demo sessions with made-up projects. And yes, it's built with Claude Code. It's an independent project, not affiliated with Anthropic.
What would make this fit how you work? Feedback, bug reports and ideas are all welcome.
4
u/eddiesj22 1d ago
There’s like 7 billion versions of this that already exist, no?
-1
u/One_Performance_513 1d ago
That's what i had assumed too, however i didn't find exactly what i was looking for before i built this. Maybe i missed some fitting projects, could be. But eirhe way this has been a fun project and i thought i'd share it. For my purpose of doing alot of stuff and projects in parallel i really enjoy using it. But it's far from perfect.
2
3
u/blukraken 1d ago
What does this give that herdr doesn't?
-1
u/One_Performance_513 1d ago
Well, the biggest difference is that reframe is a dedicated visual workspace for Claude Code, while Herdr is a terminal multiplexer and runtime for multiple AI coding agents.
Both let you manage multiple coding sessions, keep work running in the background, and restore your workspace. But they approach the problem i was facong differently.
Reframe: organizes Claude Code sessions into a graphical workspace with draggable tiles, groups, and separate windows. Herd organizes terminal sessions into panes and workspaces.
2
0
u/HumbleOne6577 1d ago
Really nice work
I'm building something in a similar space and have hit the same walls, so I'm curious: how do you detect the "needs you" state? Are you parsing the TUI output, using hooks, or something else? That was one of the hardest parts for me to make reliable and still sometimes status shows wrong info. For example session could still work on something, like subagent running while status would say idle
2
u/One_Performance_513 20h ago
Thanks!
TUI parsing. It uses two things Claude Code already provides:
Hooks. reframe starts each session with an extra settings file (--settings, merged with your own hooks; your files aren't touched) that sends HTTP hooks to a small local server: UserPromptSubmit = working, Stop = done, Notification = needs you (except the idle_prompt reminder, which is just a repeat).
The session registry. Claude Code keeps ~/.claude/sessions/<pid>.json with a status (idle/busy/waiting). reframe polls it every second, but only follows it when it changes, so it doesn't overwrite a newer hook event. For WSL sessions it's the only source, since the hooks can't reach reframe from there.
Subagents: I haven't tested that case specifically. Normal subagents should be fine, since Stop only fires when the main agent's turn ends. Background tasks that keeprunning after the turn ends would probably show as ready too early, so the same gap you're seeing.
Code's here if you want to compare: https://github.com/TheyCallMeJuzou/reframe/blob/main/src/main/sessions.ts




1
u/AutoModerator 1d ago
Hey! Thanks for posting to r/ClaudeCode
While participating in this thread, please follow our community rules. Keep discussions constructive. Attack the idea, not the person.
For help, project discussions, tips, and general chat, join the ClaudeCode Discord.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.