diff --git a/apps/ui/src/components/views/settings-view/developer/developer-section.tsx b/apps/ui/src/components/views/settings-view/developer/developer-section.tsx
index 7a0882f0..4a36bab3 100644
--- a/apps/ui/src/components/views/settings-view/developer/developer-section.tsx
+++ b/apps/ui/src/components/views/settings-view/developer/developer-section.tsx
@@ -12,9 +12,18 @@ const LOG_LEVEL_OPTIONS: { value: ServerLogLevel; label: string; description: st
{ value: 'debug', label: 'Debug', description: 'Show all messages including debug' },
];
+// Check if we're in development mode
+const IS_DEV = import.meta.env.DEV;
+
export function DeveloperSection() {
- const { serverLogLevel, setServerLogLevel, enableRequestLogging, setEnableRequestLogging } =
- useAppStore();
+ const {
+ serverLogLevel,
+ setServerLogLevel,
+ enableRequestLogging,
+ setEnableRequestLogging,
+ showQueryDevtools,
+ setShowQueryDevtools,
+ } = useAppStore();
return (
+
+ {/* React Query DevTools - only shown in development mode */}
+ {IS_DEV && (
+
+
+
+
+ Show React Query DevTools panel in the bottom-right corner for debugging queries and
+ cache.
+
+
+
{
+ setShowQueryDevtools(checked);
+ toast.success(checked ? 'Query DevTools enabled' : 'Query DevTools disabled', {
+ description: 'React Query DevTools visibility updated',
+ });
+ }}
+ />
+
+ )}
);
diff --git a/apps/ui/src/hooks/use-settings-migration.ts b/apps/ui/src/hooks/use-settings-migration.ts
index b77fba5b..7398aece 100644
--- a/apps/ui/src/hooks/use-settings-migration.ts
+++ b/apps/ui/src/hooks/use-settings-migration.ts
@@ -713,6 +713,7 @@ export function hydrateStoreFromSettings(settings: GlobalSettings): void {
muteDoneSound: settings.muteDoneSound ?? false,
serverLogLevel: settings.serverLogLevel ?? 'info',
enableRequestLogging: settings.enableRequestLogging ?? true,
+ showQueryDevtools: settings.showQueryDevtools ?? true,
enhancementModel: settings.enhancementModel ?? 'claude-sonnet',
validationModel: settings.validationModel ?? 'claude-opus',
phaseModels: settings.phaseModels ?? current.phaseModels,
diff --git a/apps/ui/src/hooks/use-settings-sync.ts b/apps/ui/src/hooks/use-settings-sync.ts
index 8ede5600..d4679b81 100644
--- a/apps/ui/src/hooks/use-settings-sync.ts
+++ b/apps/ui/src/hooks/use-settings-sync.ts
@@ -58,6 +58,7 @@ const SETTINGS_FIELDS_TO_SYNC = [
'muteDoneSound',
'serverLogLevel',
'enableRequestLogging',
+ 'showQueryDevtools',
'enhancementModel',
'validationModel',
'phaseModels',
diff --git a/apps/ui/src/routes/__root.tsx b/apps/ui/src/routes/__root.tsx
index 4a56ca2b..907d2b19 100644
--- a/apps/ui/src/routes/__root.tsx
+++ b/apps/ui/src/routes/__root.tsx
@@ -40,7 +40,7 @@ import { useIsCompact } from '@/hooks/use-media-query';
import type { Project } from '@/lib/electron';
const logger = createLogger('RootLayout');
-const SHOW_QUERY_DEVTOOLS = import.meta.env.DEV;
+const IS_DEV = import.meta.env.DEV;
const SERVER_READY_MAX_ATTEMPTS = 8;
const SERVER_READY_BACKOFF_BASE_MS = 250;
const SERVER_READY_MAX_DELAY_MS = 1500;
@@ -895,17 +895,22 @@ function RootLayoutContent() {
}
function RootLayout() {
- // Hide devtools on compact screens (mobile/tablet) to avoid overlap with sidebar settings
+ // Hide devtools on compact screens (mobile/tablet) to avoid overlap with UI controls
const isCompact = useIsCompact();
+ // Get the user's preference for showing devtools from the app store
+ const showQueryDevtools = useAppStore((state) => state.showQueryDevtools);
+
+ // Show devtools only if: in dev mode, user setting enabled, and not compact screen
+ const shouldShowDevtools = IS_DEV && showQueryDevtools && !isCompact;
return (
- {SHOW_QUERY_DEVTOOLS && !isCompact ? (
-
- ) : null}
+ {shouldShowDevtools && (
+
+ )}
);
}
diff --git a/apps/ui/src/store/app-store.ts b/apps/ui/src/store/app-store.ts
index e78cd80f..ecb78220 100644
--- a/apps/ui/src/store/app-store.ts
+++ b/apps/ui/src/store/app-store.ts
@@ -682,6 +682,9 @@ export interface AppState {
serverLogLevel: ServerLogLevel; // Log level for the API server (error, warn, info, debug)
enableRequestLogging: boolean; // Enable HTTP request logging (Morgan)
+ // Developer Tools Settings
+ showQueryDevtools: boolean; // Show React Query DevTools panel (only in development mode)
+
// Enhancement Model Settings
enhancementModel: ModelAlias; // Model used for feature enhancement (default: sonnet)
@@ -1168,6 +1171,9 @@ export interface AppActions {
setServerLogLevel: (level: ServerLogLevel) => void;
setEnableRequestLogging: (enabled: boolean) => void;
+ // Developer Tools actions
+ setShowQueryDevtools: (show: boolean) => void;
+
// Enhancement Model actions
setEnhancementModel: (model: ModelAlias) => void;
@@ -1472,6 +1478,7 @@ const initialState: AppState = {
muteDoneSound: false, // Default to sound enabled (not muted)
serverLogLevel: 'info', // Default to info level for server logs
enableRequestLogging: true, // Default to enabled for HTTP request logging
+ showQueryDevtools: true, // Default to enabled (only shown in dev mode anyway)
enhancementModel: 'claude-sonnet', // Default to sonnet for feature enhancement
validationModel: 'claude-opus', // Default to opus for GitHub issue validation
phaseModels: DEFAULT_PHASE_MODELS, // Phase-specific model configuration
@@ -2593,6 +2600,9 @@ export const useAppStore = create()((set, get) => ({
setServerLogLevel: (level) => set({ serverLogLevel: level }),
setEnableRequestLogging: (enabled) => set({ enableRequestLogging: enabled }),
+ // Developer Tools actions
+ setShowQueryDevtools: (show) => set({ showQueryDevtools: show }),
+
// Enhancement Model actions
setEnhancementModel: (model) => set({ enhancementModel: model }),
diff --git a/libs/types/src/settings.ts b/libs/types/src/settings.ts
index f6401314..35de27e5 100644
--- a/libs/types/src/settings.ts
+++ b/libs/types/src/settings.ts
@@ -863,6 +863,10 @@ export interface GlobalSettings {
/** Enable HTTP request logging (Morgan). Default: true */
enableRequestLogging?: boolean;
+ // Developer Tools
+ /** Show React Query DevTools panel (only in development mode). Default: true */
+ showQueryDevtools?: boolean;
+
// AI Commit Message Generation
/** Enable AI-generated commit messages when opening commit dialog (default: true) */
enableAiCommitMessages: boolean;
@@ -1286,6 +1290,7 @@ export const DEFAULT_GLOBAL_SETTINGS: GlobalSettings = {
muteDoneSound: false,
serverLogLevel: 'info',
enableRequestLogging: true,
+ showQueryDevtools: true,
enableAiCommitMessages: true,
phaseModels: DEFAULT_PHASE_MODELS,
enhancementModel: 'sonnet', // Legacy alias still supported