Repository navigation
Helpdock 0.1.0
The first release: M0 Skeleton and M1 Ticketing core. Helpdock is now a
working staff ticket desk — brands, departments and teams, tickets with a full
workspace, contacts, views and search — behind the tenancy, auth and install
foundations of M0. Customers cannot reach it yet: there is no email channel,
help center or widget. Pre-alpha: expect breaking changes before 1.0.
M1 Ticketing core
- Brands, departments and teams. Ticketing settings per brand, departments
with an Arabic name and a default team, and team members scoped to the
departments they can reach. - Tickets under department scope. Tickets, messages, internal notes and an
activity log under row-level security that hides a department's tickets from
anybody outside it. Every change reaches open screens in real time. - One state machine for every status change, with a per-brand reopen policy,
"awaiting customer" on an agent reply, and escalation. - The ticket workspace. List, thread, composer, details panel and new-ticket
dialog, in English and Arabic, with a collision indicator when two agents are
on the same ticket. - Saved views and search. Personal and shared views with sidebar counts, and
ticket search through a token table (ADR 0011), so a search that finds nothing
stays fast under row-level security. - Contacts and accounts, with verified-only automatic merging, duplicate
suggestions and a 24-hour undo. - Desk tools. Tags, custom fields and templates; round-robin and skill-based
assignment; merge (with a 24-hour unmerge) and split; spam and a sender block
list; time tracking; CSAT rating links; attachments with a media pipeline that
re-encodes images, voice notes and video posters. - Retention. Per-brand retention with a nightly purge and contact
anonymisation.
Upgrade notes
- New, optional:
HD_SETUP_TOKEN. When set (at least 32 characters), the
first-run wizard asks for it as a "Setup key" before it creates the admin
account, so nobody who cannot read the server's.envcan claim a fresh
install. Set it before the host is reachable from the internet. Unset, the
wizard behaves as before. See the install guide. - Development MinIO now comes from Chainguard's public image.
Security
- The first-run wizard can be gated by
HD_SETUP_TOKEN(above). - Fixes for the first CodeQL findings: remote response headers can no longer
write to an object prototype, the SMTP deadline is capped at ten seconds, and
an admin asset path is proven to be inside the build before the file system is
touched.
M0 Skeleton
The foundation every later milestone builds on: an install you can stand up,
sign in to and watch.
- One deploy, many brands, enforced in Postgres. Every tenant table carries
brand_idunder aFORCEd row-level-security policy, every request runs
inside a transaction that sets theapp.*session settings, and every route
declares the permission it needs. A negative test suite proves brand A cannot
read brand B. - Install and run with Docker Compose. One image with
APP_ROLE=api|worker,
a Compose stack with Caddy, Postgres 17 with pgvector, Redis and MinIO, and
on-demand TLS that only answers for a verified help-center domain. - A first-run wizard. A brand-new install lands on four steps: the admin
account, the first brand, outgoing email, done. - Four ways to sign in. Password (argon2id), sign-in link, Google and
GitHub, each with TOTP and recovery codes, rotating refresh tokens in Redis
and "sign out everywhere". - Staff and roles. Admin, Team Leader, Agent and the Viewer toggle, with
invite, activate, role change, deactivate, reactivate, delete and per-brand
removal. - An admin shell in English and Arabic, right-to-left included, with the
System page reporting version, commit, queues and dependency health. - The plumbing later milestones need: a Socket.IO
/staffnamespace with
presence, a transactional outbox with a crash-safe relay, an SSRF-safe
outbound HTTP client, pino logs with request and brand ids, OpenTelemetry and
/metrics.
Not in this release
Email, automation and SLAs, the help center, the widget, the Telegram channel,
AI and the public API. They are M2 to M8 in the PRD.
What's Changed
- chore: add CODEOWNERS by @Docker-Hunterpedia in #1
- docs: add license, README, security policy and contributing guide by @Docker-Hunterpedia in #2
- docs: add DOMAIN-RULES and close PRD review findings by @Docker-Hunterpedia in #3
- docs: start M0 and record ADRs 0001-0005 by @Docker-Hunterpedia in #19
- docs: add DESIGN.md design system and UI rules by @Docker-Hunterpedia in #20
- feat: scaffold monorepo with Turborepo, Biome, Vitest and CI (M0-01) by @Docker-Hunterpedia in #21
- docs: record M0-01 and M0-12 shipped in M0 milestone doc by @Docker-Hunterpedia in #22
- docs: add design-first rule for every screen by @Docker-Hunterpedia in #23
- feat: config loader with secret encryption and settings invalidation (M0-02) by @Docker-Hunterpedia in #25
- feat: add @helpdock/net SSRF-safe outbound HTTP client (M0-15) by @Docker-Hunterpedia in #24
- feat: design tokens, MUI theme and en/ar catalogs (M0-07 foundations) by @Docker-Hunterpedia in #26
- docs: record derivation rules made concrete by packages/ui by @Docker-Hunterpedia in #27
- docs: use Helpdock as the example brand in planning docs by @Docker-Hunterpedia in #29
- feat: Drizzle schema, migrations and row-level security (M0-03) by @Docker-Hunterpedia in #28
- feat: transactional outbox relay and idempotent consumers (M0-14) by @Docker-Hunterpedia in #30
- feat: admin shell with sign-in, two-factor and the empty nav (M0-07) by @Docker-Hunterpedia in #31
- feat: tenancy plumbing and the NestJS application (M0-04) by @Docker-Hunterpedia in #33
- docs: record six more M0 deliverables shipped by @Docker-Hunterpedia in #34
- feat: Docker image, Compose stack and Caddy on-demand TLS (M0-09) by @Docker-Hunterpedia in #35
- feat: staff authentication, sessions and the admin http adapter (M0-05) by @Docker-Hunterpedia in #37
- test: fix stale-snapshot race in the jobs consumer integration suite by @Docker-Hunterpedia in #39
- feat: observability and the admin System page (M0-10) by @Docker-Hunterpedia in #38
- docs: align ARCHITECTURE §14 with the observability implementation by @Docker-Hunterpedia in #40
- feat: roles and the staff lifecycle (M0-06) by @Docker-Hunterpedia in #42
- feat: realtime gateway skeleton, rooms and staff presence (M0-13) by @Docker-Hunterpedia in #44
- feat: first-run wizard for a brand-new install (M0-08) by @Docker-Hunterpedia in #41
- feat: CI, the route input-validation check, screenshot baselines and the M0 close-out (M0-11) by @Docker-Hunterpedia in #60
- test: pin the clock in the relay-status metrics tests by @Docker-Hunterpedia in #62
- docs: start M1 Ticketing core by @Docker-Hunterpedia in #61
- feat: contacts, accounts and the identity seam (M1-04) by @Docker-Hunterpedia in #64
- test: baseline the contacts screens (M1-04) by @Docker-Hunterpedia in #65
- feat: tickets, threads and the activity log (M1-02, M1-03) by @Docker-Hunterpedia in #63
- docs: team membership follows the role-change ceiling by @Docker-Hunterpedia in #68
- feat: brands, departments, teams and team members (M1-01) by @Docker-Hunterpedia in #66
- feat: ticket state machine, escalation and the Statuses tab (M1-08) by @Docker-Hunterpedia in #69
- feat: attachments and the media pipeline (M1-10) by @Docker-Hunterpedia in #71
- feat: tags, custom fields and ticket templates (M1-06) by @Docker-Hunterpedia in #72
- feat: the ticket workspace (M1-15, part 1) by @Docker-Hunterpedia in #70
- feat: assignment, merge and split, spam, CSAT and time, identity rules, retention, and the list gate (M1-07, 09, 11, 12, 13, 14, 15) by @Docker-Hunterpedia in #73
- feat: saved views, search through a token table, and the last workspace gaps (M1-05, M1-15 part 2) by @Docker-Hunterpedia in #74
- feat: tag tickets and edit custom fields in the details panel, and close out M1 (M1-15) by @Docker-Hunterpedia in #75
- Update versioning configuration in changesets.yml by @Docker-Hunterpedia in #76
- feat(security): setup key, CodeQL fixes, and changesets for the rest of M1 by @Docker-Hunterpedia in #78
- chore: version packages by @github-actions[bot] in #77
- ci: run CI as parallel jobs; docs: 0.1.0 release notes by @Docker-Hunterpedia in #79
Full Changelog: https://github.com/Docker-Hunterpedia/Helpdock/commits/v0.1.0