Samply
vortex-data/vortex
Analyze Samply Firefox-profiler output, record focused profiles, summarize hot threads/stacks, inspect symbolication, and compare profile evidence before and after a performance change.
Profile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT.
$ npx skills add wado-lang/wado --skill profiling-wado-compiler -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install wado-lang/wado profiling-wado-compiler --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/wado-lang/wado.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .claude/skills/profiling-wado-compiler && 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 "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .claude/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compilerType 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 wado-lang/wado --skill profiling-wado-compiler -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install wado-lang/wado profiling-wado-compiler --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wado-lang/wado.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .agents/skills/profiling-wado-compiler && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .agents/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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 wado-lang/wado --skill profiling-wado-compiler -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install wado-lang/wado profiling-wado-compiler --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wado-lang/wado.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .cursor/skills/profiling-wado-compiler && 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 "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .cursor/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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/wado-lang/wado.git --path .claude/skills/profiling-wado-compiler--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 wado-lang/wado --skill profiling-wado-compiler -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install wado-lang/wado profiling-wado-compiler --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wado-lang/wado.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .gemini/skills/profiling-wado-compiler && 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 "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .gemini/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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 wado-lang/wado profiling-wado-compilerInstalls 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 wado-lang/wado --skill profiling-wado-compiler -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/wado-lang/wado.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .github/skills/profiling-wado-compiler && 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 "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .github/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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 wado-lang/wado --skill profiling-wado-compiler -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install wado-lang/wado profiling-wado-compiler --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wado-lang/wado.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/profiling-wado-compiler .opencode/skills/profiling-wado-compiler && 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 "profiling-wado-compiler" agent skill from https://github.com/wado-lang/wado/tree/main/.claude/skills/profiling-wado-compiler into .opencode/skills/profiling-wado-compiler/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "profiling-wado-compiler", 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.
profiling-wado-compilerProfile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT.
Profiling Wado Compiler is an agent skill from wado-lang/wado. Profile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT. Use for native CPU or memory profiling, not guest wasm (see wado-performance for that).
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `scripts/analyze_dhat.ts` and `scripts/analyze_native_profile.ts`).
It sits in Development, covering Performance optimization. It works with WebAssembly and Rust. The repository describes itself as: The Wado Programming Language. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b1f1e2a. 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 2 files in scripts/ (TypeScript), which the agent can run.
Shell commands in SKILL.md call:
nodecargoapt-getFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
Profiling Wado Compiler loads about 2.9k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 1,143 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.
echo '1' | sudo tee /proc/sys/kernel/perf_event_paranoidaddr2line --version >/dev/null || sudo apt-get install -y binutilsAutomated 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 wado-lang/wado at commit b1f1e2a, republished under its MIT licence (© wado-lang). 1,143 words, ~2,944 tokens.
.claude/skills/profiling-wado-compiler/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.wado binaryHost-side Rust profiling (the compiler, wado serve, wado run, …
including wasmtime/cranelift). For the guest wasm program, use
wado-performance instead.
Choose based on what you're optimising for:
| Profile | Cargo flag | Use when | Trade-off |
|---|---|---|---|
profiling | cargo build --profile profiling --bin wado | Improving benchmark scores — release-equivalent codegen with debug info kept. Inherits release (thin LTO, codegen-units=1) and adds debug = 2, strip = false. | Slow build (LTO), but the CPU profile reflects what users actually run. |
dev | cargo build --bin wado | Improving developer-iteration time — making cargo run -- compile/test/... faster for compiler-hackers. Uses the in-workspace [profile.dev.package.wado-compiler] opt-level = 1, so the compiler itself isn't molasses while everything else stays unoptimised. | Fast build, but the absolute numbers are larger than a release run; ratios between hot paths are still actionable. |
If unsure: pick profiling for "users complain it's slow", pick dev
for "rebuild → run → tweak feels slow during development." The
analyzer script and recording flow below are identical for both.
# 1. Build with the chosen profile (see table above)
cargo build --profile profiling --bin wado # benchmark-oriented
# or
cargo build --bin wado # dev-iteration-oriented
# 2. Record under load with samply (cargo install samply)
samply record --save-only --rate 1000 -o scratchpad/prof.json -- \
target/profiling/wado serve --addr 127.0.0.1:8080 app.wado &
SAMPLY_PID=$!
# ... drive load (e.g. oha against benchmark/http_routing) ...
# 3. Stop: SIGTERM the CHILD, not samply. samply finalizes on child exit;
# signalling samply leaves the child running and the recording hangs.
kill -TERM "$(pgrep -P "$SAMPLY_PID" | head -1)"; wait "$SAMPLY_PID"
# 4. Analyze
node .claude/skills/profiling-wado-compiler/scripts/analyze_native_profile.ts scratchpad/prof.jsonSymbols resolve against the path the profile recorded, not the binary that
produced it. Rebuilding over target/profiling/wado makes every earlier profile
symbolicate against the new build, and its output still looks normal. When you
A/B, give each arm its own path: copy the first build aside and profile it
there.
For one-shot commands (wado compile foo.wado, wado test foo.wado)
there is nothing to drive — samply records until the child exits, so
just invoke it directly:
samply record --save-only --rate 1000 -o scratchpad/prof.json -- \
target/debug/wado test package-gale/tests/driver_rust_test.wadoInteractive call tree (and correct kernel symbols):
samply load scratchpad/prof.json opens a browser-based call-tree UI. The
CLI analyzer below is for grep-able, transcript-friendly summaries.
The analyzer is a TypeScript script run directly by Node.js (>= 23.6,
which strips types with no flags). No build step or dependencies are
needed; node analyze_native_profile.ts ... just works.
# samply needs perf_event_paranoid <= 1 for a non-root user
echo '1' | sudo tee /proc/sys/kernel/perf_event_paranoid
# `addr2line` is part of binutils — usually already installed
addr2line --version >/dev/null || sudo apt-get install -y binutilsanalyze_native_profile.ts workssamply's --save-only profile is unsymbolicated: funcTable.name
holds the hex relative-virtual-address (RVA), keyed by (lib_index, rva) so the same hex address in two different libs is never merged.
The script:
--symbolicator auto):atos -o <path> -arch <arch> -l <base> <addrs>; the main
executable's __TEXT base is 0x100000000, shared dylibs use base 0.addr2line -fC -e <path>; PIE binaries store RVAs directly
in the profile (no base offset to add). The script reshapes the
output to <func> (in <lib>) (<file:line>) so the
(in <binary>) filter works on both platforms.threadCPUDelta (real CPU), not wall-clock
weight — otherwise parked tokio/rayon worker threads bury everything.libc.so.6 / libsystem_* ratio means your hot path is in
syscalls/memcpy, not Rust code.memcpy pressure.wado only — the Rust-only view.
INCLUSIVE is deduped per sample so recursive frames don't push
percentages above 100%.wado leaf stack until it finds a wado frame and
credits the cost there. This is how you find which Rust function
is responsible for the __memcpy / mmap / mimalloc hot spots.Vec/HashMap growth plumbing. The header is allocation's share of
total CPU, so "is this allocation-bound at all" is a number, not a
guess.Common invocations:
# Default: top 30, auto-symbolicator
node .claude/skills/profiling-wado-compiler/scripts/analyze_native_profile.ts scratchpad/prof.json
# Wider view; force Linux symbolicator even on macOS
node .claude/skills/profiling-wado-compiler/scripts/analyze_native_profile.ts \
scratchpad/prof.json --top 60 --symbolicator addr2line
# Profile a different binary, or a copy of `wado` aside for an A/B arm:
# `--binary` names the file the Rust-only views keep
node .claude/skills/profiling-wado-compiler/scripts/analyze_native_profile.ts \
scratchpad/prof.json --binary wado-lsp
# Split one function's inclusive cost by the frames it calls
node .claude/skills/profiling-wado-compiler/scripts/analyze_native_profile.ts \
scratchpad/prof.json --under 'container_sroa::movers_of'Measure peak RSS first, per phase second, per allocation site last.
--log-level debug prints every compiler span with the process's resident set
(Linux only). An end line adds the net change in current RSS since the span
began:
wado compile --log-level debug hello.wado 2>&1 | grep '<< '
# [00:00:02.1547] << stdlib_snapshot · rss 343/343 MiB (+225)The pair is current/peak MiB. A span that allocates and frees again nets out
near +0, so read a jump in the peak as well as the change. RSS is
process-wide, so under wado test with more than one worker the changes mix
every worker's compile. Use -p 1 there.
A heap profiler sees only the system allocator. wado-cli's default
mimalloc feature replaces it, so build without it, and copy the binary aside
so the next build does not replace it:
cargo build -p wado-cli --bin wado --no-default-features
cp target/debug/wado scratchpad/wado-sysalloc
valgrind --tool=dhat --num-callers=40 --dhat-out-file=scratchpad/dhat.json \
scratchpad/wado-sysalloc compile -O2 hello.wado -o scratchpad/out.wasm
node .claude/skills/profiling-wado-compiler/scripts/analyze_dhat.ts scratchpad/dhat.jsonDHAT runs about 10× slower than native. Its default of 12 frames cuts off the
recursive phases, which is why --num-callers=40 is there.
The analyzer reports what was live at the heap's peak (t-gmax), since that
sets peak memory, by allocation site and by wado function inclusive.
--where RE and --not RE keep or drop stacks, so
--where get_or_init_snapshot splits the per-thread stdlib snapshot from the
compile itself. --stacks N prints the largest stacks whole.
threadCPUDelta;
otherwise parked tokio/rayon worker threads bury everything.atos are wrong (shared-cache base
offset). Read syscall cost via the script's "nearest Rust caller"
attribution, not the syscall name.Body::for_each_child::<closure> instantiations onto one address, and
it reads as optimize::drve at ~10 % self CPU while the nir/drve
span measures 0.8 %. A span that contradicts the profile is the tell.
Before crediting a pass, run nm target/debug/wado | grep <symbol>
and count how many names share the address.addr2line outermost-frame only. -i (inlined frames) is
intentionally omitted because addr2line does not emit a per-input
separator with -i, so the output cannot be reliably split back to
addresses. The outermost frame matches the self-CPU bucket — which
is what you want. If you need inlined frames, use samply load.target/profiling/wado (or target/debug/wado)
makes earlier profiles re-symbolicate to garbage. Analyze before
rebuilding, or keep the matching binary.-O3 time is the inliner and the NIR fixed point, so cutting the number of
lowered functions buys much less than the count suggests.ld-linux-x86-64.so.2 when the RVA happens to
collide between the main binary and the dynamic linker mapping. The
library breakdown's self-CPU view (which uses the leaf frame's lib)
is the trustworthy ratio — incl-by-lib can over-count those frames.© wado-lang, MIT. 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 2 other files (scripts) in .claude/skills/profiling-wado-compiler of wado-lang/wado.
Open the folder on GitHubat commit b1f1e2a
Profiling Wado Compiler 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 |
|---|---|---|---|---|---|---|
| Profiling Wado Compiler this skillwado-lang/wado | 117 | — | ~2.9k | Automated safety check: Notes | MIT | |
| Samplyvortex-data/vortex | 3.2k | — | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Investigate User Bugcristicretu/diri | 427 | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Cppcrazyguitar/cppcheatsheet | 290 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Rust Profilingdiodeme/Gold-Band | 143 | 1 repos | ~1.7k | Automated safety check: Notes | AGPL-3.0 | |
| ProfilingShopify/rubydex | 364 | — | ~2.3k | Automated safety check: Notes | Custom licence |
vortex-data/vortex
Analyze Samply Firefox-profiler output, record focused profiles, summarize hot threads/stacks, inspect symbolication, and compare profile evidence before and after a performance change.
cristicretu/diri
Investigate a bug a specific diri user hit (crash, hang, slowness, memory leak, blank or garbled terminal, spawn/resume/remote failure, copy/paste not working) from diri's telemetry with the…
crazyguitar/cppcheatsheet
Comprehensive C/C++ programming reference covering everything from C11-C23 and C++11-C++23, system programming, CUDA GPU computing, debugging tools, Rust interop, and advanced topics.
diodeme/Gold-Band
Rust profiling skill for performance analysis. An agent skill from diodeme/Gold-Band.
Shopify/rubydex
Profile Rubydex indexer performance — CPU flamegraphs, memory usage, phase-level timing.
noumena-labs/Sipp
Enforces this monorepo's coding style rules by inspecting git diffs, reading .agents/skills/style-checker/references/styleguidance.md, fixing style violations, and reporting the result.
wado-lang/wado
Analyze and improve the runtime speed of a Wado program's compiled guest Wasm — profile hot functions, read the generated WIR for allocations and copies, reason about the WasmGC cost model, and…
wado-lang/wado
Measure how long GitHub Actions jobs and steps took across past runs, and find the pull request that made CI slower.
wado-lang/wado
Investigate and improve code coverage for the wado-compiler crate.
wado-lang/wado
The only way to merge origin/main into a branch, conflicts or not.
wado-lang/wado
Transpile Wado Wasm components to JS with jco, then run, debug, and benchmark them on Node.
wado-lang/wado
Task-completion flow: /cr (a /code-review answered with /code-review-response, which ends with /distill), update docs (spec/cheatsheet/compiler/optimizer), then run mise run on-task-done (build…
Works with
Categories
Profile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT. Profiling Wado Compiler is an agent skill from wado-lang/wado. Profile the native Rust wado binary (compile/serve/run) for host-side bottlenecks — CPU with a sampling profiler, memory with the span trace's RSS and valgrind DHAT.
Profiling Wado Compiler fits situations like: memory profiling; not guest wasm (see wado-performance for that).
Run `npx skills add wado-lang/wado --skill profiling-wado-compiler -a claude-code`. Or copy the skill folder (.claude/skills/profiling-wado-compiler in wado-lang/wado) into .claude/skills/profiling-wado-compiler in your project. Claude Code loads it when a task matches its description.
Run `npx skills add wado-lang/wado --skill profiling-wado-compiler -a codex`. Or copy the skill folder (.claude/skills/profiling-wado-compiler in wado-lang/wado) into .agents/skills/profiling-wado-compiler 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 wado-lang/wado --skill profiling-wado-compiler -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/profiling-wado-compiler, .gemini/skills/profiling-wado-compiler, .github/skills/profiling-wado-compiler and .opencode/skills/profiling-wado-compiler in your project.
Going by SKILL.md and its folder, Profiling Wado Compiler needs TypeScript for the scripts in its folder and the command-line tools its instructions call (node, cargo and apt-get). Our summary lists: Node.js.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Profiling Wado Compiler is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k 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 Profiling Wado Compiler: Samply (vortex-data/vortex, 3.2k stars), Investigate User Bug (cristicretu/diri, 427 stars), Cpp (crazyguitar/cppcheatsheet, 290 stars) and Rust Profiling (diodeme/Gold-Band, 143 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
wado-lang (a GitHub organization) maintains it in wado-lang/wado, which has 117 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 9, 2026.
Source: wado-lang/wado on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.