Summary
Lists on interlinedlist.com are structured data with typed columns. The Windows app treats every row as a freeform JSON blob (Views/ListsView.xaml has an inline JSON editor), because CLAUDE.md records the schema DSL as "only partially reverse engineered ... not implemented".
That blocker is stale. The DSL is now fully published at /help/api/lists-dsl, and both endpoints answer the bearer sync-token.
Live verification (2026-09-15, test account)
GET /api/lists/{id}/schema -> 200 {"data":{"name":"New list","fields":[]}}
The contract
GET /api/lists/{id}/schema — read the schema as DSL.
PUT /api/lists/{id}/schema — two body shapes, selected by payload:
- a
schema DSL object → destructive rebuild (wipes and recreates all columns);
- a
properties array → non-destructive small edits (rename a label, add/remove one column) preserving row data.
POST /api/lists also accepts schema at create time.
The DSL
{ "name": "Books to Read", "description": "My reading backlog.",
"fields": [
{ "key": "title", "type": "text", "label": "Title", "required": true },
{ "key": "year", "type": "number", "label": "Year" },
{ "key": "read", "type": "boolean", "label": "Read", "defaultValue": false }
] }
fields must contain at least one column; keys must be unique.
- Field props:
key, type, label (required) + required, defaultValue, options, placeholder, helpText, validation, visible, visibility, displayOrder.
- Twelve types:
text, textarea, number, boolean, date, datetime, email, url, tel, select, multiselect, priority.
- Row data (
POST /api/lists/{id}/data) is keyed by each column's key, not its label.
Why this matters
Every other list feature — typed row entry, Powered Templates, Create from…, GitHub-backed lists, saved views — assumes real columns exist. This epic is the foundation for them.
Repo conventions to follow
- Service: one
partial class InterlinedApiClient file per domain in InterlinedList/Services/.
- Wire types in
InterlinedList/Models/ matching real API JSON.
- ViewModel per view in
InterlinedList/ViewModels/ (CommunityToolkit.Mvvm ObservableObject + [RelayCommand]).
- View is a self-contained
UserControl in InterlinedList/Views/ that news up its own VM from AppServices.Session.
- Strata tokens only — no colors/fonts/radii outside
Resources/Palette.xaml + Theme.*.xaml.
- Read-after-write for any mutating endpoint whose response envelope has not been live-verified.
Summary
Lists on
interlinedlist.comare structured data with typed columns. The Windows app treats every row as a freeform JSON blob (Views/ListsView.xamlhas an inline JSON editor), becauseCLAUDE.mdrecords the schema DSL as "only partially reverse engineered ... not implemented".That blocker is stale. The DSL is now fully published at
/help/api/lists-dsl, and both endpoints answer the bearer sync-token.Live verification (2026-09-15, test account)
The contract
GET /api/lists/{id}/schema— read the schema as DSL.PUT /api/lists/{id}/schema— two body shapes, selected by payload:schemaDSL object → destructive rebuild (wipes and recreates all columns);propertiesarray → non-destructive small edits (rename a label, add/remove one column) preserving row data.POST /api/listsalso acceptsschemaat create time.The DSL
{ "name": "Books to Read", "description": "My reading backlog.", "fields": [ { "key": "title", "type": "text", "label": "Title", "required": true }, { "key": "year", "type": "number", "label": "Year" }, { "key": "read", "type": "boolean", "label": "Read", "defaultValue": false } ] }fieldsmust contain at least one column;keys must be unique.key,type,label(required) +required,defaultValue,options,placeholder,helpText,validation,visible,visibility,displayOrder.text,textarea,number,boolean,date,datetime,email,url,tel,select,multiselect,priority.POST /api/lists/{id}/data) is keyed by each column'skey, not its label.Why this matters
Every other list feature — typed row entry, Powered Templates, Create from…, GitHub-backed lists, saved views — assumes real columns exist. This epic is the foundation for them.
Repo conventions to follow
partial class InterlinedApiClientfile per domain inInterlinedList/Services/.InterlinedList/Models/matching real API JSON.InterlinedList/ViewModels/(CommunityToolkit.MvvmObservableObject+[RelayCommand]).UserControlinInterlinedList/Views/that news up its own VM fromAppServices.Session.Resources/Palette.xaml+Theme.*.xaml.