docs/references/data/preference-overview.md
The Preference system provides centralized management for user configuration and application settings with cross-window synchronization.
PreferenceService handles data that:
app.theme.mode)// UI updates immediately, then syncs to database
await preferenceService.set("app.theme.mode", "dark");
// Waits for database confirmation before updating UI
await preferenceService.set("api.key", "secret", { optimistic: false });
┌─────────────────────────────────────────────────────┐
│ Renderer Process │
│ ┌─────────────────────────────────────────────────┐ │
│ │ usePreference Hook │ │
│ │ - Subscribe to preference changes │ │
│ │ - Optimistic/pessimistic update support │ │
│ └──────────────────────┬──────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ PreferenceService (Renderer) │ │
│ │ - Local cache for fast reads │ │
│ │ - IPC proxy to Main process │ │
│ │ - Subscription management │ │
│ └──────────────────────┬──────────────────────────┘ │
└────────────────────────┼────────────────────────────┘
│ IPC
┌────────────────────────┼────────────────────────────┐
│ Main Process ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ PreferenceService (Main) │ │
│ │ - Full memory cache of all preferences │ │
│ │ - SQLite persistence via Drizzle ORM │ │
│ │ - Cross-window broadcast │ │
│ └──────────────────────┬──────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ SQLite Database (preference table) │ │
│ │ - scope + key structure │ │
│ │ - JSON value storage │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
All Preference_* IPC channels are sender-gated by validateSender (untrusted senders are rejected) — see IpcApi Overview §Security.
Main process provides getStats(details?) for debugging subscription status:
details=true for per-key breakdownimport { application } from '@application'
const preferenceService = application.get('PreferenceService')
const stats = preferenceService.getStats(true);
Preferences are stored in the preference table:
// Simplified schema
{
scope: string; // e.g., 'default', 'user'
key: string; // e.g., 'app.theme.mode'
value: json; // The preference value
createdAt: number;
updatedAt: number;
}
For detailed code examples and API usage, see Preference Usage Guide.
| Operation | Hook | Service Method |
|---|---|---|
| Read single | usePreference(key) | preferenceService.get(key) |
| Write single | setPreference(value) | preferenceService.set(key, value) |
| Read multiple | usePreferences([...keys]) | preferenceService.getMultiple([...keys]) |
| Write multiple | - | preferenceService.setMultiple({...}) |