Where data lives
Two locations, and the split between them is deliberate: things that belong to a project are written into that project so they can be committed, and things that belong to you stay in the app's own folder so they never end 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
└── before-restore/ your data, archived before a restorextop-db.json is written atomically, and a file that turns out to be corrupt is moved aside as *.corrupt-<timestamp> rather than thrown away.
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
| Key | Holds |
|---|---|
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 |
settings | Everything in Settings, plus panelSize, orbPosition, projectView |
reminders[] | Text, time, repeat, done state |
apiHistory[] | The last 200 API runs, per project |
apiSecrets | '<projectId>:<envName>' → { variable: value } — never leaves this folder |
prayerCache, prayerLog | Today's times, and which prayers were acknowledged |
athkar | Today's counters, keyed period:id, reset by date |
lastOpened | The project the panel highlights first |
Inside a project
<project>/.xtop/api/
├── requests/<slug>.json
└── environments.jsonSaved API requests and their environments live in the repository on purpose: they travel with the code, and a teammate who clones the project gets your requests with it.
Secrets and run history are the exception. A request file records that it uses ; what the token is is stored in the app data folder against <projectId>:<envName>. That is what makes committing .xtop/ safe.
Notes are Markdown files, not database rows — see Notes.
Backups
A backup zips exactly two things:
xtop-db.json
notes/**Meetings are not in a backup — transcripts and audio-derived text would dwarf everything else. Back up %APPDATA%\XTop\meetings\ yourself if you need them.
See Backup & restore.
Two shapes worth knowing
Two things differ from the original spec, and both differences are load-bearing:
- Collections are an array of
{ id, name, projects[] }, not an object keyed by name — so a collection can be renamed and reordered without rewriting keys. - Global commands are stored once in
globalCommands[]rather than copied into every project, so editing one updates it everywhere. Collection commands live on the collection for the same reason. Only private commands live on the project itself.
