A Discourse-style forum for Solid pods — categories, topics, and threaded replies, stored as JSON-LD you own. One self-contained app, no build step.
Sister to forum (which is Discord-style —
realtime chat channels). discuss is the long-form, threaded side: read a category,
open a topic, follow the thread.
Sign in with xlogin — Solid-OIDC (WebID) or nostr.
Shared-pod, multi-user: one pod hosts the forum, any authenticated user can post.
The forum lives on the signed-in user's pod — resolved from the WebID's
pim:storage (falling back to the WebID origin) — so the app works whether it's
served from the pod itself or from somewhere else (e.g. github.io).
/public/discuss/index.jsonld forum meta + category list
/public/discuss/c/<cat>/<topicId>/topic.jsonld the opening post
/public/discuss/c/<cat>/<topicId>/<postId>.jsonld one file per reply (append-only)
/public/discuss/c/<cat>/<topicId>/like_<target>_<user>.jsonld one file per like
/public/discuss/.acl owner Control; AuthenticatedAgent Append
One file per reply means many people can post concurrently without overwriting each other — the container just collects everyone's docs.
MVP complete — full read/write on a pod. Built in phases:
- 1. Scaffold — light-theme Discourse layout, three views (Categories → Topics → Topic thread) over hardcoded sample data, hash router.
- 2. Auth — xlogin wired up; header shows identity (avatar + name + sign-out).
- 3. Categories — categories read from
/public/discuss/index.jsonld; a fresh forum is seeded (index +.acl+ a welcome topic) on the owner's first visit. Opened without a writable pod (e.g. github.io, signed out) it falls back to a read-only demo. - 4. Topics — per-category container; topic list + inline New topic form that
PUTs
c/<cat>/<topicId>/topic.jsonld. - 5. Replies — topic thread reads every reply doc in the container and renders them
chronologically; the composer PUTs one JSON-LD
schema:Commentper reply (append-only). - 6. Polish — relative activity times; per-post likes (append-only
schema:LikeActiondocs, one file per user per post, toggle = PUT/DELETE); new/unread badges on the topic list (tracked inlocalStorageby reply count, no extra fetches). - 7. Power features
- Edit / delete your own posts — author-gated (compares
schema:authorto your WebID); edits stampschema:dateModified; deleting an OP removes the whole topic. - Markdown in post bodies — bold, italic,
code, fenced blocks, links (http/https only), blockquotes, lists, headings,@mentions. Escape-first renderer, no injection. - Last activity + last poster per topic row (one extra fetch of the newest reply, found via time-sortable filenames).
- Quote any post → prefills the composer with an attributed blockquote.
- Category management — create / rename / recolor categories from the UI (writes
index.jsonld).
- Edit / delete your own posts — author-gated (compares
Static — open index.html, or install to a pod (e.g. /public/apps/discuss/). The app
data (/public/discuss/) is independent of where the app code is installed.