Creator economy for kids · Live in production

Shirt Elastic

Kids design t-shirts with AI, sell them for real, and earn a cut — with their school earning a cut too.

Role: Product design, safety model, flow design, and direction of the agents that wrote it.

Timeline: Live at shirtelastic.com — open to the public

Visit the live site

Database tables
24

Table definitions in shared/schema.ts. Counted in the repository on 8 August 2026.

API endpoints
151

Express route registrations. Counted in the repository on 8 August 2026.

Pages
36

25 public and school pages plus 11 admin pages. Counted in the repository on 8 August 2026.

What was actually broken

A kid has an idea for a shirt. Between that idea and a real shirt sits: design software they can't use, a print supplier with a minimum order, a storefront, a payment processor, and a tax form.

Every one of those is a wall. The idea dies at the first one.

Shirt Elastic removes all of them, and then adds the part that makes it stick — the kid earns money, and so does their school.

The flow I designed

The design is dominated by one decision, and everything else follows it.

You make the thing before you make an account. A child arrives, describes what they want, picks a style, generates it, reviews four versions, customises it — and only then, when there is something they want to keep, does the app ask for an email. A magic link claims the work already sitting in front of them.

This costs real engineering: designs have to exist without an owner, and be adoptable later. It is worth every line. The alternative — a signup wall in front of a 10-year-old with an idea — loses almost all of them, and the ones it loses are exactly the ones who hadn't yet decided the product was for them.

Nothing unsafe reaches a screen, ever. Moderation is two layers and it is fail-closed: if a check cannot run, the content does not publish. This is the one place in the product where a false negative is unacceptable and a false positive is merely annoying, and the system is tuned accordingly.

Touch targets are sized for eight-year-olds. Bigger than an adult interface would use, with generous spacing, because a mis-tap on a design you're proud of is a small heartbreak.

Money is explained, not just calculated. Commission splits between creator, school and platform change during a fundraiser, so the interface shows the split rather than just the total. A kid who can see where the money went trusts the number.

The school is a growth loop, not a feature. Tagging a school that hasn't registered triggers outreach to that school. The kids do the distribution.

Interface notes

  1. Three steps, and none of them is “sign up”

    A child describes an idea, picks a style and reviews the result before the product asks for anything. The account request comes afterwards, when there is something worth keeping.

  2. Sign in is in the corner, not the door

    It exists for people coming back. It is deliberately not on the path of someone arriving with an idea, because that is the moment you lose them.

  3. “Surprise me” answers the blank page

    The hardest moment in any generative tool is the empty box. Reacting to something is far easier than inventing from nothing, so one tap produces something to react to.

The hard part

Fail-closed moderation on generative content made by children.

Two layers: a vision model checks generated imagery, and a separate pass handles tagging and classification. The hard requirement is the direction of failure. If the moderation service is down, slow, or returns something unparseable, the design does not publish. Not "publish and review later" — the review queue is for ambiguity, not for outages.

That sounds obvious written down. In practice almost every moderation integration fails open, because failing closed means the happy path is now coupled to a third party's uptime, and it feels like you have made your own product worse. You have. That is the correct trade when the users are children.

The second-order work is all in making the closed state not feel like a bug: clear state on the design, honest wording about why it is waiting, and a queue that a human actually clears.

Stack

FrontendReact 18 + Vite, Wouter, TanStack Query
UIshadcn/ui on Radix, Tailwind, framer-motion
BackendExpress 5 + TypeScript
DatabasePostgreSQL + Drizzle ORM
AuthEmail magic links — no passwords anywhere in the product
PaymentsStripe Checkout + Stripe Connect Express, with automated daily payouts
Image AIDALL·E 3 primary, Gemini fallback, Photoroom background removal
SafetyGemini Vision moderation, fail-closed, with a human review queue
FulfilmentPrintful print-on-demand with shipping webhooks
StorageGoogle Cloud Storage

Outcome

Live at shirtelastic.com, open to anyone: design a shirt, order it, have it printed and shipped.

Running in production end to end — AI design generation, two-layer moderation, print-on-demand fulfilment, Stripe Connect creator payouts, school storefronts, fundraisers with prize pools, leaderboards, and an eleven-screen admin console.

All work · Start a project