Repository navigation
Helpdock 0.5.0
M10 Meta channels, and the code half of M9 Hardening: the fixes from
the internal pre-pentest review, the gaps the ASVS L2 re-walk of Telegram, AI
and the API found, the automated accessibility audit, and four follow-ups M6
and M7 had left open. What still needs a person before 1.0 is listed under
known gaps.
M10 Meta channels
- WhatsApp numbers, Facebook Pages and Instagram professional accounts are
ticket channels. A customer's message opens a ticket or continues the
conversation's open one, and an agent's public reply, text and files, goes
back on the same platform through the outbox. Images, video, documents,
voice notes and stickers arrive on the ticket; locations and shared
contacts are filed as text. The first message of a reply opens with the
agent's first name and the brand. - One webhook for the install. Every post from Meta is checked against
the app secret before it is parsed, routed to the account it names, filed
within the request and answered at once. Channels › Meta shows the callback
URL and the verify token to paste into Meta's dashboard. - Connect an account per platform on Channels › Meta by pasting the
dashboard's token, test it before saving and route it to a department.
Once an hour a job checks the token and the webhook subscription; the
account's page offers Subscribe now and Reconnect when Meta drops
either. - The reply window. A reply outside Meta's 24-hour window is refused when
it is written, and the ticket view says how long the window stays open. A
person's reply to a Messenger or Instagram customer between 24 hours and
7 days goes out with Meta's Human Agent tag when the account's switch is
on. - Delivery states on every reply: sent, delivered and read as Meta
reports them,failedwith Retry, andrefusedin Meta's words when the
window had closed. - Identities. The ticket view shows which number, Page or account a
ticket is with, the customer's platform id, phone, name or handle, and
which of them is verified. Messenger and Instagram names are looked up by
a job and kept once they arrive. - The whole of it is in
docs/guides/meta-channels.md: what each
platform needs, what Meta charges for WhatsApp, App Review, and developing
without Meta.
M9 Hardening
- Visitor addresses behind a proxy.
TRUST_PROXYnow takes a list of
proxy addresses, CIDRs or the namesloopback,linklocaland
uniquelocal, so the api believes the hop from Caddy and not an address a
client wrote intoX-Forwarded-For. The Cloudflare Caddyfile trusts
Cloudflare's published ranges and forwards the visitor's address. - Widget sockets spend a budget of 120 events a minute per visitor, and a
visitor's sockets are closed when their signed identity is withdrawn or
changed. - OAuth sign-in is bound to the browser that started it by a ten-minute
cookie. - API keys can expire (
expiresAtwhen one is created), a refused key
leaves a trace in the audit log, an API key gets 403 instead of 500 on
routes that act for a person, andwebhooks:manageno longer reads data on
its own. - Brands scheduled for deletion. During the 30-day grace, the brand's API
keys answer 410 and its webhook deliveries are skipped. - Model addresses are checked when saved: https, and no private, loopback
or metadata address unless its range is inOUTBOUND_ALLOW_CIDRS. - Retention purges finished webhook deliveries and sent or failed Telegram
replies after 30 days, and storedIdempotency-Keyanswers after 24 hours.
"Anonymise contact" also erases the contact's Telegram chats, the redaction
maps of AI calls on their tickets and the webhook deliveries that carry
their data. - Uploaded and Google Drive DOCX files are refused past 1,000 entries or
100 MiB unpacked. JSON answers carryCache-Control: no-store. A Notion or
Google Drive connection callback works once. - Accessibility. Zoom, reflow, forced colours, screen-reader markup and
mixed-direction text are checked by Playwright on the widget and the help
center in both languages, and what they found is fixed
(record). The ASVS L2 record
reads 198 Met, 35 Partial and 0 Gap (record).
Gaps closed from M6 and M7
- Telegram bots have their own language prompt.
/startasks for English
or Arabic with the bot's question, edited on the bot's page under
Channels › Telegram. - The widget's handoff line says when the team is back. A visitor writing
out of hours after a handoff reads when the team is away until, by the
department's calendar, else the brand's. A conversation carries the new
optionalhours. - The ticket list says what the assistant did. A row's caption ends with
"AI paused" or "AI answered". - Agent assist sends the brand's Arabic system prompt for an Arabic
ticket, as auto-reply already did.
Upgrade notes
- Run the migrations (
0048–0052). Restart the worker so it picks up the
Meta jobs (sending, media, profile names and the hourly health check). - The Compose file now sets
TRUST_PROXY=uniquelocalinstead oftrue.
truestill works and still believes every hop. Behind Cloudflare, copy the
newdocker/caddy/Caddyfile.cloudflareand rundocker compose up -d
(install guide); behind a proxy
of your own, list its address
(install guide). - API keys that manage webhooks need the read scope of the endpoint's
events (tickets:read,contacts:readorarticles:read), or they get
403webhook-event-scope. Endpoints that already exist keep delivering. - Keys already issued never expire; set
expiresAtthrough the API when you
want one to. - A Google or GitHub sign-in begun just before the upgrade has to be started
again. - To connect a Meta account, set the Meta app's id and secret in
.env
(HD_META_APP_ID,HD_META_APP_SECRET) and restart the api and the worker;
there is no Meta section on the Settings screen in this release
(the four settings).
Optional:META_GRAPH_VERSION,META_GRAPH_API_ROOTand
META_INSTAGRAM_API_ROOT, whose defaults are Meta's.
Known gaps
- The Meta channels have not been run against a real Meta app yet. CI
uses a stand-in for the Graph API. The milestone document lists what only a
real run settles: which secret signs Instagram webhooks (both are tried),
the exact closed-window error code, whether Business Verification is
required for App Review, and whether a Page the operator administers returns
a customer's name without the profile feature. Until an install has been
through App Review, a Messenger contact can be "Messenger user" with its
id. - WhatsApp templates (M10-09), which reach a customer after the window,
come in a later release; the satisfaction survey is not sent on these
channels until they do. - What still needs a person before 1.0: the external pentest
(scope), the screen-reader pass
(runbook), the load-test host run, the
clean-VM onboarding run with outside testers, and the restore drill for the
record (M9). - The rest is listed in
M10.
What's Changed
- feat: sign release images with GitHub OIDC by @Docker-Hunterpedia in #162
- fix: reduce CI feedback time by @Docker-Hunterpedia in #163
- fix: skip full CI for docs-only PRs by @Docker-Hunterpedia in #164
- test: stabilize completed settings screenshots by @Docker-Hunterpedia in #166
- feat: M9 hardening towards 1.0 — pre-pentest fixes, ASVS re-walk and gap fixes, accessibility automation, and the M6/M7 gaps by @Docker-Hunterpedia in #167
- feat: M10 Meta channels — WhatsApp, Messenger and Instagram as ticket channels by @Docker-Hunterpedia in #168
- docs: pentest statement of work (M9-01) and the screen-reader pass runbook (M9-04) by @Docker-Hunterpedia in #170
- docs: release notes for 0.5.0, and the missing 0.4.0 and 0.3.1 sections by @Docker-Hunterpedia in #172
- chore: version packages by @github-actions[bot] in #169
Full Changelog: v0.4.0...v0.5.0