Ops Notes

Epiq Self-Hosted Git-Backed Issue Tracker: TUI + Web GUI Deployment and Git Event Sourcing Deep Dive

Developer Tools Visualization

What Problem Does This Actually Solve?

Let’s be honest — the issue tracker market is a dumpster fire. Jira is an overpriced elephant, GitHub Issues locks you into Microsoft’s ecosystem, and GitLab CE is a resource hog. My team tried half a dozen solutions last year and walked away disappointed from every single one.

Then I stumbled across Epiq on r/selfhosted — an issue tracker that uses Git as its backend. My first reaction was: “Are they insane? Git is for code, not for tracking bugs.”

But the more I dug in, the more the idea started to click. An issue is fundamentally a sequence of state-change events. So why not store those events as Git commits? Every issue creation, status change, and comment becomes a commit. Self-hosting becomes trivial — you just need a Git repo. No database, no extra services.

The Reddit thread hit 40 points, with the comments section split between “this is brilliant” and “is this actually usable?” I decided to find out the hard way.

Architecture Breakdown: Git as a Database — For Real?

Epiq’s architecture is counterintuitive as hell. It stores all issue state in a branch called state, which contains user-scoped event logs. Each user appends events within their own scope, and synchronization happens via standard Git push/pull.

┌─────────────────────────────────────────────────────────┐
│                    Epiq Architecture                     │
│                                                         │
│   ┌──────────┐     ┌──────────────┐    ┌─────────────┐  │
│   │ Terminal  │     │  Web GUI     │    │  MCP        │  │
│   │ TUI (ASCII)│    │  (Browser)   │    │  Interface  │  │
│   └─────┬────┘     └──────┬───────┘    └──────┬──────┘  │
│         │                 │                   │         │
│         └─────────────────┼───────────────────┘         │
│                           │                             │
│                    ┌──────▼───────┐                     │
│                    │  State Engine│                     │
│                    │  (state br.) │                     │
│                    └──────┬───────┘                     │
│                           │                             │
│                    ┌──────▼───────┐                     │
│                    │  Git Backend │                     │
│                    │  (bare repo) │                     │
│                    └──────────────┘                     │
└─────────────────────────────────────────────────────────┘

The key insight: Epiq doesn’t serialize issue data into Git — it uses Git commits themselves as the event storage medium. Each event is a commit, the commit message is the event type, and the commit content is the payload. This is textbook Event Sourcing.

The good:

  • Natively distributed — clone the repo and work offline
  • Full audit trail — every change has a Git signature
  • Zero database dependency
  • Multi-user collaboration = Git push/pull

The bad:

  • Conflict resolution is a nightmare
  • Query performance is bounded by Git operations
  • No SQL — complex queries require custom scripting

Hands-On Deployment: From Zero to Running

Environment Setup

I deployed on a 2C4G Debian 12 box. Epiq’s official docs recommend the binary over Docker.

# Grab the latest release
curl -LO https://github.com/ljtn/epiq/releases/latest/download/epiq-linux-amd64.tar.gz
tar xzf epiq-linux-amd64.tar.gz
sudo mv epiq /usr/local/bin/

# Verify
epiq --version
# Output: epiq 0.x.x

Initialize the Repository

Epiq needs a bare Git repo as its backend.

# Create bare repo
mkdir -p /srv/epiq/data
cd /srv/epiq/data
git init --bare

# Initialize Epiq state branch
epiq init --repo /srv/epiq/data

This creates a state branch with the initial event log structure.

Multi-User Configuration

User management is Git-based. Each user needs a Git identity.

# Add user alice
epiq user add --name alice --email alice@example.com
# Add user bob
epiq user add --name bob --email bob@example.com

User scopes are isolated — each user’s event log is a separate file in the state branch.

Launch the Web GUI

Epiq ships with a browser GUI powered by the same Git-backed state engine.

# Start web server on port 8080
epiq serve --repo /srv/epiq/data --port 8080 --host 0.0.0.0

Point your browser to http://your-server:8080. The UI is… minimal. But it has filtering, autocomplete, command history, and a command palette. Functional, if not pretty.

TUI Mode

For terminal die-hards (me):

epiq tui --repo /srv/epiq/data

Vim-style keybindings. j/k to navigate, Enter to open, i to create, : for command mode. It feels natural if you live in the terminal.

Real-World Usage: Love It or Hate It?

Team Collaboration Test

Five of us used it for a week. Workflow: clone locally, use TUI, push periodically.

Day one disaster — two people modified the same issue simultaneously. Push conflict. Epiq’s conflict resolution is first-push-wins, latecomer rebases.

# Manual conflict resolution
cd /srv/epiq/data
git checkout state
git pull origin state --rebase
# Resolve conflicts manually
epiq rebase --continue
git push origin state

This flow is brutal for non-Git-native users. Our frontend dev, who only knows add, commit, push, was completely lost.

Performance Benchmarks

I stress-tested it. Response times for epiq list after creating N issues:

Operation100 Issues1000 Issues10000 Issues
List query< 50ms~120ms~800ms
Create issue~30ms~30ms~35ms
Status change~20ms~25ms~30ms
Full-text search~100ms~450ms~3.2s

At 10,000 issues, search crawls. Epiq has no index — it literally walks every commit message.

Comparison with Alternatives

FeatureEpiqGitHub IssuesGitLab IssuesGiteaLinear
Self-hosted✅ Native✅ Heavy✅ Light
Offline work✅ Full
Database neededNoneYesYesYesYes
Multi-userGit push/pullNativeNativeNativeNative
Complex queriesWeakStrongStrongMediumStrong
Learning curveSteepFlatFlatFlatFlat

Community Sentiment: The Raw Truth

The r/selfhosted thread had some brutally honest takes:

The good:

  • “Finally, I don’t have to trust a third party with my issue data”
  • “Offline mode is a lifesaver for plane rides”
  • “The Git workflow integration is seamless”

The bad:

  • “Conflict resolution is prehistoric — good luck onboarding non-Git users”
  • “The web UI looks like it’s from 2005”
  • “Search might as well not exist”

One comment nailed it: Epiq is for tech purists and all-Git workflows. It’s not a general-purpose tool.

FAQ

Does GitHub have an issue tracker?

Yes. GitHub Issues is GitHub’s built-in issue tracking system. It’s feature-rich and well-integrated, but proprietary and hosted on GitHub’s servers. Epiq positions itself as a self-hosted alternative.

Can GitHub be self-hosted?

Strictly, no. GitHub is a SaaS product with no self-hosted version. Alternatives include GitLab CE, Gitea, and Epiq.

What is the Gitea issue tracker?

Gitea is a lightweight self-hosted Git service with a built-in issue tracker similar to GitHub Issues. It’s written in Go, resource-efficient, and easy to deploy. Unlike Epiq, Gitea uses a traditional database backend.

Is Git free and open source?

Yes. Git is free and open-source software under the GPL license. Epiq inherits Git’s open-source nature by using it as its backend.

My Verdict

Epiq is a genuinely novel idea that’s not yet production-ready. Try it if:

  • Your entire team is Git-proficient
  • You need offline capability
  • You want zero database dependencies
  • You don’t care about web UI polish

Otherwise, stick with Gitea or GitLab CE — they’re more mature products.

That said, using Git as a database is the right direction. Data ownership, portability, and audit trails are becoming non-negotiable. Epiq might not be the final answer, but it’s pointing in the right direction.

References & Community Insights

The following authoritative resources were referenced for architectural best practices and specifications:

Elvin Hui

About the Author: Elvin Hui

Elvin is a Senior Infrastructure Engineer with 10+ years of experience spanning data centers, cloud-native architecture, and network security. Certified in CCNA and AWS Solutions Architecture, I focus on turning real-world production "war stories" into actionable, hardcore technical guides.