epiq README

The project's README from github.com/ljtn/epiq. As one markdown file: README.md.

Epiq

Epiq is a self-hosted issue tracker that allows you to review workflows in real time or after the fact via replay. It persists state as an immutable event log, versioned and synchronized via Git.

Most issue trackers live outside your workflow. Instead of a centralized, managed service, Epiq offers issue tracking as an integrated part of the development environment offering workflow replay and inline code-diffs, tackling the review bottleneck with time-travel, filtering, and a tight code integration.

Site →

All state is kept local, Git-backed, and versioned.

The Epiq GUI: the event log, the board and a ticket's code diff, under the time travel timeline

Audit the workflow

Agents now run whole sprints unattended. Because state is an event log, you can replay the board to find out what moved when, who moved it, and what changed along the way.

Code, linked to tickets

Prefix a commit's subject with the ticket's ref to link the two:

git commit -m "1YRTG8T ...<some message>"

Linking makes a commit show up in the ticket code-diff tab. You can comment on selected lines, and also file a new ticket straight from the selection. The MCP exploses this reference as a ref property agents can refer to.

A ticket's Commits tab, showing the diff of a linked commit

Preserve the linking post-merge via conventions:

Terminal + Browser

Epiq originated from the command line and offers a first-class terminal experience, but also features a browser interface powered by the same Git-backed event engine.

The Epiq terminal UI: the same board rendered in a terminal, with the command palette along the bottom

How it is different

Fundamental design choices gives a system with:


Installation

Quick install

Binary:

curl -fsSL https://raw.githubusercontent.com/ljtn/epiq/main/install.sh | sh

Installs to ~/.local/bin by default. Override with EPIQ_INSTALL_DIR (or XDG_BIN_HOME); pin a version with EPIQ_VERSION=v1.0.0.

Via npm

npm install --global epiq

Verify

epiq --version

Getting Started in 2 steps

  1. Make sure you're inside a Git repository
# If needed:
git init
# For collaboration, use a repo with a remote (e.g. clone from GitHub)
  1. Run:
epiq

If it is your first run, this opens the interactive setup wizard that sets you up in about 30 seconds.

That’s it!

Once your project is set up, you can also launch the browser user interface with:

epiq gui

On a machine with no display, or with --no-open, it serves without opening a browser; open the URL it prints.

Setup wizard creates: User config persisted in ~/.epiq-global/config.json.

Initialization creates:

  • Project definition in ./.epiq/project.json
  • Authoritative Git state at ~/.epiq-global/worktrees/<id>
  • Updates your .gitignore to ignore local-only .epiq/log/ Epiq manages a dedicated Git state branch and worktree automatically as the source of truth for synchronization.
  • A local debug log at .epiq/log/epiq.log — check it first if sync, boot, or a Git operation is misbehaving.

MCP & Agent Compatibility

Epiq provides a MCP (Model Context Protocol) server for agents to interact with, making it easy to plug into modern agent frameworks. The server is exposed by the epiq-mcp binary that ships with the package.

Claude Code

The reliable way to register the server is with the claude mcp add command — it writes to the correct config file for you, so you don't have to hand-edit JSON:

# Available everywhere (recommended)
claude mcp add --scope user epiq -- npx -y --package=epiq epiq-mcp

# Or only in the current project
claude mcp add epiq -- npx -y --package=epiq epiq-mcp

Verify the connection with claude mcp list (it should report epiq … ✔ Connected). MCP servers are loaded at startup, so restart Claude Code after adding the server before its tools become available.

Skills

Find skill at .claude/skills/epiq/SKILL.md that documents a recommended workflow for working the Epiq board. epiq_skill_install writes the same file into any repository that lacks it, so a project set up from an agent gets the rules too — after epiq_project_init, since init refuses a repository with uncommitted files; it leaves an identical copy alone and refuses to overwrite a differing one unless told to with force.

Agent identity

Every process — your TUI, your GUI, each agent's MCP server - writes as your user, so by default the board cannot tell one agent from another. The MCP allows agents to assume an identity, so at the start of a session, tell your agent which name it should assume.

That agent then shows up in the contributor list, assigns itself rather than you, and authors its own events. This can be useful when tracing many agents at the same time. Consider reusing names instead of inventing one per session, or the registry fills with single-run identities.

Other MCP clients

For clients that are configured by hand, add the following to the client's MCP config file — note this is not the same as Claude Code's ~/.claude.json; Claude Desktop uses claude_desktop_config.json:

{
	"mcpServers": {
		"epiq": {
			"command": "npx",
			"args": ["-y", "-p", "epiq", "epiq-mcp"]
		}
	}
}

Once registered, agents can interact with your local Epiq instance through the MCP.

Sandboxed or network-restricted environments

npx -y -p epiq epiq-mcp resolves the package against the npm registry every time it starts, even if it's already cached locally. In agent sandboxes with restricted network access, this can make the MCP server appear to hang. If you're running Epiq's MCP server in such an environment, install it globally once and point your MCP config at the resolved executable directly, bypassing npx (and the registry lookup) entirely on every subsequent start:

npm install --global epiq
which epiq-mcp   # use this absolute path in your MCP config
{
	"mcpServers": {
		"epiq": {
			"command": "/absolute/path/to/epiq-mcp"
		}
	}
}

npx remains the simpler option for normal, network-connected setups.


How Epiq is synchronized

Epiq uses Git in the background - no manual Git commands are required. Running :sync synchronizes changes between your local state (persisted at ~/.epiq-global/worktrees/<id>/) and the remote state. By utilizing Git worktrees, synchronization stays isolated from your regular development workflow. Project tracking metadata is stored in .epiq/project.json.

Conflict Avoidance & Data Integrity

Epiq is designed to provide robustness in a distributed, Git-backed environment where multiple users may update state concurrently. Instead of mutating shared files, Epiq uses an event-sourced model to prevent merge conflicts and make concurrent changes predictable.

Event-sourced state

All changes are stored as append-only events in user-scoped files, rather than modifying a shared state file. This avoids in-place edits to the same lines and significantly reduces the likelihood of Git conflicts.

State is reconstructed in-memory by replaying a merge of all user logs.

Deterministic materialization

The current state is derived by replaying events in a deterministic order.

Events use a composite of time-sortable IDs (ULIDs) and a reference to the last known event ("edge"). On creation, events are appended relative to the last known event. If multiple events share the same reference point, their relative order is resolved using their time-based IDs.

This approach:

Conflict handling model

Epiq resolves concurrent changes at the event level:

Local-first with eventual consistency

Epiq follows a local-first model:

Frequent synchronization reduces divergence and keeps the system predictable


GitHub Sponsors

🫡 Never leave your editor!

epiq (ljtn/epiq)

Searching Database…

543 ·GitHub
What is this?Epiq is a self-hosted, Git-backed issue tracker that stores all state as an immutable event log, letting you replay a project's workflow in real time or after the fact to see exactly what happened.
Is this a CLI tool or does it have a GUI too?Both: Epiq started as a terminal (TUI) app but also ships a browser interface, and the two share the same Git-backed event engine, so you can work from either.
How do I get it running?Install the epiq binary (quick-install script or npm), then from inside a Git repo just run epiq — the first run launches an interactive setup wizard that configures the project in about 30 seconds; you can also start the browser UI as a separate command.
Do I need an existing Git repo to use Epiq?Yes — Epiq is designed to run inside a Git repository and uses a dedicated Git branch and worktree as its source of truth; it's not meant to be used outside of a repo.
Any gotchas when setting up or syncing?Project init refuses to run in a repo with uncommitted files, and in sandboxed agent environments the default npx install can appear to hang because it re-resolves the package from the npm registry on every start — installing globally and pointing at the resolved binary avoids this.
Can I use Epiq without an internet connection?Yes, Epiq is local-first and works fully offline, syncing to Git only when you explicitly or automatically run a sync and reconciling once connectivity returns.
Does any of my data go through a cloud service?No — Epiq has no accounts or SaaS backend; all state lives locally and is versioned through your own Git repo.
What exactly does workflow replay let me do?Because every change is an append-only event, you can replay the board's history to see who moved what ticket and when, almost like rewinding a recording of the whole sprint.
How does Epiq avoid merge conflicts when multiple agents edit the board at once?Each user or agent writes to their own event log file instead of a shared state file, events carry time-sortable ULIDs plus a reference to the prior event, and later events win on conflict — so Git merges are just combining independent files.
Can several AI agents work on the same project without colliding?Yes — the MCP lets each agent assume a distinct identity at the start of a session, so its actions show up under its own name in the contributor list instead of overwriting the user's.
How do commits link back to tickets?Prefix a commit subject with a ticket's ref (e.g. its ID) to link it; the commit then appears in that ticket's code-diff tab, and you can comment on specific lines or file a new ticket straight from a selection.
Creator
ljtn
Size
80.2 MB
Stars
543
Age
1y
Commits · 90 Days