v1.0 — production ready

Issue tracking that stays yours.

Resolvd is a self-hosted ticket and project tracker — none of the Jira bloat, all of the workflow you actually need. Run it on a $5 VPS or in your homelab.

# 60-second install
git clone https://github.com/joshhearne/resolvd.git
cd resolvd
cp .env.example .env  # edit secrets
docker compose up -d --build

Everything you'd expect. Nothing you wouldn't.

Built for engineering, support, and ops teams who've outgrown a spreadsheet but don't want to onboard a sales rep.

🎯

Projects & Tickets

Scoped projects with custom prefixes (WEB-0042). Priority levels P1–P5, custom statuses, internal/external modes.

🔐

Flexible Auth

Microsoft Entra ID, Google OAuth, or local accounts with Argon2. Mix and match. TOTP MFA enforceable per role.

✉️

Email Notifications

Microsoft Graph, Gmail API, or plain SMTP. Followers notified on status changes, comments, and assignments.

💬

Real Collaboration

Comments, @mentions, followers, attachments up to 50 MB. Bulk export, CSV import, audit trail.

👥

Roles & Permissions

Admin, Manager, Submitter, Viewer — with per-project overrides for vendors and external collaborators.

🎨

Custom Branding

Your logo, your color, your site name. Drop-in replacement for the default look.

🐳

Docker-Native

Three services: Postgres, Node backend, React frontend. One docker compose up and you're running.

🏠

Self-Hosted, Always

Your data on your hardware. No SaaS lock-in, no per-seat tax, no vendor surveying your tickets.

Boring stack. On purpose.

No bespoke runtimes, no exotic databases, no proprietary protocols. Components you already know how to operate, monitor, and back up.

  • Postgres 16 for everything: tickets, sessions, branding config. pg_dump is your full backup.
  • Node + Express backend. Argon2 hashing, express-session, Multer uploads.
  • React + Vite + Tailwind frontend, served by nginx in a 30 MB Alpine image.
  • Bring your own TLS — Caddy, nginx, Cloudflare Tunnel, whatever you already run.
┌─ docker-compose.yml ──────────────┐
services:
  postgres: postgres:16-alpine
  backend:  node 22 + express
  frontend: nginx alpine
  nginx:    internal router
└────────────────────────────────────┘
binds 127.0.0.1:8090
volumes: pg-data, uploads
total RAM: ~400 MB idle