Content-Hash File Cache Pattern
affaan-m/ECC
Caches slow file processing results in Python keyed by a SHA-256 hash of the file content, so renames still hit the cache and edits invalidate it automatically.
Captures a clean Keybase service log and analyzes it for redundant, duplicated or looping RPCs, then checks whether a caching fix reduced the calls.
$ npx skills add keybase/client --skill keybase-rpc-log-analysis -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install keybase/client keybase-rpc-log-analysis --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/keybase/client.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .claude/skills/keybase-rpc-log-analysis && 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 "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .claude/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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/keybase/client/tree/master/skill/keybase-rpc-log-analysisType 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 keybase/client --skill keybase-rpc-log-analysis -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install keybase/client keybase-rpc-log-analysis --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/keybase/client.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .agents/skills/keybase-rpc-log-analysis && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .agents/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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 keybase/client --skill keybase-rpc-log-analysis -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install keybase/client keybase-rpc-log-analysis --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/keybase/client.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .cursor/skills/keybase-rpc-log-analysis && 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 "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .cursor/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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/keybase/client.git --path skill/keybase-rpc-log-analysis--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 keybase/client --skill keybase-rpc-log-analysis -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install keybase/client keybase-rpc-log-analysis --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/keybase/client.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .gemini/skills/keybase-rpc-log-analysis && 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 "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .gemini/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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 keybase/client keybase-rpc-log-analysisInstalls 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 keybase/client --skill keybase-rpc-log-analysis -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/keybase/client.git skills-src && mkdir -p .github/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .github/skills/keybase-rpc-log-analysis && 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 "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .github/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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 keybase/client --skill keybase-rpc-log-analysis -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install keybase/client keybase-rpc-log-analysis --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/keybase/client.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skill/keybase-rpc-log-analysis .opencode/skills/keybase-rpc-log-analysis && 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 "keybase-rpc-log-analysis" agent skill from https://github.com/keybase/client/tree/master/skill/keybase-rpc-log-analysis into .opencode/skills/keybase-rpc-log-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keybase-rpc-log-analysis", 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.
keybase-rpc-log-analysisCaptures a clean Keybase service log and analyzes it for redundant, duplicated or looping RPCs, then checks whether a caching fix reduced the calls.
The Go service logs every RPC it serves and every call it makes, so its log is where the client's real network behavior shows. The skill captures a clean run with scripts that archive old logs and start a locally built service, writing to its own file under /tmp/kb-analysis so a flood of entries cannot rotate the evidence away. It then drives the desktop app with a focused end-to-end flow set instead of the full suite, which would double every count.
Log files still rotate at 128MB, so the report script is given all the sibling files together. Other bundled Python scripts report RPC cost, diff two runs and trace why a call was made. The skill warns that the service needs kbfs built beside it, or the Files tab stays empty and files and git tests fail for unrelated reasons, and it tells the agent to ask before stopping the service or launching the app.
Read from SKILL.md and the folder at commit 81e93d6. 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 7 files in scripts/ (Python and Shell), which the agent can run.
Shell commands in SKILL.md call:
yarngitpython3goFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use yarn and git, 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.
Keybase RPC Log Analysis loads about 3k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 1,724 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); the scripts in this folder are not scanned.
The full file from keybase/client at commit 81e93d6, republished under its BSD-3-Clause licence (© keybase). 1,724 words, ~3,025 tokens.
.claude/skills/keybase-rpc-log-analysis/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.The Go service logs every RPC it serves and every call it makes. That log is the only place the client's real network behaviour is visible — the JS side shows intent, the log shows what actually went out. A quiet minute is ~45 lines; a minute with a flood is 120,000.
skill/keybase-rpc-log-analysis/scripts/clean-logs.sh --archive # dry run without a flag
skill/keybase-rpc-log-analysis/scripts/start-service.sh # own terminal, foreground
cd shared && yarn desktop:start:hot:e2e # another terminal
cd shared && yarn test:e2e:desktop:rpc # or drive the app by handstart-service.sh builds from this checkout, stops the running service, and logs
with -d --log-file to /tmp/kb-analysis/service.log. Its own file matters: the
default log is shared with everything else and a flood rotates the evidence away
in under two minutes.
Use test:e2e:desktop:rpc, not test:e2e:desktop. The full suite is 6.6
minutes over two projects (light and dark), which doubles every count and makes
the log rotate. test:e2e:desktop:rpc is the six flows that actually drive team
and channel loading, on one project, in 39 seconds. test:e2e:desktop:flows
takes file arguments if you need a different set — always pass a single
--project (it does), or light and dark each contribute a copy of every call.
--log-file still rotates at 128MB — a full e2e run produces ~135MB and will
cross it. Nothing is lost, but the analysis must then include the siblings, so
pass them all:
python3 skill/keybase-rpc-log-analysis/scripts/rpc-report.py \
/tmp/kb-analysis/service.log-* /tmp/kb-analysis/service.logRotation is easy to miss: a script that reads only service.log after a long run
silently analyses the tail. Check ls -la /tmp/kb-analysis/ before believing a
count.
The service forks kbfs from its own bin directory, and a plain go install of
the service does not build it. Without kbfs the Files tab is empty and git
fails with KBFS client not found, which fails every files-* and git-* e2e
test for reasons unrelated to the change under test. start-service.sh warns.
Note the installed kbfs keeps the mount when the service is swapped for a local
build, so those tests can fail even with a kbfs binary in place — they are not
in the test:e2e:desktop:rpc set for that reason.
Ask before stopping the service or launching the app — both are the user's.
A before/after is only worth reporting if both runs did the same thing. What works:
# after: with the fix in the tree
<reload the renderer>; : > /tmp/kb-analysis/service.log
cd shared && yarn test:e2e:desktop:rpc
cp /tmp/kb-analysis/service.log /tmp/kb-analysis/after.log
# before: revert ONLY the source changes, keeping any new test scripts
git stash push -- <the source files you changed>
<reload the renderer>; : > /tmp/kb-analysis/service.log
cd shared && yarn test:e2e:desktop:rpc
cp /tmp/kb-analysis/service.log /tmp/kb-analysis/before.log
git stash popgit stash takes it with them.page.reload() on
localhost:9222). Module-level caches — the usual subject of these fixes —
survive HMR, so without a reload the second run starts warm and reads better
than it is.rpc-diff.py when you already know
which calls you are watching: parse + Server: <Name> / + RemoteClient: chat.1.remote.<name>, and count how many landed within the hook's own
staleMs of the previous call for the same subject. That last number is the
one that says "this was a cache miss" rather than "this was work".| Question | Command |
|---|---|
| What did this run do? | rpc-report.py <log> [--start 2026-07-24T17:23] [--end ...] |
| What was actually slow? | rpc-cost.py <log> [--min-mean-ms 50] |
| Why is X called so much? | rpc-why.py <log> --match 'AttachmentHTTPSrv: GetURL' |
| Did my fix work? | rpc-diff.py before.log after.log |
Run rpc-cost.py early. Count and cost answer different questions, and the
loudest line in the log is usually not the expensive one. In one capture the top
line by count was an in-memory map lookup — 15,767 calls for 0.16s total, not
worth touching — while the real cost was 469 team loads at 292ms each, 186
seconds, sitting 30th by count.
To prove a loud flood is free rather than just absent from the table, pass
--min-mean-ms 0 --top 400: the default threshold hides cheap chatty ops, which
is exactly the row you need. AttachmentHTTPSrv: GetURL at 4,848 calls does not
appear at all by default, and shows as 0.04s total once it does.
Analysing an already-rotated log is the same — pass
~/Library/Logs/keybase.service.log-<start>-<end> directly. The filename carries
its own window, so --start/--end are only for narrowing further.
Read rpc-report.py's sections in order:
A BURSTS row with a bare name and no (subject) means the subject could not be
resolved: many RPCs log no arguments. Those rows are same-name only — treat
them as a lead, not as proof the same conversation was hit twice.
rpc-why.py answers attribution. ROOT (the app RPC that opened the trace) is
usually the answer; DRIVERS (nearest preceding call) points at the specific
line. BATCHES needs the span that logs the item count, which is normally the
local one, not the remote it wraps — match HybridConversationSource: GetMessages,
not getMessagesRemote. The script says so when it finds no counts.
shared/tests/results/test-results/*/test-finished-1.png
give you a timestamped list of which test ran when, and app.log records
renderer reloads. One burst-per-profile-open and one burst-per-bootstrap look
identical in the service log until you check.chat-trace out of the before-log and count the work
hanging off it. Two getMutualTeamsLocal calls here went to 0 after a guard on
"empty argument list" — and their traces showed 82 remote refreshes and 750ms
each, so the service treats the empty case as a real query and the guard was
removing a feature, not a redundancy. A real dedupe takes N to 1, not to 0.getAnnotatedTeam read 3 in the run where
mutual teams was wrongly suppressed and 11 in both runs where it was not —
because the shared teams it returns are what then get loaded. If a metric you
did not touch moves, find out which call upstream stopped happening.rpc-cost.py first.rpc-diff.py is only meaningful if both runs did
the same thing — same tests, same order, same project, renderer reloaded
between them. See "Prove a fix".Each of these was a real bug, and each is what its section looks like:
loadOnDemand flag: a profile rendered a row per
team and each row annotated its team up front, for a popup nobody opened.staleMs: 5_000 and most of its calls arrive under 5s after the previous one
for the same subject, the cache is not being shared — the window is doing
nothing because each caller has a fresh copy of it. This ratio is the single
most useful derived number here; 81% for getAnnotatedTeam is what found that
bug.Where the money actually is in this client: identify/proof checks and team loads. Both are hundreds of milliseconds each and both fan out to several HTTP calls. Chat localization is cheap per call but runs over every channel.
© keybase, BSD-3-Clause. 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 7 other files (scripts) in skill/keybase-rpc-log-analysis of keybase/client.
Open the folder on GitHubat commit 81e93d6
Keybase RPC Log Analysis 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 |
|---|---|---|---|---|---|---|
| Keybase RPC Log Analysis this skillkeybase/client | 9.3k | — | ~3k | Automated safety check: Pass | BSD-3-Clause | |
| Content-Hash File Cache Patternaffaan-m/ECC | 274k | 5 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Flowfile Debugging PlaybookEdwardvaneechoud/Flowfile | 370 | — | ~6.3k | Automated safety check: Pass | MIT | |
| Writing Streamlit AppsPostHog/posthog-foss | 721 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Python Performance Optimizationwshobson/agents | 40k | 12 repos | ~814 | Automated safety check: Pass | MIT | |
| The Art of Debuggingstas00/the-art-of-debugging | 1.7k | — | ~6.1k | Automated safety check: Notes | CC-BY-SA-4.0 |
affaan-m/ECC
Caches slow file processing results in Python keyed by a SHA-256 hash of the file content, so renames still hit the cache and edits invalidate it automatically.
Edwardvaneechoud/Flowfile
Symptom-to-cause triage playbook for Flowfile (core/worker/kernel/frontend/AI) — covers "no such table" DB cascades (two distinct causes), import-time Alembic migration corruption, silent…
PostHog/posthog-foss
Write Streamlit app source code that runs well in a PostHog sandbox — the posthogapps.query() bridge for reading PostHog data, the packages baked into the sandbox image, caching and session state…
wshobson/agents
Profiles slow Python code with cProfile and memory profilers, then applies targeted fixes for CPU, memory, I/O and query bottlenecks.
stas00/the-art-of-debugging
Condensed debugging method and tool recipes for Unix, Python and PyTorch programs: crashes, hangs, segfaults, wrong output, CUDA OOM, NaN values and slowness.
ben-manes/caffeine
Prices each step of the window climber algorithm by disabling it in turn, to find steps that no longer earn their keep and branches that no longer fire.
keybase/client
Analyzes V8, Chrome and Electron .heapsnapshot files with Node scripts to find memory leaks, detached DOM nodes and the retainer paths that keep objects alive.
keybase/client
Analyzes Chrome or Electron DevTools Performance trace exports with Python scripts to find where render time actually goes, without opening DevTools.
keybase/client
Parses a React DevTools Profiler JSON export with Python scripts to find re-render storms, commit fan-out and why a component rendered, without opening the DevTools UI.
keybase/client
Fetches GitHub Copilot review feedback from inline threads and review bodies, checks each finding against the code and fixes the valid ones.
keybase/client
Takes a screenshot of a running Electron desktop app through playwright-cli over remote debugging, shrinks it and shows it so you can check the UI visually.
keybase/client
Guides writing and fixing end-to-end flow tests for the Keybase app on desktop with Playwright and on iOS with Appium and WebdriverIO, sharing one testID registry.
Works with
Categories
Captures a clean Keybase service log and analyzes it for redundant, duplicated or looping RPCs, then checks whether a caching fix reduced the calls. The Go service logs every RPC it serves and every call it makes, so its log is where the client's real network behavior shows. The skill captures a clean run with scripts that archive old logs and start a locally built service, writing to its own file under /tmp/kb-analysis so a flood of entries cannot rotate the evidence away.
Keybase RPC Log Analysis fits situations like: hunting redundant or looping RPCs after a rate-limit error; investigating a service log that rotates every few minutes; proving that a caching change cut the number of calls; diagnosing a slow or hot desktop app.
Run `npx skills add keybase/client --skill keybase-rpc-log-analysis -a claude-code`. Or copy the skill folder (skill/keybase-rpc-log-analysis in keybase/client) into .claude/skills/keybase-rpc-log-analysis in your project. Claude Code loads it when a task matches its description.
Run `npx skills add keybase/client --skill keybase-rpc-log-analysis -a codex`. Or copy the skill folder (skill/keybase-rpc-log-analysis in keybase/client) into .agents/skills/keybase-rpc-log-analysis 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 keybase/client --skill keybase-rpc-log-analysis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/keybase-rpc-log-analysis, .gemini/skills/keybase-rpc-log-analysis, .github/skills/keybase-rpc-log-analysis and .opencode/skills/keybase-rpc-log-analysis in your project.
Going by SKILL.md and its folder, Keybase RPC Log Analysis needs Python and a shell for the scripts in its folder and the command-line tools its instructions call (yarn, git, python3 and go). Our summary lists: A Keybase client checkout with a locally built service; yarn, to start the desktop app; Python 3.
SKILL.md contains no URLs. Its commands use git, 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Keybase RPC Log Analysis is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 Keybase RPC Log Analysis: Content-Hash File Cache Pattern (affaan-m/ECC, 274k stars), Flowfile Debugging Playbook (Edwardvaneechoud/Flowfile, 370 stars), Writing Streamlit Apps (PostHog/posthog-foss, 721 stars) and Python Performance Optimization (wshobson/agents, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
keybase (a GitHub organization) maintains it in keybase/client, which has 9,257 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 7, 2026.
Source: keybase/client on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.