Voice Builder
charlie947/social-media-skills
Build a personalised voice profile inside a Codex or Claude project from a short interview plus 3 to 5 sample pieces of writing.
Build a performance chart for nubjs.com — the SVG bar figures in blog posts, docs pages and social posts (a runtime augmentation against plain node, an install or dispatch comparison, a cross-tool…
$ npx skills add nubjs/nub --skill nub-charts -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nubjs/nub nub-charts --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/nubjs/nub.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/nub-charts .claude/skills/nub-charts && 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 "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .claude/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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/nubjs/nub/tree/main/.claude/skills/nub-chartsType 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 nubjs/nub --skill nub-charts -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nubjs/nub nub-charts --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nubjs/nub.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/nub-charts .agents/skills/nub-charts && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .agents/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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 nubjs/nub --skill nub-charts -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nubjs/nub nub-charts --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nubjs/nub.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/nub-charts .cursor/skills/nub-charts && 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 "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .cursor/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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/nubjs/nub.git --path .claude/skills/nub-charts--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 nubjs/nub --skill nub-charts -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nubjs/nub nub-charts --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nubjs/nub.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/nub-charts .gemini/skills/nub-charts && 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 "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .gemini/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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 nubjs/nub nub-chartsInstalls 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 nubjs/nub --skill nub-charts -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nubjs/nub.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/nub-charts .github/skills/nub-charts && 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 "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .github/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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 nubjs/nub --skill nub-charts -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nubjs/nub nub-charts --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nubjs/nub.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/nub-charts .opencode/skills/nub-charts && 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 "nub-charts" agent skill from https://github.com/nubjs/nub/tree/main/.claude/skills/nub-charts into .opencode/skills/nub-charts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nub-charts", 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.
nub-chartsBuild a performance chart for nubjs.com — the SVG bar figures in blog posts, docs pages and social posts (a runtime augmentation against plain node, an install or dispatch comparison, a cross-tool…
Nub Charts is an agent skill from nubjs/nub. Build a performance chart for nubjs.com — the SVG bar figures in blog posts, docs pages and social posts (a runtime augmentation against plain node, an install or dispatch comparison, a cross-tool ranking). Use whenever asked for a graphic, chart, graph or figure showing a benchmark result, whenever adding a measured claim to a docs or blog page that deserves a picture, and whenever regenerating an existing figure with fresh numbers. Covers the house visual system (720px, the light/dark/opaque triple, the Nub…
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts.
It sits in Writing & Content, covering Social media posts and Blog and article writing. The repository describes itself as: The fast all-in-one Node.js toolkit. The licence is MIT.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 568e73a. 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 1 file in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodeFrom 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.
Nub Charts loads about 4.6k tokens when it runs. Until then it costs about 188 tokens; SKILL.md has 2,945 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 nubjs/nub at commit 568e73a, republished under its MIT licence (© nubjs). 2,945 words, ~4,634 tokens.
.claude/skills/nub-charts/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Every performance figure on nubjs.com is a hand-generated SVG, not a charting library. They share one visual system with the homepage's <Bench> panel, and a new chart that does not match it looks broken next to the others.
The first charts drawn with this skill broke the first four, the next one broke the fifth, and the threadpool figures shipped with the sixth unbroken only because the maintainer asked for the axis to go, so they come before anything else.
gutterFor, fitRight), never from a fixed x, and a label is never padded to fill a gutter. The padding is 56px at the sides and 30px top and bottom (PAD_X, PAD_Y), the sides wider on purpose: a landscape frame needs more side margin than vertical margin to look evenly padded. Both halves of the rule were corrected on the same day, 2026-09-12, on one two-row chart: first "TOO MUCH dead space on the left" (short labels in a gutter sized for long ones, 140px of nothing on the left against 40px on the right), then, once the margins matched at 22px, "it needs more space than that... optical balance" — centered ink that close to the edge reads as cramped. Check it on the raster: the leftmost label and the rightmost note should sit the same, comfortable distance from their edges.groupGap), which also closed the gap between the panels of the threadpool figure that read as "a little too much space between each chart" (maintainer, 2026-09-12: "just omit the x axis numbers altogether, and ticks"). The unit therefore lives in the value label (66 req/s, 1,763 Mloops/s), never in a tick.A chart is the last step, never the first. The number comes from a benchmark under tests/bench/ that survives the methodology in AGENTS.md and the benchmarking skill; the chart only draws it. A figure built on numbers from a loaded machine is worse than no figure, because it ships a claim nobody will re-check.
| what | where |
|---|---|
| published assets | site/public/blog/ — flat, no subdirectories, even for docs pages |
| the renderer | scripts/chart.mjs next to this file |
the Figure component | site/src/components/figure.tsx — darkSrc takes the dark rendering |
| the benchmark | tests/bench/<family>/, tracked, with a saved run under results/; the caption links to it |
| the one-off generator | your scratch directory — see "The generator is scratch, the benchmark is not" |
tests/bench/. It must print a machine-readable line per measurement — the runtime scripts print one ROW {…} per cell — so the generator never has numbers typed into it by hand. A run worth keeping is saved as results/<date>.json with the machine, the Node version and every per-round value; the generator reads that file. Typing numbers into the generator is not acceptable, because the figure then has no provenance.remote-build --job adhoc (the script runs at the repo root with NUB_BIN set). For an install benchmark, uptime first and follow the benchmarking skill's load gate. A Windows-only behavior is measured on a real windows-latest runner through a dispatch-only workflow that uploads the results JSON as an artifact — tests/bench/windows-dispatch/ and .github/workflows/bench-windows-dispatch.yml are the template — and the run is committed under results/ before anything is drawn. A number remembered from a PR body, a code comment or a release post is not provenance, however well it was measured at the time: the Windows dispatch figure re-measured 95.6 → 35.8 ms as 92.9 → 19.9 ms on the current release, and only the saved run can say which is true today.scripts/chart.mjs. Keep it in your scratch directory.rsvg-convert -z 2 -b '#faf7f0' in.svg -o out.png, then read the PNG. Every layout bug in "Traps" below is invisible in the SVG source and obvious in the render. Check the dark theme too, with -b '#100f0d'. Encode Sans is installed on the dev Mac, so the raster uses the site's face; the mono falls back to Menlo.site/public/blog/ and wire it into the MDX.A chart makes a number look settled, so check it is before you commit it to a figure.
nub --node in the same run is plain Node with nothing injected; if it does not match node, the harness is measuring something other than the augmentation. node with the flag set by hand is the other control: if nub does not match it, the augmentation is not what is being measured.pairedChart — the same measurement under two conditions, one bar each per row: a track-colored bar for plain node, an ember bar for nub. No axis is drawn (rule 6); groups carry their own scale and unit, so two magnitudes of the same direction can share a figure without sharing a scale, and a figure never mixes directions. This is the form for a runtime augmentation, where the subject is often the LARGER number: req/s under nub against req/s under node. Sort rows by the size of the effect when the effect is the story, by a natural order (the routes as listed in the benchmark) when the spread is.
overlapChart — one measurement against another on a shared axis where the subject is the SMALLER number. The slower series is a track; the faster one is an ember bar drawn inside it, so the gap between them is the win. Right for a time under two conditions (cold vs warm, before vs after). Sort by the ember bar, not the track: ember is the subject, and a subject series that jumps around is the first thing a reader notices. Never use it for a throughput: the subject bar would cover the track and the comparison vanishes.
rankedChart — one value per row, longest first, optionally split into titled groups. This is the form for cross-tool comparisons, where the bars measure different things that have no pairing. Nub's own rows are highlighted; everything else is the track color.
Pick by whether the two numbers are the same measurement under two conditions. If they are and the subject is a time, overlap them; if the subject can be the larger number, pair them; if they are not the same measurement, rank them.
Figure scales to the content column, and a wider SVG just renders smaller.PAD_Y and PAD_X in chart.mjs). Without it the figure reads as cropped, which is obvious the moment it sits on a page or in a tweet rather than on a preview; with less at the sides it reads as cramped even when centered (rule 5).pbkdf2, 320k awaits, a tool name. The gutter is exactly as wide as the longest label plus its gap, and the bar column runs to wherever the longest value label or note meets the right padding: the renderer computes both from the rows (rule 5), so a figure with short labels gets a wider bar column, not an empty margin.libuv threadpool, AsyncLocalStorage, Fastify + OpenTelemetry. The comparison is what the two bars and the legend say.headingNote carries the direction and, when it matters, the Node line — Node 22, lower is better. Nothing else goes there.node, 4 threads / nub, 8 threads, else just node / nub.acid, sky, orchid, pink) exist for a figure that sits next to a homepage section already using one of them — pass accent. alt (sky) exists only for a second nub configuration in a ranked chart.+23%, 1.9× faster, flat) after the subject's label is the only commentary a figure carries.Both themes come from THEMES in scripts/chart.mjs, and every value there is a token from site/src/app/global.css: the fumadocs page and text pair, and the accent quintet in its darkened light-mode and bright dark-mode variants. Do not invent colors — a chart with an off-palette gray reads as a screenshot from somewhere else. The type is Encode Sans and Geist Mono, the site's own faces, with the same system fallbacks the CSS names.
writeChart() emits three files per figure:
<stem>-light.svg and <stem>-dark.svg — transparent, for <Figure darkSrc>, which swaps them on the dark class.<stem>.svg — light chart on an opaque #faf7f0 background. This is for GitHub, where a transparent light chart is unreadable on the dark theme. Release notes and PR bodies use it.Wire the pair in with Figure (already used in the blog posts that carry an image):
<Figure
src="/blog/threadpool-light.svg"
darkSrc="/blog/threadpool-dark.svg"
alt="..."
caption={<>... (<a href="https://github.com/nubjs/nub/blob/main/tests/bench/runtime/threadpool.sh">benchmark</a>)</>}
/>The alt text carries the whole data table, not a description of the picture: it names every row, both values and the multiplier, then closes on the headline. A screen reader user gets the same numbers a sighted reader does.
The page caption says what is measured and how, then links the benchmark file on main. This is where the fixture, the round count and the box go: the sentence that would have been a footnote inside the image belongs here, next to the figure rather than in it.
Not every figure is destined for a page. When the target is a tweet or a slide, the opaque <stem>.svg is the one to use, rasterized at 2x — rsvg-convert -z 2 in.svg -o out@2x.png. It carries its own background, so it survives whatever theme the reader's client uses. The dark rendering on its page color (-b '#100f0d') is the other option and matches the homepage's dark bench panel.
The caveat lives in the copy. The image never carried the fixture note, so whoever writes the post owns it: hand them the sentence (what was measured, how many rounds, what box, what shared it) along with the file.
A chart with no page pointing at it does not belong in site/public/blog/. That directory is for published assets. Leave a social-only figure in your scratch directory and hand over the path; unreferenced SVGs in the site tree are somebody's future cleanup.
The benchmark and its saved run are tracked, reviewed, and linked from the caption; they are the reproducible artifact. The generator that turns one run into one SVG is a one-off — keep it in your scratch directory. scripts/chart.mjs exists so each generator is thirty lines of data selection rather than a copy of the layout.
2.0× numeral only works when the short rows are much shorter than the long ones, leaving the lower right of the plot empty. When every bar is long there is nowhere to put it, and it lands on top of the bars. Drop it; the per-row notes already say it.<tspan>, and a   entity does not save you. To put a gap between a heading and a muted qualifier, set dx on the tspan — an explicit offset is the only thing that survives.heading.Figure renders the image at the column width regardless of its aspect ratio. A very tall chart still works, but 8–10 rows is the practical limit before the type gets small in the content column.X0 − 12 − 0.6 × 12 × chars), the rightmost is the longest note's end; both should be PAD_X (56px) from the frame. A one-line script over the SVG's <rect> and <text> positions settles it in seconds, and it is the check the renderer's own sizing is verified against. Then look at the raster anyway: equal margins that are too small read as cramped, and only the eye catches that.Keep the stem and overwrite all three files, so no MDX changes. Then re-check every place the numbers appear as prose — the alt text, the caption, the surrounding paragraph, the summary bullets at the top of a release post, and any other page repeating the claim. A regenerated chart that contradicts the sentence next to it is the failure mode here; grep the multiplier across site/content/ before you finish.
© nubjs, 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 1 other file (scripts) in .claude/skills/nub-charts of nubjs/nub.
Open the folder on GitHubat commit 568e73a
Nub Charts 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 |
|---|---|---|---|---|---|---|
| Nub Charts this skillnubjs/nub | 4.4k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Voice Buildercharlie947/social-media-skills | 3.8k | — | ~3.3k | Automated safety check: Pass | MIT | |
| Content Writer Agentmastra-ai/mastra | 29k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| Content Writerchrispangg/deepagentsdk | 128 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Blog Cover Posterdigoal/blog | 8.6k | — | ~1.4k | Automated safety check: Pass | GPL-2.0 | |
| Content Repurposeririnabuht12-oss/marketing-skills | 4.1k | — | ~2k | Automated safety check: Pass | None |
charlie947/social-media-skills
Build a personalised voice profile inside a Codex or Claude project from a short interview plus 3 to 5 sample pieces of writing.
mastra-ai/mastra
Authoring playbook for building agents that draft written content — blog posts, marketing copy, social media posts, newsletters, product descriptions, landing pages, or ad copy.
chrispangg/deepagentsdk
Writing content across different platforms and styles. An agent skill from chrispangg/deepagentsdk.
digoal/blog
Turn a blog post, article, notes, or any source material into a set of vertical poster images — one cover plus several coherent content slides that explain the core points.
irinabuht12-oss/marketing-skills
Transform one long-form piece into multiple platform-specific content derivatives including LinkedIn posts, tweet threads, email snippets, ad hooks, and video scripts while maintaining voice…
thatrebeccarae/claude-marketing
Comprehensive content marketing toolkit with brand voice analysis, SEO optimization scripts, content frameworks, social media strategy, and content calendar planning.
nubjs/nub
Diagnose and clear CPU, memory, and disk contention on the maintainer's dev host.
nubjs/nub
Reclaim disk on the maintainer's Mac when the volume is full or filling — ENOSPC, "no space left on device", a failed build or agent harness, or a routine sweep of Rust build residue.
nubjs/nub
A skill your agent uses when running a compatibility/parity AUDIT — enumerating where nub diverges from a reference it claims parity with (pnpm CLI grammar, a lockfile format, a Node behavior, a…
nubjs/nub
Run ad-hoc Nub tests and debugging probes on real local Linux guests.
nubjs/nub
Performance-trace Nub package-manager installs using the existing phase timings, structured diagnostics, and sampling-profiler workflow.
nubjs/nub
A skill your agent uses when building or testing the nub Rust workspace inside a git worktree — cargo build/test/clippy for nub-cli/nub-core/aube in a worktree off origin/main.
Categories
Build a performance chart for nubjs.com — the SVG bar figures in blog posts, docs pages and social posts (a runtime augmentation against plain node, an install or dispatch comparison, a cross-tool…. Nub Charts is an agent skill from nubjs/nub.com — the SVG bar figures in blog posts, docs pages and social posts (a runtime augmentation against plain node, an install or dispatch comparison, a cross-tool ranking).
Nub Charts fits situations like: asked for a graphic; figure showing a benchmark result; whenever adding a measured claim to a docs; blog page that deserves a picture.
Run `npx skills add nubjs/nub --skill nub-charts -a claude-code`. Or copy the skill folder (.claude/skills/nub-charts in nubjs/nub) into .claude/skills/nub-charts in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nubjs/nub --skill nub-charts -a codex`. Or copy the skill folder (.claude/skills/nub-charts in nubjs/nub) into .agents/skills/nub-charts 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 nubjs/nub --skill nub-charts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nub-charts, .gemini/skills/nub-charts, .github/skills/nub-charts and .opencode/skills/nub-charts in your project.
Going by SKILL.md and its folder, Nub Charts needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node). 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 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.
Nub Charts is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 19k 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 Nub Charts: Voice Builder (charlie947/social-media-skills, 3.8k stars), Content Writer Agent (mastra-ai/mastra, 29k stars), Content Writer (chrispangg/deepagentsdk, 128 stars) and Blog Cover Poster (digoal/blog, 8.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nubjs (a GitHub organization) maintains it in nubjs/nub, which has 4,375 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on October 10, 2026.
Source: nubjs/nub on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.