Projects and milestones.
Track projects and hit milestones. Structured data, clean API. The kind of internal tool every team ends up building — except this one took three files instead of three sprints.
The permissions are the app. This is the whole data model — schema.ts, the first of the app's three files (its import line, not shown, brings these names in from "create-dillo/schema"):
// The schema the live backend serves today (span2/live-schemas filing, re-verified at deploy).
export default schema({
Milestone: table({
done: boolean().default(false),
due: string().date().optional(),
notes: string().max(500).optional(),
project: relation('Project'),
sortOrder: integer().default(0),
title: string().min(1).max(160),
}).permissions({ view: anyone, edit: owner }),
Project: table({
archived: boolean().default(false),
color: string().max(7).optional(),
description: string().max(500).optional(),
name: string().min(1).max(120),
status: string().min(1).max(24).default('active'),
}).permissions({ view: anyone, edit: owner }),
});