Rome wasn't built in a day, and neither was this app.
your-art-on-shirt.laravel.cloud/design
Not that my app is an architectural masterpiece that will stand the test of time. It's more that it was way more complicated than I thought it was going to be.
This was the second app I've ever built, and I decided to build it with multiple APIs and throw a physical product into the mix.
So, yeah. You don't know what you don't know until you know.
The Saturday morning my world changed
This might sound dramatic, but it was this Saturday morning that my world changed. I had just built my first app (laracon.us/photos) and that experience taught me that I could probably build anything if I was ambitious enough.
I got up at 6am. I was restless all night. My mind was racing through, what else can I build?
Josh Cirre had just built this notion image generator.
Christina from Resend had just talked at Laracon about building silly software.
And, Andrew Schmelyun has been building really cool code-to-physical products like this GitHub issues printer.
Idk why, but all these ideas collided in my brain and I thought: wouldn't it be cool if you could generate your own art and get it printed on a tshirt?
So I started talking to Claude about it, and Claude basically said: yeah, we can build this.
Next thing I knew, I had some new X followers. By the time I realized how complicated this build was actually going to be, I felt like I owed it to the people (and myself, haha) to figure it out.
It worked, but it sucked
I realized later that I'd given my agent way too simple of a scope. I was missing very important details like:
How to pay for the shirt (so it wouldn't cost me if someone actually wanted to print a shirt)
Which print-on-demand (POD) service to use
How to calculate shipping
No matter, though. We eventually got there. I just ended up spending more tokens than I needed by not scoping properly earlier on.
My simple scope: build an app using Laravel where you design art (my first iteration was just the 90s Memphis style), preview it on a black or white tshirt, then print + ship it.
Design → Preview → Print
It actually kinda worked. But it looked like garbage. Here's what the preview page looked like:

I knew right away why it looked like this: I needed to pull a real image from a POD shop. We settled on Printful.
Once I created the account and got the API connected, it quickly pulled in the right preview.

This was the first moment that I felt like I was actually useful. I was able to "debug" why it looked so bad and work with the agent to fix it.
As you can see, the placement of the front and back logos weren't quite right. I told Claude to tweak the preview placement to the left chest, and center the back logo better.
I then went through the process of generating the art, previewing it, and printing it on Printful. I had a week til it came, so I thought: while I wait, I can perfect the UI so I can release this thing as soon as it comes.
Oh yeah, Stripe
Going through the process of designing, previewing, and printing made me realize: oh yeah, how are people gonna actually pay for the shirt.
I wasn't actually looking to make a buck, which is probably why I didn't think about it. But shirts cost money to print, and I didn't want to foot the bill if someone actually ordered one.
I shot that thought off to my agent and it told me it was a whole reconfiguration situation. Not a simple, let's just plop Stripe right in there.
It took 52 minutes and used a crap ton of tokens.
During this part of the process I had to wrestle with my agent for a minute on shipping. This was the architecture my agent came up with:
Add shipping address in a form → POD API → get shipping rate → Stripe API → create checkout → payment → webhook → POD API → create order
It felt so clunky. But, after some thinking with Claude, I started to see why it built it that way. Stripe Checkout can't call my POD's API to figure out the shipping price mid-checkout.
So if I wanted a live shipping price from my POD provider, my app had to get that price first, then hand the final amount to Stripe.
That felt overly complex for a hobby project, so I simplified the logic down to standard shipping. But it was a great learning moment: shipping + taxes aren't so simple to configure.
10 minutes to update copy
That week I was waiting for my shirt I was in Denmark for a Laravel conference. The booth was only open during breaks, so I had my computer open tweaking things here and there as people spoke.
Updates like: change the copy to say design instead of design your tshirt. You know, simplification.
It literally took 10 minutes for my agent to do that. While I painfully waited, Aaron Francis got on the stage. Something he said sparked an idea: buckets.
All my code was in one, big 3,200 lines of code file and growing quickly. I decided to have the agent refactor my code into buckets to make it easier for it to find stuff.
The refactor took a while but once it was done, I was able to ship at 10x the speed. (oh yeah, adding Laravel Boost helped 😅)
The shirt came, but it sucked
I was so excited when the package arrived. Physical proof I can just build things!
That was quickly met with sadness and disappointment. The shirt looked nothing like the preview. It hit me as soon as I saw the shirt. I told the agent to change how the logos displayed on preview, but I never told it to reflect those same changes in Printful.
Was an easy tweak, but, then I had to wait another 10 days for another test print to come.
While I was at it, I actually swapped out the shirt from As Colour to Comfort Colors. The As Colour shirt was...not great. And more expensive.
7 days late
The shirt showed up 7 days later than when Printful said it would. And that was something completely out of my control because I am not Printful. I don't have a DTG printer in my basement.
This wasn't my million dollar idea.
I decided it was good enough


That young, early builder Sam didn't know just how complex all this was going to be. And honestly, I'm glad she didn't.
I had big, fun plans to make several different styles of generative art. But, I got to a point where I thought: I should be spending my time on projects that could actually become something.
So without further ado, here's my app: your-art-on-shirt.laravel.cloud/design
If it were my million dollar idea, I'd do things like:
more and better generative art options
more flexibility on shirts, hoodies, whatever you want
fix the colors (the colors on screen don't translate perfectly to print, so the shirt looks more dull than the preview)
cleaner UI
But I built it. It works. And I learned a ton about APIs, refactoring, agents, scoping, AI, Stripe, and physical printing.
Most importantly, this experience taught me something I don't think I'll forget: I really can build anything I want if the ambition is there.
Now I'm ready to go build something else.