Background
Until recently, I was primarily using Cursor for AI-assisted coding. The editor-centric AI integration worked really well with my development style—it made the feedback loop smooth when AI-generated code didn't match my intentions, whether I needed to manually fix it or provide additional instructions.
But everything changed when Opus 4.5 was released in late November last year.
Opus 4.5 delivers outputs that match my expectations far better than any previous model. Claude Code's CUI-first design also feels natural to my workflow. Now, Claude Code has become the center of my development process. I've locked in Opus 4.5 as my daily driver.
I typically run multiple Claude Code sessions simultaneously—across different projects or multiple branches using git worktree. Managing notifications and checking outputs across these sessions is critical.
I was using OS notifications to check in whenever changes happened, but I kept missing them. I wanted something better.
So I built an app to streamline my workflow.
What I Built
It's a cross-platform desktop application built with Tauri. I've only tested it on macOS (my daily environment), but the codebase is designed to support Linux as well.
My Environment & Workflow
This app is primarily designed to optimize my own workflow, so the features reflect my environment and habits.
I develop using Ghostty + tmux.
My typical workflow looks like this:
- Draft ideas and design in Markdown
- Give instructions to Claude Code (using Plan mode for larger tasks)
- Review the diff of generated code, then provide additional instructions or continue
Features
Multi-Session Monitoring Dashboard
The dashboard monitors Claude Code sessions by receiving events through hooks configured in the global settings.json.
Since I keep this running during development, I designed it with a minimal, non-intrusive UI.
Always-on-top mode (optional) ensures the window doesn't get buried under other apps—so you never miss a notification.
Transparency settings let you configure opacity separately for active and inactive states. When inactive, you can make it nearly invisible so it doesn't get in the way.
It's there in the top-right corner, barely visible.
Status Display & Sound Notifications
Sessions are displayed with one of four states:
| State | Meaning | Display |
|---|---|---|
Active |
Claude is working | 🟢 |
WaitingPermission |
Waiting for permission approval | 🔐 |
WaitingInput |
Waiting for user input (idle) | ⏳ |
Completed |
Response complete | ✅ |
Sound effects play on state changes (can be toggled off):
- Waiting (Permission/Input): Alert tone (two low beeps)
- Completed: Completion chime (ascending two-note sound)
I'm planning to add volume control and custom commands in the future—like using say to speak or playing music on completion 🎵
Git-Based Diff Viewer
I usually review AI-generated changes using difit.
I wanted to integrate that same flow into this app, so you can launch difit directly on changed files.
Huge thanks to the difit team for building such a great tool!
tmux Integration
When developing, I use tmux panes and tabs to manage multiple windows. My typical setup is Claude Code on the left half, and server/commands on the right.
When working across multiple projects or branches via git worktree, it's frustrating to hunt for which tmux tab has Claude Code running.
So I added a tmux mirror view that lets you quickly check results and give simple instructions without switching tabs.
How It Works
The app uses Claude Code hooks to determine session status based on which hooks fire.
Event Flow
I didn't want to introduce complexity with an intermediate server for inter-process communication. So I went with a simple approach: hooks write to log files, and the app watches those files.
Hooks write logs to a temporary directory (.local/eocc/logs), which the app monitors.
Since Claude Code runs in a terminal, hooks can access terminal environment paths. This lets me grab tmux and npx paths from within hooks and pass them to the app.
Mapping Hooks to Status
Claude Code provides these hook events:
https://code.claude.com/docs/hooks-guide
Here's how I map them to session states:
| Event | Usage | Session State |
|---|---|---|
session_start (startup/resume) |
Start a session | Active |
session_end |
End a session | Remove session |
notification (permission_prompt) |
Waiting for approval | WaitingPermission |
notification (idle_prompt) |
Waiting for input | WaitingInput |
stop |
Response completed | Completed |
post_tool_use |
After tool execution | Active |
user_prompt_submit |
Prompt submitted | Active |
Conclusion
I've only been using Claude Code as my primary tool for about two months, and I expect my workflow will keep evolving.
Thanks to AI, I can quickly build and adapt tools like this—which is exactly what makes this era so exciting.
If your workflow is similar to mine, give it a try! I'd love to hear your feedback.




Top comments (0)