Try it live About this project
You generate a few 3D models. You keep one. The rest get deleted. 3D Junkyard is where you dump the rest: a live, shared galaxy of castoff 3D models, each on its own tether, sorted by what it is — chairs with chairs, lamps with lamps. A model nobody picked can still be exactly what someone else is looking for.
Dump one: drag a GLB / glTF / FBX / OBJ / STL file into the page. It appears where you let go, drifts down, and lands next to things like it — public, with your ID on it. Or let your agent do it. With the Junkyard MCP server and skill, an agent searches here before generating, generates with Tripo only when nothing fits, and at the end of every 3D job dumps the Tripo models that didn’t make the cut — each tagged as made with Tripo.
Need something? Describe it, fly to it, take it — use it under CC BY 4.0, crediting whoever let it go. Coming next: what you dump can earn. Every take is already recorded; next, whoever let the model go gets a share of what it brings in.
Open it in a desktop browser; phones get a note to switch. The 1,921 models seeded into the world come from the public Objaverse 1.0 dataset (published on Sketchfab by their authors under their own Creative Commons licenses) and land a few at a time under 12 preset IDs; whatever you dump hangs in the same galaxy.
Highlights
- Drag a GLB / glTF / FBX / OBJ / STL file, or a zipped folder, into the page: it appears where you let go, drifts down and lands next to things like it, with a firework at the landing spot that everyone online sees, signed with your ID
- The world is the index: every item settles by meaning into a permanent cell of the galaxy, with its own shareable address like JUNK-3F9K2; search with a sentence or an image and the camera flies to the hits, lit up while everything else dims
- Hand it to your agent: with the Junkyard MCP server and skill, Claude Code, Codex or Cursor searches here before generating, uses Tripo only when nothing fits, and when the job is done dumps whatever the project didn’t use — each tagged as made with Tripo
- Take it: takeable items come with a download link valid for five minutes and a ready-made credit line — use them under CC BY 4.0, crediting whoever let them go; every take is already on the books, and next, whoever let it go gets a share
Technical breakdown
The agent loop · Search first, generate second, dump last
One junkyard skill installs unchanged into Claude Code, Codex and Cursor, backed by a Streamable HTTP MCP server named junkyard with four verbs — junkyard_search / junkyard_fetch / junkyard_dump / junkyard_reclaim — mirrored over REST. Before any 3D generation the agent calls junkyard_search with text, plus a reference image if it has one, and below_bar in the response says whether the hits are good enough: only when fewer than three clear the bar does it generate with Tripo, saving the output to disk at once because Tripo download links expire in five minutes.
The count happens once, when the task ends: only files generated this round and not referenced by the project go to junkyard_dump. A reference can take four forms — project-relative path, file name, stem without extension, absolute path — matched on word boundaries, case-insensitively; models the user picked and moved or copied under a new name are recognised by sha256; anything uncertain stays. Reference images are never uploaded, a project marked private skips the step entirely, and “undo the last dump” reclaims the whole session with junkyard_reclaim.
Ingest · Any format in, eight steps to a searchable item
Files dragged into the page and files dumped by agents share one async queue — validate → hash → convert → fingerprint → license → embed → tag → place — and the falling banner in the page reports progress against those eight steps. Conversion produces a normalised display copy: Y-up, longest edge scaled to one unit, meshopt-compressed, animations kept; anything above 150,000 triangles is decimated below that, and texture sets over 16 MiB are downsampled step by step, so heavy multi-material files are slimmed to fit rather than reduced to a point cloud.
The same three.js renderer, running in headless Chromium, shoots eight thumbnail views of each item, and MeshSurfaceSampler takes a 20,000-point coloured point cloud: the cloud goes to the Uni3D 3D encoder and the thumbnails to SigLIP 2, giving two vectors for search. A four-view contact sheet goes to the vision-language model Qwen3-VL-Flash in a single call, which picks a category, a style and a dominant colour from a bilingual controlled vocabulary and adds up to five free tags in both languages; category · style · first free tag becomes the item’s name in every list. Original prompts and reference images never reach any public output.
Semantic map · The world is the search index
UMAP (three components, non-parametric) is trained once on public-corpus vectors from the same encoder used in production and frozen as map v1; new items are placed with transform, so existing ones never move. Coordinates are quantised into integer cells, and when a cell is taken a deterministic spiral finds the nearest free one. The cell is a permanent address: a reclaimed item leaves a tombstone there, and the cell is never reused. A 3D Hilbert curve turns each cell into a 24-bit index written as five Crockford Base32 characters — addresses like JUNK-3F9K2 — so neighbouring numbers are neighbours in space.
Search runs on two channels: the EVA02 text tower aligned with Uni3D (non-English queries are machine-translated first) and multilingual SigLIP 2 (Chinese encoded directly, image queries too). Each recalls from an HNSW index in pgvector, and the two lists are fused with RRF. Text and item vectors sit across a modality gap, so a query is never projected onto the map; the camera flies to the centroid of the top hits instead. When fewer than three results clear the bar the response carries below_bar — the page marks it as a low match, and an agent knows it is time to generate.
World rendering · Nearly two thousand items, three levels of detail
The world streams in 16×16-cell tiles as the view moves, and every item has three looks by distance: up close, a full mesh — at most 24 slots, handed out by on-screen size, shown only once its shaders are precompiled; mid-range, a thumbnail silhouette impostor whose baked-in background is keyed out in the shader, drawn from a 4096² atlas of 2,601 slots; far away, an instanced anchor point. Switching looks is a 300 ms cross-fade whose opacities always add up to one, so no frame is ever empty.
Each item hangs on its own tether, drifting around its anchor and slowly turning once every 120–180 seconds, all seeded by the item’s id — every client sees the same motion without any network sync. When someone dumps, the firework at the landing spot is pushed over SSE to everyone online. If the frame rate stays low for three seconds, a four-step auto-degrade kicks in (resolution → fireworks → far field → drift), and the near-mesh budget only shrinks when frames actually drop — never just because draw calls are high.


