LoBall Bikes — a shop floor for bikes that already have a story.
A used-and-refurbished bike shop in Tucson that sells, services, upgrades, and takes bikes on consignment — an owner-operated shop that’s explicit about being an anti-racist business and leans into Tucson’s punk and community scene rather than around it. The site had to carry inventory that turns over by the week, a real service-booking calendar, and a journal that reads in the shop’s own voice instead of a stock small-business template.
The brief
Every bike on the floor is used and one-of-a-kind — accurate this week, sold by next — and each one needed its own photos and story rather than a generic spec sheet. Booking a service slot needed a real calendar, not a contact-us-and-we’ll-call-you form. And once a bike is priced and photographed for the shop’s own site, re-listing it by hand on eBay, Craigslist, and Facebook Marketplace is the kind of repetitive work that eats a slow Tuesday afternoon.
The approach
- A `bike` CPT for shop inventory and an `event` CPT for community events, plus a `journal_category` taxonomy — Anti-racism, Punk & community, Affordability — that tags journal posts the way the shop actually thinks about them.
- A PhotoSwipe lightbox gallery on every bike’s page, loaded lazily as an ES module — the viewer core only downloads the first time a visitor opens a photo, and each image’s real dimensions are read from attachment metadata up front so the opening animation doesn’t jump.
- The Bike Lister plugin: one click cross-posts a listed bike to eBay through the real Sell Inventory API, and generates ready-to-paste Craigslist and Facebook Marketplace drafts — with a 40-day warning to repost the Craigslist ad before it expires.
- Google Calendar-backed service booking — a week-view availability grid backed by a service-account calendar, so a customer books an actual open slot instead of guessing.
- A booking-email bridge that turns every calendar booking into a notification email to the shop over the same Resend transport that runs the site’s contact form.
- Cache-busting keyed to each asset’s file-modified time, so a CSS or JS edit invalidates its own cache instead of waiting on a version bump someone forgot to make.
“Why an anti-racist bike shop — and why we say so out loud.”
— LoBall Bikes
The outcome
The shop can list a newly refurbished bike once and have it live on its own site and on eBay, with drafts ready for Craigslist and Facebook Marketplace, within minutes — the Craigslist repost clock tracked automatically instead of by memory. Service bookings land on the shop’s calendar as a real, holdable slot, and the journal reads in the shop’s own anti-racist, community-first voice because the taxonomy was built around how the shop already talks, not a generic blog category list.