Kagi News follows a local-first model: all settings live in your browser’sDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/kagisearch/kite-public/llms.txt
Use this file to discover all available pages before exploring further.
localStorage and work without any account. Sync is an optional layer on top that mirrors those settings to Kagi’s servers so every device you sign in on starts with the same configuration.
Sync requires a Kagi account. Sign in via Settings → Sync & Privacy → Sign In. Sync works on web browsers and PWA installs. Native iOS and Android apps do not yet support settings sync.
Enabling sync
Sign in to your Kagi account
Open Settings (gear icon) and navigate to the Sync & Privacy tab. If you are not signed in, click the Sign In link, which redirects you to
kagi.com/signin.Enable Settings Sync
Toggle Sync Settings on. When you first enable it, your current local settings are immediately pushed to the server so all your devices receive your preferences.
What gets synced
Settings are grouped by category. Each category syncs as a unit:| Category | Settings included |
|---|---|
appearance | Theme, font size |
display | Story count, expand mode, open mode, maps provider, layout width |
language | Interface language, data language, content languages |
categories | Category order, enabled categories, disabled categories, single-page mode |
content | Content filter level, custom keywords, filter presets, filter mode and scope, reading levels |
sections | Section visibility (summary, highlights, perspectives, Q&A, timeline, sources, etc.) |
How sync works
TheSyncManager class (src/lib/client/sync-manager.ts) manages all sync operations as a singleton. Here is the flow for a typical settings change:
- You change a setting in the UI.
- The
Settingclass records the change and callssyncManager.trackSettingChange(key, value). - The manager debounces the change — waiting 2 seconds to batch rapid sequential edits — then calls
POST /api/syncwith the pending changes. - The server returns any remote changes made on other devices.
- The manager applies remote changes to
localStorageand updates the reactive Svelte state so the UI reflects the new values immediately.
Conflict resolution
The default conflict resolution strategy is'merge'. When the same setting is changed on two devices before either syncs, the server provides a merged resolution value. Alternative strategies ('local' — keep local; 'remote' — always use server) can be set programmatically via syncManager.setConflictStrategy().
Device identity
Each browser/device is assigned a uniquedeviceId (UUID v4) stored in localStorage. This ID is included in every sync request so the server can attribute changes to the correct device and skip sending a device its own changes.
Sync triggers
TheSyncManager syncs in response to multiple events:
| Trigger | Notes |
|---|---|
| Settings change | Debounced 2 s after the last change in a batch |
| App becomes visible | Fires on document.visibilitychange when the tab regains focus |
| Device comes back online | Fires on the window.online event |
| Login | Performs a full sync immediately on syncManager.initialize(userId) |
| Another browser tab changes a setting | Cross-tab via localStorage storage events |
SyncState
The current sync status is exposed through theSyncState interface:
syncManager.onSyncStateChange(listener).
Exporting your synced data
To download a full JSON export of everything stored on Kagi’s servers for your account:- Go to Settings → Sync & Privacy.
- Click Export Data.
- A file named
kagi-news-sync-data-YYYY-MM-DD.jsonis downloaded automatically.
credentials: 'include').
Privacy
Your synced data is stored on Kagi’s servers and associated with your account. It is:- Not used for any purpose other than sync — Kagi does not analyse or monetise your settings or read history.
- Not shared with third parties.
- Fully deletable at any time: go to Settings → Sync & Privacy → Clear All Synced Data. This calls
POST /api/sync/clearand permanently removes all server-side data. Your locallocalStoragedata is not affected.