I built a detention-pay calculator for truckers in a day — unglamourous niches beat another AI wrapper A developer built a free, no-signup detention-pay calculator for truck drivers in a single day, using a single HTML file with vanilla JavaScript. The tool calculates the money brokers owe drivers for waiting past free time at loading docks, then generates a claim PDF — with a watermark that markets the tool to logistics companies. The project targets an unglamorous niche where existing solutions are all paid or email-gated, offering a frictionless web alternative that runs instantly on a trucker's phone. Every "what should I build" thread on here is full of AI wrappers fighting over the same five SaaS founders. Meanwhile there's a guy sitting at a loading dock right now, doing arithmetic in his head, who is about to undercharge his broker by a few hundred bucks because nobody built him a 30-second tool. I built that tool. It's a free detention-pay calculator for truck drivers. This is the build log — the niche-selection, the single-file stack, and two decisions an SVG gauge and a no-mail-service auth scheme that were more interesting than the app deserves. I'm not a trucker. I build small free web tools for industries other may find unglamourous or not enticing enough. That honesty matters later. Truckers get a "free time" window at a dock — usually 2 hours. Past that, the broker owes detention pay ~$50–100/hr . Drivers leave an estimated $2,000–6,000/year of it unclaimed, mostly because the math + the paperwork is annoying enough to skip. So the spec wrote itself: The mistake I almost made: assume the niche is empty because I'd never heard of it. I checked. It is not empty — DockClaim $49/mo, GPS tracking , Detention Buddy, a couple of $9.99/mo App Store apps, even a free email-gated web calculator or two. That killed my first instinct "be the only one" but clarified the real wedge: everything is a paid app download or email-gated. The opening was a genuinely free, no-signup, instant web version that also generates the claim PDF. Not "the only detention tool" — the one with the least friction. I'll say more on why I'm careful about that claim at the end. Lesson: validate to find your angle , not just a go/no-go. "Crowded but all friction-heavy" is a fine market. No framework. The whole app is a single self-contained .html — markup, CSS, vanilla JS, jsPDF from a CDN. It deploys as a static asset. Cold-loads instantly on a trucker's phone on dock wifi, which is the only performance budget that matters here. The core math is anticlimactic, which is the point — including the one edge case people forget, the overnight dock wait: js function detentionOwed arriveMin, leaveMin, freeHrs, rate { let wait = leaveMin - arriveMin; if wait < 0 wait += 24 60; // crossed midnight at the dock const billable = Math.max 0, wait / 60 - freeHrs ; const charged = Math.ceil billable ; // brokers bill by the hour return charged rate; } The PDF is the actual product. jsPDF , a few doc.text calls laying out a claim, and a footer line — "Generated free at quackbuilds.com…" . That watermark is the entire distribution strategy: every claim a driver emails a broker carries the tool into a logistics company's inbox. The artifact does the marketing. The audience reads dashboards all day, so the result is a round gauge — a dim "free-clock" arc that hands off to a glowing amber "billable" arc, with a seven-segment LED readout DSEG font https://github.com/keshikan/DSEG in the center. The trick is splitting one dial into two arcs with stroke-dasharray + stroke-dashoffset . A 270° sweep, the free segment first, the billable segment offset to start exactly where free ends: js const R = 84, C = 2 Math.PI R, ARC = 0.75 C; // 270° of the circle const freeLen = Math.min freeMin, wait / wait ARC; const billLen = Math.max 0, wait - freeMin / wait ARC; gaugeFree.setAttribute "stroke-dasharray", ${freeLen} ${C} ; gaugeBill.setAttribute "stroke-dasharray", ${billLen} ${C} ; gaugeBill.setAttribute "stroke-dashoffset", ${-freeLen} ; // negative = start later Both