---
name: Kitbitz illustrations
description: Use whenever a picture would help and a hand-drawn look fits — illustrating a video, an AI app, a deck, a landing page, a social post, an empty state, a section break. 2,043 CC0 illustrations in 13 themed kits (nature, medieval, cyberpunk, city, interior, space, pirate, halloween, dungeon, ruins, western, winter, barbieland), mirrored locally and searched offline. Not for photorealism, product screenshots, logos or icons.
tagline: 2,000 free hand-drawn illustrations your agent can drop into videos, apps, decks and websites.
website: https://kitbitz.art
icon: palette
version: 2
situations: illustrate this, add a picture, we need an image here, this page is bare, an empty state needs something, a background element, art for the video, art for the deck, a scene with a cart and crates, hand-drawn look, SVG illustration, free illustration, CC0 artwork, kitbitz
requires-secrets:
requires-packages:
---

# Kitbitz illustrations

2,043 hand-drawn illustrations in thirteen themed kits, every one **CC0 1.0** — public domain, free
commercially, no attribution required. They are editable SVG (2,009 of them; 34 are PNG only), so you
can recolour a path, drop a layer or scale one to a billboard.

The library lives **on this machine**, in `files/kit/kitbitz/`. Search, scene-casting and copying are
local file operations: no query, no brief, no filename and no part of the person's work ever leaves the
machine. The one and only network call in this skill is `kitbitz_sync` downloading the pack from our own
bucket, and it refuses any file whose sha256 does not match the digest pinned in `pack.json`.

## First run

```
kitbitz_sync                      → 0.3 MB catalog of all 2,043 drawings. Do this once.
```

That is enough to **search everything**. A kit's artwork (0.2–32 MB per kit) comes down the first time
you actually copy something from it, and `kitbitz_fetch` does that for you — you do not have to plan it.
Only reach for `kitbitz_sync kits: ["nature", "medieval"]` when you want the files in advance.

Do not run `kitbitz_sync kits: ["all"]` on a whim: that is 77 MB and a tool call is killed at 120
seconds. A cut-short download resumes on the next call, but a few kits at a time is the sane way.

## The thirteen kits

`nature` (309) · `medieval` (341) · `interior` (281) · `space` (170) · `cyberpunk` (157) ·
`pirate` (145) · `halloween` (133) · `city` (115) · `ruins` (103) · `western` (84) · `winter` (79) ·
`dungeon` (74) · `barbieland` (52)

`cyberpunk` and `city` are the two heavy ones (30 MB+) — those kits are detailed full scenes rather
than single objects. Everything else is under 4 MB.

## Searching

```
kitbitz_search  query: "market cart"  kit: "medieval"  limit: 8
```

Three habits, in order of how much they matter:

1. **Nouns, not adjectives.** The catalog is tagged by *object* — `cart`, `lantern`, `pine`, `crate`,
   `control panel`. "Something cosy and autumnal" finds nothing; `pumpkin`, `lantern`, `bare tree`
   finds the picture you were imagining.
2. **Name the kit once you know the style.** Without `kit`, a search happily returns a cyberpunk crate
   and a medieval crate in the same list, and two illustrations from different kits next to each other
   look like a mistake. Pick the kit first, then search inside it.
3. **Prefer the SVG, and it already does.** Every asset says `SVG` or `PNG` in its line. SVG is what
   you want: it recolours, it scales, and the video editor and a web page both take it directly.

Near-identical variants (five crates that differ by a plank) are **hidden by default** — one per object
per kit. When the first pick is nearly right, `variants: true` shows its siblings. Do not paste five
variants of the same crate into one scene; that is what the deduplication is protecting you from.

## Casting a scene from a brief

When the ask is a *scene* rather than a picture — "a medieval market at dusk", "a cyberpunk alley with
a food stall" — do not run four searches. Run one:

```
kitbitz_scene  brief: "a medieval market at dusk"
               roles: ["merchant", "cart", "crate", "barrel", "sign"]
```

It picks the kit that answers the most roles (or takes the `kit` you name), fills each role from **that
one kit** so the pieces belong together, never uses the same drawing twice, and prints the roles it
**could not fill**. Read that last list rather than skipping it: "no merchant in the medieval kit" is a
real fact about the scene you are about to build. Fill the gap another way, drop it from the layout, or
try a different kit — but do not pretend a barrel is a merchant.

`per_role: 3` when you want options to show the person instead of a decision made for them.

## Getting them into the work

```
kitbitz_fetch  ids: ["cypress-tree-91120599", "market-cart-4f2a…"]
               into: "projects/harvest-reel/assets/kitbitz"
```

**One folder per project.** A project's illustrations live with the project — `projects/<name>/assets/kitbitz/`
— never loose in `files/`, never scattered. That is the house rule for everything a project owns, and
artwork is not an exception.

**The exception is genuinely reusable elements.** A logo mark, a set of props several videos share:
those go in `files/kit/svg/`, which is also the folder the **video editor's kit panel reads**. Anything
you put there shows up as a placeable element in the timeline. Do not dump the whole mirror in there —
`files/kit/kitbitz/` is the library, `files/kit/svg/` is the shortlist.

Every fetch writes or extends **`KITBITZ.md`** beside the files: each drawing's id, title, illustrator,
kit and a link to its page, with the CC0 note. Attribution is *not required* and we give it anyway,
because a drawing had a hand behind it. Leave that file in place; move the credit into a colophon if the
person prefers, but do not silently delete it.

Limits, so you plan around them rather than discover them: 60 drawings per call, 2 MB per file (one
asset in the library is over it and is skipped by name — reference it in place instead).

## Using them

**In a video** (`*.mvideo.json`). An illustration is an image clip like any other. Fetch into
`files/kit/svg/` if the reel series will reuse it — it then appears in the editor's kit panel and the
person can drag it onto the timeline themselves — or into the project folder if it belongs to this one
video. Transparent SVG composites over a background fill without any masking work.

**In an AI app** (`ui/`). Copy the SVG into the app's own `ui/` folder and reference it as a sibling
file. An app frame loads **nothing** off its own folder — no CDN, no remote image — so an `<img src>`
pointing anywhere else silently renders blank. Watch the `ui/` folder size budget; these are a few KB
each, but the detailed city and cyberpunk scenes are not.

**In a deck** (`decks/<name>.deck.json`). The `image` field on a slide takes the fetched path. One
illustration per slide, at the same scale across the deck; the moment two slides use different kits it
reads as clip-art.

**On a website.** Inline the SVG when you want to recolour it from CSS (`fill="currentColor"` on the
paths you want themed); use `<img>` when you just want the picture. They are transparent, so they sit
on any background.

## Style — when NOT to use this

These are **playful, hand-drawn, flat-colour illustrations with soft shadows**. They are right for a
friendly landing page, a explainer video, an empty state, a game-ish or storybook feel, a deck that
wants warmth.

They are **wrong** for a studio product look, an enterprise dashboard, a fintech or medical page, a
brand that has its own illustration system, anything that must read as photographic, and logos or UI
icons (use Tabler for icons). Putting a hand-drawn pirate ship on a B2B pricing page does not make it
friendlier; it makes it look unfinished. When the brief is "clean and serious", say so and skip this
skill rather than shipping something that has to be undone.

Kits mix badly. Two illustrations from two kits in one layout look like two stock sites. One kit per
surface.

## Privacy and the network

- Search, scene and fetch are **pure local file operations**. Nothing is sent anywhere.
- `kitbitz_sync` opens exactly one host, `dl.0-0.chat`, and only for URLs that came out of a document
  whose sha256 matched the digest pinned in `pack.json`. It refuses any other host, any non-https URL,
  and any file whose bytes do not hash to what was pinned.
- This skill does **not** talk to kitbitz.art or to its public MCP endpoint at run time. The mirror was
  taken once, by a person, with `scripts/mirror-kitbitz.mjs` in the 00Local repo.
- Never put a client name, a private brief or anything from the person's files into a search — not
  because it would leak (it cannot), but because the habit is the thing worth keeping.

## Licence

CC0 1.0 Universal. Free for commercial work, no attribution required, no permission to ask for. The
full statement and the credit we give anyway are in `files/kit/kitbitz/LICENSE.md`, and every
`KITBITZ.md` repeats it beside the files it describes. Upstream: <https://kitbitz.art>.
