GET /api/v1/docs/repositories/{id}/board-views returns { "views": [], "revision": 0 } for an account with no saved views. Views are private to the authenticated account and project. Existing project-board access checks and token scopes apply; repository upload tokens are rejected.
PUT on the same URL accepts the previous revision and an ordered views array. Each entry contains view (the RxCode TaskSavedView Codable shape with empty storyIds) and storyRemoteIDs (cloud story IDs). It returns the stored array and incremented revision. A stale revision returns 409 without writing. Invalid data returns 400. Clients refetch, merge edits/deletions by view UUID against their last successful base, and retry at most twice. Layout is board or table; only one default is allowed. Limits: 100 views, 200 filter values, 200-character names, 100000-character filter scripts. Scripts are stored as text, never executed by this API.
Old clients ignore this endpoint. Mobile retains cached views and freshly fetched tasks on GET 404, and reports that saved-view sync requires an updated server. Explicit edits require a supporting server. The Mac uploads existing local views on its next successful cloud sync. Local story UUIDs are translated to remote IDs before upload and back on each device. Swift filter scripts continue to execute only on desktop.
Deploy the database migration and backend endpoint before releasing clients. No production migration or deployment is performed by preparing this change.
The web board reads these same account preferences, refreshes every 30 seconds while visible and on window focus, and supports board/table views, filters, default selection, and dedicated edit/delete dialogs. Saves use the editor-opening snapshot as the merge base and retry revision conflicts at most twice. Swift scripts remain unchanged and are not executed on web or mobile; both clients disclose that only standard filters apply. iPhone refreshes when the board becomes active and every 30 seconds while visible, and serializes cloud board operations to prevent late reads from overwriting newer edits.
View IDs accept standard UUIDs plus the native built-in Board ID 00000000-0000-0000-0000-00000000B0A7 (case insensitive). Rejecting this stable Foundation UUID prevents native boards containing the implicit Board tab from uploading custom views.