Novu Design Workflow
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
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…
$ npx skills add blotcms/blot --skill investigate-slow-upstream-responses -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install blotcms/blot investigate-slow-upstream-responses --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/investigate-slow-upstream-responses .claude/skills/investigate-slow-upstream-responses && 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 "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .claude/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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/investigate-slow-upstream-responsesType 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 investigate-slow-upstream-responses -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install blotcms/blot investigate-slow-upstream-responses --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/investigate-slow-upstream-responses .agents/skills/investigate-slow-upstream-responses && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .agents/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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 investigate-slow-upstream-responses -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install blotcms/blot investigate-slow-upstream-responses --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/investigate-slow-upstream-responses .cursor/skills/investigate-slow-upstream-responses && 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 "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .cursor/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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/investigate-slow-upstream-responses--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 investigate-slow-upstream-responses -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install blotcms/blot investigate-slow-upstream-responses --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/investigate-slow-upstream-responses .gemini/skills/investigate-slow-upstream-responses && 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 "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .gemini/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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 investigate-slow-upstream-responsesInstalls 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 investigate-slow-upstream-responses -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/investigate-slow-upstream-responses .github/skills/investigate-slow-upstream-responses && 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 "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .github/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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 investigate-slow-upstream-responses -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 investigate-slow-upstream-responses --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/investigate-slow-upstream-responses .opencode/skills/investigate-slow-upstream-responses && 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 "investigate-slow-upstream-responses" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/investigate-slow-upstream-responses into .opencode/skills/investigate-slow-upstream-responses/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigate-slow-upstream-responses", 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.
investigate-slow-upstream-responsesScan 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…
Investigate Slow Upstream Responses is an agent skill from 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 while setting aside routes that are slow by design (SSE, long polls, webhooks), then investigate the top candidates with the app logs and the render-probe script to tell a regularly pathological request from one that queued behind something else. Appends a short entry to this skill's findings log. Use when asked to look…
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `join-app-log.js`, `probe-summary.js` and `triage.js`).
It sits in Backend & APIs, covering Webhooks. The repository describes itself as: Turns a folder into a website. The licence is AGPL-3.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6250431. 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.
Ships script files (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
sshnodenpmdockerredis-cliFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use ssh, npm and 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.
Investigate Slow Upstream Responses loads about 3.6k tokens when it runs. Until then it costs about 167 tokens; SKILL.md has 1,738 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 6250431, republished under its AGPL-3.0 licence (© blotcms). 1,738 words, ~3,633 tokens.
.claude/skills/investigate-slow-upstream-responses/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Bar: 100ms. Any page request whose st= is over 100ms is bad. Most
blog renders take ~10ms, so 100ms+ means either the request is expensive or
it waited behind one that was.
Related: node-response-time-review ranks sites by app-side render time over
a window. This skill starts from nginx's view (st=), separates queueing from
real cost, and goes on to find out why with the render probe.
Host ssh blot. The operator has OK'd read-only commands for this skill
(log reads, docker logs, docker ps, redis-cli read commands on specific
keys, never KEYS). Nothing that writes, restarts or deletes.
npm run render-probe starts a throwaway container on the host (data
mounted read-only, own memory/CPU limit) and is part of this skill. Run one
probe at a time, keep --concurrency low, and pass --yes only once the
operator has agreed to probing in this session. Its output in
./data/render-probe/<run>/ holds customer content: delete it when done.
Log format (proxy/config/http.conf, access_log_format):
[06/Oct/2026:09:28:17 +0000] <request_id> <status> <request_time> <req>:<bytes> <url> cache=<HIT|MISS|-> ip=… st=<upstream_response_time> lrs=… up=<addr> ua=…st=-: nginx cache hit, no upstream. st=0.088, 0.049 / up=a, b: a
retry on a second upstream (sum them). Ports: 8090 yellow (blogs),
8089 green (blot.im POSTs, webhooks), 8088 blue (dashboard and blot.im
GETs; also the backup for blogs, so blog requests on blue mean yellow
was down or failing, usually around a deploy).<request_id> is passed to node as X-Request-ID, so the same id appears
in the container's log (app/request-logger.js):[time] [yellow] <id> <url> GET
[time] [yellow] <id> +12ms <req.log step>
[time] [yellow] <id> <status> <duration-s> <url> elu=<0..1> slowest=+<ms>ms:"<step>"st − duration ≈ time the request queued before the app's middleware
ran. elu is event-loop utilisation over the request: ~1 means the
process was CPU-bound (this request or another), ~0 means it was
waiting on I/O (Redis, disk). slowest= is the longest gap between
the request's req.log steps and the step that ended it (only on
requests that log steps, mostly blog renders; (response finished) means
the gap was after the last step). A request that never finishes logs
<id> Connection closed by client <url> instead.[EVENT LOOP] lag max=… lines (app/helper/eventLoopMonitor.js) mark
windows where the loop blocked >500ms.docker ps uptime first:
the access log usually covers more time than the app logs do.Routes that are slow by design: the triage script sets these aside, so glance at the counts but don't investigate unless something looks off:
| Route | Why |
|---|---|
blot.im/sites/*/status, …/import/status | dashboard SSE (helper/sse) |
webhooks.blot.im/connect | webhook relay SSE (app/clients/webhooks.js) |
*/draft/stream/* | draft preview SSE |
preview-of-*/__blot/preview/reload | template preview SSE |
blot.im/clients/{google-drive,dropbox}/webhook* | sync work done inline |
blot.im/clients/git/*, stripe/paypal-webhook, rebuild, import, OAuth | real work inline |
Add to LONG_LIVED / INHERENT in triage.js when you meet a new one.
Use cheaper subagents (model: "sonnet") for per-candidate digging. Keep
triage, render probes and the write-up in the main agent. Probes run one at
a time on the host, so don't let parallel subagents start them.
S=<scratchpad>
ssh blot "docker ps --format '{{.Names}}\t{{.Status}}'"
ssh blot "ls -la /var/instance-ssd/logs/"
ssh blot "gzip -c /var/instance-ssd/logs/access.log" > $S/access.log.gz(gzip: file size changed while zipping is harmless: the log is live.) Add
the rotated access.log-YYYYMMDD for a longer window. Note when the app
containers started; requests before then can only be judged from nginx.
T=.claude/skills/investigate-slow-upstream-responses/triage.js
node $T $S/access.log.gz # whole window
node $T $S/access.log.gz --since 08:42:00 # since containers started
node $T $S/access.log.gz --detail <host> # one host's slow requests + ids
node $T $S/access.log.gz --at 04:10:30 # everything in flight around a momentIt prints:
slow/all says how often that route is slow. own
counts slow requests that were alone or the cluster suspect (likely their
own cost). The rest overlapped something slower (likely queued);Pick candidates: top URL groups with high own, hosts with a high slow
share, and every cluster suspect over ~1s. Drop anything that only appears
as a victim. Treat requests on blue for a blog host and anything in
the first few minutes after a container start as deploy noise unless it
continues afterwards. Check the root TODO ("Fix performance bugs on
various sites") and the findings log below for already-known sites.
Join the slow requests to the app's response lines by request id:
J=.claude/skills/investigate-slow-upstream-responses/join-app-log.js
ssh blot "for c in blue green yellow; do docker logs blot-container-\$c 2>&1; done | grep -E '^\[[^]]+\] \[[a-z-]+\] [0-9a-f]{32} ([0-9]{3} [0-9.]+ |Connection closed)'" > $S/app.log
node $J $S/access.log.gz $S/app.log [--host <host>]It splits slow requests into mostly queued (st − app > st/2) and
mostly own time, then into CPU-bound (elu ≥ 0.8) and I/O-bound
(elu < 0.3), counts the most common slowest= steps, and lists the
slowest requests with st / app / queued / elu / slowest step. Only requests
since the containers started can join; the access log copy must overlap
that (pull it fresh if a deploy happened since).
For one request id, every step it logged:
ssh blot "docker logs --timestamps blot-container-yellow 2>&1 | grep <id>"All of a host's completion lines, slowest first:
ssh blot "docker logs blot-container-yellow 2>&1 | grep -E '^\[[^]]+\] \[yellow\] [0-9a-f]{32} [0-9]{3} [0-9.]+ https?://<host>' | awk '{print \$5, \$6, \$8, \$7}' | sort -k2 -rn | head"Read it as:
redis-cli SLOWLOG GET 20),
disk, or an outbound fetch.--at <time> to find what was
running on that upstream and investigate that instead./page/N,
/search) → still a real cost, but the fix may be cheaper 404s or
caching rather than faster renders.Brief for a sonnet subagent (one per candidate, run in parallel, background).
Make it self-contained: the context above (host, containers, deploy time, log
formats, what elu means, read-only rule, no probes), the candidate's slow
lines with ids from --detail, its slow/all, and ask for: app duration/elu
and st − duration per id, the code path for that route with file:line,
whether cost scales with entry count, regular vs one-off, ranked likely causes
with confidence, under ~400 words.
For blog hosts only (the probe mounts the blog router; blot.im pages can't
be probed, so read their code instead). See scripts/render-probe/README.md.
npm run render-probe -- https://<host>/<path> [more urls] --repeat 3 --verbose --cpu-prof --yes
npm run render-probe -- --stats https://<host> # catalog size, read timings, Redis diagnostics
npm run render-probe -- --replay access.log --from 2026-10-06T04:10:20 --to 2026-10-06T04:10:35 # reproduce a stall windowSummarise the output (per-request time, Redis commands/bytes, costliest phases, and the CPU profile's top self-time functions):
node .claude/skills/investigate-slow-upstream-responses/probe-summary.js data/render-probe/<run>--repeat 3: first render is cold (like just after a deploy), repeats are
warm. Slow every time = regularly pathological. Slow once = cold cache.--verbose / phases.ndjson: which step costs what (catalog fetch,
augmentEntries, prepareCacheValue, cloneDeep, retrievers,
loadView, Mustache). Phases of concurrent async work overlap, so
read the slowest one, not the sum. Lots of Redis commands with a low
loop delay = I/O-bound (round trips); mustache/cloneDeep dominant
with a large page = CPU-bound template.requests.ndjson: Redis commands and reply bytes per request: lots of
round trips → I/O, huge replies → catalog size.--cpu-prof: .cpuprofile in the output dir (open in Chrome DevTools >
Performance, or summarise self-time by function with a short node script).--replay a stall cluster's window to check that the suspect really
causes it: if the replay's own timings show the same pile-up, it's the
burst (often one site's CPU-heavy renders × a parallel crawler), not
something outside the app. The replay caps in-flight requests at 8 and
skips the rest, so a burst wider than that won't fully reproduce. Read
"skipped N request(s)" and the per-request times rather than expecting
the production numbers.--at, [EVENT LOOP], Redis
SLOWLOG, a sync or validation run in green's log at that time).Delete ./data/render-probe/<run>/ when done.
Report to the operator in chat (domains and ids are fine there): window,
headline numbers, each candidate's classification with evidence, and what
to fix. Don't change code unless asked. If a site or route needs work, add a
compact line to the root TODO (under "Fix performance bugs on various
sites" for a site), or note it for a PR.
Then append an entry to the findings log below and update the Method or
triage.js if you learned something. Clean up scratch copies of the log.
Read this first: a known slow site or route changes the triage. Newest last.
Privacy: this file is committed to the repo, so entries must contain no customer information. No domains, handles, blog IDs, paths that name content, post titles or template names. Describe sites generically ("a blog with several thousand entries on a heavy custom template", "the site already listed in TODO under 'Fix performance bugs on various sites'"). Give UTC timestamps and nginx request ids (random tokens) so a future agent can re-find the requests in the logs. Keep out userbase/infra size numbers; percentages and per-request timings are fine.
Entry template:
### <date> — window <HH:MM>–<HH:MM> UTC
- Headline: <share of upstream requests over 100ms>, <what dominated>
- <candidate>: <classification> — <evidence: st, app duration, elu, probe> — <cause / next step>
- Set aside / noise: …
- Follow-up: …50ab38e0a873d503affbbf68491d3223): a crawler fetched ~20 of its pages
at once, each costing 0.2–0.6s of CPU (app elu ≈ 0.99 on every render,
probe warm render ~600ms, mostly Mustache on a ~650KB page). A replay of
that window (in-flight capped at 8) peaked at 336ms loop delay, so the
production pile-up needed the wider burst./search costs 0.5–0.8s warm (the search_results local
reads ~10MB from Redis per query), and its 404s cost 100–400ms. The 404s
are crawler hits on …/null links the template emits./questions/* pages: 250–750ms, elu 0.2–0.4 (I/O), including
302s from /questions/:id/edit. Not root-caused yet.mailto: link (No file found in folder: mailto:…).changes.watch webhook in the window
ended 499 at ~8.8s. app/clients/google-drive/routes/site.js awaits
the sync before replying, so Google hangs up each time (unlike the Dropbox
webhook, which acks first).slowest= field to the response log line and
join-app-log.js. TODO lines added for the Google Drive webhook ack and
mailto: lookups.© 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
SKILL.md and 3 other files in .claude/skills/investigate-slow-upstream-responses of blotcms/blot.
Open the folder on GitHubat commit 6250431
Investigate Slow Upstream Responses 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 |
|---|---|---|---|---|---|---|
| Investigate Slow Upstream Responses this skillblotcms/blot | 2k | — | ~3.6k | Automated safety check: Pass | AGPL-3.0 | |
| Novu Design Workflownovuhq/novu | 40k | — | ~2.6k | Automated safety check: Pass | Custom licence | |
| Golivemikehasa/golive-skill | 1.3k | — | ~13k | Automated safety check: Notes | MIT | |
| Stripe Appsfossasia/eventyay | 1.7k | 1 repos | ~3.6k | Automated safety check: Pass | Apache-2.0 | |
| Dingtalk Messageagentscope-ai/ReMe | 3.6k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| PR Review Provideryansongda/pay | 5.4k | — | ~2.4k | Automated safety check: Pass | MIT |
novuhq/novu
Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state.
mikehasa/golive-skill
Take an agent-written app from repo to live production on the user's OWN accounts, with providers they choose (hosting, database, auth, payments, email, domain/DNS).
fossasia/eventyay
A skill your agent uses when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g.
agentscope-ai/ReMe
钉钉消息发送技能。支持企业内部机器人(批量单聊/群聊)和 Webhook 自定义机器人两种接入方式,支持多机器人管理,支持文本、Markdown、链接、ActionCard、FeedCard等多种消息类型。
yansongda/pay
A skill your agent uses when reviewing PRs that add or modify a payment Provider in yansongda/pay - covers plugin pipeline, multi-tenant safety, signature verification, docs, and naming conventions.
kanchengw/cnllm
Guides Stripe integration decisions — API selection (Checkout Sessions vs PaymentIntents), Connect platform setup (Accounts v2, controller properties), billing/subscriptions, Treasury financial…
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…
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
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…
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…
Categories
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…. Investigate Slow Upstream Responses is an agent skill from blotcms/blot.log) for requests with slow upstream response times (st=, the time the node containers took to answer), triage and rank them while setting aside routes that are slow by design (SSE, long polls, webhooks), then investigate the top candidates with the app logs and the render-probe script to tell a regularly pathological request from one that queued behind something else.
Investigate Slow Upstream Responses fits situations like: asked to look into slow upstream times; slow st= values; slow requests in the access log; re-run the slow upstream review.
Run `npx skills add blotcms/blot --skill investigate-slow-upstream-responses -a claude-code`. Or copy the skill folder (.claude/skills/investigate-slow-upstream-responses in blotcms/blot) into .claude/skills/investigate-slow-upstream-responses in your project. Claude Code loads it when a task matches its description.
Run `npx skills add blotcms/blot --skill investigate-slow-upstream-responses -a codex`. Or copy the skill folder (.claude/skills/investigate-slow-upstream-responses in blotcms/blot) into .agents/skills/investigate-slow-upstream-responses 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 investigate-slow-upstream-responses -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/investigate-slow-upstream-responses, .gemini/skills/investigate-slow-upstream-responses, .github/skills/investigate-slow-upstream-responses and .opencode/skills/investigate-slow-upstream-responses in your project.
Going by SKILL.md and its folder, Investigate Slow Upstream Responses needs JavaScript for the scripts in its folder and the command-line tools its instructions call (ssh, node, npm, docker and redis-cli). Our summary lists: Node.js; Docker.
SKILL.md contains no URLs. Its commands use ssh, npm and 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.
Investigate Slow Upstream Responses 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 3.6k tokens (SKILL.md is roughly 15k 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 Investigate Slow Upstream Responses: Novu Design Workflow (novuhq/novu, 40k stars), Golive (mikehasa/golive-skill, 1.3k stars), Stripe Apps (fossasia/eventyay, 1.7k stars) and Dingtalk Message (agentscope-ai/ReMe, 3.6k 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 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.