Skip to content

Where data lives ​

There are two places, and the split is on purpose: anything that belongs to a project is written into that project so it can be committed, and anything that belongs to you stays in the app's own folder so it never ends up in a pull request.

The app data folder ​

%APPDATA%\XTop\
├── xtop-db.json      everything below
├── notes/
│   ├── global/<slug>.md
│   └── projects/<projectId>/<slug>.md
├── meetings/<id>/
│   ├── meeting.json
│   └── shots/<n>.png    region screenshots taken during it
└── before-restore/        your data, archived before a restore

xtop-db.json is written in a way that cannot leave it half-written, and a file that turns out to be corrupt is moved aside as *.corrupt-<timestamp> instead of being deleted.

Upgrading from DevX or Dev Nexus

The app was called Dev Nexus, then DevX, and its folder was named after it — %APPDATA%\DevX\. The first launch after upgrading moves the whole folder across on its own, renames dev-nexus-db.json to xtop-db.json, and brings notes, meetings and the downloaded Whisper model with it. If anything goes wrong it leaves the old folder exactly where it was, so nothing is ever lost. Backup archives written under the old names still restore — the old database name inside them is read into the new one.

What is in it ​

KeyHolds
collections[]{ id, name, commands[], projects[] }
collections[].projects[]{ id, name, aliases[], path, env, defaultIde, figmaLink, postmanCollectionId, commands[], lastOpenedAt, startup }
globalCommands[]Commands offered in every project, stored once
settingsEverything in Settings, plus panelSize, projectView, islandEdge, islandAutoHide
settings.agent*What X Agent remembers between chats: agentProvider, agentMode, agentModels, agentProjectId. No API keys — there are none
reminders[]Text, time, repeat, done state
apiHistory[]The last 200 API runs, per project
commandHistory[]The last 300 commands typed in the terminal, most recent first — feeds the suggestions. A line starting with a space is never recorded
apiSecrets'<projectId>:<envName>' → { variable: value } — never leaves this folder
prayerCache, prayerLogToday's times, and which prayers were acknowledged
athkarToday's counters, keyed period:id, reset by date
lastOpenedThe project the panel highlights first

Inside a project ​

<project>/.xtop/api/
├── requests/<slug>.json
└── environments.json

Saved API requests and their environments are kept in the repository on purpose: they travel with the code, so a teammate who clones the project gets your requests too.

Secrets and history are the exception. A request file only says that it uses ; the token itself is stored in the app data folder under <projectId>:<envName>. That is what makes it safe to commit .xtop/.

Notes are Markdown files, not database rows — see Notes.

Backups ​

A backup zips exactly two things:

xtop-db.json
notes/**

Meetings are not included — they are far bigger than everything else. Back up %APPDATA%\XTop\meetings\ yourself if you need them.

See Backup & restore.

Two details worth knowing ​

  • Collections are a list of { id, name, projects[] }, not an object keyed by name — so a collection can be renamed and reordered without rewriting the keys.
  • Global commands are stored once in globalCommands[] instead of being copied into every project, so editing one changes it everywhere. Collection commands live on the collection for the same reason. Only private commands live on the project itself.