You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Feature Request: Global Defaults with Per-Project Overrides #58
Currently, Mode, Agent, Model, Effort, and Turns must be configured manually for each project.
It would be useful to support global default values that are automatically applied to all projects, while still allowing project-specific overrides when needed.
Any new project would automatically inherit these values.
For a specific project, only the settings that need to differ would be overridden:
project:
model: Sonnetturns: 10
Effective configuration:
mode: Task # inheritedagent: Single # inheritedmodel: Sonnet # overriddeneffort: Auto # inheritedturns: 10# overridden
Benefits
Avoid reconfiguring the same settings for every project.
Ensure consistency across projects.
Allow project-specific tuning when necessary.
Improve workflow for users who primarily work with the same Mode, Agent, and Model combination.
Suggested UI
Add a Global Defaults section in Settings.
Apply defaults automatically to newly created projects.
Allow projects to override any setting.
Add a Reset to Defaults button at project level.
Visually indicate overridden values (badge, icon, tooltip, different color, etc.).
Example
Many users always work with:
Mode: Task
Agent: Single
Model: Opus
Effort: Auto
Turns: 5
Today, these values must be manually selected every time a project is created or opened.
With global defaults, projects would start with the preferred configuration automatically, while retaining the flexibility to override specific settings when needed.
The chain — project override > global default (config.json) > BUILTIN, resolved by a new pure module chat-defaults.js. The five dials are Mode, Agent, Model, Effort and Turns.
All five asks are covered:
Global Defaults in Settings — five rows in the settings catalog (section: 'defaults'), so the existing generic form renders them with source badges and a per-row Reset.
Auto-applied — a new chat, a project switch and a page reload all seed the toolbar from the resolved defaults instead of the literals that used to sit in newTab().
Per-project override — the ★ button pins the current five dials to the active project; PUT /api/projects/:id/defaults.
Reset to Defaults — the ↺ button next to it, shown only when something is actually pinned.
Override indicator — an accent border and a dot on the toolbar group label of each pinned dial.
The per-project link is deliberately sparse: a project stores only the dials it pinned, so an unpinned dial keeps following the global when the global changes. A full five-key snapshot would have frozen each project at whatever the global happened to be the day it was created.
BUILTIN is the pre-#58 behaviour verbatim, so an install that never opens the settings form behaves exactly as before. An existing chat is never re-seeded — it carries its own mode/model in SQLite.
The diff went through an independent cross-provider review before merge, which caught a real precedence bug: the two config files were spread together raw, so a local empty value could mask a valid global one and fall through to the built-in instead of to the global. Fixed in the second commit, along with unifying the turns coercion between the settings form and the resolver.
Tests: test/chat-defaults.test.js (53 assertions, pure resolver) and test/chat-defaults-api.test.js (51 assertions, real server with both config layers on disk). Full suite: 63 files, 1858 assertions, CI green.
Activity
feat: global new-chat defaults with per-project overrides (#58) (#62)
Lexus2016 commentedon Aug 23, 2026
Shipped in #62 (
a696098).The chain —
project override > global default (config.json) > BUILTIN, resolved by a new pure modulechat-defaults.js. The five dials are Mode, Agent, Model, Effort and Turns.All five asks are covered:
section: 'defaults'), so the existing generic form renders them with source badges and a per-row Reset.newTab().PUT /api/projects/:id/defaults.The per-project link is deliberately sparse: a project stores only the dials it pinned, so an unpinned dial keeps following the global when the global changes. A full five-key snapshot would have frozen each project at whatever the global happened to be the day it was created.
BUILTINis the pre-#58 behaviour verbatim, so an install that never opens the settings form behaves exactly as before. An existing chat is never re-seeded — it carries its own mode/model in SQLite.The diff went through an independent cross-provider review before merge, which caught a real precedence bug: the two config files were spread together raw, so a local empty value could mask a valid global one and fall through to the built-in instead of to the global. Fixed in the second commit, along with unifying the
turnscoercion between the settings form and the resolver.Tests:
test/chat-defaults.test.js(53 assertions, pure resolver) andtest/chat-defaults-api.test.js(51 assertions, real server with both config layers on disk). Full suite: 63 files, 1858 assertions, CI green.chore: release 7.7.0 — the #58 chain reaches the server, not just the…
Merge #81: a chat remembers its turn budget and effort