Repository navigation
Helpdock 0.3.0
M4 Widget and realtime and M5 Help center. Customers can now reach the
desk from a brand's own website: an embeddable chat widget, a hosted contact
form, and a bilingual help center on the brand's domain whose articles the
widget searches too.
M4 Widget and realtime
- The chat widget. One
<script type="module" … data-brand>tag. It is a
Preact app in a Shadow DOM, about 26 KB gzipped, with socket.io loaded only
when a conversation starts. It has four modes (chat, chat with suggested
articles, help center only, and contact form), light, dark and auto themes
from the brand's accent, and English and Arabic with right-to-left layout. - Visitor identity and ownership. A server-issued visitor id and a hashed
secret. An optional signed identity comes from the customer's own backend. A
typed email never opens another contact's conversations. - Origin allow-list and rate limits on every widget route and on the socket
handshake. They are set on Channels › Widget. - Delivery you can trust. Messages are deduplicated by client id, carry a
sequence number per conversation, and catch up after a reconnect, with an SSE
fallback. A dropped network, an api restart or a double send leaves exactly
one message. - In the widget: a pre-chat form, business-hours awareness, the transcript
by email, agent name and avatar, and attachments and voice notes within the
brand's content policy. - The hosted web form at
/contact, per brand, with custom fields,
attachments and optional CAPTCHA (Turnstile or hCaptcha). It needs no
JavaScript. - The widget protocol is documented for native apps in
docs/guides/widget-protocol.md.
M5 Help center
- Content: categories, sections and articles with an English and an Arabic
version, drafts, scheduled publishing, and a fallback to the brand's default
language. The admin editor handles headings, tables, callouts, code, images
(re-encoded to WebP), YouTube and Vimeo embeds, and Markdown import and
export. - Visibility: each version is public or internal, and a whole help center
can be internal-only. Internal content never reaches the sitemap, public
search or a public cached page. Staff reach it through a one-minute pass from
the admin. - Pages on the brand's own domain. Custom domains are checked by CNAME and
TXT and get certificates from Caddy on demand. Pages are server-rendered in
both languages and cached, with canonical and hreflang links, Open Graph,
JSON-LD, a sitemap androbots.txt. - Theme: accent colour, logo, favicon, home layout, header and footer
links, and custom CSS, which is filtered through a strict allowlist. - Search in English and Arabic with typo tolerance on titles, plus a search
log that shows what customers looked for and did not find. - Feedback: views and "Was this helpful?" votes, and an Insights tab. From
an article, "Still need help?" opens the widget or the form and tells the
agent which article the customer came from.
Fixes
- A brand added after setup now gets the built-in ticket statuses. Before this
release no ticket could be filed in it, and its widget said it was
unavailable.
Upgrade notes
- Run the migrations (
0030–0035). Restart the worker so it picks up the
help center jobs (publishing, image processing, search indexing). - The image now carries the widget build and serves it at
/widget.js. Set
WIDGET_DIST_DIRonly when you run the api outside the image. - Optional:
HELPCENTER_CNAME_TARGETnames the host customers' help center
domains should point at. It defaults to the host ofAPP_URL. The install
guide's custom domains section has
the DNS steps. - The bundled
Caddyfilechanged. If you keep your own copy, compare it: a
domain marked as proxied by Cloudflare no longer triggers a certificate
request.
Known gaps
Listed in M4 and
M5. The one to know before exposing a help
center: images in internal articles are not access-controlled beyond an
unguessable address.
What's Changed
- feat(widget): the Preact widget app, modes, theming and accessibility (M4-01, M4-11, widget side of M4-05..08) by @Docker-Hunterpedia in #129
- feat(domains): custom help center domains with DNS verification and on-demand TLS (M5-07) by @Docker-Hunterpedia in #131
- feat(widget): widget server, identity, realtime and the live transport (M4-02..08, M4-10) by @Docker-Hunterpedia in #132
- feat(web-form): hosted web form per brand with custom fields and CAPTCHA (M4-09) by @Docker-Hunterpedia in #133
- feat(help-center): content model, article editor and visibility (M5-01, M5-02, M5-09) by @Docker-Hunterpedia in #134
- feat(help-center): search, feedback, Insights and the widget on real content (M5-05, M5-08, M5-10) by @Docker-Hunterpedia in #135
- feat(help-center): server-rendered pages, SEO and site settings (M5-03, M5-04, M5-06) by @Docker-Hunterpedia in #136
- docs: close out M4 Widget and realtime and M5 Help center by @Docker-Hunterpedia in #137
- docs: release notes for 0.3.0 (M4, M5) by @Docker-Hunterpedia in #138
- ci: release automatically when the version PR merges; run widget and api page browser tests by @Docker-Hunterpedia in #139
- chore: version packages by @github-actions[bot] in #130
Full Changelog: v0.2.0...v0.3.0