v0.4.2 — latest release

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). P1–P5 priorities, semantic status chain with one-click Advance, auto-close grace, move between projects, inline title edit.

Bulk Edit & Merge

Admin Bulk Edit toggle adds checkboxes — change status / assignee / project across up to 500 tickets in one shot. Search-driven Merge picker collapses dupes by ref, title, or description.

📝

Markdown Comments

GitHub Flavored Markdown editor with Write / Preview tabs, formatting toolbar, and Ctrl+B / Ctrl+I / Ctrl+Enter shortcuts. Mobile toolbar collapses to the essentials.

💬

@Mentions + Push

Type @ for project-scoped autocomplete. Mentioned users auto-follow and get in-app notification, email, and (opt-in) browser push via VAPID + service worker.

✉️

Email-to-Ticket

Email #PREFIX to create tickets. Dedup against recent open tickets, signature + reply-marker stripping, CC auto-attach. M365 Graph, Gmail API, or SMTP.

Learn more
📬

Helpdesk Routing

Scope a mailbox to one project — inbound mail without #PREFIX auto-creates there. Per-account banner-strip presets (Inky, Mimecast, Proofpoint, Avanan) clean inbound bodies.

Learn more
🤝

Vendor CRM

Companies + contacts scoped per project. Admin-gated Notify Vendor button. Per-vendor pill colors hashed from company id — same vendor, same color across users.

Learn more
🔕

Mute + Daily Digest

Auto-mute noisy vendor replies on a ticket. Followers don't get paged; muted comments collapse into the thread and surface in a daily digest at the configured local time.

Learn more
🔐

Flexible Auth

Microsoft Entra ID, Google OAuth (Workspace + consumer), or local accounts with Argon2. TOTP MFA enforceable per role; lockout after 8 failed attempts.

🛡️

JIT Support Access

Support principals blocked until an admin approves a 1–14 day grant. Read-only by default. Every fine-grained access (ticket views, attachment downloads) lands in the audit log.

🔒

Encryption at Rest

AES-256-GCM envelope encryption with per-row data keys. HMAC blind index keeps title search working under encryption. Off / Standard / Vault modes.

📞

NATO Phonetic Readback

Hover any ticket ref to spell it for vendor calls — WEB-0079 → "Whiskey Echo Bravo · 0 0 7 9". Org + per-user toggles. Pair with AlphabetSoup for general spelling.

Visit

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