Files and folders
This page lists the folders SkillCatalog uses on your machine and in your repositories, what each file holds, and which ones you can delete. See File formats.
The SkillCatalog folder
SkillCatalog keeps its files in ~/.skillcatalog/. The desktop app and skc share this folder.
~/.skillcatalog/
settings.toml
telemetry-salt
logs/
catalogs/
catalogs.yml
acme-skills/
profiles/
home/
profile.yml
delivery-manifest.json
payments-api/
proposals/
acme-skills/
delivery-retained/
score-history-backups/| Path | What it holds | Safe to delete? |
|---|---|---|
settings.toml | Your settings. See settings.toml. | Only to reset your settings. Every tool is then off, usage metrics are on, and the next delivery removes the files SkillCatalog delivered. |
telemetry-salt | A random secret that salts the short codes that stand for catalog and skill names in log files. Usage metrics do not use it. | Yes. SkillCatalog makes a new one, which changes those codes. |
logs/ | Log files. See Logs. | Yes. |
catalogs/catalogs.yml | The registered catalogs: id, name, source URL, clone folder, and sync policy. | No. Use skc catalog remove. |
catalogs/<name>/ | The clone of a registered catalog. Its name comes from the catalog name you gave in the desktop app, or else from its repository, such as acme-skills. When that name is taken, it is acme-skills-2. The Essentials catalog, when the desktop app set it up, is skillcatalog-essentials. | No. Use skc catalog remove. A clone can hold changes you have not synced, and removing the catalog deletes them unless you pass --keep-clone. |
profiles/<profile-id>/profile.yml | A profile: its id, name, folder, and entries. For a project profile, it also holds the path of the team manifest and the folder saved with --target-dir. | No. Use skc profile delete or skc uninstall. |
profiles/<profile-id>/delivery-manifest.json | The delivery record: each file delivery wrote for the profile, with a hash of its content. | Only to repair a damaged record. Then run skc deliver <profile-id> --adopt-matching, which rebuilds the record and takes back the files whose content matches. Plain skc deliver reports them as files SkillCatalog did not write. Files you edited stay untracked either way. |
proposals/<catalog-id>/ | Records of proposals on a review-branch catalog. Records of finished proposals are kept for 30 days by default. | No. Use skc proposal discard. |
delivery-retained/<profile-id>.json | The edited delivered files that skc uninstall or skc profile delete kept. When a profile with that id delivers to those paths again, for example after skc install in the same checkout, delivery tracks them as edited files and removes them from this record. | Yes. Delivery then reports those files as files SkillCatalog did not write, and still leaves them in place. |
score-history-backups/<catalog-id>/<slug>/ | The copy of SCORE.json that each skc skill score-history <slug> --repair run takes before it rewrites the file. SkillCatalog never reads or deletes these copies. | Yes. |
Locks and working folders: any other file or folder here, such as *.lock files, .locks/, .remove-quarantine/, scoring/, or accepted-improvement-handoffs/ | Files SkillCatalog uses while it works. | Leave them. Delete a lock only when no skc command and no desktop app is running. |
Every command except skc completions, skc help-json, and skc update --check writes to this folder, even one that only reads your catalogs. Commands that read catalogs, such as skc status, skc validate, skc catalog list, and skc proposal list, can also replace the Essentials catalog's copy with the version that comes with skc.
The desktop app keeps display preferences, such as the theme, outside this folder.
Use another folder
skc --config-dir <folder> keeps all of SkillCatalog's files in <folder> instead of ~/.skillcatalog: settings, catalogs and their clones, profiles, proposals, logs, and the secret for log codes. Pass it to every command. The desktop app always uses ~/.skillcatalog.
--config-dir does not move delivery. The Home profile still delivers to each tool's skills folder in your home folder, such as ~/.claude/skills/. Two setups with different --config-dir folders share those skills folders.
To isolate delivery too, set HOME to another folder, which moves ~/.skillcatalog with it. See Isolate a run.
Where skills are delivered
SkillCatalog delivers each skill as a folder <slug>/ with its SKILL.md and companion files, into the skills folder of each tool you turned on:
| Tool | Tool id | Home profile | Project or personal profile |
|---|---|---|---|
| Claude Code | claude-code | ~/.claude/skills/<slug>/ | <folder>/.claude/skills/<slug>/ |
| Cursor | cursor | ~/.cursor/skills/<slug>/ | <folder>/.cursor/skills/<slug>/ |
| Codex | codex | ~/.agents/skills/<slug>/ | <folder>/.agents/skills/<slug>/ |
For a project profile, <folder> is the checkout, or the folder saved with skc install --target-dir. For a personal profile, it is the folder you gave skc profile create. See Use the skills in a second checkout.
When no entry selects a skill any more, delivery removes its files and then its folder if the folder is empty. Turning a tool off removes the files SkillCatalog delivered for that tool. See Turn tools on and off.
When delivery cannot deliver a profile or a skill safely, it skips only that one, keeps its earlier copies, and delivers the rest, as Partial delivery explains.
Delivered files and drift
Each profile's delivery record lists every file SkillCatalog delivered, with a hash of its content. SkillCatalog compares each file with the record to find drift. skc deliver --check and skc validate --drift fail when they find drift, and skc status counts it.
| Case | What skc deliver --check reports | What delivery does |
|---|---|---|
| Clean: unchanged since delivery | Nothing | Updates it when the catalog changes, and removes it when no entry selects the skill. |
| Edited | "Manually edited" | Keeps your version. It does not update or remove the file, and lists it under "Preserved edited files, not removed". |
| Deleted | "Deleted" | Writes it again, counted as "restored". |
| Unreadable | "Unreadable" | Leaves it in place and lists it with the preserved files. |
| Not in the record, exactly what delivery would write, such as a file an earlier delivery wrote before its record was lost | Nothing | Leaves it, and reports a failed file with reason unmanaged_target_exists. skc deliver --adopt-matching takes it over without writing: it records the file as delivered, and later deliveries update it and remove it with the skill. |
Not in the record, different content, such as a hand-made SKILL.md | Nothing | Leaves it, and reports a failed file with reason unmanaged_target_exists. --adopt-matching leaves it too. |
skc deliver --check also lists a project profile's checkout or --target-dir folder that cannot be found, as "Unreadable", and fails.
To replace an edited file with the catalog's version, delete it and run skc deliver. For files that SkillCatalog did not write, see A skill folder already exists.
Files in a checkout
| Path | Written by | In Git? |
|---|---|---|
.skillcatalog/skillcatalog.yml | skc init, or you | Yes: this is the team manifest. |
.skillcatalog/skillcatalog.local.yml | SkillCatalog, when you change a project profile's entries, for example with skc profile add; or you | No. SkillCatalog adds it to .gitignore, and refuses to write it while Git would track it. |
.skillcatalog/.skc-recovery/ | SkillCatalog, the first time it writes your local manifest. If another process changes that file during a write, the replaced version is kept here. | No. It holds its own .gitignore. |
.gitignore | SkillCatalog appends .skillcatalog/skillcatalog.local.yml and /.skillcatalog/.skc-recovery/ the first time it writes your local manifest, unless both lines are there. | Yes. |
.claude/skills/, .cursor/skills/, .agents/skills/ | Delivery of the project profile, unless you saved another folder with --target-dir | Git does not ignore them automatically. See Keep delivered files out of Git. |
skc install itself writes nothing in the checkout except delivered files.
Files in a catalog clone
| Path | What it is |
|---|---|
.git/hooks/pre-commit | The check SkillCatalog runs before each commit, described below. |
skills/<slug>/SCORE.json | The skill's score history, written by scoring. Delivery skips it. |
.gitkeep in skills/, stacks/, and bundles/ | Created, with catalog.yaml and README.md, when you add an empty repository, so Git keeps the folders. |
skc sync commits changes in catalog.yaml, README.md, skills/, stacks/, bundles/, and a legacy taxonomy.yaml, and leaves other files uncommitted.
The pre-commit check
When you add a catalog with skc catalog add, the desktop app's Add catalog, or a first skc install, SkillCatalog adds its lines to the clone's .git/hooks/pre-commit, between # --- skc-validate-begin --- and # --- skc-validate-end ---. An existing hook keeps its other lines. A catalog added from a share link gets no hook.
Before each commit in the clone, including the commits that skc sync and desktop saves make, the hook checks the catalog's files as skc validate --path <clone> --warnings-ok --no-drift does. A warning or an edited delivered copy never blocks a commit. An error refuses the commit, and the hook prints Fix the problems listed above, then commit again.
Each sync and save rewrites SkillCatalog's lines in the hook so they run the skc of the program doing the work, and discards any edit you made between the markers. When the hook cannot run skc at all, it refuses the commit and says to update SkillCatalog and sync.
To turn the check off for one catalog, run chmod -x .git/hooks/pre-commit in the clone. SkillCatalog keeps the file that way. If your Git configuration sets core.hooksPath, Git never runs this hook, so run skc validate yourself before you sync or save.
Logs
skc and the desktop app write log files to ~/.skillcatalog/logs/, or to <folder>/logs/ with --config-dir <folder>. When skc cannot find your home folder, it writes to skillcatalog-logs in the system's temporary folder.
| File | What it holds |
|---|---|
cli.<date> | Everything skc logged that day, such as cli.2026-09-23. |
desktop.<date> | Everything the desktop app logged that day. |
latest.log | A link to the file of the program that started most recently. |
Each time skc or the desktop app starts, SkillCatalog deletes log files more than 7 days old. skc completions, skc help-json, and skc update --check write no log.
SKILLCATALOG_LOG sets how much SkillCatalog logs. The default is info, and the other levels are error, warn, debug, and trace. SKILLCATALOG_LOG=off stops writing log lines, though the day's file is still created.
Log files are not redacted, so read them before you share them, as Find and share logs explains.
Environment variables
| Variable | Effect |
|---|---|
SKILLCATALOG_LOG | The log level. See Logs. |
GIT_TIMEOUT_NETWORK | Seconds before SkillCatalog stops a Git clone, fetch, or push. The default is 120. |
GIT_TIMEOUT_LOCAL | Seconds before SkillCatalog stops any other Git command. The default is 30. |
HOME | Your home folder. ~/.skillcatalog and the Home profile's skills folders are under it. |
PATH | Where SkillCatalog finds git, the AI provider tools, and, for the pre-commit hook, skc. SkillCatalog also looks in /opt/homebrew/bin and /usr/local/bin. |
A timeout value that is not a whole number is ignored. No environment variable sets the SkillCatalog folder, so use --config-dir or HOME.
When SkillCatalog syncs, saves, or publishes, its Git commands ignore variables from your environment that point Git at another repository. Examples are GIT_DIR, GIT_WORK_TREE, and GIT_INDEX_FILE. A shell or a Git hook that sets them cannot send those commits elsewhere. GIT_CEILING_DIRECTORIES and the GIT_CONFIG* variables still apply.