Alan Wizemann 0344ce2b98 Persist chat terminal across navigation, add session resume
The terminal process now survives sidebar navigation by hoisting
ChatViewModel to the app level via environment injection. The
LocalProcessTerminalView instance lives in the view model rather
than being recreated by NSViewRepresentable each time.

Added session management:
- Session menu with New Session, Continue Last, and Resume by ID
- Recent sessions list pulled from the database
- Hermes --resume and --continue flags for session continuity
- Status indicator showing active/inactive process state
- Empty state prompting user to start or resume a session

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 02:53:47 -04:00

Scarf app icon

Scarf

A native macOS companion app for the Hermes AI agent.
Full visibility into what Hermes is doing, when, and what it creates.

macOS Swift License

Features

  • Dashboard — System health, token usage, cost tracking, recent sessions at a glance
  • Sessions Browser — Full conversation history with message rendering, tool call inspection, and full-text search (FTS5)
  • Activity Feed — Recent tool execution log with filtering by kind (read/edit/execute/fetch/browser) and detail inspector
  • Live Chat — Embedded terminal running hermes chat with full ANSI color and Rich formatting via SwiftTerm
  • Memory Viewer/Editor — View and edit Hermes's MEMORY.md and USER.md with live refresh
  • Skills Browser — Browse all installed skills by category with file content viewer
  • Cron Manager — View scheduled jobs, their status, prompts, and output
  • Log Viewer — Real-time tailing of error and gateway logs with level filtering
  • Settings — Read-only config display with raw YAML viewer and Finder path links
  • Menu Bar — Status icon showing Hermes running state with quick actions

Requirements

  • macOS 26.2+
  • Xcode 26.3+
  • Hermes agent installed at ~/.hermes/

Building

git clone https://github.com/awizemann/scarf.git
cd scarf/scarf
open scarf.xcodeproj

Or from the command line:

xcodebuild -project scarf/scarf.xcodeproj -scheme scarf -configuration Debug build

Architecture

Scarf follows the MVVM-Feature pattern with zero external dependencies beyond SwiftTerm:

scarf/
  Core/
    Models/       Plain data structs (HermesSession, HermesMessage, HermesConfig, etc.)
    Services/     Data access (SQLite reader, file I/O, log tailing, file watcher)
  Features/       Self-contained feature modules
    Dashboard/    System overview and stats
    Sessions/     Conversation browser with detail view
    Activity/     Tool execution feed with inspector
    Chat/         Embedded terminal via SwiftTerm
    Memory/       Memory viewer and editor
    Skills/       Skill browser by category
    Cron/         Scheduled job viewer
    Logs/         Real-time log viewer
    Settings/     Configuration display
  Navigation/     AppCoordinator + SidebarView

Data Sources

Scarf reads Hermes data directly from ~/.hermes/:

Source Format Access
state.db SQLite (WAL mode) Read-only
config.yaml YAML Read-only
memories/*.md Markdown Read/Write
cron/jobs.json JSON Read-only
logs/*.log Text Read-only
gateway_state.json JSON Read-only
skills/ Directory tree Read-only
hermes chat Terminal subprocess Interactive

The app never writes to state.db — it opens in read-only mode to avoid WAL contention with Hermes.

Dependencies

Package Purpose
SwiftTerm Terminal emulator for the Chat feature

Everything else uses system frameworks: SQLite3 C API, Foundation JSON, AttributedString markdown, GCD file watching.

How It Works

Scarf is a passive observer. It watches ~/.hermes/ for file changes and polls the SQLite database for new sessions and messages. The Chat tab spawns hermes chat as a subprocess in a pseudo-terminal, giving you the full interactive Hermes CLI experience with proper ANSI rendering.

The app sandbox is disabled because Scarf needs direct access to ~/.hermes/ and the ability to spawn the Hermes binary.

Contributing

Contributions are welcome. Please open an issue to discuss what you'd like to change before submitting a PR.

  1. Fork the repo
  2. Create your feature branch (git checkout -b feature/my-feature)
  3. Commit your changes (git commit -m 'Add my feature')
  4. Push to the branch (git push origin feature/my-feature)
  5. Open a Pull Request

License

MIT

S
Description
Languages
Swift 88.2%
JavaScript 5.5%
HTML 2.1%
Python 2%
CSS 1.1%
Other 1.1%