Skip to content
/

Poirot

poirot · LeonardoCardoso/Poirot · ★ 184 · last commit 2026-05-16

Primitive shape 7 total
Skills 7
00

Summary

Poirot — Summary

Poirot is a native macOS SwiftUI companion app for Claude Code that reads session transcripts from ~/.claude/projects/, renders them with rich markdown and syntax highlighting, and provides browsing, analytics, search, and configuration management in a polished read-only viewer.

Problem it solves: Claude Code stores all sessions as JSONL files with no native viewer; Poirot parses those files and presents sessions as searchable timelines with token costs, diff viewers, tool-call blocks, AI-generated facets (goal/outcome/helpfulness), and live file watching — all without cloud connectivity.

Distinctive trait: Poirot is entirely read-only for sessions — it never modifies what Claude Code does. Its value is investigation (named after Hercule Poirot, Agatha Christie's detective). The exception is the sub-agent editor, where users can create/edit/delete custom sub-agent definitions stored as .claude/agents/ files.

Tech stack: Swift 6, SwiftUI, macOS 15+, @Observable, XcodeGen-managed project, MarkdownUI + HighlightSwift for rendering, GCD dispatch sources for live file watching. Binary is under 6 MB.

Target audience: Individual Claude Code users on macOS who want a polished companion for reviewing what their agent did — session analytics, debug log browsing, tool-call inspection, and configuration overview — without any workflow methodology imposed.

Production-readiness: 184 stars, MIT license, 3 contributors; actively maintained (pushed May 2026). Available via brew install --cask poirot.

differs_from_seeds: Poirot is a pure read-only session inspector — it adds no methodology, no skills, no hooks, and no commands. Unlike any of the 11 seeds (all of which shape agent behavior), Poirot only visualizes it. The closest seed is ccmemory in that both consume Claude session data, but ccmemory actively writes and queries memory while Poirot only reads.

01

Overview

Poirot — Overview

Origin

Poirot was "vibe-coded in a weekend" by Leonardo Cardoso using Claude Code as co-pilot. From the README:

"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."

Philosophy

Poirot's philosophy is strict non-interference: it reads Claude Code's data files but never modifies session transcripts, never injects into Claude's reasoning, and never adds to the .claude/ configuration beyond what the user explicitly does through the sub-agent editor.

From the README badge line:

"No login. No tracking. No analytics. No BYOK. No extra cost. Works offline. Less than 6 MB."

This positions Poirot explicitly against tools that require cloud accounts, collect telemetry, or proxy API calls. The binary fits in a single download under 6 MB — a deliberate minimalism statement.

Development discipline

The AI_INSTRUCTIONS.md file (the project's own CLAUDE.md equivalent) is unusually detailed — it prescribes Swift 6 concurrency patterns, SwiftUI state management with @Observable, SF Symbols naming conventions with specific animation types, a design token system (PoirotTheme), and a feature checklist (search integration, live file watching, navigation history). The instructions reference skills (sf-symbols-expert, swiftui-expert-skill, swift-testing-expert) by name — Poirot was itself built with a Claude Code skill-based development methodology.

Design system

  • Warm golden accent (#E8A642) on near-black backgrounds
  • All icons: SF Symbols with bounce/pulse/replace/breathe/wiggle/rotate animations
  • Centralized PoirotTheme design token system
  • Accessibility: @Environment(\.accessibilityReduceMotion) guards all animations
02

Architecture

Poirot — Architecture

Distribution

  • Homebrew Cask: brew install --cask poirot (automated release workflow)
  • Source: xcodegen generate && xcodebuild
  • Size: < 6 MB binary

Requirements

  • macOS 15.0+ (Sonoma)
  • No additional runtimes, no Node, no Python, no cloud account

Project structure

Poirot/
├── project.yml                   # XcodeGen project definition
├── AI_INSTRUCTIONS.md            # Development rules (CLAUDE.md equivalent)
├── CLAUDE.md                     # Redirects to AI_INSTRUCTIONS.md
├── Poirot.xcodeproj/             # Generated by XcodeGen
├── Poirot/
│   ├── Resources/                # Assets, fonts, localizations
│   └── Sources/
│       ├── App/                  # App entry points
│       │   ├── PoirotApp.swift
│       │   ├── ContentView.swift
│       │   ├── AppState.swift
│       │   ├── AboutView.swift
│       │   └── SettingsView.swift
│       ├── Models/               # Data models (session, message, tool, config)
│       ├── Protocols/            # Service protocols for DI
│       ├── Services/             # JSONL parsing, file watching, analytics
│       ├── Theme/                # PoirotTheme design tokens
│       ├── Utilities/            # Helpers
│       └── Views/                # SwiftUI views
└── PoirotTests/
    └── Mocks/                    # Hand-written service mocks

Data sources read

Source Path Content
Session transcripts ~/.claude/projects/**/*.jsonl Full conversation history
Prompt history ~/.claude/history.jsonl Past user inputs
Debug logs ~/.claude/debug/ Diagnostic logs
AI facets ~/.claude/usage-data/facets/ AI-generated session summaries
Plans ~/.claude/plans/ Markdown plan files
Commands ~/.claude/commands/ + .claude/commands/ Slash command definitions
Skills ~/.claude/skills/ + .claude/skills/ Skill module definitions
Agents ~/.claude/agents/ + .claude/agents/ Sub-agent definitions
Hooks ~/.claude/settings.json Hook configurations
MCP config ~/.claude/claude_desktop_config.json MCP server configs
Memory .claude/memory/ Per-project auto-memory files

Technology choices

  • Swift 6 strict concurrency: SWIFT_DEFAULT_ACTOR_ISOLATION: MainActor — all types implicitly @MainActor unless opted out with nonisolated
  • State management: @Observable with @State (no legacy ObservableObject)
  • DI: Protocol-driven services injected via SwiftUI EnvironmentValues
  • Testing: Swift Testing framework (@Suite, @Test, #expect)
  • Live updates: GCD dispatch sources with 1 second debounce on file changes
  • Markdown rendering: MarkdownUI + HighlightSwift
  • Project generation: XcodeGen from project.yml
03

Components

Poirot — Components

Poirot ships no Claude Code primitives (commands, skills, hooks, MCP). All components are SwiftUI views and service layers.

View modules

View Purpose
Session History Browser Sessions grouped by project; timestamps, model, token counts
Session Detail Full conversation timeline with collapsible tool blocks
Session Analytics Dashboard Token costs, model distribution, session trends (charts)
AI Session Summaries Goal/outcome/helpfulness badges from facets directory
Code Diff Viewer Syntax-highlighted inline diffs for Edit tool blocks
Bash Output Renderer Terminal-styled command output with exit status
Extended Thinking Collapsible thinking blocks with purple accent
Universal Search (Cmd+K) Fuzzy search across all categories
Debug Log Viewer Color-coded logs with search/filter/paginated loading
Prompt History Browser history.jsonl with date grouping + project filtering
Commands Browser Global + per-project slash commands with scope badges
Skills Browser Skill modules with parsed frontmatter
MCP Servers View Live connection status with color-coded SF Symbols
Sub-agents Editor Create/edit/duplicate/delete agents with tool categories
Plugins Viewer Installed plugins and metadata
Output Styles Output formatting style preview
Hooks Viewer Event hooks grouped by type
TODOs Per-session todo lists with status
Plans ~/.claude/plans/ markdown viewer with file watching
Memory Per-project auto-memory files with rendered markdown
Help Book (Cmd+?) Keyboard reference and feature overview

Service protocols (DI layer)

  • JSONL transcript parser
  • File system watcher (GCD)
  • Analytics calculator
  • AI facets reader
  • Configuration file readers (commands, skills, agents, hooks, MCP)
  • Export service (Markdown / PDF)

Sub-agents editor

Notable write capability: Poirot can create, edit, duplicate, and delete sub-agent definition files in ~/.claude/agents/ or .claude/agents/. The editor provides:

  • Name, description, system prompt fields
  • Model selection
  • Tool category selection (Read-only, Edit, Execution, Other)
  • Memory configuration (global or none)
  • Auto file naming from agent name (kebab-case)
  • Import/export as JSON

This is the only part of Poirot that modifies .claude/ files.

05

Prompts

Poirot — Prompts

Poirot ships no prompting primitives for Claude Code users. It contains no skills, commands, or hooks.

The project's own development workflow uses skills internally (referenced in AI_INSTRUCTIONS.md), but these are not shipped with the app.

AI_INSTRUCTIONS.md excerpts (development methodology, not user-facing)

The project's AI_INSTRUCTIONS.md is a detailed CLAUDE.md-equivalent for developing Poirot itself. Key prescriptions:

Tech stack rules (structured constraints):

## Architecture
- Platform: macOS 15.0+, Swift 6, Xcode 16+
- Project generation: XcodeGen (project.yml → xcodegen generate)
- Concurrency: SWIFT_DEFAULT_ACTOR_ISOLATION: MainActor — all types are implicitly
  @MainActor unless opted out with nonisolated
- DI: Protocol-driven services injected via SwiftUI EnvironmentValues
- State: @Observable with @State (not ObservableObject)
- Testing: Swift Testing (@Test, #expect, #require) with hand-written mocks

Feature checklist (mandatory behavioral constraints):

### New Feature Checklist
Every new feature or view must follow these steps:
1. Use existing patterns (list, gallery) for page content layout
2. Use markdown rendering as pertinent
3. Add items to the universal search (⌘K)
4. Watch for file changes for live updates
5. Include in navigation history if pertinent
6. Move new screenshots to assets/showcase/
7. Add new information to the README.md file

Prompting technique used: Role-constraining rules with mandatory checklists — a prescriptive behavioral specification that functions as an "Iron Law" list (same pattern as superpowers' skills). The instructions include explicit antipatterns ("Never use custom icon assets or emoji for UI elements", "Do not invent new layout paradigms").

Referenced skills (not in repo)

AI_INSTRUCTIONS.md mentions these skills for use during Poirot development:

  • sf-symbols-expert — icon selection and animation
  • swiftui-expert-skill — view composition and state
  • swift-testing-expert — test structure
  • swift-concurrency — async/await patterns
  • core-data-expert — persistence patterns

These are expected to be available in the developer's Claude Code environment, not shipped with the Poirot app.

09

Uniqueness

Poirot — Uniqueness & Positioning

differs_from_seeds

Poirot is a passive read-only viewer — entirely unlike all 11 seed frameworks:

  • vs. all methodology seeds (superpowers, BMAD, spec-driver, spec-kit, openspec): Those inject behavior into the agent. Poirot records what the agent did.
  • vs. MCP-toolserver seeds (claude-flow, ccmemory, taskmaster-ai): Those extend Claude's capabilities. Poirot only reads what Claude produced.
  • vs. markdown-scaffold seeds (claude-conductor, agent-os): Those structure future work. Poirot inspects completed work.
  • vs. kiro: kiro is a full IDE. Poirot is a companion to the IDE.

Poirot is most similar to an observability tool — the session equivalent of a log aggregator. Within the batch, it has the richest feature set for pure session investigation.

What makes Poirot distinctive within the GUI desktop batch

Among the 10 batch frameworks, Poirot stands out for:

  1. Deepest CC integration: It reads more Claude Code data sources than any other tool — sessions, facets, debug logs, history, plans, memory, hooks, MCP configs, commands, skills, agents, plugins, output styles. The feature matrix is exhaustive.
  2. Native Swift performance: Unlike Electron or Tauri competitors, it's < 6 MB with native macOS UI conventions.
  3. AI facets display: It surfaces Claude Code's own AI-generated session analysis (goal/outcome/helpfulness) — a feature no other tool in this batch exposes.
  4. Sub-agents editor: The only write capability — letting users create custom sub-agents directly from the viewer rather than editing JSONL manually.
  5. Development self-documentation: Poirot was built using CC skills and its AI_INSTRUCTIONS.md is a model of how to write agent development guidelines for a native app.

Observable failure modes

  1. macOS-only: Swift/SwiftUI limits this to macOS 15+; no Windows/Linux support.
  2. JSONL format fragility: If Anthropic changes the session JSONL schema, parsing breaks. There is no versioned schema contract.
  3. Feature surface vs. depth: The feature list is extremely long for a 3-contributor project; surface breadth risks maintenance burden.
  4. No write-back loop: The sub-agent editor lets users create agents but doesn't provide any way to test them — users must switch to Claude Code terminal.
  5. Facets dependency: The AI summaries feature depends on ~/.claude/usage-data/facets/ which is generated by Claude Code's internal background process; if Anthropic removes or changes this, the summaries feature silently stops working.
04

Workflow

Poirot — Workflow

Poirot imposes no workflow. It is a read-only session investigation tool. User flow:

Investigation workflow

1. Launch Poirot
2. Onboarding flow (first run: detects Claude Code CLI, discovers sessions)
3. Browse session history → select project → view sessions
4. Open session detail → scroll timeline / search (Cmd+F)
5. Check AI summaries for goal/outcome badges
6. Browse analytics dashboard for cost trends
7. Open debug logs for error investigation
8. Cmd+K universal search across any category

Configuration management workflow

1. Open Commands / Skills / Agents / Hooks / MCP views
2. Browse installed configuration
3. For sub-agents: create/edit/duplicate/delete (only write operation)
4. Open files in VS Code, Cursor, Xcode, or Zed for editing

Export workflow

Session detail → Export → Choose Markdown or PDF
Options: include/exclude tool calls, metadata, etc.
Share via macOS share sheet

Live watching

Poirot uses GCD dispatch sources to watch:

  • ~/.claude/projects/ for new sessions (auto-update)
  • ~/.claude/usage-data/facets/ for new AI summaries
  • ~/.claude/plans/ for new plan files
  • .claude/memory/ for memory file changes

All updates appear without restart.

Artifacts

None produced by Poirot. It reads only (except sub-agent definitions).

Approval gates

None.

Phases

None — all features available from the sidebar at any time.

06

Memory Context

Poirot — Memory & Context

State storage

Poirot is entirely file-based and stateless beyond in-memory Swift state:

  • No database: Poirot reads from JSONL files; it does not maintain its own database
  • No cloud: "Works offline" is an explicit design goal
  • In-memory only: App state lives in @Observable Swift classes via @State

Data sources (all read-only except sub-agents)

Source Persistence Scope
~/.claude/projects/**/*.jsonl Owned by Claude Code Global
~/.claude/history.jsonl Owned by Claude Code Global
~/.claude/debug/ Owned by Claude Code Global
~/.claude/usage-data/facets/ AI-generated by Claude Code Global
~/.claude/plans/ User-created Global
.claude/agents/ Written by Poirot + user Per-project

Live file watching

GCD dispatch sources watch all data directories with a 1-second debounce. New sessions, facets, plans, and memory files appear in the UI without requiring a refresh or restart.

Context compaction

Not applicable — Poirot does not run any AI model or participate in agent sessions. Claude Code's own context compaction is transparent to Poirot; the compacted JSONL is read identically.

Cross-session handoff

None — Poirot reads but does not write session state. There is no mechanism to inject context from one session into another.

Memory browsing

Poirot reads per-project auto-memory files from .claude/memory/ and renders them as formatted markdown. These are memory files that Claude Code generates; Poirot surfaces them for human review.

07

Orchestration

Poirot — Orchestration

Multi-agent

No. Poirot does not run any AI model or agents. It is a passive observer.

Orchestration pattern

None.

Isolation mechanism

None required — read-only app with no subprocess spawning.

Execution mode

Interactive GUI (passive file reader).

Multi-model

No.

Consensus mechanism

None.

Auto-validators

None.

Note on "AI session summaries" feature

Poirot reads AI-generated session summaries from ~/.claude/usage-data/facets/ — these are generated by Claude Code itself (not by Poirot) as background facet analysis. Poirot renders the pre-computed goal/outcome/helpfulness/friction data. This is the closest Poirot comes to AI involvement, but it is purely consuming Claude Code's existing output.

08

Ui Cli Surface

Poirot — UI & CLI Surface

Desktop app (primary surface)

Poirot is a native macOS SwiftUI application. All value is in the UI.

Design language:

  • Warm golden accent #E8A642 on near-black backgrounds (IDE-like aesthetic)
  • All icons: SF Symbols with bounce/pulse/breathe/wiggle/rotate animations
  • Font scaling: Cmd+/Cmd-/Cmd0 for zoom
  • Full keyboard navigation with discoverable shortcuts
  • Grid and list view toggles throughout

Sidebar navigation:

  • Sessions (session history, analytics, AI summaries, prompt history)
  • Configuration (commands, skills, agents, plugins, output styles, hooks, TODOs, plans, memory)
  • Diagnostic (MCP servers, models, debug logs)

Feature highlights:

Feature Key binding Description
Universal Search Cmd+K Fuzzy search across all categories
In-session search Cmd+F Search within current conversation
Font scale up Cmd++ Zoom entire UI
Font scale down Cmd+-
Help Cmd+? Keyboard reference
Export (toolbar) Session as Markdown or PDF
Open in editor (click) VS Code / Cursor / Xcode / Zed
Terminal jump (click) Terminal / iTerm2 / Warp / Ghostty / Kitty / Alacritty

CLI binary

None.

IDE integration

None (Poirot is standalone). It can open files in IDEs but has no VS Code / Cursor plugin.

Distribution

  • Homebrew Cask: brew install --cask poirot
  • Manual: Build from source with XcodeGen + Xcode
  • Binary size: < 6 MB

Observability from within Poirot

  • Debug Log Viewer: parses ~/.claude/debug/ with color-coded levels, auto-scroll to first error
  • Session Analytics: visual charts of token trends and cost over time
  • AI Session Summaries: goal/outcome/helpfulness/friction indicators per session

Related frameworks

same archetype · same primary tool · same memory type

Goose (Block/AAIF) ★ 46k

General-purpose AI agent (not just code) with security-first tool inspection, recipe-based shareable configurations, and 15+ LLM…

Vibe Kanban ★ 27k

Eliminate the overhead of planning, switching between agent terminals, and reviewing diffs by providing a single web dashboard…

1Code ★ 5.5k

Cursor-like desktop experience for Claude Code and Codex with cloud background agents, event-driven automations, and a full…

Crystal (stravu) ★ 3.1k

Manage multiple parallel AI coding sessions in isolated git worktrees from a single desktop GUI.

Maestro (RunMaestro) ★ 3.0k

Orchestrate unlimited parallel AI agent sessions with a keyboard-first desktop app including Group Chat coordination and Auto Run…

AgentsMesh ★ 2.1k

Multi-tenant workforce platform that gives every team member a squad of AI coding agents coordinated through channels, pod…