Command Palette
Search for a command to run...
Arbtr Architecture
DogfoodingWe use Arbtr to document Arbtr. Here are our own architectural decisions.
This page documents Arbtr's own architectural decisions. It's not just documentation—these are real decisions in our Arbtr instance.
We practice what we preach. Every significant technical choice is recorded, with context, positions considered, and rationale. The relationship graph shows how these decisions connect.
Live data
These decisions are seeded in thearbtr-architecture team. If you're running Arbtr locally, run the seed script to populate this data.The Decision Graph
┌─────────────────────┐
│ Use Next.js │ ◀─────────────────────────────┐
│ [Anchor] │ │
└──────────┬──────────┘ │
┌─────────────┬──────┴──────┬─────────────┐ │
▼ ▼ ▼ ▼ │
┌─────────────────┐ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ Use Supabase │ │ Tailwind │ │ App Router │ │ ReactFlow │ │
│ [Anchor] │ │ [Committed] │ │ [Committed] │ │ [Standard] │ │
└────────┬────────┘ └─────────────┘ └──────────────┘ └──────────────┘ │
│ │
▼ │
┌─────────────────┐ ┌──────────────────┐ │
│ RLS │ ──enables───▶ │ Multi-tenancy │ │
│ [Anchor] │ │ [Anchor] │ │
└─────────────────┘ └──────────────────┘ │
│
┌─────────────────┐ ┌──────────────────┐ │
│ BYOK for AI │ ◀─depends───── │ Magic Paste │ │
│ [Committed] │ │ [Committed] │ │
└─────────────────┘ └──────────────────┘ │
│
┌─────────────────────┐ │
│ Relationships > Votes│ │
│ [Anchor] │ ◀──derived_from────┬─────────────────────────────│
└──────────┬──────────┘ │ │
│ │ │
┌──────────▼──────────┐ ┌───────────┴─────────┐ │
│ Graph-first nav │ │ No arg scores │ │
│ [Committed] │ │ [Committed] │ │
└─────────────────────┘ └─────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────┘
depends_on
Interactive Graph Coming Soon
The full interactive decision graph will be embedded here. For now, explore the decisions below.
Technology Stack
Use Next.js as the web framework
AnchorFull-stack React with SSR, API routes, and App Router
Use Supabase for database and auth
AnchorPostgreSQL with real-time, auth, and RLS in one package
Use Tailwind CSS with shadcn/ui
CommittedUtility-first CSS with copy-paste component ownership
Use TypeScript in strict mode
AnchorFull type safety, no any unless documented
Use App Router over Pages Router
CommittedReact Server Components for better performance
Architecture
Team-based multi-tenancy with slugs
AnchorAll data scoped to teams, human-readable URLs
Row Level Security for data isolation
AnchorDatabase-enforced team isolation, defense in depth
BYOK (Bring Your Own Key) for AI
CommittedUsers provide their own API keys, no AI billing complexity
Client-side graph rendering with ReactFlow
StandardInteractive node graph for decision visualization
Product Philosophy
Relationships over voting as core value
AnchorThe graph of dependencies matters more than vote counts
Graph-first navigation
CommittedUsers navigate through the graph, not list views
Magic Paste for frictionless input
CommittedAI extracts decisions from unstructured text
One-way Git sync (publish only)
StandardArbtr is the editor, Git is the archive
No argument quality scores
CommittedCheck completeness, never rate quality
Running the Seed Script
To populate these decisions in your local Arbtr instance:
# Set your Supabase credentials
export NEXT_PUBLIC_SUPABASE_URL="your-url"
export SUPABASE_SERVICE_ROLE_KEY="your-key"
# Run the seed script
npx tsx scripts/seed-arbtr-architecture.ts
This creates the arbtr-architecture team with all 14 decisions and their relationships.
Why Document Our Own Decisions?
We document our own architectural decisions for three reasons:
- Dogfooding
Using Arbtr to build Arbtr exposes friction points and missing features. If it's painful for us, it's painful for users.
- Demonstration
Real decisions are more compelling than hypotheticals. These show exactly how relationships, domains, and importance levels work.
- Transparency
Open-source means open decisions. Users can see not just what we built, but why we made the choices we did.
Previous
RFC ProcessBack to start
Manifesto