diff --git a/src/web/public/index.html b/src/web/public/index.html
index 0c96a5a2..94ea56e8 100644
--- a/src/web/public/index.html
+++ b/src/web/public/index.html
@@ -1148,13 +1148,26 @@
Enable experimental Agent Teams for all new Claude sessions (disabled by default)
+
+ Claude Model
+
+ Default (CLI setting)
+ Fable 5 (1M context)
+ Fable 5
+ Opus (1M context)
+ Opus
+ Sonnet
+ Haiku
+
+ Model for new Claude sessions (pinned via the case's .claude/settings.local.json) — takes precedence over the 1M Opus toggle below
+
1M Opus Context
- Use 1M token context window (model: opus[1m]) for all new sessions
+ Use 1M token context window (model: opus[1m]) for all new sessions — ignored when a Claude Model is selected above
Thinking Effort
@@ -1203,6 +1216,7 @@
Default Model
Default (CLI default)
+ Fable 5 (Most powerful)
Opus (Most capable)
Sonnet (Balanced)
Haiku (Fast & cheap)
@@ -1226,6 +1240,7 @@
Haiku
Sonnet
Opus
+ Fable 5
Quick searches, codebase exploration
@@ -1236,6 +1251,7 @@
Haiku
Sonnet
Opus
+ Fable 5
Code writing, feature implementation
@@ -1246,6 +1262,7 @@
Haiku
Sonnet
Opus
+ Fable 5
Writing and running tests
@@ -1256,6 +1273,7 @@
Haiku
Sonnet
Opus
+ Fable 5
Code review, quality checks
diff --git a/src/web/public/session-ui.js b/src/web/public/session-ui.js
index 7a43a544..8063490e 100644
--- a/src/web/public/session-ui.js
+++ b/src/web/public/session-ui.js
@@ -354,8 +354,10 @@ Object.assign(CodemanApp.prototype, {
const envOverrides = this.buildEnvOverrides(caseSettings, globalSettings);
const hasEnvOverrides = Object.keys(envOverrides).length > 0;
const effort = this.getEffortSetting(globalSettings);
+ // Explicit Claude Model choice (App Settings) wins over the legacy 1M Opus
+ // toggles; both flow as `modelOverride` → the case's .claude/settings.local.json
const useOpus1m = caseSettings.opusContext1m || globalSettings.opusContext1mEnabled;
- const modelOverride = useOpus1m ? 'opus[1m]' : '';
+ const modelOverride = globalSettings.claudeModel || (useOpus1m ? 'opus[1m]' : '');
// Step 1: Create all sessions in parallel
this.terminal.writeln(`\x1b[90m Creating ${tabCount} session(s)...\x1b[0m`);
diff --git a/src/web/public/settings-ui.js b/src/web/public/settings-ui.js
index 60f3600e..db3e47b5 100644
--- a/src/web/public/settings-ui.js
+++ b/src/web/public/settings-ui.js
@@ -345,6 +345,7 @@ Object.assign(CodemanApp.prototype, {
settings.codexDangerouslyBypassApprovals ?? false;
// Claude Permissions settings
document.getElementById('appSettingsAgentTeams').checked = settings.agentTeamsEnabled ?? false;
+ document.getElementById('appSettingsClaudeModel').value = settings.claudeModel ?? '';
document.getElementById('appSettingsOpusContext1m').checked = settings.opusContext1mEnabled ?? false;
document.getElementById('appSettingsThinkingEffort').value = settings.thinkingEffort ?? '';
// CPU Priority settings
@@ -1349,6 +1350,7 @@ Object.assign(CodemanApp.prototype, {
codexDangerouslyBypassApprovals: document.getElementById('appSettingsCodexDangerouslyBypassApprovals').checked,
// Claude Permissions settings
agentTeamsEnabled: document.getElementById('appSettingsAgentTeams').checked,
+ claudeModel: document.getElementById('appSettingsClaudeModel').value,
opusContext1mEnabled: document.getElementById('appSettingsOpusContext1m').checked,
thinkingEffort: document.getElementById('appSettingsThinkingEffort').value,
// CPU Priority settings
diff --git a/src/web/schemas.ts b/src/web/schemas.ts
index a1e9c7c2..78f454cb 100644
--- a/src/web/schemas.ts
+++ b/src/web/schemas.ts
@@ -305,6 +305,8 @@ export const SettingsUpdateSchema = z
tunnelEnabled: z.boolean().optional(),
tabTwoRows: z.boolean().optional(),
agentTeamsEnabled: z.boolean().optional(),
+ /** Model for new Claude sessions (e.g. "claude-fable-5[1m]", "opus[1m]"); takes precedence over opusContext1mEnabled */
+ claudeModel: z.string().max(50).optional(),
opusContext1mEnabled: z.boolean().optional(),
thinkingEffort: z.string().max(20).optional(),
// UI visibility