I believe we need a place where people come for positive and constructive interactions — as well as for their own peace of mind and organisation. So I built Agora89. The name comes from an ancient Greek word for a public open space used for assemblies and markets. The "89" is because plain "Agora" was taken, and sometimes you need a two-digit Fibonacci prime — so remember Agora89.
Today's social media is a political and cultural battlefield, and pretty much every app out there is weaponised to be addictive and exploitative. Users are mapped, their data is sold, and under the pretence of a "customisable experience" your mind-state is manufactured for you. As an example, take a look at this actual conversation between a user and Meta AI.
More to come soon…
Stack
Agora89 is a Python/FastAPI application backed by PostgreSQL, Redis, and Celery. The frontend is server-rendered Jinja2 + HTMX + Alpine.js — no single-page framework, no build step, no Node.js runtime in production. We made that choice deliberately: a smaller surface, fewer moving parts, and no transitive npm dependency tree. Everything user-facing is one HTTP round-trip away from the database.
The platform runs on a single Hetzner box behind Caddy, with Postgres,
Redis, the FastAPI app, a Celery worker, and Celery Beat as separate
systemd units. Daily pg_dump → R2 backups are scheduled by cron.
AI Assistant
The assistant is not a coding agent for large codebases. It is built around two strengths: a state-of-the-art memory system and a high-end reasoning model (Anthropic Claude Sonnet for the main turn, Haiku as a fallback and for cheap pre-passes). For administrative work, knowledge retrieval, and bibliographic research that combination is overkill in the best sense — fast, accurate, and cited.
Custom tools cover the parts our users care about: search the news
feed, search posts and the marketplace, search the media library, list
the agenda and reminders, look up profiles, write notes and reminders,
remember and forget facts, and — when warranted — search the open web
via Brave plus Anthropic's native web_search and code_execution
server tools. A monthly €120 hard budget is checked on every request.
Memory system
Memory is the part we put the most thought into. It has three layers:
- Typed facts —
subject / predicate / objecttriplets with one of five fact types (identity, preference, relationship, state, event), per-type TTL, and full supersession lineage (valid_from,valid_to,superseded_by_id). Extracted post-turn by a Haiku Celery task. - Episodic chunks — conversation snippets stored in Postgres with a
pgvectorHNSW index (384-dim MiniLM embeddings) plus atsvectorGIN index for keyword search. Hybrid recall combines cosine0.55+ BM250.30+ recency0.15(30-day half-life). - Active-memory pre-pass — a small Haiku call picks the top ≤20 facts and ≤5 chunks from a candidate pool of 50/10 before the main turn, so the big model sees a curated, relevant slice of memory instead of a blind top-k dump.
Beyond that, server-side compaction summarises older turns once history crosses ~70% of the model's window, keeping the last ten turns verbatim. Cross-channel history (Telegram, Matrix) is encrypted at rest with AES-256.
What we read, what we adopted, what we wrote ourselves
Building the assistant we studied five open-source agent projects. We read them — we did not copy code. Every borrowed idea was re-implemented from scratch in Python/FastAPI to fit our stack. We also explicitly avoided depending on Node.js runtimes or npm packages, even when a reference implementation was JavaScript-first.
| Repo | License | What we adopted | What we explicitly skipped |
|---|---|---|---|
| openclaw/openclaw | MIT, Node/TS | SOUL.md / SYSTEM.md split (voice vs. capability), the active-memory pre-pass concept, slash commands (/new, /compact, /usage, /think), citation rendering, sticky model failover, server-side compaction, skills overlay |
Dreaming (nightly memory consolidation), DM pairing flow, the 20-channel gateway |
| getcompanion-ai/feynman | MIT, TypeScript | Prompt-engineering patterns: integrity commandments, source-verification rubric, a verifier post-pass on citation-bearing replies, scripted workflow slash-commands (/research, /compare, /summarize, /trip) |
The pi-skills Markdown format (we already had a skills mechanism), the Pi runtime itself, alphaXiv research workflow |
| NousResearch/hermes-agent | MIT, Python | Sub-agent delegation (flat depth, restricted toolset, capped concurrency), rolling-window prompt cache (the system_and_3 strategy), cross-session FTS recall with a Haiku summariser |
Atropos RL training pipeline, autonomous skill creation, the React/Ink TUI, the 20+ platform gateway |
| NateBJones-Projects/OB1 | MIT, Python | Driver for the Chroma → pgvector collapse: one Postgres table, single embedder we own, transactional writes, no extra runtime state |
Domain-table sprawl, schema-aware routing, the Aiception layer |
| mem0ai/mem0 | Apache-2.0, Python | The user-facing memory dashboard pattern (top-of-chat toggle → facts / chunks / settings panel) and a lightweight synthetic eval harness (recall@5 / MRR) | Entity-linking from every chunk (would noise the DB; BM25 already covers named entities), single-pass ADD-only extraction (regression vs. our supersession model), shipping mem0 as a library dependency |
What is original to us
Several pieces are not borrowed from any of the above:
- Five typed fact categories with per-type TTL and explicit supersession lineage. None of the reference systems carry temporal validity or formal fact types this way.
- Hybrid recall with weighted recency decay — cosine + BM25 are common; the 30-day half-life on the recency component is ours.
- Per-tier monthly budget wall (€120/mo, hard-enforced per request) with web-search capped at 3 uses per session.
- XML-wrapped tool results as a prompt-injection defence: the model is instructed to ignore instructions found inside tool output.
- Single-database operational story — facts, chunks, embeddings, conversations and channel history all live in one Postgres instance, covered by one backup cron.
Coming soon.