by AirsupHQ
Describe a factory in one line. Claude builds it as a live 3D simulation you can run. Open source agent skill: real discrete event simulation, tilt-shift miniature.
Available after the catalog security scan passes.
⚠️ 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.
# Add to your Claude Code skills
git clone https://github.com/AirsupHQ/factory-skillGuides for using ai agents skills like factory-skill.
Describe a factory in one line. Claude builds it as a live 3D simulation you can run.
The page is a model factory on a table, seen through a tilt-shift lens: a cut-away hall with the line inside, machines that move while they work, product flowing on conveyors, people, forklifts, a truck yard. Under it runs a discrete event simulation. Every number on screen comes from that simulation, never from a script: the throughput, the utilization bars, the WIP, the pulsing red outline around the bottleneck. When someone adds a machine at the bottleneck, the simulation gets one more server, the conveyor in front of it drains, and the outline moves to the next constraint.
The simulation is the explanation, so it has to be true.
note where they come from
("18 min at 180 C", "51 slots, 3 needle head"). When you have to estimate, say "typical".machines = CEIL(rate_in x cycle / (batch x availability x target utilization)).Run date at the start. A factory takes 10 to 25 minutes.
references/process.md has typical numbers for common processes and how to pick them.perToken so one token
leaves the line every 5 s to 2 h (a tray of 40 croissants, a case of 24 cans, a tray of 96 cells).spec.js (schema below). Start from the closest example in examples/.node scripts/check.mjs spec.js. It sizes the line and runs 5 production
days of the same engine the page runs, and prints per station: machines, capacity per day, busy,
down, blocked, starved, failures; then the forecast and the bottleneck. Read it like an engineer:
node scripts/build.mjs spec.js <out>.html writes one file of about 1 MB with three.js,
the runtime and the spec inlined. It opens from disk with no server and no network.node scripts/capture.mjs <out>.html shot.png --query "assemble=0" (needs
Playwright) and read the PNG. The line should fill the frame, every station should have its
machines, product should be on the conveyors, the HUD should show a throughput. Zero console errors.check.mjs (edit servers on a copy) before you quote it.FactorySkill.define({
id: 'ebike-motors', // file name
prompt: 'a line that makes 2,000 e-bike motors a day', // the user's line, typed into the page
title: 'E-bike hub motor line',
product: { name: 'motor', unit: 'motors', perToken: 1 },
demand: { perDay: 2000 }, // or perHour, or perWeek (5 days)
calendar: { shifts: 2, hoursPerShift: 8, startHour: 6 },
sizing: { targetUtil: 0.85 }, // planned utilization for the sizing rule
release: 'capacity', // 'capacity': raw material always there (find the max), 'takt': released at demand
seed: 11,
stations: [
{ id: 'stamp', name: 'Lamination press', machine: 'press', ct: 22, cv: 0.04, buffer: 8,
mtbf: 6 * 3600, mttr: 25 * 60, input: 'coil', stage: 'stack', note: '64 laminations at 180 strokes/min' },
{ id: 'wind', name: 'Needle winding', machine: 'winder', ct: 150, after: ['stamp'], stage: 'wound' },
...
],
stages: { coil: { shape: 'coil', color: '#8d949b' }, stack: { shape: 'ring', color: '#6f7780' }, ... },
})
Station fields:
| field | meaning |
|---|---|
id, name |
key and the name on the plate and in the HUD |
machine |
a kit machine (table below) or an alias such as lathe, proofer, pasteurizer, seamer |
ct |
seconds per cycle per machine; with batch it is the time for the whole batch |
cv |
coefficient of variation of the cycle (lognormal). Automatic 0.02 to 0.06, manual 0.1 to 0.2 |
batch |
units taken and released together (a chamber oven, a mixer, a TVAC) |
perMachine |
units one physical machine holds at once in continuous flow (tunnel oven, spiral, proofer, formation rack). The DES gets that many servers per machine with ct = dwell time |
servers |
'auto' (default, sizing rule) or a number of machines (times perMachine) |
buffer |
capacity of the input buffer (each input of a join has its own) |
mtbf, mttr |
mean busy seconds between failures and mean repair seconds (exponential) |
yield |
fraction good; the rest is scrapped at this station |
after |
predecessor ids. Default: the previous station. A station with input starts a new branch |
input |
the raw material stage a branch starts from |
stage |
the product stage this station outputs (looks up stages) |
note |
where the numbers come from, shown in the inspector |
variant, color, accent, length, radius, height, fill, web, glow |
looks |
operators, reserve, at: [col, row, dir] |
people beside machines, spare floor slots, manual grid placement |
The model is a tree into one last station (the sink): every station feeds exactly one next station.
Machines (real scale, metres) in runtime/kit.js:
| machine | looks like | kind |
|---|---|---|
cnc |
machining centre, window, moving spindle, chip conveyor | side |
press |
press with ram and flywheel, coil feeder; variant: 'magnetizer' |
side |
winder |
needle winder, spinning table, wire spools | side |
robot |
fenced 6 axis arm cell; variant: 'weld' adds arc and sparks |
side |
bench |
assembly bench with an operator, bins, tool balancer | side |
tester |
test rack with screens and a clamp fixture | side |
oven |
chamber oven with racks (batch); variant: 'proofer' |
side |
mixer |
spiral or planetary mixer with turning bowl | side |
filler |
rotary filler / seamer in a glass enclosure | side |
formation |
racks with blinking channels (formation, ageing, burn-in) | side |
tank |
stainless tank with agitator, ladder, piping | side |
laser |
laser cell with glowing window | side |
turntable |
calibration turntable with camera tripods | side |
cage |
flight / function test cage; the unit lifts while tested | side |
bay |
integration bay with gantry crane and technicians; variant: 'cleanroom' |
side |
chamber |
thermal vacuum / autoclave vessel with a round door (batch) | side |
kitting |
shelving with bins and a picker | side |
stacker |
high speed stacking / winding head | side |
cell |
generic enclosed process cell (anything else) | side |
tunnel |
tunnel oven, dryer; `variant: 'pasteurizer' | 'washer'` |
spiral |
spiral cooler / freezer / proofer tower | inline |
rollers |
sheeter, laminator, `variant: 'calender' | 'slitter'` |
coater |
roll to roll coater with drying oven | inline |
smt |
printer + pick and place + reflow | inline |
vision |
inspection arch over a belt | inline |
packer |
case packer / flow wrapper | inline |
Product shapes for stages: ring wound rotor hub disc coil box crate tote croissant tray dough sheet can sixpack bottle cell pouch roll module pack pcb frame drone satellite bus sneaker bag puck.
Each takes color and scale; tray takes item: 'croissant' | 'dough'.
A process with no fitting machine: use cell with a glow colour, or define one in the spec file
before define (guarded, so check.mjs can run the file without a browser):
if (FactorySkill.Kit) FactorySkill.Kit.def('kiln', (o) => {
const K = FactorySkill.Kit, { g, M, body, acc } = K.sideBase(o, 3, 2.4)
K.box(g, 3, 2.2, 2.2, body, 0, 0, 0) // K.box(parent, w, h, d, material, x, yBottom, z)
const door = K.live(K.group(g, 0, 0, -1.1)) // parts that move live in K.live groups
K.box(door, 1.4, 1.6, 0.08, acc, 0, 0.3, 0)
return K.finish({ g, kind: 'side', w: 3, d: 2.4, h: 2.4, entry: K.V(0, 0.9, -1.3),
work: K.workFixed(0, 0.9, 0), anim(s) { door.position.y = s.state === 'busy' ? 0 : 1.4 } }, o, [1.2, 2.2, -0.9])
})
references/kit.md has the whole API (materials, parts, people, vehicles, work(i, p) for units that
move through a machine).
?intro=1 types the prompt and assembles the factory station by station first.?film=1 stops the clock: window.__film.step(dt) renders one frame. window.factory exposes
select(id), setMachines(id, n), setCT(id, s), setBuffer(id, n), camTo({az, el, dist, target}, s),
stationCenter(id), forecast(), sim, world.speed, seed, release=takt, select=<id>, ui=0, assemble=0, ao=0.Tilt-shift miniature photography, not a CAD view: warm sun with soft shadows, ambient occlusion, a
narrow band of focus with heavy blur above and below, saturated warm grade, vignette, grain. The
factory sits on a diorama base on a table: cut-away hall (back and left walls full height, front and
right cut low with the section face coloured), racking along the back wall, clutter on free floor,
truck yard, parking, trees, a sign. Machines are cream with one accent colour per station.
references/look.md explains each choice and what to keep when you extend it.
check.mjs numbers match the HUD after a few hours (the HUD window is 4 h, so it is noisier).| path | what |
|---|---|
runtime/des.js |
the simulation engine and the sizing rule (pure, runs in Node and the browser) |
runtime/kit.js |
machines, products, people, vehicles |
runtime/world.js |
layout, hall, conveyors, token placement from simulation state |
runtime/look.js |
renderer, light, AO, bloom, tilt-shift, grade |
runtime/app.js, runtime/hud.css |
page, HUD, inspector, film hooks |
vendor/three.bundle.js |
three.js r185 and the addons used (MIT) |
scripts/check.mjs, scripts/build.mjs, scripts/capture.mjs |
headless run, build, screenshot |
examples/*/spec.js |
six factories made with this skill, each with its built page |
See how factory-skill compares with popular alternatives.
npx skills add AirsupHQ/factory-skill -g -a claude-code
Then, in Claude Code:
/factory a line that makes 2,000 e-bike motors a day
No API keys and nothing to npm install: the scripts use only Node built-ins and the page is one
self-contained HTML file.
Claude reads the line, writes the real process route (stations, cycle times, batches, breakdown rates, yields), sizes every station from demand, checks the line headless, and hands you one HTML file: a model factory on a table, seen through a tilt-shift lens, with machines that move while they work and product flowing between them. Under it runs a discrete event simulation. Every number on screen is computed by it:
Click a station: add a machine, slide its cycle time or its buffer, and watch the queue drain and the bottleneck move. The inspector shows the sizing formula with its numbers and a 3 day forecast of the changed line from the same engine.
All six were made by Claude with this skill, from the prompts above. Open any
examples/*/*.html in a browser, or try them at
airsup.ai/lab/factory-skill.
The repository is the skill: a folder with a SKILL.md at its root.
| Command | |
|---|---|
| skills CLI, for you | npx skills add AirsupHQ/factory-skill -g -a claude-code |
| skills CLI, one project | npx skills add AirsupHQ/factory-skill |
| git, for you | git clone https://github.com/AirsupHQ/factory-skill.git ~/.claude/skills/factory |
| git, one project | git clone https://github.com/AirsupHQ/factory-skill.git .claude/skills/factory |
Claude Code picks up new skills in a running session; if the skills folder did not exist when the
session started, run /reload-skills.
Factory follows the Agent Skills format: a folder with a SKILL.md at its
root, plain scripts and references beside it. Any host that loads that format can use it. The skills
CLI installs it for other agents with -a <agent> (see npx skills --help for the list); in the
Claude apps you can upload the folder as a zip under Settings, Capabilities, Skills; the Claude Agent
SDK picks it up from .claude/skills/. The workflow needs a shell with Node 20 or later to run
check.mjs and build.mjs; a host without one can still follow SKILL.md and write the spec.
/factory a bakery that bakes 10,000 croissants an hour
/factory a battery cell gigafactory, three shifts, 4 GWh
/factory how many CNC machines do I need for 600 gearbox housings a week at 42 minutes each?
You do not have to name the skill: asking to see, size or simulate a production line loads it. Give real numbers when you have them (volumes, cycle times, machines you already own, shifts); Claude fills the rest with typical values and says which ones it assumed.
The headless tools work on their own too:
node scripts/check.mjs examples/ebike-motors/spec.js # size the line and run 5 production days
node scripts/build.mjs examples/ebike-motors/spec.js # write the self-contained page
node scripts/capture.mjs examples/ebike-motors/ebike-motors.html shot.png --query assemble=0
node scripts/record.mjs examples/ebike-motors/ebike-motors.html film.mp4 --secs 12 --query intro=1
check.mjs prints, per station, machines, capacity per day, busy, down, blocked, starved and
failures, then the forecast and the bottleneck:
station ct s batch mach cap/day busy down block starve fails
> Lamination press 22 1 1 2,448 76% 12% 12% 0% 19
Needle winding 150 1 7 2,481 74% 5% 9% 12% 140
...
forecast over 5 production days: 1,943 motors/day (97% of target), scrap 29.6/day
bottleneck: Lamination press (busy + down 88%) WIP at end 193 tokens lead time 72.6 min
| Layer | What it does |
|---|---|
SKILL.md |
The method: read the line, state assumptions, write the process route with real numbers, size, check, build, look, answer with the finding |
runtime/des.js |
Event driven DES: parallel machines, lognormal cycles, batches, joins, finite buffers with blocking after service, operation dependent breakdowns, scrap, shift calendar, seeded and deterministic. Same file in Node and the browser |
runtime/kit.js |
27 machines at real scale with moving parts and stack lights, 29 product shapes, people, forklifts, AMRs, trucks, racks, trees |
runtime/world.js |
Layout of the line (branches, joins, folding long lines), hall, yard, diorama base, and every token placed where the simulation says it is |
runtime/look.js |
The miniature: warm sun and soft shadows, GTAO, bloom on emissive parts only, a tilted band of focus, warm saturated grade |
runtime/app.js |
HUD, inspector, what-if API, film mode |
vendor/three.bundle.js |
three.js r185 and the addons used, MIT |
The model, its limits and the sizing rule are in references/des.md; typical
process numbers in references/process.md; the kit API in
references/kit.md; the look in references/look.md.
Node 20 or later for the scripts (built-ins only). A WebGL2 browser for the page. Playwright is
optional, for capture.mjs and record.mjs.
One sink (no rework loops), no changeovers between variants, no shared labour pool, conveyors are buffers (material handling has no capacity of its own), and a breakdown of a continuous machine (tunnel oven, spiral) stops one slot rather than the whole machine. Numbers are as good as the cycle times Claude is given or estimates: the page shows its assumptions so you can change them.
Made by airsup, manufacturing simulation for hardware teams. Inspired by Anatomy, the skill that brings machines to life as isometric figures. MIT licence.
factory-skill is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by AirsupHQ. Describe a factory in one line. Claude builds it as a live 3D simulation you can run. Open source agent skill: real discrete event simulation, tilt-shift miniature. It has 50 GitHub stars.
factory-skill'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/AirsupHQ/factory-skill" and add it to your Claude Code skills directory (see the Installation section above). factory-skill ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
factory-skill is primarily written in JavaScript. It is open-source under AirsupHQ 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 factory-skill against similar tools.
No comments yet. Be the first to share your thoughts!