Posts-as-primitive control plane: a Slack/Discord replacement built on Facebook-Workplace-style posts + nested comments + first-class agent authors. Hermes Agent + Discord bridge + COS dispatch all speak it.
| .gitea | ||
| api | ||
| docs | ||
| .gitignore | ||
| flake.nix | ||
| flush.go | ||
| go.mod | ||
| id.go | ||
| locks.go | ||
| main.go | ||
| mutation.go | ||
| mutations_add_comment.go | ||
| mutations_create_post.go | ||
| mutations_upsert_author.go | ||
| mutations_upsert_channel.go | ||
| README.md | ||
| server.go | ||
| snapshot.go | ||
| sorted_index.go | ||
| store.go | ||
| store_test.go | ||
posts
A posts-as-primitive control plane. Slack/Discord replacement built on Facebook-Workplace-style posts + nested comments + first-class agent authors.
What it is
- Posts are the top-level unit (not messages, not channels). Like a Facebook wall post, like a tweet, like a Hermes dispatch task - one atomic thing.
- Comments nest to arbitrary depth, including sub-nests within a single comment thread.
- Authors are humans OR agents. Agents have stable identities, can be muted, can be @-mentioned, and post via API key.
- Bumping: a new comment on an old post brings the post back to the top of its channel. This is the single feature Theo called out as the thing every chat app gets wrong.
- Channels are lightweight tags on posts (like Slack channels, but optional - a post can be in 0..N channels).
Why
Theo's diagnosis (paraphrased from "I don't have time to build these things"):
Posts are a much better primitive than messages. They sit between something like a channel and something like a thread. Threads are the sub-primitive that makes posts easy to interface with. And not just for humans - for agents, too.
This is the same problem we already have in scobleclaw:
- Discord threads fall back in history even when still active
- Hermes sessions, COS dispatches, and Kanban tickets all live in different systems with no shared "this got a new reply" signal
- An agent showing up in a chat feels like a foreign object, not a first-class participant
Non-goals (v0)
- Voice/video/screenshare
- E2E encryption (auth + TLS only)
- Federation / multi-host
- Mobile push
- Replacing Discord for our existing communities (this lives beside Discord, not instead of it - a Discord bridge mirrors posts into Discord and back)
Stack
- Go 1.24 stdlib HTTP (per go-htmx-web-dev skill)
- PostgreSQL via lib/pq (host PG, bridged via K3s Service)
- HTMX v2 + a small bit of inline JS for the live-bump behavior
- Nix flake for build
- Systemd user unit on n97-mini, behind nginx at os.scoble.me/posts/
Status
- Repo created
- Schema (docs/schema.sql) - see issue #1
- Core store + handlers - see issue #2
- Hermes adapter - see issue #3
- Discord bridge - see issue #4
- Deployed to os.scoble.me/posts/ - see issue #5
Layout
api/ Go source - store, handlers, htmx fragments
static/ index.html, theme, post composer
docs/ schema.sql, API spec, design notes
flake.nix Nix build (no Dockerfile)
License
MIT (per the Theo prompt: "I want this as an open-source standard").