https://github.com/leonardocardoso/poirot
A native macOS companion for Claude Code that lets you browse sessions, explore diffs, and re-run commands.
https://github.com/leonardocardoso/poirot
ai claude claude-code codex dev-tools open-ai
Last synced: 2 months ago
JSON representation
A native macOS companion for Claude Code that lets you browse sessions, explore diffs, and re-run commands.
- Host: GitHub
- URL: https://github.com/leonardocardoso/poirot
- Owner: leonardocardoso
- License: mit
- Created: 2026-02-19T08:14:00.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-03-29T19:42:18.000Z (3 months ago)
- Last Synced: 2026-03-29T20:15:58.549Z (3 months ago)
- Topics: ai, claude, claude-code, codex, dev-tools, open-ai
- Language: Swift
- Homepage: https://poirot.fyi
- Size: 58.9 MB
- Stars: 142
- Watchers: 0
- Forks: 9
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
POIROT
Investigating your Claude Code sessions.
A native macOS companion that lets you browse sessions, explore diffs, and re-run commands — all from a polished SwiftUI interface.
Features •
Capabilities •
Getting Started •
Architecture •
Contributing •
Roadmap
No login. No tracking. No analytics. No BYOK. No extra cost. Works offline. Less than 6 MB.
---
Click to watch the demo on YouTube
---
## The Story
Poirot was **vibe-coded in a weekend**. The entire app — architecture, parser, UI, tests — was built in a single creative burst with Claude Code as the co-pilot. What started as "I wonder if I can build a companion app for Claude Code... using Claude Code" turned into a real, usable tool.
Named after **Hercule Poirot**, Agatha Christie's legendary detective. Because every great investigation needs the right tools — and Poirot helps you investigate exactly what your AI assistant has been up to.
---
## Features
- **Session Analytics** — Token consumption, cost breakdowns, model distribution, and session trends
- **Session History Browser** — Sessions grouped by project with timestamps, model info, and token counts
- **Rich Conversation View** — Full timeline with markdown rendering, syntax highlighting, and collapsible tool blocks
- **Tool Block Display** — Every tool invocation rendered with name, icon, file path, and result
- **Extended Thinking** — Collapsible thinking blocks with distinct purple accent
- **Fuzzy Search (⌘K)** — Spotlight-style search across sessions, commands, file paths, and more
- **Slash Commands** — Browse global and per-project commands with descriptions and permissions
- **Skills** — Explore reusable skill modules with parsed frontmatter
- **MCP Servers** — Live connection status indicators with color-coded SF Symbols
- **Models** — Browse available models and their capabilities
- **Sub-agents** — Create, edit, and manage custom sub-agents with tools, model, memory, and system prompt
- **Plugins** — View installed plugins and their metadata
- **Output Styles** — Preview output formatting styles
- **Hooks** — Event hooks grouped by type with matcher patterns and handler details
- **Session TODOs** — Per-session todo lists with status tracking
- **Plans** — Browse `~/.claude/plans/` with rendered markdown and file watching
- **Debug Log Viewer** — Color-coded log levels, search, filtering, and paginated loading
- **Prompt History** — Browse input history with date grouping and project filtering
- **AI Session Summaries** — Goal, outcome, helpfulness, and friction indicators from facets
- **Memory** — Per-project auto-memory files with rendered markdown and live watching
> **See all features with screenshots in the [Feature Showcase](SHOWCASE.md).**
---
## Capabilities
| Category | Feature | Description |
|----------|---------|-------------|
| **Analytics** | Session Analytics Dashboard | Token consumption, cost breakdowns, model distribution, and session trends |
| **Sessions** | JSONL Transcript Parser | Parses `~/.claude/projects/` transcripts into structured models |
| | Session History Browser | Sessions grouped by project with timestamps, model, token counts |
| | Real-time File Watching | Auto-updates via GCD dispatch sources with 1s debounce |
| | Per-Project Configuration | Supports global (`~/.claude/`) and per-project (`.claude/`) scopes |
| | Session Detail View | Full conversation timeline with collapsible blocks and scroll-to-bottom |
| **Conversation** | Markdown Rendering | Rich text with syntax highlighting via MarkdownUI + HighlightSwift |
| | Code Diff Viewer | Syntax-highlighted inline diffs for Edit tool blocks |
| | Bash Output Renderer | Terminal command output with monospace styling and exit status |
| | Extended Thinking | Collapsible thinking blocks with distinct purple accent |
| | Tool Blocks | Every tool invocation rendered with name, icon, file path, and result |
| | In-Session Search | ⌘F to search within the current conversation |
| **Diagnostics** | Debug Log Viewer | Parse and browse `~/.claude/debug/` logs with color-coded levels, search, filtering, and paginated lazy loading |
| | Auto-scroll to Error | Opens directly at the first error entry for quick triage |
| | Relative Timestamps | Toggle between absolute (HH:mm:ss.SSS) and relative (+offset) time display |
| **History** | Prompt History Browser | Browse `~/.claude/history.jsonl` with date grouping, project filtering, full-text search, and copy-to-clipboard |
| **AI Summaries** | Session Facets | AI-generated analysis (goal, outcome, helpfulness) from `~/.claude/usage-data/facets/` |
| | Outcome & Helpfulness Badges | Color-coded badges for success/partial/failure and helpfulness rating |
| | Goal Categories | Tag chips showing categorized session goals with counts |
| | Friction Indicators | Subtle indicators for tool failures, misunderstandings, and other friction |
| | Live File Watching | Auto-updates when new facets appear via GCD dispatch sources |
| **Search** | Universal Search (⌘K) | Fuzzy search across sessions, AI summaries, history, commands, skills, memory, MCP servers, plugins, output styles, models, sub-agents, plans, TODOs, and debug logs |
| | Grouped Results | Results organized by category with counts |
| | Quick Access | Empty state shows shortcuts, counts, and recent sessions |
| **Configuration** | Commands | Browse and manage slash commands (global and per-project) |
| | Skills | Browse and manage reusable skill modules |
| | MCP Servers | Browse configured Model Context Protocol servers with live connection status |
| | Models | Browse available models and capabilities |
| | Sub-agents | Create, edit, duplicate, and delete custom sub-agents with categorized tool selection and memory configuration |
| | Plugins | Browse installed plugins |
| | Output Styles | Browse and manage output style configurations |
| | Hooks | View and manage event hooks grouped by type with matcher patterns and handler details |
| | TODOs | Browse per-session todo lists with status tracking and session navigation |
| | Plans | Browse `~/.claude/plans/` markdown files with rendered/raw toggle, copy, delete, and file watching |
| | Memory | Browse per-project auto-memory files with rendered markdown, project filtering, and file watching |
| | Grid & List Views | Toggle between card grid and compact list layouts |
| | Scope Badges | Visual distinction between Global and Project-scoped items |
| **Integrations** | IDE/Editor | One-click open files in VS Code, Cursor, Xcode, or Zed |
| | Terminal Selection | Pick your terminal: Terminal, iTerm2, Warp, Ghostty, Kitty, Alacritty |
| | Quick Command Re-run | Click any Bash command to copy or open in your terminal |
| **Export** | Session Export | Export sessions as Markdown or PDF with configurable options |
| | Copy Markdown | One-click copy of session content as Markdown to clipboard |
| | Share Sheet | Native macOS share sheet integration for exported files |
| **Sub-agents** | Custom Agent Creation | Full form with name, description, system prompt, model, color, categorized tools, and persistent memory |
| | Auto File Naming | File path auto-derived from agent name (lowercase, dashes); file renamed on edit |
| | Tool Categories | Select tools by category (Read-only, Edit, Execution, Other) or individually |
| | Agent Memory | Configure persistent memory per agent (global or none) |
| | Import/Export | Share agents as JSON files between users |
| | Duplicate | Clone built-in or custom agents as starting points |
| **Navigation** | Font Scaling | ⌘+ / ⌘- / ⌘0 to zoom the entire UI |
| | Keyboard Shortcuts | Full keyboard navigation with discoverable shortcut hints |
| | Help Book (⌘?) | Keyboard reference, feature overview, and getting started guide |
| **App** | Onboarding Flow | First-run welcome with CLI detection, session discovery, and feature tour |
| | Homebrew Distribution | `brew install --cask poirot` with automated release workflow |
| **Design** | Dark Theme | Warm golden accent (`#E8A642`) on near-black backgrounds |
| | SF Symbols | All icons are SF Symbols with bounce, pulse, and replace animations |
| | Design Tokens | Centralized `PoirotTheme` for colors, spacing, radii, and typography |
| **Architecture** | Swift 6 | Strict concurrency with `@MainActor` default isolation |
| | Observation | `@Observable` with `@State` — no `ObservableObject` |
| | Protocol-Driven DI | Services injected via SwiftUI `EnvironmentValues` |
| | Provider System | Extensible `ProviderDescribing` protocol for multi-LLM support |
| | Swift Testing | `@Test`, `#expect`, `#require` with hand-written mocks |
---
## Getting Started
### Install with Homebrew
```bash
brew tap leonardocardoso/poirot
brew install --cask poirot
```
### Prerequisites
| Tool | Version | Install |
|------|---------|---------|
| macOS | 15.0+ | — |
| Xcode | 16.0+ | Mac App Store |
Install SwiftLint and SwiftFormat via Homebrew: `brew install swiftlint swiftformat`.
### Build & Run
```bash
git clone https://github.com/LeonardoCardoso/Poirot.git
cd Poirot
brew install swiftlint swiftformat
open Poirot.xcodeproj
```
Hit **⌘R** in Xcode and you're up. Or build from the command line:
```bash
xcodebuild -scheme Poirot -destination 'platform=macOS' -skipMacroValidation build
```
### Run Tests
```bash
xcodebuild test -scheme Poirot -destination 'platform=macOS' -skipMacroValidation
```
Tests use [Swift Testing](https://developer.apple.com/documentation/testing/) (`@Test`, `#expect`, `#require`) — not XCTest.
---
## Architecture
```
Poirot/Sources/
├── App/ # Entry point, ContentView, AppState, Settings
├── Models/ # Value-type structs — Project, Session, Message, ContentBlock
├── Protocols/ # Service protocols (SessionLoading, ProviderDescribing)
├── Services/ # Concrete implementations + SwiftUI Environment DI
│ └── Providers/ # LLM provider configs (ClaudeCodeProvider)
├── Theme/ # Design tokens (PoirotTheme) + Markdown theme
├── Utilities/ # Parsers, terminal launcher
└── Views/ # SwiftUI views organized by feature
├── Components/ # Sidebar, StatusBar, Shimmer
├── Configuration/ # Config dashboard
├── History/ # Prompt history browser
├── Home/ # Welcome / empty state
├── Memory/ # Memory file browser
├── Project/ # Project sessions list
├── Plans/ # Plans browser
├── Search/ # ⌘K overlay
├── Session/ # Conversation detail, tool blocks, thinking
└── Todos/ # Per-session todo overview
```
### Tech Stack
| Layer | Choice |
|-------|--------|
| Language | Swift 6 with strict concurrency |
| UI | SwiftUI + Observation (`@Observable`) |
| Concurrency | `MainActor` default isolation |
| DI | Protocol-driven services via `EnvironmentValues` |
| Markdown | [MarkdownUI](https://github.com/gonzalezreal/swift-markdown-ui) |
| Syntax Highlighting | [HighlightSwift](https://github.com/nicklawls/HighlightSwift) |
| Linting | SwiftLint (strict profile) |
| Formatting | SwiftFormat |
| Testing | Swift Testing with hand-written mocks |
### Design System
Poirot uses a custom dark theme built around a warm golden accent (`#E8A642`) on near-black backgrounds (`#0D0D0F`). All icons are **SF Symbols** with symbol effects (bounce, pulse, replace transitions). Typography scales dynamically with user preference (⌘+/⌘-).
Design tokens live in [`PoirotTheme.swift`](Poirot/Sources/Theme/PoirotTheme.swift) — colors, spacing, radii, and typography all in one place.
### How It Works
```
~/.claude/projects/ Poirot reads JSONL transcripts
│ from Claude Code's local storage
▼
┌─────────────────┐
│ SessionLoader │──▶ Discovers projects & session files
└────────┬────────┘
▼
┌─────────────────┐
│ TranscriptParser │──▶ Parses JSONL into Session/Message models
└────────┬────────┘
▼
┌─────────────────┐
│ AppState │──▶ Observable state with in-memory caching
└────────┬────────┘
▼
┌─────────────────┐
│ SwiftUI Views │──▶ Sidebar → Session Detail → Tool Blocks
└─────────────────┘
```
---
## Contributing
We welcome contributions of all sizes — bug fixes, new features, documentation, or just fixing a typo.
### Quick Start
1. Fork the repo
2. Create a feature branch from `main`
3. Make your changes with tests
4. Ensure the build passes with zero warnings
5. Ensure all tests pass
6. Ensure SwiftLint passes
7. Open a PR against `main`
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide on code style, architecture conventions, and testing expectations.
### Code Style at a Glance
- **Swift 6** — All types are implicitly `@MainActor` (no manual annotations needed)
- **`@Observable`** with `@State` — not `ObservableObject`
- **SF Symbols only** — No custom icon assets
- **Swift Testing** — `@Test`, `#expect`, `#require` for all new tests
- **Hand-written mocks** — In `PoirotTests/Mocks/`, no mocking frameworks
---
## Roadmap
Poirot is early. There's a lot to build and we'd love your help. Track what's planned and in progress on the [issues page](../../issues).
---
## Community
- **Found a bug?** [Open an issue](../../issues)
- **Have an idea?** [Start a discussion](../../discussions)
- **Want to contribute?** [Read the guide](CONTRIBUTING.md) and send a PR
---
## Acknowledgments
- Built with [Claude Code](https://claude.ai/code) — the tool this app is built to complement
- [MarkdownUI](https://github.com/gonzalezreal/swift-markdown-ui) for rich text rendering
- [HighlightSwift](https://github.com/nicklawls/HighlightSwift) for code syntax highlighting
- Every SF Symbol that made the UI feel native
---
## License
MIT — see [LICENSE](LICENSE) for details.
No tracking. No analytics. Analyze the code yourself, or ask your Claude to do it. :)
Made with coffee and Claude Code in a weekend.
If you find Poirot useful, consider giving it a star. It helps others discover the project.