Settings
-
-
- {/* Default SSH Key Directory */}
-
-
Default SSH Key Directory
-
- Mounted into all containers unless overridden by a per-project setting.
-
-
setSshKeyPath(e.target.value)}
- onBlur={async () => {
- if (appSettings) {
- await saveSettings({ ...appSettings, default_ssh_key_path: sshKeyPath || null });
- }
- }}
- placeholder="~/.ssh"
- className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
- />
-
-
- {/* Default Git Name */}
-
- Default Git Name
- setGitName(e.target.value)}
- onBlur={async () => {
- if (appSettings) {
- await saveSettings({ ...appSettings, default_git_user_name: gitName || null });
- }
- }}
- placeholder="Your Name"
- className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
- />
-
-
- {/* Default Git Email */}
-
- Default Git Email
- setGitEmail(e.target.value)}
- onBlur={async () => {
- if (appSettings) {
- await saveSettings({ ...appSettings, default_git_user_email: gitEmail || null });
- }
- }}
- placeholder="you@example.com"
- className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
- />
-
-
- {/* Container Timezone */}
-
-
Container Timezone
-
- Timezone for containers — affects scheduled task timing (IANA format, e.g. America/New_York)
-
-
setTimezone(e.target.value)}
- onBlur={async () => {
- if (appSettings) {
- await saveSettings({ ...appSettings, timezone: timezone || null });
- }
- }}
- placeholder="UTC"
- className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
- />
-
-
- {/* Global Claude Instructions */}
-
-
Claude Instructions
-
- Global instructions applied to all projects (written to ~/.claude/CLAUDE.md in containers)
-
-
-
- {globalInstructions ? "Configured" : "Not set"}
-
-
setShowInstructionsModal(true)}
- className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
- >
- Edit
-
+
+ {/* Container Timezone */}
+
+
Container Timezone
+
+ Timezone for containers — affects scheduled task timing (IANA format, e.g. America/New_York)
+
+
setTimezone(e.target.value)}
+ onBlur={async () => {
+ if (appSettings) {
+ await saveSettings({ ...appSettings, timezone: timezone || null });
+ }
+ }}
+ placeholder="UTC"
+ className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
+ />
-
- {/* Global Environment Variables */}
-
-
Global Environment Variables
-
- Applied to all project containers. Per-project variables override global ones with the same key.
-
-
-
- {globalEnvVars.length > 0 ? `${globalEnvVars.length} variable${globalEnvVars.length === 1 ? "" : "s"}` : "None"}
-
-
setShowEnvVarsModal(true)}
- className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
- >
- Edit
-
+ {/* Global Claude Instructions */}
+
+
Claude Instructions
+
+ Global instructions applied to all projects (written to ~/.claude/CLAUDE.md in containers)
+
+
+
+ {globalInstructions ? "Configured" : "Not set"}
+
+ setShowInstructionsModal(true)}
+ className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
+ >
+ Edit
+
+
-
- {/* Global Claude Code Settings */}
-
-
Claude Code Settings
-
- Default Claude Code CLI settings applied to all projects. Per-project settings take precedence.
-
-
-
- {appSettings?.global_claude_code_settings ? "Configured" : "Using defaults"}
-
-
setShowClaudeCodeSettingsModal(true)}
- className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
- >
- Edit
-
+ {/* Global Environment Variables */}
+
+
Global Environment Variables
+
+ Applied to all project containers. Per-project variables override global ones with the same key.
+
+
+
+ {globalEnvVars.length > 0 ? `${globalEnvVars.length} variable${globalEnvVars.length === 1 ? "" : "s"}` : "None"}
+
+ setShowEnvVarsModal(true)}
+ className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
+ >
+ Edit
+
+
-
- {/* Web Terminal */}
-
+ {/* Global Claude Code Settings */}
+
+
Claude Code Settings
+
+ Default Claude Code CLI settings applied to all projects. Per-project settings take precedence.
+
+
+
+ {appSettings?.global_claude_code_settings ? "Configured" : "Using defaults"}
+
+ setShowClaudeCodeSettingsModal(true)}
+ className="text-xs px-2 py-0.5 text-[var(--accent)] hover:text-[var(--accent-hover)] hover:bg-[var(--bg-primary)] rounded transition-colors"
+ >
+ Edit
+
+
+
+
- {/* Speech to Text */}
-
+
+
+
- {/* Updates section */}
-
-
Updates
+
+
+
+
+
+ {/* Default SSH Key Directory */}
+
+
Default SSH Key Directory
+
+ Mounted into all containers unless overridden by a per-project setting.
+
+
setSshKeyPath(e.target.value)}
+ onBlur={async () => {
+ if (appSettings) {
+ await saveSettings({ ...appSettings, default_ssh_key_path: sshKeyPath || null });
+ }
+ }}
+ placeholder="~/.ssh"
+ className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
+ />
+
+
+ {/* Default Git Name */}
+
+ Default Git Name
+ setGitName(e.target.value)}
+ onBlur={async () => {
+ if (appSettings) {
+ await saveSettings({ ...appSettings, default_git_user_name: gitName || null });
+ }
+ }}
+ placeholder="Your Name"
+ className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
+ />
+
+
+ {/* Default Git Email */}
+
+ Default Git Email
+ setGitEmail(e.target.value)}
+ onBlur={async () => {
+ if (appSettings) {
+ await saveSettings({ ...appSettings, default_git_user_email: gitEmail || null });
+ }
+ }}
+ placeholder="you@example.com"
+ className="w-full px-2 py-1 text-sm bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
+ />
+
+
+
+
+
+
+
+
+
{appVersion && (
@@ -237,11 +245,11 @@ export default function SettingsPanel() {
{imageUpdateInfo && (
- A newer container image is available. Re-pull the image in Docker settings above to update.
+ A newer container image is available. Re-pull the image in Container settings above to update.
)}
-
+
{showInstructionsModal && (
(() => loadOpenState(key, defaultOpen));
+
+ useEffect(() => {
+ persistOpenState(key, open);
+ }, [key, open]);
+
+ return (
+
+
setOpen(o => !o)}
+ aria-expanded={open}
+ className="w-full flex items-center justify-between px-3 py-2 text-left text-sm font-medium text-[var(--text-primary)] hover:bg-[var(--bg-primary)] transition-colors"
+ >
+ {title}
+
+
+
+
+ {open && (
+
+ {children}
+
+ )}
+
+ );
+}