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…

544 ·GitHub
这是什么?Epiq 是一个自托管、以 Git 为后端的问题跟踪器,把所有状态存为不可变的事件日志,让你可以实时或事后回放项目的工作流,确切看到发生了什么。
这是 CLI 工具,还是也有图形界面?两者都有:Epiq 起源于终端(TUI)应用,但也带浏览器界面,两者共用同一个基于 Git 的事件引擎,你可以任选其一来工作。
怎么让它跑起来?安装 epiq 二进制(快速安装脚本或 npm),然后在一个 Git 仓库里直接运行 epiq——首次运行会启动交互式设置向导,约 30 秒即可配置好项目;浏览器界面也可以用单独的命令启动。
使用 Epiq 需要已有的 Git 仓库吗?需要——Epiq 设计为在 Git 仓库内运行,用一个专用的 Git 分支和工作树作为事实来源;它不适合在仓库外使用。
安装或同步时有什么坑?项目初始化会拒绝在有未提交文件的仓库中运行;在沙箱化的智能体环境里,默认的 npx 安装可能看起来卡住了,因为它每次启动都重新从 npm registry 解析包——改为全局安装并指向解析出的二进制即可避免。
没有网络连接也能用 Epiq 吗?可以,Epiq 是本地优先的,完全离线可用,只在你显式或自动运行同步时才同步到 Git,等联网恢复后再进行协调。
我的数据会经过云服务吗?不会——Epiq 没有账号或 SaaS 后端;所有状态都保存在本地,并通过你自己的 Git 仓库做版本管理。
工作流回放具体能让我做什么?因为每次变更都是只追加的事件,你可以回放看板的历史,看到谁在什么时候移动了哪张工单,几乎就像倒带重看整个迭代的录像。
多个智能体同时编辑看板时,Epiq 如何避免合并冲突?每个用户或智能体写入自己的事件日志文件而不是共享状态文件,事件带有可按时间排序的 ULID 和对前一个事件的引用,冲突时后到的事件胜出——因此 Git 合并只是合并相互独立的文件。
多个 AI 智能体能在同一个项目上工作而不互相冲突吗?可以——MCP 让每个智能体在会话开始时认领一个独立身份,它的操作会以自己的名字出现在贡献者列表中,而不是覆盖用户的。
提交怎么关联回工单?在提交标题前加上工单的引用(比如它的 ID)即可建立关联;该提交随后会出现在那张工单的代码差异标签页里,你还可以针对选中的具体行评论,或直接从选中内容新建工单。
Creator
ljtn
Size
80.2 MB
Stars
544
Age
1y
Commits · 90 Days