“Convention over configuration” hides what a convention actually is: a decision, made
once, by someone else, so ten thousand teams don't each pay to make it again. Chord
keeps its decisions in a public register — numbered, argued, and amendable by RFC.
Each entry records what was chosen, what was rejected, and what evidence would reopen
it. Here are the first twelve.
№
The question you'd have re-decided
Chord's answer
01
Web server
Kestrel. Never asked, never configured, never the bottleneck.
02
Project layout
The tree is the framework's. app/handlers, app/models, app/views, db/migrate, tests. Names are routes; structure is meaning.
03
ORM
EF Core beneath an ActiveRecord-flavored surface. Deal.where(...) reads like Rails, compiles like LINQ.
04
Database
Postgres — wearing four hats. Data, job queue, cache, and pub/sub. One dependency; outgrow a hat before you add a service.
05
Front-end
HTML over the wire. SignalR carries server-rendered partials; a fixed few-KB client morphs the DOM. No bundler, no hydration.
06
Auth
Sessions and passkeys, in the box, database-backed. chord g auth when you want the files in your tree to edit.
07
Background jobs
Hangfire, queued through Postgres, retries and schedules included, visible in the dev dashboard.
08
Mail
MailKit, pre-wired. Every outbound message previewable at /dev/mail before you've sent one.
09
Cache
Postgres unlogged tables. When you outgrow it you'll know, and what to swap in will be obvious.
10
Testing
Generated with every scaffold. One runner — chord test — and system tests that drive a real headless browser.
11
Configuration
Conventions first, environment second, no config trees. If a knob matters, it's a readable file; if it doesn't, it doesn't exist.
12
Dependency injection
The framework's business, not yours. Handlers take a params object; the container is invisible from G#.
13–40 are in the docs. You don't have to read them — that's the product.