by jonwheatley
Turn any two places into a pixel-art fly-through of the real road. A Claude Code skill.
# Add to your Claude Code skills
git clone https://github.com/jonwheatley/pixel-pathSee how pixel-path compares with popular alternatives.
pixel-path is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by jonwheatley. Turn any two places into a pixel-art fly-through of the real road. A Claude Code skill. It has 77 GitHub stars.
pixel-path's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/jonwheatley/pixel-path" and add it to your Claude Code skills directory (see the Installation section above). pixel-path ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
pixel-path is primarily written in JavaScript. It is open-source under jonwheatley on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh pixel-path against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Builds a folder you can open or host: index.html with road.js and layout.js (the fly-through), data/ (the
baked route) and art/ (the pictures). Plain Node 18+, no npm installs (the self-check uses Playwright if present).
Scripts are in ${CLAUDE_SKILL_DIR}/scripts/; run them as node ${CLAUDE_SKILL_DIR}/scripts/<name>.mjs ....
Call the trip folder TRIP (e.g. trips/bath-bristol). Every step can be rerun and resumes where it stopped.
The result is a first-person camera moving along the real road: the real buildings on their footprints, the real landmarks at their places, real land cover, hills and horizon. No interface beyond a small credits line. Scroll (or drag on a touch screen) to speed up, slow down or reverse.
export RETRODIFFUSION_API_KEY=... (on a Mac they can store it in the Keychain instead:
security add-generic-password -s pixel-path -a retrodiffusion -w). Never ask for the key in the chat, never
print it, echo it or write it to a file.Per region (a region is one look, e.g. "Georgian Bath"); $0.18 a picture at RetroDiffusion rd_pro__default
(October 2026). The levels are nested: moving up a level only pays for the new pictures.
| level | per region | 1 region / 2 regions | what you get |
|---|---|---|---|
| placeholders | 0 | $0 / $0 | code-drawn stand-ins for every picture |
sparse |
4 | 4 / 8 pictures, $0.72 / $1.44 | 3 kinds of building and a tree; every lot still filled, mirrored and tinted copies stretch the few pictures |
moderate |
about 14 + 4 landmarks | 18 / 32 pictures, $3.24 / $5.76 | about 10 buildings over the main kinds, 2 trees, a shrub, a street prop, the 4 best-known landmarks |
detailed |
about 26 + 10 landmarks | 36 / 62 pictures, $6.48 / $11.16 | up to 6 variants of each kind of building (up to 9 kinds), 3 trees, 2 shrubs, 3 street props, 10 landmarks |
node ${CLAUDE_SKILL_DIR}/scripts/route.mjs --out TRIP --from "Bath, England" --to "Bristol, England" [--via "Keynsham"]
Places can be names or "lat,lon"; add the region or country if a name is ambiguous. The start's country sets which
side you drive on, miles or km on signs, and a yellow centre line in North America. It prints the distance and the
estimate table (pictures and dollars for each level): show it and ask which level. NoRoute means no road connects
them: add a --via on the road network. Set PIXEL_PATH_USER_AGENT="name/1.0 (email)" so the services know who asks.
node ${CLAUDE_SKILL_DIR}/scripts/bake.mjs --trip TRIP [--default-land desert]
--default-land desert for arid routes. It prints, per 10 km, the buildings, land mix and place names, and at the end
the best-known landmarks near the road: use them to choose regions and subjects. On Overpass errors it waits and retries
across mirrors; if it still fails, rerun later (finished chunks are kept).
One region (theme) per distinct look: usually 1 for a short or uniform route, 2 or 3 for city, countryside, another
city. A region is id|starts at km|description. Write specific subjects: generic prompts give generic buildings,
and the subject is what makes a place recognisable. Give up to 6 alternatives per role separated by | (each variant
takes the next one). For landmarks, describe what the building looks like from the street
(--subject "lm-<wikidata id>=..."): the model does not know the building by name.
node ${CLAUDE_SKILL_DIR}/scripts/plan-art.mjs --trip TRIP --detail moderate \
--theme "bath|0|the Georgian city of Bath, England: honey-coloured Bath stone" \
--theme "bristol|11|Bristol, England: red brick and pastel-painted Victorian terraces" \
--subject "bath:terrace=a three-storey Georgian townhouse of Bath stone in a terrace, sash windows, a black door|..." \
--subject "bath:shop=a Georgian Bath stone building with a painted wooden shopfront, invented name|..." \
--subject "lm-Q2540426=the Roman Baths: a Bath stone colonnade and the Pump Room front with tall columns"
node ${CLAUDE_SKILL_DIR}/scripts/placeholder-art.mjs --trip TRIP
Kinds of building (house, terrace, shop, apartment, tower, civic, church, industrial, farm) get pictures in proportion
to how much of the frontage they cover; other roles are tree, bush, street and the landmarks. Read the printed
list and fix subjects that don't fit. The prompts already spell out the view and the isolation. Never ask for real
brand logos, real business names or recognisable people.
node ${CLAUDE_SKILL_DIR}/scripts/rd.mjs quote --trip TRIP # free: the exact total and the account balance
node ${CLAUDE_SKILL_DIR}/scripts/rd.mjs run --trip TRIP --budget 6.50 # only after the user confirms the budget
--budget is the trip's total including what it already spent; suggest about 25% over the quote for re-rolls (in tests, 10 to 35% of pictures came back unusable and were re-rolled). Every job
is quoted and reserved in art/ledger.json before it is paid for; the run stops rather than go over the budget or the
balance, and reruns never pay twice. Exit 3 means no key.
node ${CLAUDE_SKILL_DIR}/scripts/clean.mjs --trip TRIP
Floods away white backdrops, fills see-through holes in facades, hardens edges, crops, and drops pictures that still
carry a background (over 55% of the outline opaque), painted sky, cut-off subjects or slivers. Open
TRIP/art/contact.png with the Read tool and look at every picture. Add any that look wrong (a building at an angle,
two buildings in one picture, a sign with a real brand, anything that would not stand on its own in a street) to
TRIP/art/drop.txt, one name per line, and re-clean.
node ${CLAUDE_SKILL_DIR}/scripts/check.mjs --trip TRIP [--fix --budget 6.50]
It installs the page, lays out the whole route exactly as the page will, and then, in headless Chromium:
TRIP/check/worst-frames.png (each frame as it looks, beside the same frame with the problem marked);TRIP/check/montage.png, shot-*.png) and checks they are readable and named;--fix re-rolls dropped pictures within the budget and checks again. The frame checks need Node 20+ and Playwright
(npm i -D playwright && npx playwright install chromium); without them, say plainly that the trip was not swept.Read TRIP/check/worst-frames.png, TRIP/check/montage.png and the shot-*.png frames. The trip is done only when
the sweep reports no frames with sky through or between buildings and every frame you look at passes these
questions: can you tell where you are (buildings, signs, landmarks)? Is there a gap in a street, sky through or behind
a building, a building that looks like a flat card, a floating fragment, the same building twice side by side?
Is anything broken, on a background, cut off, enormous or tiny? Fix what you find: a bad picture goes in
drop.txt and rd.mjs run --regen NAME (it costs a picture: say so first); generic pictures need better subjects and
--regen; a region that looks wrong needs another region. Run the check again after every fix. Tell the user honestly
what is still imperfect.
node ${CLAUDE_SKILL_DIR}/scripts/viewer.mjs --trip TRIP --serve 8080 # then open http://127.0.0.1:8080/
Any static server works (file:// does not). To host, upload index.html, road.js, layout.js, data/ and art/
(not .cache/, art/raw/, art/ledger.json). Controls: scroll or drag to go faster or slower (keep going to reverse),
arrow keys the same, Space pauses, I shows where you are, M a small map. URL options: ?km=3.2&speed=60&info=1&map=1.
One script at a time per service, with the built-in pauses. Everything is cached in TRIP/.cache, so reruns cost the
services nothing. Never run several bakes in parallel; for many or very long routes, self-host OSRM and Overpass.
data/ is a derived database: if you share it publicly it stays under the ODbL, with attribution.POST https://api.retrodiffusion.ai/v2/inferences with header X-RD-Token; body prompt, prompt_style, width, height, num_images, seed, remove_bg, input_palette; check_cost: true returns balance_cost and remaining_balance
for free; results in base64_images, or a task_id polled at GET /v2/inferences/tasks/<id>. Trust rd.mjs quote
over the prices above. If the API changes, adjust bodyOf() and api() in rd.mjs.
scripts/route.mjs (with the estimate), bake.mjs; kit.mjs (roles, prompt recipes, levels); plan-art.mjs,
rd.mjs, clean.mjs, placeholder-art.mjs; viewer.mjs, check.mjs; lib.mjs.templates/viewer.html, road.js, layout.js: the fly-through (commented, to be read). templates/palette.png: the
shared palette that keeps a kit coherent.A Claude Code skill that turns any two places into a pixel-art fly-through of the real road. Ask Claude for "a pixel path from Bath to Bristol" and it:
Bath, England: real streets from OpenStreetMap, art generated with the moderate kit.
A first-person, pixel-art view of any real road, built from the real map. Useful wherever you want a real place or route on screen:
A folder with an index.html. Open it through any static web server and you are moving down the real road:
I shows where you are and M shows a small map.Before anything slow happens, the first step prints an estimate for your route, and the skill asks you to choose.
Only the art costs money: $0.18 a picture at RetroDiffusion's rd_pro__default (October 2026). Cost depends on the
number of regions (distinct looks along the route), not on distance.
| level | pictures per region | 1 region | 2 regions | what you get |
|---|---|---|---|---|
| placeholders | 0 | $0 | $0 | code-drawn stand-ins for every picture |
| sparse | 4 | $0.72 | $1.44 | three kinds of building and a tree. Every lot is still filled; mirrored and tinted copies stretch the pictures. |
| moderate | about 14, + 4 landmarks | $3.24 | $5.76 | about ten buildings across the main kinds, two trees, a shrub, a street prop, the four best-known landmarks |
| detailed | about 26, + 10 landmarks | $6.48 | $11.16 | up to six variants of each kind of building, three trees, two shrubs, three street props, ten landmarks |
The levels are nested, so moving up a level only pays for the new pictures. The exact quote is free and comes after the bake. Allow about 25% on top for re-rolls: in testing, 10% (Bath) to 34% (Manhattan) of pictures came back cut off or on a background. The cleanup dropped them, and the self-check re-rolled them within the budget.
Bath to Bristol at moderate (two regions, Georgian Bath, then Victorian Keynsham and Bristol, 32 pictures, $5.76):

Kyoto Station to Kinkaku-ji, Japan, at sparse (one region, four pictures, $0.72):

Both runs passed the full self-check, including the sweep: 627 and 345 moving frames, with no sky through or between buildings. The estimate printed after routing matched the exact quote in every test run.
As a plugin. In Claude Code:
/plugin marketplace add jonwheatley/pixel-path
/plugin install pixel-path@pixel-path
By hand. Copy this folder into your skills folder, so that the skill is at
~/.claude/skills/pixel-path/SKILL.md. For a single project, use .claude/skills/pixel-path/ inside it.
Then ask Claude: "make me a pixel path from Paris to Versailles".
export RETRODIFFUSION_API_KEY=....security add-generic-password -s pixel-path -a retrodiffusion -w.npm i -D playwright && npx playwright install chromium). Without them, the layout and art checks still run.The skill doesn't call a route done when the code runs. It calls it done when the pictures pass:
Every building is a solid. Each building is laid along its real line and always gets a shaded end wall, so it never reads as a flat card. A neighbour that joins it paints over the part it covers.
Cleanup. Each picture is cleaned and its backdrop flood-filled away. Holes in facades are filled, including a roof-to-ground gap between two houses drawn in one picture. Pictures that still carry a background, painted sky, a cut-off edge or a sliver are dropped. A contact sheet of every picture is written for Claude to look at.
Layout check. The whole route is laid out exactly as the page will draw it, checking for gaps in street walls and for a building with the same picture as its neighbour.
The sweep. Every 75 m of built-up road, the camera moves and looks straight ahead and 30° to each side. The sky is painted magenta and every building is drawn into a mask, and it counts:
The 20 worst frames are written side by side with the problem marked.
Review. Claude is told to look at the worst frames and the samples and keep fixing until the sweep is clean.
The page shows a credits line that must stay visible wherever a fly-through is shown.
data/ folder is a derived database: if
you share it publicly, it stays under the ODbL, with credit.LICENSE), by Jon Wheatley. The road projection is the classic arcade technique (see Lou's Pseudo
3D Page and Jake Gordon's Javascript Racer).