v0.7.0 — 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.

🖥️

Inventory + Action1

Top-level Inventory across every managed machine. Action1 connector pulls endpoints, installed software, security posture (patches, vulns, reboot required). Twelve seeded asset types + admin-defined customs + per-source custom-field mapping.

Learn more
📚

Knowledge Base

Per-project articles in a BlockNote rich editor. Version history with one-click restore. pg_trgm suggestion ranker auto-surfaces matching articles on tickets; Promote-to-KB drafts a new article from any ticket's resolution.

Learn more
🚨

Alerts + Rules

Deduped state-machined view of every problem from Zabbix, Action1, or a generic webhook. Per-source rules pick which severities auto-promote to tickets (promote / notify-only / ignore). Dashboard widget lists top open.

Learn more
⏱️

SLA Tracker

Response + resolve clocks per priority. Pre-breach warnings at 80%, business-hours clocks, escalation chains, auto-assignment (round-robin / case-load / specific). Vendor-vs-internal wait split on the dashboard.

Learn more

BYO-AI Rewrites

Bring your own OpenAI / Anthropic / Ollama key. ✨ AI button on every composer — tone, verbosity, ELI5. Per-project glossary primes the model with your lingo. Org-managed key + lock + usage badge for cost transparency.

Learn more
✉️

Email-to-Ticket

Email #PREFIX to create tickets, or scope a mailbox to one project so inbound mail without a prefix auto-creates there. Dedup against recent open tickets, signature + reply-marker stripping, per-account banner-strip presets. M365 Graph, Gmail API, or SMTP.

Learn more
💬

Mentions + Notifications

@ autocomplete subscribes mentioned users. 6×3 channel matrix (in-app / email / push) per event with email digest cadence — instant, hourly, 12h, or daily. Browser push via VAPID + service worker.

🤝

Vendor CRM

Companies + contacts scoped per project. Admin-gated Notify Vendor button. Per-vendor pill colors hashed from company id. Auto-mute noisy vendor replies into a daily digest at the configured local time.

Learn more

Bulk Edit & Merge

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

🔐

Flexible Auth + Hardening

Microsoft Entra, Google OAuth, or local with Argon2id. TOTP MFA per role. Login hardened with per-IP rate limit, persistent block on credential stuffing, honeypot + sub-800ms dwell rejection, session regeneration, CSP + HSTS.

🔒

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.

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