AWS Cloudformation Elasticache
giuseppe-trisciuoglio/developer-kit
Provides AWS CloudFormation patterns for ElastiCache Redis or Memcached infrastructure, including subnet groups, parameter groups, security controls, and cross-stack outputs.
Look after Blot's production Redis host (its own EC2 instance, built and operated with config/redis/): triage a "Redis host:" alert email from app/scheduler/check-redis-host.js (failed background…
$ npx skills add blotcms/blot --skill redis-host -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install blotcms/blot redis-host --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/redis-host .claude/skills/redis-host && 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 "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .claude/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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/redis-hostType 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 redis-host -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install blotcms/blot redis-host --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/redis-host .agents/skills/redis-host && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .agents/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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 redis-host -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install blotcms/blot redis-host --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/redis-host .cursor/skills/redis-host && 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 "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .cursor/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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/redis-host--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 redis-host -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install blotcms/blot redis-host --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/redis-host .gemini/skills/redis-host && 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 "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .gemini/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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 redis-hostInstalls 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 redis-host -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/redis-host .github/skills/redis-host && 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 "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .github/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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 redis-host -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 redis-host --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/redis-host .opencode/skills/redis-host && 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 "redis-host" agent skill from https://github.com/blotcms/blot/tree/master/.claude/skills/redis-host into .opencode/skills/redis-host/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "redis-host", 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.
redis-hostLook after Blot's production Redis host (its own EC2 instance, built and operated with config/redis/): triage a "Redis host:" alert email from app/scheduler/check-redis-host.js (failed background…
Redis Host is an agent skill from blotcms/blot. Look after Blot's production Redis host (its own EC2 instance, built and operated with config/redis/): triage a "Redis host:" alert email from app/scheduler/check-redis-host.js (failed background save, Redis refused writes - OOM/MISCONF/NOREPLICAS, other Redis errors, rejected connections, Redis restarted or switched host, slow Redis commands, TCP memory, memory over 80% of maxmemory, stale sample, maxmemory unset) or a problem in the Redis line of the daily email (resize now, last save failed, backup overdue, no…
Its SKILL.md is about 5.5k 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 Databases, covering Backup and disaster recovery and Technical documentation. It works with Redis. The repository describes itself as: Turns a folder into a website. The licence is AGPL-3.0.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 418e559. 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:
sshdockerawsnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use ssh, docker and aws, 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.
Redis Host loads about 5.5k tokens when it runs. Until then it costs about 246 tokens; SKILL.md has 2,858 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 noted patterns worth knowing about, such as sudo or a known installer.
On a disk problem, find what filled it (`sudo du -xh --max-depth=2 / | sort -h | tail`)leak, `sudo sysctl -w net.ipv4.tcp_mem=...` above the count, is lost onAutomated 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 418e559, republished under its AGPL-3.0 licence (© blotcms). 2,858 words, ~5,506 tokens.
.claude/skills/redis-host/SKILL.md (or your agent's skills folder).Production Redis is one host, built by config/redis/ and reached by the
app containers, the proxy and the cert scripts at a floating private IP
(BLOT_REDIS_HOST). config/redis/README.md describes the setup and holds
the steps for building a host, cutting over, resizing and disaster recovery.
This skill does not repeat them: it says which README section to use, which
read-only checks to propose for each alert, how to read them, and what must
never be done without asking.
SSH aliases: redis is the Redis host (ec2-user, port 22, key-only),
blot is the app host.
Related: investigate-production-container-restarts (a Redis stall shows up
there as [LOCK COMPROMISED] restarts; its section on the Redis host has the
TCP memory background) and investigate-slow-upstream-responses.
ssh redis,
ssh blot, docker exec, docker logs, and any AWS call that changes
something (launch, terminate, assign an address, modify an attribute, write
to S3). Read-only commands too. State the exact command. An approval
covers that command only, not the next one, not "the same kind of thing",
and not what other skills auto-approve. Read-only AWS describe-* / ls
calls are fine without asking, but say what you ran.launch.sh --drill for any throwaway host (a rehearsal, a
restore test, a cutover practice). A drill host is tagged BlotDrill=true
and can never upload backups, so it cannot overwrite or prune the
production ones.BlotDrill tag and
that it is not a production instance (not the one holding the floating IP
or serving BLOT_REDIS_HOST). Production instances have termination
protection; if a terminate is refused for that reason, stop and ask rather
than lifting it.[LOCK COMPROMISED]
restarts. Go forward to a fresh host instead.cutover.sh allows, and always --dry-run first.data/ directory
(the repo is public). Private IPs already in the README are fine.bash.CONFIG SET, BGSAVE,
readonly.sh, SLOWLOG RESET) or changes the host (sysctl -w,
bootstrap.sh) on your own initiative. Propose it, with the exact command
and what it will do, after the read-only checks say it is needed.app/scheduler/check-redis-host.js runs every 5 minutes on the master and
emails REDIS_HOST_ALERT with the subject Redis host: <summary> (template
app/helper/email/admin/REDIS_HOST_ALERT.txt). Each condition is emailed
once when it starts and once when it clears. Conditions are states; events
come from app/scheduler/redis-host-events.js, which compares Redis's
counters with the ones seen at the previous check (a gap over 15 minutes
starts a new baseline, so a long outage does not produce a flood).
| Alert title | Trigger |
|---|---|
| TCP memory nearing tcp_mem[1] | the host's sample mem is at 50% of tcp_mem[1] (clears at 45%) |
| TCP memory pressure | TCPMemoryPressures rose on the same host since the last sample |
| TCP memory sample stale | no new sample for 20 minutes (judged only if the previous check also read Redis within 11 minutes) |
| Redis memory nearing maxmemory | used_memory at 80% of maxmemory (clears at 75%); noeviction, so writes fail at the limit |
| maxmemory not set | maxmemory is 0 on a host marked active by /etc/blot-redis/floating-ip |
| Redis background save failing, writes will be refused | rdb_last_bgsave_status is not ok (stop-writes-on-bgsave-error yes) |
| Redis refused writes (OOM, MISCONF) | any new OOM, MISCONF or NOREPLICAS error (emailed at most hourly) |
| Redis errors | 100 or more new errors of one other type (READONLY, WRONGTYPE, ERR...) within one 5-minute check |
| Redis rejected connections | rejected_connections rose: Redis was at maxclients |
| Redis restarted or switched host | uptime went backwards, or run_id or version changed |
| Slow Redis commands | slowlog entries of 50ms or more (Redis records from 10ms) |
The daily email has one line, from app/scheduler/daily/redis-server.js:
**Redis:** memory 27% (resize in ~47 days), disk 21% (19 GB free), saved 3m ago, backed up 30m ago.
These need action:
| In the line | Meaning |
|---|---|
| resize now | memory is at 70% of maxmemory or more |
no maxmemory set | as the alert above |
last save failed / save not reported / never saved | background save problem |
| last backup Xh ago, overdue / no backup recorded | no upload for over 2 hours (backups are hourly) |
no sample from the Redis host / sample Nm old / disk not reported | the host's 5-minute sample is missing or old |
| /backups not mounted / backup disk N% full | the instance store holding local backup copies |
Redis: unavailable (...) | Redis itself is down; /redis-health covers that, treat it as an outage |
To print the current report without sending an email, the README has
NODE_PATH=app node app/scheduler/check-redis-host.js; on production that
runs inside an app container, so it is a production command (ask first).
Host checks run as ssh redis '<command>' (use ssh -n when the command
does not read stdin). redis6-cli needs no auth.
last save failedssh redis 'redis6-cli INFO persistence'
ssh redis 'sudo tail -n 100 /var/log/redis6/redis6.log'
ssh redis 'df -h / /backups; free -m; sysctl vm.overcommit_memory'rdb_last_bgsave_status:err, with rdb_last_bgsave_time_sec and
latest_fork_usec (in INFO stats) for how long the last good one took.Can't save in background: fork: Cannot allocate memory is overcommit (vm.overcommit_memory must be 1; bootstrap.sh
sets it) or too little free RAM for the fork's copy-on-write: memory is too
high for the host, so see the resize section. No space left on device or
Write error saving DB on disk is the root disk (/var/lib/redis6).MISCONF) until a save succeeds, so it is urgent.
Redis retries on its own save schedule; a manual BGSAVE is a write
to the host, so propose it separately once the cause is fixed.sudo du -xh --max-depth=2 / | sort -h | tail)
before deleting anything, and ask before deleting.ssh redis 'redis6-cli INFO errorstats'
ssh redis 'redis6-cli INFO memory | grep -E "^(used_memory_human|maxmemory_human|mem_fragmentation_ratio):"'
ssh redis 'redis6-cli CONFIG GET min-replicas-to-write'OOM: memory reached maxmemory. Treat as the memory alert below, but
urgent: the app is serving 503s.MISCONF: the failed-save section above.NOREPLICAS: min-replicas-to-write is not 0. It should be 0; readonly.sh
sets 99 and may have been left on after a freeze or a rehearsal
(readonly.sh <host> off undoes it, which is a write: propose it).Error saving file in database lines, and
[LOCK COMPROMISED] restarts, in the containers' logs (see below).INFO errorstats for the type and count. READONLY is expected for a moment
during a cutover; outside one, clients are talking to a replica: check
redis6-cli ROLE on the host BLOT_REDIS_HOST points at, and which host has
/etc/blot-redis/floating-ip. WRONGTYPE or ERR in bulk is an app bug:
find the error text and the calling code in the containers' logs and fix it
in the app.
ssh redis 'redis6-cli INFO clients'
ssh redis 'redis6-cli CLIENT LIST | grep -o " addr=[0-9.]*" | sort | uniq -c | sort -rn | head'connected_clients against maxclients. The per-address counts show which
host (app container host, proxy, a script) is leaking connections. Fixing
that means restarting or fixing the client, which is a production change to
propose, not to do.
Expected after a cutover, a resize or a planned reboot. If none, check:
ssh redis 'uptime; redis6-cli INFO server | grep -E "^(run_id|uptime_in_seconds|redis_version):"'
ssh redis 'sudo journalctl -u redis6 --since "2 hours ago" | tail -n 50'
ssh redis 'sudo dmesg | grep -i -E "oom|killed process" | tail'
ssh redis 'sudo tail -n 100 /var/log/redis6/redis6.log'An OOM kill (dmesg, journald) means memory: the resize section. A reboot
means look at why. Data written since rdb_last_save_time is lost after a
crash (save policy and the hourly backups are all there is: no AOF), so
check redis6-cli INFO persistence and, in the app, whether sync validation
needs a run. Expect [LOCK COMPROMISED] restarts in the app containers from
the outage itself.
ssh redis 'redis6-cli SLOWLOG GET 20'
ssh redis 'redis6-cli INFO stats | grep latest_fork_usec'
ssh redis 'ls ~/perf/*.log 2>/dev/null && tail -n 20 ~/perf/redis-sample.log'Each entry has the command, its first arguments, the duration in
microseconds and the client address. One slow command blocks everything
behind it on Redis's single thread, so the usual suspects are a big reply
(SMEMBERS/LRANGE/MGET over huge values), a Lua script, KEYS or an
unbounded SCAN, or a fork stall at the :00 backup (compare the time with
latest_fork_usec and the ~/perf/redis-sample.log BGSAVE columns, if the
collectors from config/redis/perf/ are installed). Find the calling code by
grepping the repo for the command and the key pattern, then fix it in the
app. Do not SLOWLOG RESET before the entries are recorded in the report.
ssh redis 'tail -n 30 ~/tcpmem.log'
ssh redis 'grep TCP: /proc/net/sockstat; cat /proc/sys/net/ipv4/tcp_mem'
ssh redis 'nstat -az TcpExtTCPMemoryPressures TcpExtTCPMemoryPressuresChrono TcpExtPruneCalled TcpExtTCPRcvQDrop'mem and tcp_mem are pages. Healthy use is dozens of sockets with empty
queues and a count far below tcp_mem[1]. A count that keeps rising with few
sockets is leaked kernel accounting (the old host's problem in September and
October 2026, behind the incident log's first entry): the fix is a new host
(resize section), not tuning. A count that rises with many real sockets
(ss -tm) is a client leak or burst: find the client. The stopgap for a
leak, sudo sysctl -w net.ipv4.tcp_mem=... above the count, is lost on
reboot and is a host change to propose. Background and the burst test are in
investigate-production-container-restarts.
resize nowssh redis 'tail -n 20 ~/redis-mem.log'
ssh redis 'redis6-cli INFO memory | grep -E "^(used_memory_human|used_memory_peak_human|maxmemory_human|mem_fragmentation_ratio):"'
ssh redis 'redis6-cli INFO keyspace'Compare with the daily email's projection: steady growth is the normal
path to a resize, a sudden jump is something writing a lot (a sync, a
runaway job) and is worth finding first. maxmemory is about 70% of RAM, so
it is the headroom for the save's copy-on-write that is being used up.
Fix: README, "Increasing the Redis server size", then the guardrails
below. The daily email warns at 70% so there are days to plan; the 80% alert
means do it now. Avoid --bigkeys, --scan or DEBUG commands on the live
master (one CPU); never KEYS. MEMORY USAGE <key> is cheap for a suspect key.
no sample from the Redis hostThe sample is written to Redis by bin/tcpmem-log.sh on the host, only if
the host is the master and accepts writes.
ssh redis 'tail -n 5 ~/tcpmem.log; cat /etc/cron.d/blot-redis; systemctl is-active crond'
ssh redis 'redis6-cli ROLE | head -n 1; cat /etc/blot-redis/floating-ip'Right after a cutover the new host needs one or two 5-minute runs. If
ROLE is not master or Redis refuses the write (OOM, MISCONF,
frozen), it is that problem, not cron. If cron is dead or the file is gone,
config/redis/bootstrap.sh redis re-applies it (propose, do not run).
ssh redis 'redis6-cli CONFIG GET maxmemory; cat /etc/redis6/blot-memory.conf'.
Fix: config/redis/bootstrap.sh redis, which writes the file and applies it
with CONFIG SET without a restart (propose it; the README, "Running
bootstrap on a live host").
ssh redis 'tail -n 20 ~/backup.log; ls -l /etc/blot-redis; cat /etc/cron.d/blot-redis'
ssh redis 'df -h /backups; findmnt /backups; systemctl status blot-instance-store --no-pager | head'
aws s3 ls s3://blot-redis-backups/hourly/ | tail -n 3bin/backup.sh exits quietly unless the host is a master that accepts
writes, /etc/blot-redis/floating-ip exists and its address is on the host,
and /etc/blot-redis/drill does not exist. A missing marker after a cutover
or restore, or a stray drill marker, explains a silent gap; backup.log and
the newest S3 key give the last good upload. /backups is the NVMe instance
store: it is wiped when the instance stops and keeps the 10 newest local
copies, so "not mounted" means the mount service failed, and "full" means
pruning stopped.
ssh blot)Useful with any of the above, to see whether clients are affected:
ssh blot 'docker logs --since 1h blot-container-green 2>&1 | grep -c "\[LOCK COMPROMISED\]"'
ssh blot 'docker logs --since 1h blot-container-green 2>&1 | grep -E "\[LOCK\] slow heartbeat|Error saving file in database" | tail -n 20'
ssh blot 'grep -o "st=[0-9][0-9.]*" /var/instance-ssd/logs/access.log | tail -n 20000 | cut -d= -f2 | sort -n | awk "{a[NR]=\$1} END {print \"p50\", a[int(NR*.5)], \"p95\", a[int(NR*.95)]}"'Run the first two for each container that matters (blue, green, yellow).
st= is nginx's upstream time in seconds; most blog renders take about 10ms,
so a p95 well past 100ms during the alert, or slow heartbeat lines with a
large roundTrip, means clients felt it. Container logs only go back to the
last deploy. For a window rather than the last 20000 lines, grep the log for
the minute prefix first. investigate-slow-upstream-responses takes it from
there.
README, "Increasing the Redis server size" (launch a replica of the live
master on a bigger type in the same family with --from replica:<primary private IP>, check it, cutover.sh in an allowed window). Guardrails on top
of the rules:
launch.sh --dry-run and cutover.sh --dry-run first, and show the
operator the plan each prints.data/./redis-health, the app containers' restart
counts, and that the next hourly backup arrives from the new host.README, "Disaster recovery": pick the newest backup with
launch.sh --list, restore onto a new host, check it, move the floating IP,
turn on backups, check the app. To rehearse it, run steps 1-3 with
launch.sh --drill (tagged, never uploads), write down the commands for
steps 4-5 against the drill host without running them, time each step, and tear
the host down by instance ID (rule 3). A drill is still a production-account
action: launch and terminate each need an explicit yes. Add the timings to
the incident log.
Report to the operator in chat: which alert, the evidence, the cause, what was
changed or what to change. If something needs follow-up work, add a compact
line to the root TODO under "Redis host follow-ups". Then append to the
incident log.
Read this first: a repeated alert changes the diagnosis. Newest entries last.
Privacy: this file is committed to a public repo. No customer information (domains, handles, blog IDs, post titles), no instance IDs, public IPs, account IDs or key names, and no userbase or infra size numbers beyond what the README already states. Give UTC times so a future agent can find the same moment in the logs while they last.
Entry template:
### <date> — <alert or task>
- Trigger / evidence: …
- Cause: …
- Fix / outcome: …
- Follow-up: …tcp_mem, bursts to Redis dropped, [LOCK COMPROMISED] crashes on 26 Sep and 6 Oct). A fix-probe on the blog from
the 6 Oct crash showed the shared connection waiting up to 4002ms with 98
retransmits.assign-private-ip-addresses 1.8s), no folder lock lost. The TCP memory
alert cleared. The same fix-probe on the new host: worst shared-connection
wait 188ms, 0 retransmits. A disaster-recovery restore drill
(launch.sh --drill, newest backup) took 2m31s for the full production dataset.TODO.BGSAVE 84ms at 21:00Z, the hourly backup's
own save (backup.sh saves right before each upload). Redis logs a
BGSAVE with the time it took to fork, ~60-85ms on the current host.BGSAVE/BGREWRITEAOF are now only reported at
FORK_ALERT_US (500ms) or more (app/scheduler/redis-host-events.js).cutover.sh (#2079).
hourly/2026-10-08-hour-21 (the first backup saved right before upload)
restored onto a --drill host in 2m25s; key count within 0.001% of live.[LOCK] lines) and ran
cutover.sh --dry-run: every check passed, the drill-host warning showed,
plan steps 1-6, rollback command without --allow-unbootstrapped.BGSAVE 250ms at 22:00Z and
PSYNC 63ms at 21:06Z, both held back by the 6-hour limit since the
21:00Z BGSAVE email.FORK_ALERT_US filter went live (deploy
22:09-22:13Z); held-back events aren't re-filtered.PSYNC/SYNC added to FORK_COMMANDS, so a replica's full
sync is only reported at 500ms or more.© 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/redis-host of blotcms/blot.
Open the folder on GitHubat commit 418e559
Redis Host 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 |
|---|---|---|---|---|---|---|
| Redis Host this skillblotcms/blot | 2k | — | ~5.5k | Automated safety check: Notes | AGPL-3.0 | |
| AWS Cloudformation Elasticachegiuseppe-trisciuoglio/developer-kit | 357 | — | ~1.5k | Automated safety check: Notes | MIT | |
| Implement Commandredis/node-redis | 18k | — | ~5k | Automated safety check: Pass | MIT | |
| Supercheck Infrastructure Deploymentsupercheck-io/supercheck | 215 | — | ~1.4k | Automated safety check: Notes | AGPL-3.0 | |
| Docs Syncredis/node-redis | 18k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Bump Test Imageredis/node-redis | 18k | — | ~1.4k | Automated safety check: Pass | MIT |
giuseppe-trisciuoglio/developer-kit
Provides AWS CloudFormation patterns for ElastiCache Redis or Memcached infrastructure, including subnet groups, parameter groups, security controls, and cross-stack outputs.
redis/node-redis
Add a new Redis command (or command variant) to node-redis end-to-end — the <NAME.ts Command file, its registration with JSDoc in the package commands/index.ts, and a co-located <NAME.spec.ts with…
supercheck-io/supercheck
Work on Supercheck Docker Compose, K3s, Kubernetes manifests, gVisor, OpenTofu/Hetzner, secrets, external services, autoscaling, backups, disaster recovery, DNS/TLS, or production deployment.
redis/node-redis
Analyze master branch implementation and configuration to find missing, incorrect, or outdated documentation in docs/, README.md, and per-package READMEs.
redis/node-redis
Bump the default Redis docker test image (redislabs/client-libs-test) in the shared DEFAULTDOCKERCONFIG and the CI matrix, then force-push the bump-test-image branch and open a PR against upstream.
veliovgroup/mail-time
A skill your agent uses when building, wiring, reviewing, or debugging MailTime and ostrio:mailer email queues for horizontally scaled Node.js, Bun, or Meteor apps.
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
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
Categories
Look after Blot's production Redis host (its own EC2 instance, built and operated with config/redis/): triage a "Redis host:" alert email from app/scheduler/check-redis-host.js (failed background…. Redis Host is an agent skill from blotcms/blot.
Redis Host fits situations like: the user pastes; forwards one of these alerts; check the Redis host.
Run `npx skills add blotcms/blot --skill redis-host -a claude-code`. Or copy the skill folder (.claude/skills/redis-host in blotcms/blot) into .claude/skills/redis-host in your project. Claude Code loads it when a task matches its description.
Run `npx skills add blotcms/blot --skill redis-host -a codex`. Or copy the skill folder (.claude/skills/redis-host in blotcms/blot) into .agents/skills/redis-host 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 redis-host -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/redis-host, .gemini/skills/redis-host, .github/skills/redis-host and .opencode/skills/redis-host in your project.
Going by SKILL.md and its folder, Redis Host needs the command-line tools its instructions call (ssh, docker, aws and node). Our summary lists: Docker.
SKILL.md contains no URLs. Its commands use ssh 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 notes only (runs commands with sudo), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Redis Host 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 5.5k tokens (SKILL.md is roughly 22k 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 Redis Host: AWS Cloudformation Elasticache (giuseppe-trisciuoglio/developer-kit, 357 stars), Implement Command (redis/node-redis, 18k stars), Supercheck Infrastructure Deployment (supercheck-io/supercheck, 215 stars) and Docs Sync (redis/node-redis, 18k 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.