Turn any idea or article into hand-drawn editorial illustrations starring your own character — free on your ChatGPT/Codex sub. An agent skill (Claude Code, Codex, Cursor, Gemini) + a macOS app.
> /plugin marketplace add caezium/nib> /plugin install nib@nib
FAQ
nib is a Claude Code plugin with 1 hand-picked skill for content work, indexed on Flowy. Install it with the command on its page. It includes nib. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Repo: caezium/nib
Nib turns an idea — or a whole article — into hand-drawn editorial illustrations for your blog post, newsletter, or docs. Every image is white-background, one-idea-per-image, and stars one character you own (a mascot, a logo character, anything). The character performs the idea — pushes it, sorts it, steers it — instead of just posing. And because it's sent as the reference on every render, it stays on-model across the whole piece: the 2nd, 5th, and 10th image still look like the 1st.
Same character, three looks — and it didn't drift.
Three ideas in, three scenes out — building momentum, debugging, deep focus — the same character performing each.
Real plates straight from the app — a different character, any concept, still on-model.
nib.henryzh.dev · Free & open source · MIT
Install the skill into your agent — one command, no app to download:
| Agent | Command |
|---|---|
| Claude Code | npx skills add caezium/nib --skill nib |
| Codex CLI | codex plugin add caezium/nib |
| Cursor | Add plugin: caezium/nib |
| Gemini CLI | gemini extensions install caezium/nib |
Then just ask:
Use nib to illustrate: "small habits compound into a big result"
Use nib to make a 5-image set in riso for this article: https://paulgraham.com/ds.html
Use nib: set my avatar to ./avatar.png, then illustrate "saying no protects focus" in woodcut
codex login), Nib generates on your existing subscription. No API key, no per-image
charge.OPENROUTER_API_KEY and Nib uses
google/gemini-3.1-flash-image-preview (or any image model via --model). Exact 16:9. A
whole blog post for under a dollar.It picks automatically: your OpenRouter key if set, else a free Codex or Gemini CLI lane (whichever you're signed into).
Don't have a mascot? Use a bundled character:
Use nib with the "blip" character to illustrate "ship small, ship often"
The skills/nib/characters/ library ships ready-to-use
characters (and PRs adding your own are welcome — a character is just a folder with a
one-paragraph spec + a reference image). Or bring your own avatar image, and optionally
describe it in words (--avatar-spec) to lock its design even tighter.
The methodology and the looks live in one place — skills/nib/references/ — read by
both the skill engine and the desktop app, so they never drift.
marker · riso · blueprint · woodcut · pixel · clay · gouache · chalk ·
diorama · enamel · felt · manila · phosphor — one per piece, so a set reads as a
series. See references/styles.md.
python3 skills/nib/scripts/generate.py \
--idea "trust is built one piece of evidence at a time" \
--style marker --avatar ./avatar.png --out out.png
Flags: --backend auto|openrouter|codex · --model <id> · --avatar-pack <name> ·
--avatar-spec "<text>" · --register explainer · --transparent · --doctor.
Dependency-free (python3 3.9+ only).
Transparent cutouts. Add --transparent to lift the art off its white ground into a
transparent PNG — for slides, stickers, or dark UI. It uses rembg
(pip install 'rembg[cpu]'), which isn't bundled, so the core stays dependency-free; without
it the opaque render is kept. Works standalone on any image too:
python3 skills/nib/scripts/cutout.py <image.png>.
A TypeScript + React desktop app (macOS) — avatar onboarding, a style picker, a generation history grid, and a zoomable lightbox. Concept mode draws one idea at a time; Article mode turns a post — or your own draft — into a shot list you shape: pick which moments to draw, add your own, ask for more, then generate them in parallel.
Concept and Article modes · pick a starter character · free and keyed generation lanes.
Install (macOS, Apple Silicon):
brew install --cask caezium/tap/nib
This is a self-signed pre-1.0 build, so the cask clears the Gatekeeper quarantine flag on
install. If macOS still blocks it, right-click the app and choose Open. Or grab the
.dmg straight from Releases.
Run from source:
npm install && npm run gen # first time
npm run dev # real generation (OpenAI or OpenRouter key)
npm run dev:mock # placeholder images, no API calls
npm run build # package the app
The desktop app sends anonymous usage events (which mode/style, success/failure) and crash reports — never your prompts, avatar, API keys, or images. Turn it off in Settings → Telemetry. The skill sends no telemetry.
Nib's house methodology is adapted from xiaohei (小黑) by helloianneo — the hand-drawn editorial-illustration skill that inspired this project. Nib reimplements its approach in its own words and code.
MIT © 2026 Henry (caezium).
.agents/
plugins/
marketplace.json
.claude-plugin/
marketplace.json
plugin.json
.codex-plugin/
plugin.json
.cursor-plugin/
plugin.json
.github/
workflows/
release.yml
sentry-issues.yml
.gitignore
.vscode/
launch.json
settings.json
tasks.json
AGENTS.md
assets/
app.icns
app.ico
app.png
entitlements.plist
CLAUDE.md
components.json
gemini-extension.json
LICENSE
mobrowser.conf.json
package-lock.json
package.json
postcss.config.js
README.md
resources/
imageTemplate.png
imageTemplate@2x.png
scripts/
package-release.sh
site/
.assetsignore
concepts/
app-dashboard.jpg
app-interest.jpg
app-rubberduck.jpg
app-shipit.jpg
app-story.jpg
app-teacher.jpg
debugging.jpg
focus.jpg
fork.jpg
juggling.jpg
momentum.jpg
techdebt.jpg
favicon.png
gallery/
avatar.jpg
blueprint.jpg
clay.jpg
gouache.jpg
marker.jpg
pixel.jpg
riso.jpg
woodcut.jpg
index.html
shots/
article.png
avatar.png
concept.png
settings.png
wrangler.jsonc
skills/
nib/
characters/
blip/
avatar.md
reference.png
hen/
avatar.md
reference.png
mo/
avatar.md
reference.png
pip/
avatar.md
reference.png
README.md
scout/
avatar.md
reference.png
references/
character-builder.md
composition.md
methodology.md
palettes.md
quality-bar.md
style-data.json
styles.md
scripts/
cutout.py
generate.py
SKILL.md
src/
main/
index.ts
lib/
app-settings.ts
avatar-store.ts
fetch-article.ts
history-store.ts
image-provider.ts
openai-api-key.ts
prompt-builder.ts
provider-resolver.ts
providers/
codex.ts
gemini.ts
mock.ts
openai.ts
openrouter.ts
shot-list.ts
styles.ts
telemetry-config.ts
telemetry.ts
renderer/
App.tsx
assets/
characters/
hen.png
mo.png
sumi.png
components/
about-modal.tsx
app-content.gallery.test.tsx
app-content.hooks.test.tsx
app-content.hooks.ts
app-content.tsx
article-panel.tsx
avatar-setup-modal.tsx
error-modal.tsx
lightbox.tsx
openai-api-key-modals.tsx
save-success-modal.tsx
settings-modal.hooks.ts
settings-modal.tsx
style-picker.tsx
theme-provider.tsx
title-bar-status.tsx
ui/
input.tsx
index.css
index.html
lib/
examples.ts
icon-pipeline.ts
utils.ts
main.tsx
proto/
app.proto
vite-env.d.ts
tsconfig.json
tsconfig.node.json
vite.config.ts
vitest.config.ts© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic