Features
Cards
The first-class entity: number, due date with zone, branch and favourite.
Inside a workspace, the card is the first-class entity: the model is inverted with respect to Trello, where everything hangs off a board. Here, a project is an optional filter label; a card with no project is a normal state, not an error.
The #42 number
id is a cuid; number is the nickname people cite in a commit or a conversation. It comes from a PostgreSQL sequence, is never reused (deleting #42 does not make the next card #42) and is unique across the whole installation.
A due date carries the zone it was declared in
A card keeps dueAt (the instant) and dueAtZone (the zone the date was chosen in). That pair is what makes the same day hold for every reader: without the zone, a due date set at 11pm in São Paulo would show up the next day for whoever reads it in UTC.
A zone with no date does not exist
The two fields travel together. In a PATCH, an absent dueAtZone preserves the stored zone: it does not fall back to the caller's zone.
The favourite is personal
The star is not a fact about the card: it is a record between the account and the card. Two readers get different values in favorite for the same card: the client reads a boolean, and it is the answer for whoever asked.
The fields
Things to watch for
- An absent field is not touched. Clearing takes an explicit value (
null), which is what lets you send{ favorite: true }alone. - Changing column writes history; reordering within the same column writes nothing.
- Entering an epic with a date target may inherit the due date, and overwriting a date already chosen takes
alignDueAt: true. - A batch edit refuses as a whole. If one card breaks a rule, none is changed.