Silhouette + URL → scannable art

QR CODES
SHAPED LIKE ANYTHING

Upload a silhouette and a URL. Get a scannable QR that conforms to your shape — sprint car, skull, heart, your logo, anything. One studio. Camo-style noise is on until you tune it off.

Drop your shape here

PNG · JPEG · SVG · STL — we route you automatically

13presets live
LIVEcamo gallery
5ink / QR
50free ink
Shaped QR example
SPRINT CAR · LIVE
Presets 13
Upload ANY
Ink 5/QR
Scan TRY

Process

THREE INPUTS · ONE CODE
01

Silhouette

Drop a file on the landing page or pick a preset in studio. Photos auto-prep to black-on-white.

PNGSVGSTL
02

Destination

Any URL — site, checkout, tel, wifi. Module density auto-fits length.

httpstelwifi
03

Generate

Max-fit placement, drag to tune, phone scan. Export PNG, SVG, or STL.

PNGSVGSTL

One studio

13 PRESETS + UPLOAD · CAMO BY DEFAULT

Drop → generate

Max-fit places the QR inside your silhouette. Drag to adjust. Decoy noise fills the shape unless you dial noise down in Style controls.

Open studio →

Auto prep

JPEG/PNG photos run through Inkwell in the background (same edit API as image-editor, hidden prep route) with an optimized silhouette prompt — no separate “silhouette” button.

Requires Inkwell sign-in for photo prep. SVG/STL skip prep.

Use cases

WHERE IT WINS
🏁

Race merch

Sprint car → driver page. Pivot Stick on racer.wiki · tees, helmets, decals.

🐾

Pet tags

Animal silhouette → owner contact or vet record.

🦅

Museums

Artifact or wildlife shape → exhibit or audio guide.

📖

Print

Book or invite shape → author page, RSVP, menu.

🌮

Food trucks

Product silhouette → ordering link on the wrap.

Industrial

Equipment icon → service form or asset record.

👑

Events

Crown, star, badge → tickets and offers.

🤖

Agents

MCP generates on demand for campaigns and products.

For agents

MCP · AUTOMATED QR

Hand-build in the studio or wire an agent. One tool call, silhouette in, image URL and scan status out.

  • Base64 PNG, public URL, SVG, or STL silhouettes
  • Inkwell wallet · Studio Pass $5/mo · 1 ink per shape · 1 ink per QR
  • Auto-refund when generation does not scan
Full MCP docs →

Also: Slant 3D print-farm guide (BYOK MCP) · Pivot Stick on racer.wiki

POST https://shapedqr.com/api/qr-studio-mcp
Header: X-MCP-Source: your-agent-name

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"generate_geometric_qr",
  "arguments":{"url":"https://yoursite.com",
   "shape_slug":"heart"}}}

Guides

PRINT FARM · RACE TOOLS
3D

Slant 3D API

Free walkthrough for Slant’s US print farm — upload STL, quote, draft orders, ship. Bring your own API key; MCP for Cursor and Claude.

Open Slant 3D guide →

Pivot Stick

Setup and pivot tooling on racer.wiki — built for dirt racers, works alongside shaped merch and QR lockups.

Pivot Stick on racer.wiki →

Pricing

PAY FOR OUTPUT

Inkwell wallet

Same ink_balances email as inkwell.wiki — buy ink packs there. No shared pool, no free trial.

inkwell.wikiemail
$5

Studio Pass

$5/month — 5 shape credits (trace or generate). Good if you do not want to buy ink packs.

subscription5 shapes
1

Pay per use

Otherwise: 1 ink per custom shape trace · 1 ink per QR. Layout previews while you drag stay free.

tracegenerate

Buy ink on Inkwell · or open studio and choose Studio Pass at checkout.

FAQ

COMMON QUESTIONS
Open the gallery or studio and scan on your phone — that is the proof. For print: module size scales with width. At 12″ art width, typical layouts land modules around 0.07″+ (well above the ~0.01″ floor). Studio shows module_pixel_size so you can scale before you ship.
Bold, high-contrast silhouettes — animals, vehicles, logos, tools. Gray mush and hairline detail fight the module grid.
Ink is the Inkwell platform wallet (~$0.05/ink). ShapedQR uses the same email. Pay 1 ink per custom trace and 1 ink per QR, buy ink at inkwell.wiki/buy-ink, or get Studio Pass ($5/mo, 5 shapes). Nothing is free.
There is one studio. Camo-style decoy noise is the default look — turn noise off in Style if you want a clean fill. Silhouette prep runs automatically on photo drops (Inkwell, in the background).

Make one weird thing.

Drop a silhouette. Paste a URL. Scan it with your phone.

Open studio →
\n\n\n var showcaseGems = ShapedQRShapes.SHAPES.map(function(s) { return { slug: s.slug, label: s.label, src: ShapedQRShapes.silhouetteSvg(s.slug) }; }); var heroRotateTimer = null; var INFO = { hero: { title: 'Hero', what: 'One drop zone. Rotating live engine renders (camo noise on). No separate Camo or Silhouette buttons.', how: 'File drop → ShapedQRIntake routes: SVG/STL direct; clean masks direct; photos → hidden Inkwell embed (prompt boost) → studio.', why: 'The product is one studio with camo-by-default aesthetics. Extra doors confused the story.' }, gallery: { title: 'Live examples', what: 'All 13 engine presets — catfish, sprint car, skull, heart, star, flask, circle, hexagon, and more. Upload any silhouette for custom shapes.', how: 'Live validate_geometric_layout from Supa — all 13 presets, camo noise on. Gallery previews are free; generates cost ink.', why: 'You should see every shape that actually works before you open the studio — real engine output, not flat silhouettes.' }, how: { title: 'Process', what: 'Three-step mental model: silhouette, destination URL, export.', how: 'Matches studio order — pick/upload shape, enter URL, generate and download.', why: 'Reduces “is this just a fancy QR sticker?” confusion. The engine masks modules to the silhouette interior.' }, studio: { title: 'One studio', what: 'Single builder: presets, uploads, noise/camo controls, max-fit, drag placement.', how: 'Camo is not a separate app — noise_mode auto fills decoys until you tune Style.', why: 'Matches how the engine actually works; fewer dead-end navigation choices.' }, uses: { title: 'Use cases', what: 'Concrete places shaped QRs outperform generic squares.', how: 'Each tile is a vertical story — merch, tags, exhibits, print, food, industrial, events, agents.', why: 'Buyers scan for their industry first. This section answers “would we actually use this?”' }, mcp: { title: 'For agents', what: 'Machine-facing generation via MCP for automated campaigns and product flows.', how: 'POST to qr-studio-mcp with generate_geometric_qr (or trace tools). Ink debits on success; refunds on failure.', why: 'Agents scale output; humans use the studio. Same geometry core, different interface.' }, pricing: { title: 'Pricing', what: 'Inkwell ink_balances wallet, optional $5/mo Studio Pass (5 shapes), or 1 ink per shape + 1 ink per QR.', how: 'Email required. Pass shape credits spend first; else ink debits. Previews free.', why: 'No shared studio pool and no free tier — you pay Inkwell or subscribe.' }, faq: { title: 'FAQ', what: 'Scan reliability, shape tips, ink economics, and why some previews are missing.', how: 'Accordion for quick reads; links to studio and MCP for depth.', why: 'Preempt support mail on the questions every first-time user asks.' } }; function buildGallery(gems) { var track = document.getElementById('galleryTrack'); track.innerHTML = ''; var list = gems.concat(gems); list.forEach(function(s) { var a = document.createElement('a'); a.className = 'gal-tile'; a.href = '/qr-studio?shape=' + s.slug; var img = document.createElement('img'); img.src = s.src; img.alt = s.label + ' shaped QR'; img.loading = 'lazy'; img.width = 180; img.height = 180; img.onerror = function() { this.onerror = null; this.src = ShapedQRShapes.silhouetteSvg(s.slug); }; img.setAttribute('data-shape-slug', s.slug); a.appendChild(img); var lab = document.createElement('span'); lab.textContent = s.label; a.appendChild(lab); track.appendChild(a); }); } function buildMarquee() { var labels = ShapedQRShapes.SHAPES.map(function(s) { return s.label; }); var text = labels.concat(labels).join(' · '); document.getElementById('marqueeTrack').innerHTML = 'SHAPED QR / ' + text + ' · UPLOAD ANY SILHOUETTE · CAMO NOISE ON · '; } function setHeroGem(gem) { var img = document.getElementById('heroShowcaseImg'); var lab = document.getElementById('heroPlateLabel'); var plate = document.getElementById('heroPlate'); if (!gem || !img) return; img.src = gem.src; img.alt = gem.label + ' shaped QR'; lab.textContent = gem.label.toUpperCase() + ' · PRESET'; plate.classList.remove('loading'); } function startHeroRotate() { if (!showcaseGems.length) return; var i = 0; setHeroGem(showcaseGems[0]); if (heroRotateTimer) clearInterval(heroRotateTimer); heroRotateTimer = setInterval(function() { i = (i + 1) % showcaseGems.length; setHeroGem(showcaseGems[i]); }, 5000); } function handleHeroDrop(e) { e.preventDefault(); var dz = document.getElementById('heroDZ'); dz.classList.remove('drag-over'); var file = e.dataTransfer.files[0]; if (file) routeDrop(file); } function handleHeroFile(e) { var file = e.target.files[0]; if (file) routeDrop(file); } function routeDrop(file) { var dz = document.getElementById('heroDZ'); dz.classList.add('busy'); dz.querySelector('.dz-up').textContent = 'Working…'; document.getElementById('dzFile').style.display = 'block'; document.getElementById('dzFile').textContent = file.name; ShapedQRIntake.routeFile(file, { onStatus: function(msg) { dz.querySelector('.dz-up').textContent = msg; } }).catch(function() { dz.classList.remove('busy'); }); } function openInfo(key) { var d = INFO[key]; if (!d) return; document.getElementById('infoTitle').textContent = d.title; var body = document.getElementById('infoBody'); body.innerHTML = '
What
' + d.what + '
' + '
How
' + d.how + '
' + '
Why
' + d.why + '
'; var bd = document.getElementById('infoBackdrop'); bd.hidden = false; bd.classList.add('open'); } function closeInfo() { var bd = document.getElementById('infoBackdrop'); bd.classList.remove('open'); bd.hidden = true; } document.querySelectorAll('[data-info]').forEach(function(btn) { btn.addEventListener('click', function() { openInfo(btn.getAttribute('data-info')); }); }); document.getElementById('infoClose').addEventListener('click', closeInfo); document.getElementById('infoBackdrop').addEventListener('click', function(e) { if (e.target === e.currentTarget) closeInfo(); }); document.addEventListener('keydown', function(e) { if (e.key === 'Escape') closeInfo(); }); document.querySelectorAll('.faq-q').forEach(function(btn) { btn.addEventListener('click', function() { var item = btn.closest('.faq-item'); var open = item.classList.contains('open'); document.querySelectorAll('.faq-item.open').forEach(function(i) { i.classList.remove('open'); }); if (!open) item.classList.add('open'); }); }); function copyMcp() { var t = document.getElementById('mcpSnippet').textContent; navigator.clipboard.writeText(t).then(function() { var b = document.querySelector('.mcp-code .copy'); b.textContent = 'Copied'; setTimeout(function() { b.textContent = 'Copy'; }, 1600); }); } buildMarquee(); buildGallery(showcaseGems); startHeroRotate(); document.getElementById('heroPlate').classList.remove('loading'); ShapedQRShapes.loadCamoPreviews().then(function(gems) { if (!gems || !gems.length) return; showcaseGems = gems; buildGallery(gems); startHeroRotate(); ShapedQRShapes.applyCamoThumbs(gems); }).catch(function(e) { console.warn('camo previews', e); });