Content source for the Bespoken Dashboard's "Product updates" feed
(the /updates page and the notifications bell). Add a post folder here and
list it in index.json — no dashboard deploy required. It shows up the next
time someone loads the dashboard.
One folder per post, grouped by year. Each post's images live next to it.
posts/
2026/
2026-09-21-dtmf-validation/
post.md
2026-10-02-exploratory-testing/
post.md
call-tree.png
index.json
The folder name (2026-10-02-exploratory-testing) is the post's ID. The
dashboard uses it as the URL and to track which posts each user has read.
Don't rename a folder once it's published: its link breaks and the post
can show up as unread again.
-
Create a folder
posts/YYYY/YYYY-MM-DD-slug/(today's date + a short slug, lowercase letters, numbers and dashes), for example:posts/2026/2026-10-02-new-voice-selector/ -
Add a
post.mdinside it with this frontmatter, then the body in Markdown below the---:--- title: Short title for the update description: One-sentence summary shown in the list and notification bell tags: New --- Full write-up goes here. Standard Markdown — headings, bold, links, lists and images all work. 
titleanddescriptionare required.tagsis optional, comma-separated (e.g.tags: New, Feature). Known tags get a color in the dashboard:New,Feature,Improvement,Fix. Any other word still works, just shown in a neutral color.
-
Add the post's path to
index.jsonat the repo root, for example"posts/2026/2026-10-02-new-voice-selector/post.md". Order in the file doesn't matter; the dashboard sorts by date. -
Push to
devfirst and check it on the dev dashboard. When it looks right, open a PR tomain. Once it's onmain, the update is live.
- Put the image in the post's folder and use a relative path:
. Don't use fullraw.githubusercontent.com/...URLs: those are tied to one branch, so the image breaks or shows the wrong version on the other one. - Keep images small. Git keeps every version of every image forever, so a large image makes the repo heavier for good. Resize to about 1600px wide and compress before committing (e.g. Squoosh or TinyPNG). Images over 500 KB fail the check.
- PNG for screenshots, JPG/WebP for photos.
Every push runs node scripts/validate.mjs (GitHub Action). It checks that
every index.json entry exists and has the right path, that each post has a
title and description, that every image a post uses exists in its folder,
and that images are under 500 KB. Run it locally before pushing:
node scripts/validate.mjsSo a new post can go out without anyone needing to touch or deploy the main
dashboard codebase. The dashboard fetches index.json and each listed post
from this repo at runtime — nothing here needs a build step.