Ram Farm pre-release

Agent memory that reconciles contradictions. An in-process library: npm i ramfarm, one SQLite file, no daemon.

Locked decisions

Generated from docs/CONTEXT.md, which is where these are actually kept. Nothing here is retyped: if a decision changes there, it changes here on the next deploy.

20 decisions, 3 of them dead. The dead ones are struck through rather than deleted. Two are claims about this project that we killed ourselves, four days apart, after reading a competitor's published tarball instead of their README.

D1 · 2026-08-22

Local-first, not hosted-first. The library is the product; hosted is a demo.

Only realistic audience is the self-host developer crowd. Hosted-first inverts the message and creates opex before there is a reason to carry it.

D2 · 2026-08-22

BYO API key everywhere, including hosted. Waremoto never pays for inference.

The single invariant that makes a free service survivable for a solo operator. (The 'so we can afford an expensive write path' half of this rationale died in phase 0 — Mem0 already spends the call on every write.)

D3 · 2026-08-22

We collect zero memory data. No analytics on content, aggregate or otherwise.

The self-host audience will check. Removes the whole privacy/compliance surface. Secondary to D11 as a differentiator, since Mem0 self-hosted also keeps data in your VPC.

D4 · 2026-08-22

TypeScript, Node 22+, ESM.

One language spans core + MCP server + Cloudflare Worker. MCP ecosystem is TS-native, and MCP is the distribution wedge.

D5 · 2026-08-22

SQLite default, Postgres and D1/Vectorize behind one adapter interface.

Zero-install default; the adapter boundary is the one thing expensive to retrofit.

D6 · 2026-08-22

Relation judgement (DUPLICATE/REFINES/CONTRADICTS/UNRELATED) is an LLM call, not a distance threshold.

Embedding similarity cannot distinguish duplicate from contradiction. Revised same day: this is prior art (Mem0's ADD/UPDATE/DELETE/NOOP), not a differentiator. Kept as the right design; dropped as a marketing claim.

D7 · 2026-08-22

Four memory types (identity/preference/state/reference) drive retention and conflict rules.

Derived from the operator's own .claude/memory/ taxonomy, proven in daily use.

D8 · 2026-08-22

No graph edges between subjects in v1.

Zep's ground; large; not needed to beat append-only vector storage.

D9 · 2026-08-22

No paid tier, no email, no Discord, no team accounts.

Each is a recurring obligation a side project cannot fund.

D10 · 2026-08-22

MCP server ships in phase 1, not later.

It is the distribution wedge — one config block, zero code, exactly our audience.

D11 · 2026-08-22superseded by D18

Positioning is a packaging claim, not an algorithmic one: "one npm install, one file, no server."

Phase 0 gate verified that Mem0 does LLM-judged relation routing and Zep does bi-temporal contradiction invalidation. What survives is that Mem0 self-hosts as 3 containers (incl. Neo4j) and Zep needs a graph DB. See research/competitive-landscape.md §3.

D12 · 2026-08-22

Public comparisons must credit Mem0, Zep, and SAGE as prior art.

Binding rule. Claiming their work loses exactly the readers this project is for.

D13 · 2026-08-22superseded by D18

The headline is "in-process", not "local-first". Ram Farm is a memory library you import; everything else is a memory system you start.

Q7 resolved against us on the words: superlocalmemory's npm description is literally "Local-first agent memory with MCP and an agent-native CLI", shipped 2026-02, 8.1k downloads/month, 219 stars. It is genuinely local. It is also a Python daemon, a private venv, a torch runtime, a web dashboard and 16-94 MCP tools. The axis that separates us is in-process vs operated, and it is checkable in thirty seconds. Refines D11 rather than replacing it.

D14 · 2026-08-22

Apache-2.0 (Q1) is now load-bearing, not incidental. State the license in the comparison table.

SuperLocalMemory is AGPL-3.0-or-later with a paid commercial escape hatch, which excludes anyone embedding memory in a proprietary product. Widest single gap — but a licensing choice they can reverse, so it is stated as a fact and never leaned on as a moat.

D15 · 2026-08-24superseded by D17

Private-first distribution. The project lives at ram.maremoto.dev, gated by Cloudflare Access, until it is robust enough to release. D2's "repo public" is now the second step, not the first.

Still standing: the private half only; the domain choice stands.

Costs $0 — maremoto.dev is an owned zone, so a subdomain is free, which beats the ramfarm.dev purchase recommended in research/naming-alternatives.md §1. It also lets the README and comparison table settle on a real rendered URL before any public claim exists to be wrong about (D12). The repo has no git remote and has never been public, so private is the current state rather than a setting.

D16 · 2026-08-24

ram.maremoto.dev serves documentation, not Ram Farm.

Worth stating because the name implies otherwise. @ramfarm/server does not exist (packages/server/ is empty, D3-gated), and a Worker cannot open a local SQLite file. All D1 testing is local, over stdio and the CLI. Hosting the library is D3+D4 work, not a deploy.

D17 · 2026-08-25

ram.maremoto.dev is public. The Cloudflare Access gate created under D15 was removed on operator instruction; D15's private-first half is superseded.

Operator's call. What it changes: the site is world-readable, so its competitive analysis, phase gates and "one person, no SLA" line are published. noindex is still set, which discourages crawlers and stops nobody. What it does not change: the repo is still not public and nothing is on npm, so D2 is untouched — the site is simply ahead of both, which is the point of letting the writing settle before there is an audience.

D18 · 2026-08-25

The packaging claim is dead; the claim is now semantic. mem0ai/oss is TypeScript, in-process, Apache-2.0, ~422k downloads/month, and its default store is better-sqlite3 at ~/.mem0/vector_store.db. D11 and D13 are both superseded. What Ram Farm still claims: a superseded fact stays queryable (validTo + supersedes[] on the live record, not a delete plus an audit row), a closed type set that mechanically drives conflict rules and decay, and mandatory scope/basis.

Found while writing research/why-not-just-use-theirs.md — the phase-0 gate checked Mem0's Python self-hosting guide, never its npm tarball. The README comparison was unfair in our favour and has been corrected. Stop condition, stated in advance: if D1 shows our judge is no more accurate than mem0's, the remaining difference is two fields, which does not justify a library — adopt mem0ai/oss and close the repo.

D19 · 2026-08-25

Two LLM planes, one provider abstraction. Open plane — BYO key or local Ollama, the default, for strangers. Internal plane — GhostWare's AI Gateway (LiteLLM :4000, virtual keys with budget caps, frozen smart/cheap/local aliases). The gateway is a preset, never a dependency.

Ram Farm's OpenAICompatibleProvider already posts to {baseURL}/chat/completions and {baseURL}/embeddings — which is LiteLLM's surface — so the internal plane is mostly a config preset, not new code. The guardrail restates D2: the moment the library cannot work without a Waremoto endpoint it stops being open-source. The offline CI job is the enforcement. Design: design/ai-gateway-integration.md.

D20 · 2026-08-25

D1 was blocked and nobody noticed. There is no semantic embedder on this host: no embedding model in the gateway's model_list, and Ollama has only qwen3:30b-a3b / qwen3:8b pulled. The embeddings tier is D1's prerequisite, not a detour.

Running D1 as planned would have exercised HashEmbedProvider, produced a store where CONTRADICTS can never fire, and looked healthy. The same config entry also gives GhostWare its first embedding capability of any kind (verified: zero hits for pgvector\|IEmbeddingGenerator\|Embedding across Ghost/src), which is worth more than the memory feature it unblocks.