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
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.
- 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.
| 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 |
brew tap leonardocardoso/poirot
brew install --cask poirot| Tool | Version | Install |
|---|---|---|
| macOS | 15.0+ | — |
| Xcode | 16.0+ | Mac App Store |
Install SwiftLint and SwiftFormat via Homebrew: brew install swiftlint swiftformat.
git clone https://github.com/LeonardoCardoso/Poirot.git
cd Poirot
brew install swiftlint swiftformat
open Poirot.xcodeprojHit ⌘R in Xcode and you're up. Or build from the command line:
xcodebuild -scheme Poirot -destination 'platform=macOS' -skipMacroValidation buildxcodebuild test -scheme Poirot -destination 'platform=macOS' -skipMacroValidationTests use Swift Testing (@Test, #expect, #require) — not XCTest.
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
| Layer | Choice |
|---|---|
| Language | Swift 6 with strict concurrency |
| UI | SwiftUI + Observation (@Observable) |
| Concurrency | MainActor default isolation |
| DI | Protocol-driven services via EnvironmentValues |
| Markdown | MarkdownUI |
| Syntax Highlighting | HighlightSwift |
| Linting | SwiftLint (strict profile) |
| Formatting | SwiftFormat |
| Testing | Swift Testing with hand-written mocks |
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 — colors, spacing, radii, and typography all in one place.
~/.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
└─────────────────┘
We welcome contributions of all sizes — bug fixes, new features, documentation, or just fixing a typo.
- Fork the repo
- Create a feature branch from
main - Make your changes with tests
- Ensure the build passes with zero warnings
- Ensure all tests pass
- Ensure SwiftLint passes
- Open a PR against
main
See CONTRIBUTING.md for the full guide on code style, architecture conventions, and testing expectations.
- Swift 6 — All types are implicitly
@MainActor(no manual annotations needed) @Observablewith@State— notObservableObject- SF Symbols only — No custom icon assets
- Swift Testing —
@Test,#expect,#requirefor all new tests - Hand-written mocks — In
PoirotTests/Mocks/, no mocking frameworks
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.
- Found a bug? Open an issue
- Have an idea? Start a discussion
- Want to contribute? Read the guide and send a PR
- Built with Claude Code — the tool this app is built to complement
- MarkdownUI for rich text rendering
- HighlightSwift for code syntax highlighting
- Every SF Symbol that made the UI feel native
MIT — see 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.


