No description
  • TypeScript 82.7%
  • JavaScript 12.3%
  • CSS 3.3%
  • HTML 0.9%
  • Shell 0.5%
  • Other 0.3%
Find a file
Jakob Possert db9e2c4414 chore: reconcile pnpm-lock.yaml after m3-ui merge
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 20:06:12 +02:00
.claude/agents m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
apps fix(m3-ui): handle failed steward/consent/room POSTs with inline error UX 2026-07-17 19:58:36 +02:00
docs transport: fix review — probe-then-patch for matrix crypto stub 2026-07-17 19:20:48 +02:00
packages transport: fix review — probe-then-patch for matrix crypto stub 2026-07-17 19:20:48 +02:00
scripts m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
.env.example m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
.gitignore m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
CLAUDE.md m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
DECISIONS.md decisions: D9 cap UI investment (Jakob has another UI; API is the reusable surface) 2026-07-17 20:00:03 +02:00
docker-compose.yml m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
FUTURE.md m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
Makefile m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
package.json m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
pnpm-lock.yaml chore: reconcile pnpm-lock.yaml after m3-ui merge 2026-07-17 20:06:12 +02:00
pnpm-workspace.yaml m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00
PRIVACY.md docs: README with Privacy Honesty Box + PRIVACY.md ladder (I7, D2 v1 ZK commitment) 2026-07-17 16:41:08 +02:00
README.md docs: README with Privacy Honesty Box + PRIVACY.md ladder (I7, D2 v1 ZK commitment) 2026-07-17 16:41:08 +02:00
tsconfig.base.json m0: monorepo scaffold, compose skeleton (podman), env gate, CLAUDE.md, DECISIONS.md, subagent defs 2026-07-17 16:03:37 +02:00

resource-web — "Does a friend have a screwdriver?"

A weekend-sprint prototype of async, privacy-preserving resource sharing on a Web of Trust.

Every person keeps a private inventory of idle resources on their own device. A friend asks in natural language, any language ("Hat wer einen Akkuschrauber?"). Matching happens on the owner's device — the asker never learns who owns anything. Only the anonymous aggregate comes back: "Yes — someone can help, we let them know." The owner gets a consent ping and decides freely; consent — and only consent — reveals identity and opens a shared Matrix room where the two humans arrange the handover.

Why: idle resources stay idle because of information asymmetry and social friction ("why won't you lend it to me?"). This design closes the asymmetry while protocol-protecting the owner from the social friction of saying no — a declined request and "nobody has one" look byte-identical to the asker.

Privacy Honesty Box

This prototype protects the owner from social exposure by protocol design (indistinguishable No, consent-gated identity). It does not yet protect against: an asker inspecting their own agent's raw traffic (privacy rung 1 fixes this), peers reading request texts (rung 2 fixes this), or homeserver metadata analysis (DIDComm/P2P transport reduces this). Claiming "zero-knowledge" for v0 would be false.

v1 commitment: the next version targets actual zero-knowledge properties — the asker learns only the aggregate, provably; non-matching peers learn nothing about the request. See PRIVACY.md.

Quickstart

Requirements: a container runtime (podman or docker) + compose, node ≥ 20, pnpm, git, make. Optional: a local ollama for LLM matching — without it a keyword fallback keeps the demo alive.

make gate                  # environment check
cp .env.example .env       # defaults are hermetic
pnpm install && pnpm -r build
make up                    # local synapse (+ ollama profile if you want it in-stack)
make demo                  # scripted demo → snapshots/index.html gallery

make revert STEP=04 checks out a step tag and restarts the sim so any demo moment can be replayed live.

Architecture

Two simulated devices (Anna asks, Ben owns), each: React UI → local agent daemon (TypeScript) → Matrix transport. One agent-daemon codebase, N persona configs. Modules meet only in packages/protocol (zod-validated envelope v0.1, request lifecycle, share policies) — transport (Matrix ↔ DIDComm), matcher (LLM ↔ keyword), and store all swap behind interfaces (proven by MockTransport in tests).

Trust edges v0 = seeded trusted_peers.json ("verified in person earlier"); the alignment target for real edges is OpenVTC Verifiable Relationship Credentials (DECISIONS.md D1.1).