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/
PathWhat it holdsSafe to delete?
settings.tomlYour 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-saltA 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.ymlThe 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.ymlA 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.jsonThe 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>.jsonThe 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:

ToolTool idHome profileProject or personal profile
Claude Codeclaude-code~/.claude/skills/<slug>/<folder>/.claude/skills/<slug>/
Cursorcursor~/.cursor/skills/<slug>/<folder>/.cursor/skills/<slug>/
Codexcodex~/.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.

CaseWhat skc deliver --check reportsWhat delivery does
Clean: unchanged since deliveryNothingUpdates 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 lostNothingLeaves 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.mdNothingLeaves 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

PathWritten byIn Git?
.skillcatalog/skillcatalog.ymlskc init, or youYes: this is the team manifest.
.skillcatalog/skillcatalog.local.ymlSkillCatalog, when you change a project profile's entries, for example with skc profile add; or youNo. 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.
.gitignoreSkillCatalog 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-dirGit 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

PathWhat it is
.git/hooks/pre-commitThe check SkillCatalog runs before each commit, described below.
skills/<slug>/SCORE.jsonThe 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.

FileWhat 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.logA 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

VariableEffect
SKILLCATALOG_LOGThe log level. See Logs.
GIT_TIMEOUT_NETWORKSeconds before SkillCatalog stops a Git clone, fetch, or push. The default is 120.
GIT_TIMEOUT_LOCALSeconds before SkillCatalog stops any other Git command. The default is 30.
HOMEYour home folder. ~/.skillcatalog and the Home profile's skills folders are under it.
PATHWhere 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.