Agent skill

Test Blogs

by blotcms in blotcms/blot

Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to…

AGPL-3.0Auto-check passedTesting & QA

Install Test Blogs

skills CLI
$ npx skills add blotcms/blot --skill test-blogs -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install blotcms/blot test-blogs --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/blotcms/blot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/test-blogs .claude/skills/test-blogs && rm -rf skills-src

Use ~/.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/

Facts

Skill name
test-blogs
GitHub stars
2k
Token cost
~2.3k tokens
SKILL.md length
1,010 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to…

  • Works in 7 steps: Ask the operator before every production… → Only write to these four blogs'… → Writing into the four synced folders and… → …
  • Asked to write to
  • SKILL.md covers Rules, Test content, Writing and Verification, plus 2 more sections
  • Calls git, ssh and aws; reaches cdn.blot.im

What it does

Test Blogs is an agent skill from blotcms/blot. Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to end - the published page, CDN and /assets responses, the generated assets on production disk, and their copy in S3 once the storage bucket exists - and clean up. Use when asked to write to, exercise or test the production test blogs, to check a sync client (Git, Dropbox, Google Drive, iCloud) after a change or deploy, to…

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering File uploads and storage, QA and bug reports and Document parsing. It works with Dropbox, Git, Google Drive and Amazon Web Services. The repository describes itself as: Turns a folder into a website. The licence is AGPL-3.0.

When your agent uses it

  • Asked to write to
  • Test the production test blogs
  • Check a sync client (Git
  • ICloud) after a change

Example prompts

  • “/test-blogs”

Requirements

  • Docker

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Ask the operator before every production command: ssh blot,
  2. Only write to these four blogs' folders/repos. Never touch any other blog.
  3. Writing into the four synced folders and pushing to gittest need no
  4. Public repo: no credentials, account IDs, email addresses or ssh details
  5. Read-only AWS calls (AWS_PROFILE=blot AWS_REGION=us-west-2 aws s3api head-object ...)
  6. Hand mechanical polling and verification (curl loops, header checks) to a
  7. End every run by appending an entry to the run log below.

What it can do on your machine

Read from SKILL.md and the folder at commit 6250431. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • ssh
    • aws
    • docker
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • cdn.blot.im

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Test Blogs loads about 2.3k tokens when it runs. Until then it costs about 181 tokens; SKILL.md has 1,010 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~181
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from blotcms/blot at commit 6250431, republished under its AGPL-3.0 licence (© blotcms). 1,010 words, ~2,279 tokens.

Download SKILL.mdSave it as .claude/skills/test-blogs/SKILL.md (or your agent's skills folder).
name
test-blogs
description
Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to end - the published page, CDN and /_assets responses, the generated assets on production disk, and their copy in S3 once the storage bucket exists - and clean up. Use when asked to write to, exercise or test the production test blogs, to check a sync client (Git, Dropbox, Google Drive, iCloud) after a change or deploy, to verify a post, image, thumbnail, document conversion or generated asset end to end, to check the S3 migration of generated assets, or to smoke-test a read-only freeze or deploy with real syncs.

Test blogs

Four production blogs, one per sync client, at https://{handle}.blot.im:

handleclientwrite content by
dbtestDropboxcopying files into ~/Library/CloudStorage/Dropbox/Apps/Blogs/dbtest/
drivetestGoogle Drivecopying into ~/Library/CloudStorage/GoogleDrive-*/My Drive/Sites/drivetest/ (glob the account part)
icloudtestiCloudcopying into ~/Library/Mobile Documents/com~apple~CloudDocs/Sites/Test/
gittestGitclone, commit, push (below)

Related: investigate-dropbox-sync-issue, investigate-macserver-sync-issue, data-volume (read-only freeze). Design of the asset move: app/storage/README, app/storage/assets.js.

Rules

  1. Ask the operator before every production command: ssh blot, ssh macserver, docker exec. State the exact command; approval covers that command only. List the planned commands together so they can be approved in one go. If the harness blocks a prod read, do not retry or rephrase: give the operator the command to run and paste back.
  2. Only write to these four blogs' folders/repos. Never touch any other blog.
  3. Writing into the four synced folders and pushing to gittest need no per-action approval once the operator has invoked this skill (they are their own test blogs), but say what you are writing and where.
  4. Public repo: no credentials, account IDs, email addresses or ssh details here or in scripts/test-blogs/, and no production sizes or counts.
  5. Read-only AWS calls (AWS_PROFILE=blot AWS_REGION=us-west-2 aws s3api head-object ...) are fine without asking; say what you ran.
  6. Hand mechanical polling and verification (curl loops, header checks) to a cheaper subagent (sonnet/haiku) when it helps; judge the results yourself.
  7. End every run by appending an entry to the run log below.

Test content

Names must be unique and recognisable: prefix everything skilltest-{unix timestamp} (e.g. skilltest-1760000000/post.md) so cleanup is a glob. Keep it small and write only what the question needs:

  • Markdown post: fastest; exercises sync, build, render. Put Title: Skilltest {ts} and Link: skilltest-{ts} metadata lines at the top so the post is at a known URL, /skilltest-{ts}.
  • Post with a JPEG/PNG (from anywhere on disk, copied in beside the post and referenced ![alt](photo.jpg)): exercises _image_cache and _thumbnails (thumbnails need the image in the post body or a Thumbnail: metadata line).
  • .docx / .odt / .epub: exercises the converters and _assets.
  • A second file edit or a delete + re-add: exercises update/removal paths.

Use one blog for a quick check; all four when checking the sync clients or a deploy. Always note which blog(s) and file names you used for the log.

Writing

Dropbox, Drive, iCloud: mkdir -p a skilltest-{ts} folder in the blog's folder above and copy the files in.

If a copy fails with "Operation not permitted", macOS privacy controls (TCC) are blocking the shell from the cloud folder. Do not work around it. The process macOS holds responsible is not Claude.app but the Claude Code binary it bundles (a disclaimer helper starts it), at a versioned path; find it with ps -o pid=,ppid=,comm= -p <pid> up the chain from $$, e.g. ~/Library/Application Support/Claude/claude-code/<version>/<hash>/claude.app. Ask the operator to add that claude.app under System Settings → Privacy & Security → Full Disk Access (⌘⇧G to paste the path) and restart Claude. The grant follows the version, so it needs redoing after a Claude Code update.

Git: the remote URL, with credentials, is the single line of ~/.config/blot/test-blogs/gittest-remote (mode 600, outside every checkout so any worktree's session finds it; the email in the URL is written %40). The operator creates it once. If the file is missing, tell the operator to create it; never ask for credentials in chat. Never print, log or echo the URL.

R=~/.config/blot/test-blogs/gittest-remote
git clone -q "$(cat $R)" "$SCRATCH/gittest" >/dev/null 2>&1   # SCRATCH = session scratchpad
cd "$SCRATCH/gittest"
# add skilltest-{ts}/..., then:
git add -A && git -c user.name=skilltest -c user.email=skilltest@localhost commit -qm "skilltest-{ts}"
git -c credential.helper= push -q "$(cat $R)" HEAD 2>&1 | sed 's#https\?://[^ ]*#<remote>#g'
git ls-remote "$(cat $R)" HEAD 2>&1 | sed 's#https\?://[^ ]*#<remote>#g' | cut -c1-12   # matches `git rev-parse HEAD`?

Redirect or redact all git output, since errors can echo the remote URL. Do not run git remote -v, git config --list or set -x.

Show full SKILL.md (468 more words)Show less

Verification

  1. Public page. Poll https://{handle}.blot.im/{post-url} (or the homepage, or /search?q={ts}) every few seconds with a timeout until the title appears. Seen 10 Oct 2026: Dropbox ~6s, iCloud ~8s, Drive ~20s, git within seconds of the push (removals similar). No result within a few minutes is a finding; check the sync client rather than waiting longer.
  2. Asset URLs. From the HTML, extract CDN URLs (https://cdn.blot.im/blog_.../...) and blog-domain /_assets/, /_image_cache/, /_thumbnails/ URLs. curl -sI each: status, content-type, cache-control (CDN assets are expected to be 200 with a long max-age). Compare with the S3 numbers below.
  3. Production disk and bucket, one approved command (read-only, exits when done): ssh blot docker exec blot-container-green node scripts/test-blogs/inspect.js <handle> [path-in-folder] The path is the file's path in the blog folder, e.g. skilltest-1760000000/post.md; without one it takes the most recent entries (-n N, default 3). Output:
    blog blog_<id> handle=dbtest client=dropbox s3=not configured
    entry /skilltest-1760000000/post.md url=/skilltest-post updated=2026-10-10T12:00:00.000Z deleted=false draft=false
      thumb small https://cdn.blot.im/blog_<id>/_thumbnails/<uuid>/small.jpg
      asset via=cdn disk=yes  _thumbnails/<uuid>/small.jpg
      asset via=blog disk=missing  _assets/<uuid>/post.docx
    (with a bucket configured, each asset line also carries:)
      asset via=cdn disk=yes  s3=yes 18342B image/jpeg cache-control="public, max-age=31536000"  _image_cache/<uuid>/photo.jpg
    disk= is storage/assets.exists; the s3= part appears only when the storage bucket is configured and storage/s3 exists (s3=missing is a failure then). The script only exists on production after the next deploy that includes it; before that, fall back to ssh blot ls -la /var/www/blot/data/static/<blogID>/<subdir>/... (blog ID from the blog_... segment of any CDN URL on the page).
  4. S3 from the Mac (once the bucket exists). Ask the operator for the bucket name; do not read the production env file: AWS_PROFILE=blot AWS_REGION=us-west-2 aws s3api head-object --bucket <bucket> --key <blogID>/<relPath> Keys are the CDN path ({blogID}/_image_cache/...). Check ContentType and CacheControl against the curl headers from step 2.
  5. Report per blog: appeared after N seconds; each asset's HTTP status, disk, S3; anything odd.

Cleanup

Delete the skilltest-{ts} folder(s) from each folder (or git rm -r and push for gittest) and poll until the post is gone from the public site. Generated assets are not deleted when an entry is deleted (by design); expected, not a finding. Delete the scratchpad clone too.

Run log

Newest last. Add one dated entry per run.

### <date> — <what was tested>
- Blogs / content: …
- Result: …
- Odd: …
2026-10-10 — first run: image post on all four blogs (after PR #2109)
  • Blogs / content: skilltest-1791618418/post.md + photo.png (a 1024×768 PNG) on dbtest, drivetest, icloudtest, gittest.
  • Result: live after dbtest 6s, icloudtest 8s, drivetest 20s, gittest <15s. Each post's _image_cache image and large thumbnail returned 200 image/png max-age=31536000 from cdn.blot.im. ls on prod found the cached image and all four thumbnail sizes in data/static/<blogID>/. Cleanup: gone after 5-28s.
  • Odd: TCC needed Full Disk Access on the bundled, versioned Claude Code claude.app, not Claude.app. The zsh shell has no PIPESTATUS, so push success is checked with ls-remote. inspect.js is not deployed yet, so verification used the ls fallback.

© 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

Files

Just SKILL.md in .claude/skills/test-blogs of blotcms/blot.

Open the folder on GitHubat commit 6250431

Compare with similar skills

Test Blogs 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.

Test Blogs compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Test Blogs this skillblotcms/blot2k—~2.3kAutomated safety check: PassAGPL-3.0
Diff-Driven Smoke TestsSkyvern-AI/skyvern23k—~5.2kAutomated safety check: PassAGPL-3.0
Latchkeyimbue-ai/latchkey130—~1.1kAutomated safety check: PassMIT
C Filesdaxaur/openpaw173—~317Automated safety check: PassMIT
OpenHarness End-to-End EvalsHKUDS/OpenHarness16k1 repos~2.1kAutomated safety check: NotesMIT
CodexBar Live QAsteipete/CodexBar22k—~1.2kAutomated safety check: PassMIT

Similar skills

  • Diff-Driven Smoke Tests

    Skyvern-AI/skyvern

    Reads your git diff, writes a handful of happy-path browser smoke tests, runs them with Skyvern or Chrome DevTools MCP and posts screenshot evidence to the PR.

    23k GitHub stars~5.2k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • 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.

    130 GitHub stars~1.1k tokensUpdated 2 days ago
    Backend & APIsAuto-check passed
  • C Files

    daxaur/openpaw

    Sync files to Google Drive, S3, Dropbox, OneDrive, and 70+ cloud providers using rclone.

    173 GitHub stars~317 tokensUpdated 4 mo ago
    Backend & APIsAuto-check passed
  • Validates OpenHarness features by running real multi-turn agent loops with live LLM calls against an unfamiliar codebase, checking actual tool execution.

    16k GitHub starsUsed in 1 repo~2.1k tokens
    Testing & QAAuto-check: notes
  • CodexBar Live QA

    steipete/CodexBar

    Runs live QA for the CodexBar app: provider usage matrix checks through its packaged CLI, config validation and menu checks, with 1Password-backed credentials handled safely.

    22k GitHub stars~1.2k tokensUpdated today
    Testing & QAAuto-check passed
  • Verifies a delivery end to end by driving the real product on a CLI, web, desktop or iOS Simulator surface, capturing evidence and publishing a round with the lh CLI.

    83k GitHub stars~9.7k tokensUpdated today
    Testing & QAAuto-check passed

More from blotcms/blot

All 11 skills in this repo
  • Data Volume

    blotcms/blot

    Grow or shrink the EBS volume that holds the app host's data directory (/var/www/blot/data), with config/host/data-volume/resize.sh (grow in place; shrink by live rsync passes, a brief read-only…

    2k GitHub stars~1.4k tokensUpdated yesterday
    Auto-check: notes
  • 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…

    2k GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed
  • 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…

    2k GitHub stars~4.7k tokensUpdated yesterday
    Auto-check passed
  • 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…

    2k GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed
  • 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)…

    2k GitHub stars~4.2k tokensUpdated yesterday
    Auto-check: warnings
  • 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…

    2k GitHub stars~1.9k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Test Blogs

What does Test Blogs do?

Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to…. Test Blogs is an agent skill from blotcms/blot. Write content into Blot's production test blogs (gittest, dbtest, drivetest, icloudtest - one per sync client) the way a real user would, wait for Blot to sync and build it, then verify it end to end - the published page, CDN and /assets responses, the generated assets on production disk, and their copy in S3 once the storage bucket exists - and clean up.

When should I use Test Blogs?

Test Blogs fits situations like: asked to write to; test the production test blogs; check a sync client (Git; ICloud) after a change.

How do I install Test Blogs in Claude Code?

Run `npx skills add blotcms/blot --skill test-blogs -a claude-code`. Or copy the skill folder (.claude/skills/test-blogs in blotcms/blot) into .claude/skills/test-blogs in your project. Claude Code loads it when a task matches its description.

How do I install Test Blogs in Codex?

Run `npx skills add blotcms/blot --skill test-blogs -a codex`. Or copy the skill folder (.claude/skills/test-blogs in blotcms/blot) into .agents/skills/test-blogs in your project. Codex loads it when a task matches its description.

Can I use Test Blogs in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add blotcms/blot --skill test-blogs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-blogs, .gemini/skills/test-blogs, .github/skills/test-blogs and .opencode/skills/test-blogs in your project.

What does Test Blogs need to run?

Going by SKILL.md and its folder, Test Blogs needs the command-line tools its instructions call (git, ssh, aws, docker and curl). Our summary lists: Docker.

Does Test Blogs access the network?

SKILL.md names 1 domain. In commands or code: cdn.blot.im; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Test Blogs safe to install?

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.

What licence does Test Blogs use?

Test Blogs 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.

How many tokens does Test Blogs use?

About 2.3k tokens (SKILL.md is roughly 9.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Test Blogs?

Skills that share tags, products or a category with Test Blogs: Diff-Driven Smoke Tests (Skyvern-AI/skyvern, 23k stars), Latchkey (imbue-ai/latchkey, 130 stars), C Files (daxaur/openpaw, 173 stars) and OpenHarness End-to-End Evals (HKUDS/OpenHarness, 16k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Test Blogs?

blotcms (a GitHub organization) maintains it in blotcms/blot, which has 1,983 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 10, 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.