PAR-189
[Epic] Configurability substrate — workspace settings, per-user prefs, custom fields
The product's #1 differentiator: deep configurability at workspace and per-user level. Today there is no settings infrastructure beyond a browser cookie for status-group order (tesks-ui/lib/prefs.ts).
Design (decided 2026-06-16)
- Storage: a JSONB
settingsblob per workspace and a JSONBprefsblob per user-per-workspace — no migration per new toggle; validated/typed in app code. - Effective config = workspace enables a feature AND the user hasn't opted out (covers "an individual user might not want due dates/sprints").
- Reads come from the mirror (Kysely DAL); writes go through the REST API like everything else. Workspace settings gated on
settings.manage; user prefs editable by any signed-in member for themselves.
Children / scope
- Substrate (this issue, first vertical):
workspace_settings+user_preftables; backendWorkspaceSettingsService+ REST endpoints; UI DAL + actions + a Features section in settings. Proof-of-pattern toggles: voting on/off (workspace-level, enforced inVoteService) and status-group order migrated from cookie → DB (per-user). - Per-user feature opt-outs (
prefs.hiddenFeatures) — mechanism shipped with the substrate; concrete opt-outs wired as optional features land (due dates/sprints from PAR-190). - Join policy (join-any-team-as-contributor vs require lead/admin approval + request-to-join) — follow-up child.
- Configurable status categories (the 6 are hard-coded) — evaluate later.
- Custom fields → split out to its own epic PAR-196.
Feature toggles for not-yet-built features (due dates, sprints) register as those features land (PAR-190); the substrate makes them gateable. Depends on RBAC (PAR-182) for who edits settings.
Resources
- commitbc3f244 Enforce subtasks + due-date feature toggles server-side (PAR-190/PAR-189)ParadauxIO/tesks
- commite4b6f98 Add configurability substrate: workspace settings + user prefs (PAR-189)ParadauxIO/tesks
Comments
tesks · Jun 16, 2026, 4:13 AM
Substrate shipped to develop — the core of this epic is done and verified:
- Backend (tesks
e4b6f98): migration V20 adds JSONBworkspace_settings+user_pref;WorkspaceSettingsServicewrites both (settings gated onsettings.manage; prefs per-user) and exposesvotingEnabled(), enforced inVoteService; RESTPUT /api/w/{slug}/settings+/prefs. 3 tests; backend suite 115 green. - UI (tesks-ui
7833aba):lib/sql/settingsreads from the mirror; a Features section in settings toggles voting; the issue detail hides the VoteControl when voting is off. Status-group order migrated from cookie → DB (per-user-per-workspace), with cookie/default fallback. typecheck + vitest + next build green.
The JSONB substrate + per-user prefs + first real toggle establish the pattern that planning/search features (and the per-user hiddenFeatures opt-out) plug into.
Remaining scope split out: PAR-196 (custom fields) and PAR-197 (team join policy). Configurable status categories is a possible later add. Marking this epic's substrate Pending Release.
tesks · Jun 17, 2026, 4:10 AM
Substrate first vertical verified fully delivered — closing.
- Schema:
workspace_settings+user_prefJSONB tables (V20). - Backend:
WorkspaceSettingsService(settings write gated on settings.manage; user prefs by the acting member) +PUT /settingsand/prefsendpoints. - Proof-of-pattern toggles enforced in business logic, not just UI: voting (
VoteService.castrefuses when off) and sprints (WorkspaceAdminService.createSprint). Subtasks/due-dates enforcement landed alongside PAR-190. - UI:
lib/sql/settings.tsDAL +lib/actions/settings.ts+ a Features section in settings (settings.manage-gated); vote UI gated onsettings.voting; status-group order migrated from cookie → per-user DB prefs (prefs.server.ts). - Per-user opt-out mechanism (
prefs.hiddenFeatures) exists.
Explicitly out of scope here (their own items): custom fields → PAR-196, team join policy → PAR-197.
Activity
- tesks changed status to Status → Done
- tesks commented
- ParadauxIO linked a commit — Commit bc3f244 — Enforce subtasks + due-date feature toggles server-side (PAR-190/PAR-189)
- ParadauxIO linked a commit — Commit e4b6f98 — Add configurability substrate: workspace settings + user prefs (PAR-189)
- tesks changed status to Status → Pending Release
- tesks commented
- tesks description: Description updated
- tesks changed status to Status → In Progress
- tesks created the issue