2024–2026 · Founder · designer · engineer · salesperson
VisorPlate
A no-drill front-license-plate display for nice cars: the plate rides in a sleeve strapped to the sun visor, and comes off in three seconds for a car show. I designed it, built the store, and shipped it myself.
- stack
- Astro, Vue, TypeScript, Cloudflare Workers, Stripe, ShipStation
- tags
- ecommerce, product, cloudflare
- status
- on hiatus
The problem
People with nice cars hate the front license plate. It breaks the lines of the bumper, and bolting it on means drilling holes through a front end that cost more than some people’s first car. Most of the country says you need one anyway.
28 states and D.C. require a front plate.
That’s the market: the lit states, where the choice was drill the bumper, prop the plate on the dash, or eat the ticket.
The product
A sleeve for the plate that straps to the sun visor. The plate faces out through the windshield, and the whole thing comes off in about three seconds when the car is headed to a show. No tools, no holes, nothing left behind on the car.

01A clear vinyl sleeve, sized for a standard US plate.

02The plate slides in from the side. No screws, no brackets.

03Loaded. The plate reads straight through the vinyl.

04The back: two velcro straps that wrap the sun visor.
Sixty seconds to install

01 Insert the plate
Slide your front plate into the sleeve.

02 Strap it on
Wrap the velcro around the passenger sun visor and flip it down.

03 Drive
Plate faces forward. Car show? Pull it off and toss it in the glovebox.
On the road

01Bugeye WRX

02NA Miata

03Honda S2000

04Porsche Cayman

05Nissan 240SX at a meet — the whole reason it has to come off fast

06Ford Mustang

07Mercedes-AMG GT

08Subaru WRX

09BMW M4
Making it
I did everything except sew. The first batch of bags was made by a seamstress, the second by my wife. The rest was me: the design, the sourcing, the photos, the store, inventory, leads, and pitching dealerships on selling them white-labelled with their own branding.
The store
The store’s job is to take money and get a label on a box without me touching a keyboard. Here’s one order, start to finish:
Browser
Someone hits Buy on a page that was rendered at build time and is served straight from Cloudflare’s edge.
Cloudflare Worker
Checks a sold-out flag in KV, then opens a Stripe Checkout session. The secret key never leaves the server.
Stripe
Takes the card, then signs a
checkout.session.completedwebhook back to the Worker.Cloudflare Worker
Verifies the signature, creates the order in ShipStation, and sends the confirmation email through Resend.
Mac mini, 8 a.m. weekdays
A cron job polls the print queue and sends every waiting label to a USB thermal printer on my desk.
Me
Bag, label, post office. A digest of the last day’s orders is already in my inbox.
There’s no database of my own anywhere in that. Stripe is the order history, ShipStation is the fulfilment queue, and KV holds exactly two things: the sold-out switch and the contact form’s rate limits. The fixed cost is the domain.
It didn’t start that way. The first version was Laravel on a Forge server, because Laravel is what I knew. A year in, I rebuilt it as an Astro site on Cloudflare Workers, with Vue only where something needs to be interactive and every product photo run through a build-time AVIF pipeline. Same product, same Stripe history. Same phone, same test:
Lighthouse — Cloudflare
- Performance
- Accessibility
- Best Practices
- SEO
- Largest Contentful Paint 12.6sPoor > 4.0 s Web average ≈ 2.5 s
When the biggest element finishes loading.
- Speed Index 4.0sPoor > 5.8 s Web average ≈ 3.4 s
How fast the page looks visually finished.
- Transferred Assets 9.36MBHeavy > 4 MB Web average ≈ 2.2 MB
Nineteen requests, most of them full-size product photos.
- Performance
- Accessibility
- Best Practices
- SEO
- Largest Contentful Paint 1.8sPoor > 4.0 s Web average ≈ 2.5 s
When the biggest element finishes loading.
- Speed Index 2.5sPoor > 5.8 s Web average ≈ 3.4 s
How fast the page looks visually finished.
- Transferred Assets 114KBHeavy > 4 MB Web average ≈ 2.2 MB
Six requests. AVIF at the size the screen asks for.