Dev Wiki
Dashboard
Changelog
Documentation
Toggle dark mode
Settings
Home
A - Z
Page Index
Archive
AWS Design
Async Embedding Pipeline
Auth
CDN Read Path
E-1 Cold Start Benchmarks
Implementation Phases
Lambda Library Mode
Operations
Phase 0 EFS Benchmarks
Phase Gates
Platform Overview
Semantic Search
AWS Tasks
E-2 CDN Read Path
E-2 CDN Read Path ClientSide
Launch Checklist
P1-9 MCP OAuth Discovery Routing
P1-9 MCP OAuth Routing
Phase 0
Phase 1
Phase 2
Phase 3
Phase 4
Prerequisites
Bugs
Semantic Search Background Sync
Design
Admin Panel Reenablement
Auth
Custom Domains
Dashboard Visibility Toggle
Data Model
E-3 Encryption Spike
E2E Testing
Frontend
Git HTTP Access
Implementation Workflow
Landing Page
MCP Server
Note Schema
Operations
P2-Username Summary
Per Wiki Database
Platform Overview
REST API
Research Wiki
Resolver
Semantic Search V2
Server Consolidation
VPS Architecture
Wiki Stats Plugin
did web Identity
Dev
2026-03-16 Beta User TLS Fix
Claude Code Memory Backup
Memory Bootstrap Guide
P1-8 E2E Test
P2-10 Summary
P2-1 Summary
P2-2 Summary
P2-3 Summary
P2-4 Summary
P2-5a Summary
P2-5b-7 Summary
P2-6 Summary
P2-8 Summary
P2-9 Summary
Phase 1 Deployment
Phase 1 Gate Results
Phase 1 Progress
Proxmox CPU Type
Underscore Filenames
V1-3 Deployment Summary
V1 SQLite Port Summary
V3 ATProto Auth Summary
V3 V5 Risk Research
V6-1 Landing Page Summary
V7 Ops Hardening
VPS Deployment Progress
VS-1 ATProto Spike
VS-2 MCP OAuth Summary
DiagTestPage
E2ETestPage
Home
Meta
Wiki Usage Guide
Minsky
Agent IRC Architecture
Directed Message Routing
IRC MCP Bridge
Plans
CI CD Pipeline
Disk Usage Caps
Login Page UX
Monitoring Dashboard
Permissions Panel Implementation
Rate Limiting And Security Headers
Security Logging
Wiki To Dashboard Navigation
Security
OWASP 2025 Audit
Tasks
Disk Usage Cap
Emergent
MCP Wiki Routing
Semantic Search Architecture
Semantic Search Multi Tenant
VPS Phases
To-Do
UserBPage
irc-plugin-design-review
An Otter Wiki
Design
Page Index
Toggle page headings
A
Admin Panel Reenablement
Background
Panel Status
Already working (no changes needed)
Re-enable now: Permissions panel (medium effort)
Phase 2: User Management (high effort)
Keep disabled: Mail Preferences
Implementation Order
Auth
MCP Auth
ACL Model
Authorization Flow
Public wiki access
Otterwiki Admin Panel — Section Disposition
C
Custom Domains
Scope
Database Schema
DNS Verification
TLS (Caddy)
Tenant Resolution
Authentication on Custom Domains
Solution: Redirect-based auth relay
Auth changes required
Relay token security
Logout
Management UI
Implementation Phases
Risks
D
Dashboard Visibility Toggle
Problem
Design
Mechanism
Read
Write
Staleness
Implementation
Files to change
UI placement
What NOT to do
Edge cases
Relationship to otterwiki admin panel
Data Model
Users
Wikis
ACLs
Storage layout (EFS)
Git Storage Mechanics
EFS-backed git repos
Fallback: S3 clone-on-demand
Semantic Search
Embedding pipeline (summary)
FAISS details
Cost estimate
URL Structure
Custom slugs (paid wikis)
Usernames
Username squatting
did web Identity
Context
Components
1. Platform DID document (did:web:robot.wtf)
2. Per-wiki DID documents (did:web:{slug}.robot.wtf)
3. One-time login route
4. CLI bootstrap tool
5. Shared JWK utility
Files changed
Tests
Verification
Future: per-wiki keys
E
E-3 Encryption Spike
Problem
Storage Layers
Approaches Evaluated
1. EFS Encryption at Rest (Single KMS Key)
2. Per-Tenant SSE-KMS on S3 Fragments
3. Separate EFS Filesystems Per Tenant
4. Application-Level Encryption on EFS
5. Full Client-Side Encryption (Zero-Knowledge)
CDN Caching Interaction
KMS Cost Model at Scale
Recommendation
For Launch
Per-User KMS Becomes Viable When
Full Zero-Knowledge: Conditions for Revisiting
Precedents Referenced
E2E Testing
Current State
Blocked On
Plan After Consolidation
Step 1: Simplify conftest.py
Step 2: Add new fixtures
Step 3: Implement 11 additional tests
Auth flows (test_auth_flows.py, 3 tests)
Wiki lifecycle (test_wiki_lifecycle.py, 4 tests — already written)
Account management (test_account.py, 3 tests — already written)
MCP consent (test_account.py, 1 test — already written, marked skip)
Step 4: Verify existing test files
Step 5: Run full suite
Architecture Notes
Mock PDS
Test mode env vars
Docker vs mock
F
Frontend
What the frontend actually is
URL Scheme
Namespace implications
Impact on existing design documents
Authentication
Cross-subdomain auth via parent-domain cookie
OAuth flow
JWT details
How the SPA knows if you're logged in
Framework
Recommendation: Svelte (not SvelteKit)
Build tooling
Bundle budget
Screens
Dashboard (/app/)
Create wiki (/app/new)
Wiki settings (/app/{slug})
Collaborators (/app/{slug}/collaborators)
MCP connection instructions (/app/{slug}/connect)
Account settings (/app/account)
Otterwiki Admin Panel Boundary
Error Handling
Static Hosting and Routing
Build and Deploy
Mobile
Upstream Contributions
Open Questions
G
Git HTTP Access
Current State
What exists in otterwiki (upstream)
What exists in robot.wtf
The auth gap
Proposed Design
Reuse MCP bearer tokens for git auth
Why this works
Implementation
Read-only for v1
Access control
Use Cases
Relationship to Template Repo
Risks
Implementation Phases
I
Implementation Workflow
Principles
Pipeline per task
0. Setup (orchestrator, before any agents)
1. Plan (Sonnet Plan agent)
2. Implement (Sonnet agent, worktree isolation)
3. Chico review (Sonnet agent)
4. Zeppo review (Sonnet agent)
5. Fix (Sonnet agent, same worktree)
6. Re-review (Sonnet agents, mandatory if Fix made changes)
7. Verify (Sonnet agent)
8. Report
Task list structure
Agent prompts
What NOT to do
L
Landing Page
Design principles
Technical requirements
System font stack suggestion
Logo
Page structure
1. Header / nav
2. Hero
3. "What is this?" section
4. "How it works" section
5. FAQ section
6. Footer
Color and styling notes
What to deliver
Out of scope for initial build
M
MCP Server
Component 3: MCP Server
Goal
Implementation
Tools
Configuration
Tool return format and error handling
SSE endpoint
N
Note Schema
Note Schema
Field definitions
Cross-references: WikiLinks are the single source of truth
Page organization
Cross-referencing
Page size guidance
Complete example page
Master Index Convention
Purpose
Structure
Example
Size budget
Orphan detection
Session start protocol
Gardening sessions
Open Questions
O
Operations
Initial pages
Customization
Custom template repos (premium)
Attachment Storage
MVP approach
Future optimization: external attachment storage
Git Remote Access
Hosted Git remote
Implementation
External Git sync (premium, future)
Otterwiki Fork Management
Merge strategy
Upstream relationship
Backup and Disaster Recovery
What we're protecting
Backup strategy
Design principle
Account Lifecycle
Data retention
Account deletion
GDPR
MCP Discoverability
Rate Limiting and Abuse Prevention
P
P2-Username Summary
Summary
Changes
Infrastructure (infra/components/dynamodb.py)
User Model (app/models/user.py)
Auth Middleware (app/auth/middleware.py)
Management API (app/management/routes.py)
CLI (app/cli/main.py)
Resolver (app/otterwiki/resolver.py)
Test Coverage
Branch
Per Wiki Database
Decision (2026-03-17)
Current State
What the resolver swaps today
Option A: Per-Request DB Swap (implementing now)
Storage layout
Mechanism
Schema initialization
Permission model
DID-as-email
Migration
Risks
Option B: Upstream Contextvars Refactor (future PR to redimp)
Core idea
What stays the same
Migration path
Phasing
Upstream pitch
Constraint
SQLite Multi-Tenant: Why It's Fine
Platform Overview
Overview
Context
Why this exists
Key users
Multi-Tenancy Model
Routing
Application Logic
Semantic Search
R
REST API
Component 1: REST API Plugin
Goal
Implementation approach
Authentication
Commit authorship and message conventions
Endpoints
Pages
Search
Links (WikiLink graph)
Changelog
WikiLink parsing and link graph
Error responses
Example requests and responses
List pages: GET /api/v1/pages?prefix=Trends/
Read page: GET /api/v1/pages/Trends/Iran Attrition Strategy
Write page: PUT /api/v1/pages/Events/2026-03-09 Day 10
Full-text search: GET /api/v1/search?q=ballistic+missile+rationing
Semantic search: GET /api/v1/semantic-search?q=strategy+for+depleting+Gulf+air+defenses&n=3
Research Wiki
Overview
Context
What is Otterwiki?
Why this system?
Key users
Architecture
Deployment
Docker Compose
Implementation Sequence
Phase 1: Investigate plugin system (30 min)
Phase 2: REST API (core deliverable)
Phase 3: Chroma integration
Phase 4: MCP server
Phase 5: Docker compose and deployment
Success Criteria
Resolver
What it does, in order
Why it's complex
The storage swap problem
The database swap problem
The multi-worker problem
The default database problem
Key data structures
Per-wiki SQLite DB (/srv/data/wikis/{slug}/wiki.db)
Auth result dict
Auth paths
Access restriction flow
Known limitations
Related pages
S
Semantic Search V2
Problem
Constraints
Design
Change 1: Section-aware chunking
Change 2: Return full chunk text in search results
Change 3: Configurable per-page deduplication
Change 4: Section-level read via MCP
Agent workflow after these changes
Implementation scope
Deployment notes
What this design does NOT address
Server Consolidation
Motivation
Current Architecture
Target Architecture
What Changes
New: app/platform_server.py
Removed
Modified
Unchanged
ManagementMiddleware Handling
Template Directory Structure
Database Connection Strategy
Rate Limiting
Session and Cookie
E2E Testing Impact
Implementation Sequence
Risks and Review Findings
Template migration (important)
App factory interface (resolved)
Error handlers (important)
Deployment strategy (important)
Caddyfile management (resolved)
Hardcoded service references (important)
Environment variables (important)
ProxyFix (minor)
Confirmed correct
V
VPS Architecture
Why this exists
Service model
Infrastructure
Server
Process model
Caddy
Why not Nginx
Authentication
Identity model
Username defaulting
ATProto OAuth (browser login)
Reference implementation
MCP OAuth (Claude.ai)
MCP protected resource metadata
Bearer tokens (Claude Code / API)
Cross-subdomain auth
Auth convergence
Migration off ATProto
Data Model
SQLite replaces DynamoDB
Tables
Storage layout
Compute
Otterwiki (WSGI)
MCP sidecar (FastMCP)
Platform API (Flask)
Auth service (Flask)
Semantic Search
Write path
Search path
Model loading strategy
Backup and Disaster Recovery
What we're protecting
Backup strategy
Recovery
Deployment
Application deployment
Initial setup
Monitoring
URL Structure
Namespace rules
What changes vs. what stays the same
Stays the same
Changes
What can be reused from existing implementation
Open Questions
W
Wiki Stats Plugin
Problem
Approach
Why a plugin
Why per-wiki DB (not robot.db)
Schema
Plugin hooks
otterwiki_after_page_save(pagepath, content, author)
otterwiki_after_page_delete(pagepath, author)
Setup hook
Resolver integration
Cron backstop
Open questions
Not implementing yet
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9