v1.0 — production ready

Issue tracking that stays yours.

Source-available ticket and project tracker — none of the Jira bloat, all of the workflow you actually need. Self-host on a $5 VPS, or let us run it for you. Same code either way.

# 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 and new comments. Admins pinged on Pending Review.

💬

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.

📦

Source-available

FSL-1.1 — free to self-host, free for internal commercial use. Auto-converts to Apache 2.0 after 2 years.

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