Latchkey
imbue-ai/latchkey
Interact with arbitrary third-party or self-hosted services (AWS, Slack, Google Drive, Dropbox, GitHub, GitLab, Linear, Coolify...) using their HTTP APIs.
Triage Fix() repairs reported in a "<Client sync issue" digest email (Dropbox sync issue, etc.; the "Fix() repaired:" lines under a blog) or in a "Resync found changes" or "iCloud resync found…
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install blotcms/blot triage-sync-fix-repair --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .claude/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .claude/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repairType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install blotcms/blot triage-sync-fix-repair --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .agents/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .agents/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install blotcms/blot triage-sync-fix-repair --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .cursor/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .cursor/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/blotcms/blot.git --path .claude/skills/triage-sync-fix-repair--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install blotcms/blot triage-sync-fix-repair --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .gemini/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .gemini/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install blotcms/blot triage-sync-fix-repairInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .github/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .github/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add blotcms/blot --skill triage-sync-fix-repair -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install blotcms/blot triage-sync-fix-repair --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/triage-sync-fix-repair .opencode/skills/triage-sync-fix-repair && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "triage-sync-fix-repair" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/triage-sync-fix-repair into .opencode/skills/triage-sync-fix-repair/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-sync-fix-repair", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
triage-sync-fix-repairTriage Fix() repairs reported in a "<Client sync issue" digest email (Dropbox sync issue, etc.; the "Fix() repaired:" lines under a blog) or in a "Resync found changes" or "iCloud resync found…
Triage Sync Fix Repair is an agent skill from blotcms/blot. Triage Fix() repairs reported in a "<Client sync issue" digest email (Dropbox sync issue, etc.; the "Fix() repaired:" lines under a blog) or in a "Resync found changes" or "iCloud resync found changes" email. Fix() changes things for a blog whenever one of its checks returns rows. Works out from the report rows and, if needed, production logs whether the repair was expected housekeeping (e.g. expired deleted entries pruned from lists), the trace of a live edit, or evidence of a real bug that is corrupting blog…
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with Dropbox and Google Drive. The repository describes itself as: Turns a folder into a website. The licence is AGPL-3.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6b1a30f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dockerFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Triage Sync Fix Repair loads about 4.1k tokens when it runs. Until then it costs about 174 tokens; SKILL.md has 2,216 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from blotcms/blot at commit 6b1a30f, republished under its AGPL-3.0 licence (© blotcms). 2,216 words, ~4,119 tokens.
.claude/skills/triage-sync-fix-repair/SKILL.md (or your agent's skills folder).app/sync/fix/index.js runs five checks in series against one blog's Redis
state and the blog's local folder. If any check returns rows it bumps the
blog's cacheID and returns the rows as its report. Fix() no longer emails
on its own (the standalone "sync/fix repaired" email, SYNC_FIX_REPAIRED,
is gone); callers report it:
app/helper/email/admin/DROPBOX_SYNC_ISSUE.txt; Google Drive's, sent at
minute 30 by app/clients/google-drive/validate.js, is
GOOGLE_DRIVE_SYNC_ISSUE.txt): a blog's "Fix() repaired:"
lines, one per check with the first 10 rows JSON.stringifyd. Formatting
lives in app/clients/util/syncReport.js.RESYNC_FOUND_CHANGES.txt), when Fix() repaired something after the resync.ICLOUD_SYNC_ISSUE.txt,
sent at minute 45 by app/clients/icloud/init.js) and the "iCloud resync
found changes" email (ICLOUD_RESYNC_ISSUE.txt) that a macserver-requested
resync sends from app/clients/icloud/routes/site/status.js. Both run the
walk and Fix() from app/clients/icloud/sync/validateBlog.js, and the
resync email carries the macserver's reason for requesting it.Other callers (dashboard rebuild, local setup, template folders and the
startup resync) only log
Fix repaired <blog> check=N. Fix() doesn't hold
the folder lock and repairs as it goes, so the report says what was
wrong; it's already been changed by the time you read it.
Fix() is called from:
app/clients/dropbox/init.js,
blogs with last_sync in the past hour, after the resync)app/clients/icloud/init.js, blogs
with lastSync in the past hour, after a clean walk), and the resync the
macserver requests after a failed push (app/clients/icloud/routes/site/status.js),
both through app/clients/icloud/sync/validateBlog.jsapp/clients/google-drive/validate.js,
blogs with lastSync in the past hour, after a clean walk)app/clients/local/setup.js)app/dashboard/site/client.js)app/templates/folders/index.js)The digest's client (its subject) tells you which hourly job probably ran it. Each
check logs Fix: <blogID> <check> duration=Nms, so the email time gives you
the run: grep 'Fix: <blogID>' to find it.
Fix() repairs often have benign, by-design causes. Work out which of those applies before you look for a bug.
Row shapes come straight from each check's report.push.
entry-ghosts (["MISSING", {id, path}], ["CASE", {oldPath, path}])Walks every entry (Entries.each, the all list) and checks its file
exists on disk (localPath), with case-insensitive fallbacks.
MISSING: the entry isn't deleted but no file backs it, so it's
Entry.dropped. That means a sync missed a delete/rename, or the local
folder was lost or reset. Usually a real sync bug. Check whether the
path was renamed or moved recently (grep the path in green's logs).
Known cause (fixed): a whole local folder removed by a sync walk.
The Google Drive, iCloud and Dropbox reset-to-blot walks fs.remove a
folder that's gone remotely, and used to call update() on the folder
path only. drop on a folder path drops nothing beneath it, so every
entry inside stayed live until Fix() caught it. The walks now update
each path inside (clients/util/localDescendants). If this recurs, look
for Removing <parent folder> which does not exist remotely in the logs.CASE: the file exists with different casing. Entry path rewritten.
Common after case-only renames on Dropbox/macOS. Mostly benign, but if
you see it repeatedly for one blog, case handling is broken.list-ghosts ([list, "MISSING", id], [list, "MISMATCH", id])MISSING rows come from Entries.pruneMissing (app/models/entries/index.js):
a member of one of the lists all, created, entries, drafts, scheduled, pages, deleted, entries:lex has no blog:<id>:entry:<id> key.
Known benign cause: expired deleted entries. Entry.drop doesn't
delete an entry. It re-saves it with deleted: true, and
models/entry/set.js puts a 24h TTL on that key, while
_assign.js keeps the id in all (and adds it to deleted). Once the
key expires, the id lingers in all/deleted until the next Fix()
prunes it. Rows only in all and deleted for files the user deleted
(or renamed away) more than 24h ago are this housekeeping, not
corruption. Expect roughly one all row plus one deleted row per
deleted file, so the count is about 2× the number of files. Only the
first 10 rows are quoted, and all is listed first, so deleted rows are
often cut off.
Since Entries.sweepExpiredDeleted landed, every entry save on the
blog and the start of list-ghosts silently clear these ids using the
deleted scores, so expired deleted entries should no longer appear in
the email. If MISSING rows in all/deleted turn up after that
deploy, a deleted entry's key disappeared before its 24h was up. That
needs investigating.
It becomes suspicious if a MISSING id is in entries, drafts,
pages, scheduled or created, because live lists should never point
at an absent key.MISMATCH: the key exists but the JSON's id ≠ the list member
(an entry stored under the wrong key). It's re-saved under its real id
and the stale member is removed. Real corruption. Find out how the
entry got there (rename handling, path normalization).tag-ghosts (["EMPTY TAG", tag], ["MISSING", id], ["MISMATCH", staleId, realId])EMPTY TAG: tag set with no members, deleted. Benign leftover.MISSING: a tag points at an entry key that doesn't exist. This is
usually the same TTL expiry as above, when the deleted entry's tags
weren't cleared. Check it against the list-ghosts rows.MISMATCH: same as list-ghosts MISMATCH. Real corruption.menu-ghosts (["Delete", item], ["Delete duplicate", item], ["Changed label/metadata/URL of", item])Syncs blog.menu page links with their entries. Delete = page entry now
deleted; Changed … = page title/URL changed. These are normal side-effects
of editing pages, unless the same item flips back and forth every run.
The row holds a reference to the menu item, which is mutated after the push,
so every row shows the post-repair values (a "Changed label of" row
already carries the new label and metadata). Known benign cause: demo
template folders (client: empty, handles from
app/templates/folders/config.js). On every app boot setupBlogs.js resets
the blog's menu to the bare config menu (no metadata, config labels), then
folders/index.js calls Fix(), which copies titles/metadata back from the
page entries. This sent the email after every deploy until setupBlogs
started keeping the entry-derived label/url/metadata from the existing menu;
if it recurs, check that merge.
entries-path-index (["MISMATCH", {entries, pathIndex}], ["BACKFILLED", n])entries:lex cardinality ≠ entries, rebuilt. A small diff can be
a race with a sync writing entries mid-check. A persistent or large diff
means a code path updates entries without pathIndex.
… 1.md, Untitled.md) that only appear
in all point to TTL housekeeping.blot, containers blot-container-{blue,green,yellow}, helpers in
remote ~/.bashrc (see investigate-production-container-restarts).
Use docker logs blot-container-green --timestamps 2>&1 | … so you can
window by time. Logs disappear when a deploy recreates the container.grep 'Fix: <blogID>' (per-check duration= lines).grep '<blog12>' | grep -F '<path>'.
models/entry/set.js logs <blog12> delete <path> and
<blog12> update <path>. A delete >24h before the Fix() run
confirms TTL expiry. If a reported path doesn't appear at all, that
still points to TTL expiry when the logs cover the 24h or so before
the run. Sync lines (sync_…, Removing, Downloading)
show renames and moves.TTL/EXISTS blog:<id>:entry:<path>, ZSCORE blog:<id>:<list> <path> to see
which lists still hold an id.MISSING/CASE repeatedly, or a
missed delete or rename. Cross-check with
investigate-dropbox-sync-issue for Dropbox blogs.MISMATCH, live-list MISSING, or
persistent path-index drift. Find the write path that produced it.TODO or note it for a PR.Read this first. A repeated pattern changes the classification. Newest entries last.
Privacy: this file is committed to the repo, so entries must contain no customer information. Leave out blog IDs, handles, domains, file and folder names or paths, post titles, and anything else that identifies a customer or their content. Describe things generically ("several draft files deleted over a day earlier"). Also leave out userbase or infra size numbers.
Include a precise UTC timestamp for the Fix() run (from the
Fix: … duration= lines), the container, the triggering caller (e.g.
Dropbox hourly validation) and any sync_ IDs, so a future agent can
re-find it in the logs while they exist.
Entry template:
### <date> <HH:MM:SS> UTC Fix() run — <classification>
- Email: <checks and row counts / reasons>, client: <client>
- Key events (UTC, to the second): …
- Cause: …
- Follow-up: …MISSING. The quoted 10 were all in the
all list and were draft files in the drafts folder, several of them
numbered-duplicate copies. Client: dropbox (hourly validation, green).duration=1454ms, noticeably
slower than the other runs, which fits it being the run that pruned) and
07:01:09. None of the reported paths appear anywhere in green's logs, so
they were last touched before 14:06 the previous day. The user was busy
renaming and deleting sibling drafts throughout (many delete lines),
which will produce the same email again about 24h later.Entry.drop keeps the deleted entry with a
24h key TTL, but the id stays in all/deleted. After expiry,
pruneMissing reports each one, which explains the 30 rows (about 15
files × 2 lists). This was the first email of this kind, sent soon after
the repair email was introduced (PR adding SYNC_FIX_REPAIRED, since replaced by the digests).Entries.sweepExpiredDeleted (option
"use the deleted scores to clean up after the expiry"). Original notes:
list-ghosts MISSING rows confined to all/deleted are
expected. Suggest leaving them out of the email (or out of the report
count used for notifyAdmin), and only alerting when a live list
(entries, drafts, pages, scheduled, created) loses its key.
Alternatively, remove deleted ids from all/deleted when the TTL is
set, or let a scheduled sweep do the pruning instead of Fix().Changed metadata of, 1× Changed label of),
client: empty. No timestamp checked on prod; the code path fully explains it.app/templates/folders. app/setup.js builds the
demo folders on every boot; setupBlogs.js writes the config menu
(no metadata, one label differs from the page title) and
applyChanges then runs Fix(), which restores metadata/labels from the
page entries. A menu item whose id is a folder (no entry) is left alone.setupBlogs keep each existing menu item's
entry-derived label/url/metadata instead of resetting them from config
(the email itself was left on, so real demo-blog repairs still surface).MISSING row (an image whose Drive name has a
/ in it), client: google-drive. Timestamp is from the email (Drive hourly fix
at :30) and wasn't confirmed on prod./ in the Drive name
into a subfolder plus a file. The new localName maps it to _, so the
next walk downloaded the flat name and removed the subfolder with one
fs.remove + update(folder). That doesn't drop entries under a folder,
so the old nested entry stayed live until Fix() dropped it./ in a file name, once each,
after that deploy. The gap behind it (removing a folder leaves its
entries live) is older and also affects Drive folder renames/deletes and
Dropbox reset-to-blot.clients/util/localDescendants). Dropbox webhook syncs were never
affected, because Dropbox reports a delete for each descendant.RESYNC_FOUND_CHANGES, iCloud, no Fix() rows. 93 downloaded, 11
dirs, 0 removed, from sync_c16e43d on green (12:16:07–12:18:27).© blotcms, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/triage-sync-fix-repair of blotcms/blot.
Open the folder on GitHubat commit 6b1a30f
Triage Sync Fix Repair next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Triage Sync Fix Repair this skillblotcms/blot | 2k | — | ~4.1k | Automated safety check: Pass | AGPL-3.0 | |
| Latchkeyimbue-ai/latchkey | 130 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Performing Cloud Storage Forensic Acquisitionmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~3.5k | Automated safety check: Pass | Apache-2.0 | |
| C Filesdaxaur/openpaw | 174 | — | ~317 | Automated safety check: Pass | MIT | |
| Media Backupsundial-org/awesome-openclaw-skills | 663 | — | ~478 | Automated safety check: Pass | None | |
| Gdclibadlogic/pi-skills | 2.6k | 1 repos | ~759 | Automated safety check: Pass | MIT |
imbue-ai/latchkey
Interact with arbitrary third-party or self-hosted services (AWS, Slack, Google Drive, Dropbox, GitHub, GitLab, Linear, Coolify...) using their HTTP APIs.
mukul975/Anthropic-Cybersecurity-Skills
Perform forensic acquisition of cloud storage services including Google Drive, OneDrive, Dropbox, and Box by pulling API-based remote data such as revision history and audit logs, and collecting…
daxaur/openpaw
Sync files to Google Drive, S3, Dropbox, OneDrive, and 70+ cloud providers using rclone.
sundial-org/awesome-openclaw-skills
Archive Clawdbot conversation media (photos, videos) to a local folder.
badlogic/pi-skills
Google Drive CLI for listing, searching, uploading, downloading, and sharing files and folders.
googleworkspace/cli
Google Drive: Upload a file with automatic metadata. An agent skill from googleworkspace/cli.
blotcms/blot
Review what Blot's request-time folder-link rewrite (app/blog/render/replaceFolderLinks) still does in production, from the [folder-links] and [folder-asset-origin] log lines, to decide what has to…
blotcms/blot
Investigate a "Dropbox sync issue" alert email from Blot's hourly Dropbox sync validation (each flagged blog lists unsynced changes, Fix() repairs, errors and/or a stuck folder lock; the changes…
blotcms/blot
Work out why the blot-container-{blue,green,yellow} Docker containers from the most recent production deployment have restarted — distinguishing a normal deploy-triggered restart from a crash (V8…
blotcms/blot
Scan the production openresty access log (/var/instance-ssd/logs/access.log) for requests with slow upstream response times (st=, the time the node containers took to answer), triage and rank them…
blotcms/blot
Investigate an "iCloud resync found changes" admin email (the ICLOUDRESYNCISSUE email a macserver-requested resync sends when it found changes, Fix() repairs or errors, with the macserver's reason)…
blotcms/blot
Analyze production Node.js app container response times to find slow-rendering sites, cross-checking against nginx queuing delay to rule out false positives (a site only looks slow because the event…
Works with
Triage Fix() repairs reported in a "<Client sync issue" digest email (Dropbox sync issue, etc.; the "Fix() repaired:" lines under a blog) or in a "Resync found changes" or "iCloud resync found…. Triage Sync Fix Repair is an agent skill from blotcms/blot.; the "Fix() repaired:" lines under a blog) or in a "Resync found changes" or "iCloud resync found changes" email.
Triage Sync Fix Repair fits situations like: the user pastes; forwards one of these emails; asks why Fix() repaired a blog.
Run `npx skills add blotcms/blot --skill triage-sync-fix-repair -a claude-code`. Or copy the skill folder (.claude/skills/triage-sync-fix-repair in blotcms/blot) into .claude/skills/triage-sync-fix-repair in your project. Claude Code loads it when a task matches its description.
Run `npx skills add blotcms/blot --skill triage-sync-fix-repair -a codex`. Or copy the skill folder (.claude/skills/triage-sync-fix-repair in blotcms/blot) into .agents/skills/triage-sync-fix-repair in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add blotcms/blot --skill triage-sync-fix-repair -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/triage-sync-fix-repair, .gemini/skills/triage-sync-fix-repair, .github/skills/triage-sync-fix-repair and .opencode/skills/triage-sync-fix-repair in your project.
Going by SKILL.md and its folder, Triage Sync Fix Repair needs the command-line tools its instructions call (docker). Our summary lists: Docker.
SKILL.md contains no URLs. Its commands use docker, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Triage Sync Fix Repair is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Triage Sync Fix Repair: Latchkey (imbue-ai/latchkey, 130 stars), Performing Cloud Storage Forensic Acquisition (mukul975/Anthropic-Cybersecurity-Skills, 34k stars), C Files (daxaur/openpaw, 174 stars) and Media Backup (sundial-org/awesome-openclaw-skills, 663 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
blotcms (a GitHub organization) maintains it in blotcms/blot, which has 1,983 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 9, 2026.
Source: blotcms/blot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.