Public snapshot @ c8064ba16166
4370cfb7b7e0 wikihub 2026-04-10
4370cfb7b7e0fd7c5bca37cf6c0bde612ddd34a9
beads-vs-wikihub-architecture.md
new file mode 100644
index 0000000..b728b39
@@ -0,0 +1,61 @@
+---
+title: Beads vs WikiHub Architecture — Source-of-Truth Comparison
+visibility: public
+---
+
+# Beads (Steve Yegge) vs WikiHub — Source-of-Truth Comparison
+
+**Date:** 2026-04-10
+**Status:** Decided
+
+## Context
+
+Both Beads and WikiHub use the same three-layer pattern — a fast queryable store, a text-serialized git-trackable export, and git hooks/plumbing to keep them in sync. But they flip the source-of-truth direction.
+
+## The shared pattern
+
+1. A fast queryable store (SQLite / Postgres)
+2. A text-serialized git-trackable export (JSONL / markdown files)
+3. Git hooks or plumbing to keep them in sync
+
+## The inversion
+
+| | Beads | WikiHub |
+|---|---|---|
+| **Source of truth** | SQLite | Git bare repos |
+| **Derived/export** | JSONL (for git tracking) | Postgres (metadata + search index) |
+| **Why this direction** | Issue fields are structured data — queries need to be fast | Wiki pages are authored markdown — users expect `git clone` |
+| **Bidirectionality** | Fully symmetric | Asymmetric by design — private content only in Postgres |
+| **Content duplication** | Yes — same data in both | **No** — public in git only, private in Postgres only |
+
+## Why WikiHub chose git-as-truth
+
+The whole thesis of WikiHub vs Notion/Google Docs is that **the wiki IS a git repo**. Real commits, real history, real `git clone`. If Postgres were the truth and git just an export, you'd have a slightly fancier ListHub.
+
+Beads can afford SQLite-as-truth because nobody cares about the git history of an issue tracker. WikiHub users — Karpathy-wiki people, Obsidian vault owners — care about `git log`, `git blame`, and offline editing.
+
+## WikiHub's no-duplication model
+
+- **Public pages:** content in git ONLY. Postgres has metadata/search. Reads via `git cat-file blob`.
+- **Private pages:** content in Postgres ONLY (`private_content` column). Never enters git.
+- **Visibility change** moves content between stores, never copies.
+
+Postgres is rebuildable from git for public content. Private content + social graph are non-rebuildable — both backups required.
+
+## What WikiHub steals from Beads
+
+- **`.wikihub/events.jsonl`** — audit events as append-only JSONL in git
+- **Line-oriented formats** under `.wikihub/` — merge-friendly
+- **Hash-based IDs** via nanoid
+- **Daemon pattern** for concurrent CLI access
+
+## Open question: defer `git push` → Postgres to v2?
+
+If nobody pushes via git in early days, defer the post-receive hook. Keep web→git sync only. Cuts half the complexity.
+
+## Sources
+
+- [Steve Yegge — Beads](https://github.com/steveyegge/beads)
+- [Introducing Beads — Medium](https://steve-yegge.medium.com/introducing-beads-a-coding-agent-memory-system-637d7d92514a)
+- WikiHub: `app/git_sync.py`, `hooks/post-receive`
+- Fork C session (2026-04-08)
\ No newline at end of file
index.md
new file mode 100644
index 0000000..a6f5761
@@ -0,0 +1,39 @@
+---
+title: Knowledge Publishing Architecture
+visibility: public
+---
+
+# Knowledge Publishing Architecture
+
+A living knowledge base of design decisions, trade-offs, and architectural patterns for **ListHub** and **WikiHub** — two products that share DNA but optimize for different things.
+
+## What this is
+
+A Karpathy-style LLM wiki: a markdown knowledge base that grows over time as we make decisions, discover patterns, and learn from implementation.
+
+## Index
+
+### Architecture
+- [[beads-vs-wikihub-architecture]] — Steve Yegge's Beads (SQLite→JSONL) vs WikiHub (git→Postgres)
+- [[two-bare-repos-per-wiki]] — Authoritative + public mirror architecture
+- [[post-receive-vs-plumbing]] — No-loop sync invariant
+
+### Data Model
+- [[acl-codeowners-pattern]] — `.wikihub/acl` glob-based permissions
+- [[visibility-modes]] — The 8-mode vocabulary
+
+### ListHub Specific
+- [[listhub-db-git-mirror-pattern]] — DB source-of-truth + one-way per-user bare git mirrors
+
+### Open Questions
+- [[milkdown-editor]] — Rich editor choice
+- [[deployment-domain]] — wikihub.globalbr.ai? Separate Lightsail?
+- [[concurrent-edit-posture]] — Last-write-wins vs git-merge vs optimistic-lock
+- [[events-jsonl-scope]] — v1 or v2?
+
+## Products covered
+
+| Product | Stack | Live |
+|---------|-------|------|
+| **ListHub** | Flask + SQLite + Jinja | listhub.globalbr.ai |
+| **WikiHub** | Flask + Postgres + Jinja + bare git | wikihub.globalbr.ai |
\ No newline at end of file
wiki/agent-friendly-apps.md
new file mode 100644
index 0000000..27a0de3
@@ -0,0 +1,82 @@
+---
+tags:
+- agents
+- tools
+- mcp
+- cli
+- directory
+title: Agent-Friendly Apps Directory
+visibility: public
+---
+
+# Agent-Friendly Apps Directory
+
+A curated directory of apps and services that work well with AI coding agents. Originally maintained on [ListHub](https://listhub.globalbr.ai/@jacobreal/agent-friendly-apps).
+
+## What makes an app "agent-friendly"?
+
+- **Config-file interfaces** — JSON, YAML, or TOML config instead of GUI-only settings
+- **CLI access** — command-line tools that agents can invoke
+- **API-first** — REST/GraphQL APIs for programmatic control
+- **MCP servers** — Model Context Protocol integration for direct agent access
+
+## Mac Apps
+
+| App | Why it's agent-friendly |
+|-----|------------------------|
+| [Karabiner-Elements](https://karabiner-elements.pqrs.org/) | JSON config-based key remapping |
+| [Espanso](https://espanso.org/) | YAML text expansion with CLI |
+| [Hammerspoon](https://www.hammerspoon.org/) | Lua-scripted macOS automation |
+| [AeroSpace](https://github.com/nicklockwood/AeroSpace) | Config-file tiling window manager |
+| [Ghostty](https://ghostty.org/) | Config-based terminal emulator |
+| [1Password CLI](https://developer.1password.com/docs/cli/) | Terminal credential management (`op` command) |
+| [Peekaboo](https://github.com/steipete/peekaboo) | macOS app inspection via MCP server |
+| [superwhisper](https://superwhisper.com/) | Voice-to-text with CLI integration |
+
+## Cloud Services (CLI/API-first)
+
+| Service | Agent interface |
+|---------|----------------|
+| GitHub | `gh` CLI, full API, MCP servers |
+| Cloudflare | Fully API-driven DNS, Workers, R2 |
+| AWS | Complete CLI/SDK automation |
+| Fly.io | CLI-first platform |
+| Vercel | CLI deployment + management API |
+| Supabase | Fully API-driven Postgres/Auth/Storage |
+| Tailscale | Mesh VPN with CLI |
+| Linear | Issue tracker with excellent API/CLI |
+
+## AI Coding Agents
+
+| Tool | Description |
+|------|-------------|
+| [Claude Code](https://claude.com/claude-code) | Anthropic's CLI coding agent |
+| [Codex CLI](https://github.com/openai/codex) | OpenAI's lightweight agent |
+| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Google's terminal agent |
+| [Cursor](https://cursor.com/) | AI-native code editor |
+
+## Communication APIs
+
+| Service | Capabilities |
+|---------|-------------|
+| Twilio | SMS/voice/WhatsApp API |
+| Telegram | Bot API |
+| Slack | API, bot framework, MCP servers |
+
+## Not Agent-Friendly (With Alternatives)
+
+| Tool | Problem | Alternative |
+|------|---------|-------------|
+| Keyboard Maestro | Binary GUI config | Hammerspoon |
+| TextExpander | GUI-only | Espanso |
+| Rectangle Pro | GUI-only | AeroSpace |
+
+## Standards & Directories
+
+- [llms.txt](https://llmstxt.org/) — LLM-friendly site standard
+- [Model Context Protocol](https://modelcontextprotocol.io/) — Agent tool protocol
+- [Composio Agentic Tools](https://directory.composio.dev/) — Agent tools directory
+
+---
+
+*Source: [ListHub](https://listhub.globalbr.ai/@jacobreal/agent-friendly-apps) · Last synced: 2026-04-10*
\ No newline at end of file