FLEETPRIORITY  /  PRODUCT DOSSIER

Fleet Priority

A subscription SaaS that gives small rental-car operators one place to track every vehicle's condition, cost, and paperwork — built solo, end to end, with Claude Code.

CASE NO. FP‑001
STATUS: LIVE
Role
Solo build, product & engineering
Built with
Claude Code, end to end
Stack
Node · Express · Stripe · vanilla JS
Status
Deployed, custom domain, HTTPS
01

The Brief

Small rental fleets run on spreadsheets, text threads, and a shoebox of paper mechanic receipts. Tag renewals slip. Insurance lapses go unnoticed until a claim. And there's rarely any record of what a car actually looked like before it left the lot versus when it came back.

Fleet Priority replaces that with a single dashboard per operator: every vehicle's tag, insurance, mileage, payoff status, maintenance history, and condition in one place, with real accounts, real subscriptions, and real accountability — not a shared spreadsheet anyone can silently edit.

It ships as a two-tier subscription product (Basic and Pro), with Stripe handling billing and a feature gate separating the tiers, so it's a real business, not just an internal tool.

02

What It Does

Fleet Dashboard

Search · filter · sort

Every vehicle as a card: status, tag expiration, tires, mechanic, and a payoff bar that decays automatically each month from a monthly-payment figure, so balances stay current without manual updates. Search by tag, VIN, make, model, or mechanic; filter by status; sort by mileage, year, or tag.

Fleet Priority dashboard showing five vehicle cards with status badges, payoff bars, and fleet-wide stats
EXHIBIT AFleet dashboard

Vehicle Record

One car, full history

Maintenance history with attached receipts, a per-vehicle gas-cost trend chart plotting every individual fill-up on a fixed axis, insurance documents and policy tracking (Pro), and a preferred-mechanic contact — all locked to view-only until an explicit Edit is pressed, so nothing changes by accident.

Vehicle edit modal showing vehicle details, photo, and the automatically decaying payoff tracker bar
EXHIBIT BVehicle record

Vehicle Inspections

Newest module

A fixed six-point photo checklist — front, rear, each side, interior, odometer — captured straight from a phone camera. The distinguishing move: starting a new inspection automatically pulls up the same vehicle's last inspection photos side by side, so damage gets judged against the last known state, not memory. Each finding carries a MINOR or MAJOR severity tag and a note.

New inspection flow showing the before and after photo comparison for the front and rear inspection slots
EXHIBIT CBefore / after capture flow
Completed inspection detail view showing a flagged scratch with photo, severity badge, and note
EXHIBIT DFlagged inspection detail

Fleet-Wide Reporting

Spend across every car

Spend broken down by service type, month-over-month oil-change and gas-cost trends, and a running log of recent maintenance across the whole fleet — the numbers an owner actually checks before deciding whether a car is worth keeping.

Fleet overview report page showing spend-by-service-type chart, cost trend charts, and a maintenance activity table
EXHIBIT EFleet overview report

Notifications & Account

Nothing slips

Tag, insurance, and maintenance deadlines surface automatically — overdue items flagged in red, due-soon in amber — with optional email reminders sent on a schedule. Settings covers profile, a theme picker that can follow the OS live, password changes, and a list of every signed-in device with per-device sign-out.

Notifications page showing overdue tag and insurance alerts and upcoming due-soon maintenance items
EXHIBIT FNotifications
Settings page showing profile, appearance theme picker, notification preferences, password change, and linked devices
EXHIBIT GSettings & linked devices
03

Under the Hood

The interesting parts weren't the CRUD screens. A few real problems came up along the way — here's how each got run down.

CORRECTNESS

A cascading delete that quietly failed

Deleting a vehicle sometimes left its maintenance records behind. The cause: the data layer read the JSON file fresh, mutated it, and wrote it back — twice, in two separate calls — so the second write could clobber the first before it landed. The fix wasn't a patch on the delete route; it was restructuring the whole store around one shared in-memory copy with serialized writes, so every mutation is immediately visible to the next one regardless of disk timing.

SECURITY

Sessions, not just tokens

Auth started as a bare JWT — fine for "is this user logged in," useless for "sign this one device out." Reworked so every login mints a server-tracked session record and the token carries a session id instead of just a user id. That's what makes per-device revocation possible, and what lets a password change safely kill every other session in one move without guessing which token belongs to which browser.

PRODUCTION

A live Stripe integration, debugged live

Checkout worked in testing, then failed in production with Managed Payments is not supported on API version 2024‑06‑20. The account had a newer Stripe feature enabled than the SDK's default API version supported. Fix was to stop relying on the SDK's default and pin the API version explicitly — the kind of bug that only shows up against a real account, not a sandbox.

DEPLOYMENT

A real box, not a platform

Deployed to a plain Ubuntu VM rather than a managed platform, since the JSON-file store and uploaded photos need a persistent disk: Node process managed by pm2, nginx as reverse proxy, DNS delegated through Route 53, TLS via Let's Encrypt, and a live Stripe webhook endpoint wired up for real subscription events.

04

Stack

BackendNode.js & Express, REST API under /api/*
DataJSON-file store, in-memory cache with serialized writes — documented seam to swap in Postgres at scale
AuthJWT in an httpOnly cookie, bcrypt password hashing, server-tracked sessions for device management
PaymentsStripe Checkout, subscriptions, webhooks, promotion codes
FrontendVanilla JS, HTML, CSS — no framework — Chart.js for trend charts
EmailResend API for password resets & reminders, console-log fallback for local dev
InfraAWS Lightsail (Ubuntu), nginx, pm2, Let's Encrypt, DNS on Route 53