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

Live

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.

Front plate required · 29 Rear only · 19 Dropped it: Ohio 2020, Alaska 2022, Utah 2025

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.

A Texas license plate in front of the clear VisorPlate sleeve.

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

A license plate half slid into the sleeve.

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

The finished VisorPlate from the front, plate fully inside.

03Loaded. The plate reads straight through the vinyl.

The back of the VisorPlate: black fabric with two velcro straps.

04The back: two velcro straps that wrap the sun visor.

Sixty seconds to install

  1. Sliding a plate into the sleeve.

    01 Insert the plate

    Slide your front plate into the sleeve.

  2. The VisorPlate strapped to a passenger sun visor.

    02 Strap it on

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

  3. A Miata with the plate showing through the windshield.

    03 Drive

    Plate faces forward. Car show? Pull it off and toss it in the glovebox.

On the road

A red bugeye Subaru WRX with a sample plate behind the windshield.

01Bugeye WRX

A red NA Miata at sunset with a plate on the passenger visor.

02NA Miata

A silver-blue Honda S2000 with a plate on the visor.

03Honda S2000

An orange Porsche Cayman with a sample plate behind the glass.

04Porsche Cayman

A black Nissan 240SX at a car meet, plate on the visor.

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

A black Ford Mustang with a plate behind the windshield.

06Ford Mustang

A matte grey Mercedes-AMG GT with a sample plate on the visor.

07Mercedes-AMG GT

A white Subaru WRX with a plate on the visor.

08Subaru WRX

A red BMW M4 at sunset with a plate on the passenger visor.

09BMW M4

Store photography. The plate sits behind the windshield on the passenger side, where the visor is.

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:

  1. Browser

    Someone hits Buy on a page that was rendered at build time and is served straight from Cloudflare’s edge.

  2. Cloudflare Worker

    Checks a sold-out flag in KV, then opens a Stripe Checkout session. The secret key never leaves the server.

  3. Stripe

    Takes the card, then signs a checkout.session.completed webhook back to the Worker.

  4. Cloudflare Worker

    Verifies the signature, creates the order in ShipStation, and sends the confirmation email through Resend.

  5. 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.

  6. 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

  • 0 Performance
  • 0 Accessibility
  • 0 Best Practices
  • 0 SEO
  • Largest Contentful Paint 1.8s
    Poor > 4.0 s Web average ≈ 2.5 s

    When the biggest element finishes loading.

  • Speed Index 2.5s
    Poor > 5.8 s Web average ≈ 3.4 s

    How fast the page looks visually finished.

  • Transferred Assets 114KB
    Heavy > 4 MB Web average ≈ 2.2 MB

    Six requests. AVIF at the size the screen asks for.