Skip to content

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 restore

xtop-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

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, 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, 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 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.