Limited Drop Series

The Lawn Lifestyle Series

Four drops. Hi-viz. Built for crews who own it.

🌿 0 crews already claimed their spot
Drop 1
YARDART
yardart

Because the block is your canvas and the mower is your brush. For the operator who sees a freshly cut lawn as art.

Drop 2
YARDBITCH
yardbitch

For the operator who doesn't ask permission to dominate the block. You set the standard. Everyone else maintains it.

Drop 3
GRASSHAT
grasshat

The only hat that belongs on a real lawn boss. Worn on the route and earned off it. Six panels. Zero apologies.

Drop 4
GRASSCLOWN
grassclown

Wear the chaos. Own the cut. For the operator who books every slot in the zip code and still has time for a joke.

Small-Format Placements

Hat + Pocket Tee — Black

All four logos on black. The real legibility test — pocket and hat are where wordmarks break first.

🧢 Black Structured Cap
All four v3 logos — yardart, yardbitch, grasshat, grassclown — on black structured caps

Logo centered on front crown panel only. Brim-to-seam fit, no side-panel wrap.

👕 Black Pocketed Crew Tee
All four v3 logos — yardart, yardbitch, grasshat, grassclown — on left-chest pocket of black crew tees

Logo scaled to pocket bounds. Pocket stitching visible around logo placement.

⚑ Legibility flags at small-format
Hero Placement

Full Back Blast — Black Sweatshirt

The back-of-truck piece. Shoulder seam to shoulder seam — a single oversized graphic that hits from across the yard. All four v3 logos at full-back scale.

🚚 This is the flagship placement. The v3 logos were built with the slant and splatter to read at scale — this is where that decision pays off. Operator needs to confirm splatter density and bolt slant read at full-back size before committing to production.
yardart — Drop 1 Rendered
YARDART v3 logo — full back blast on black heavyweight crewneck sweatshirt
yardbitch — Drop 2 Rendered
YARDBITCH v3 logo — full back blast on black heavyweight crewneck sweatshirt
grasshat — Drop 3 Rendered
GRASSHAT v3 logo — full back blast on black heavyweight crewneck sweatshirt
grassclown — Drop 4 Rendered
GRASSCLOWN v3 logo — full back blast on black heavyweight crewneck sweatshirt
Scale-read analysis
// ── Sweatshirt mockup generator (server-side, Render has network access) ───── (function () { // Read pre-resolved mockup URLs injected by the server-side route handler. // Falls back to empty object if not set (first-time visit). var serverMockups = {}; var el = document.getElementById('mockups-data'); if (el) { try { serverMockups = JSON.parse(el.textContent || '{}'); } catch(e) {} } const TAGLINES = ['yardbitch', 'grasshat', 'grassclown']; function revealCard(tagline, url) { const pending = document.getElementById('pending-' + tagline); const img = document.getElementById('img-' + tagline); const badge = document.getElementById('badge-' + tagline); if (pending) pending.style.display = 'none'; if (img) { img.src = url; img.alt = tagline.toUpperCase() + ' v3 logo — full back blast on black heavyweight crewneck sweatshirt'; img.style.display = ''; } if (badge) { badge.textContent = 'Rendered'; badge.style.background = '#166534'; badge.style.color = '#dcfce7'; } } // Immediately reveal any mockups that are already done from a prior visit for (const t of TAGLINES) { const record = serverMockups[t]; if (record && record.url && record.status === 'done') { revealCard(t, record.url); } } async function checkStatus() { try { const res = await fetch('/api/internal/gen-sweatshirts/status'); const data = await res.json(); let stillGenerating = false; for (const [tagline, url] of Object.entries(data.done || {})) { if (TAGLINES.includes(tagline)) { revealCard(tagline, url); } } for (const t of (data.generating || [])) { if (TAGLINES.includes(t)) stillGenerating = true; } if (stillGenerating) setTimeout(checkStatus, 4000); } catch (_) { /* silent — page still loads without mockups */ } } // Trigger generation then poll for results fetch('/api/internal/gen-sweatshirts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ taglines: TAGLINES }), }).catch(() => {}).finally(() => { setTimeout(checkStatus, 2000); }); })();