Fleet operations platform · in production at Hartselle Utilities

I spent 20 years fixing trucks. Then I built the system our shop actually needed.

HU.b runs fleet operations at Hartselle Utilities — vendor invoices, preventive maintenance, purchase approvals, parts inventory, and shop scheduling in one place. I designed the data model, built the backend, and shipped it to six kinds of user who each needed something different from it.

What changed

Six things the shop used to do on paper

Each of these was a real process before it was a feature.

Vendor invoices

Cost visibility
Before

Typed by hand, fifteen to twenty minutes each, and the cost never reached the truck.

Now

Now the PDF goes in and comes back as structured line items, with parts and labor separated and each one tied to the repair task it belongs to. A person still verifies it before signing, because I'd rather a tech catch a wrong part number than have the system quietly book it.

Preventive maintenance

Uptime
Before

Schedules lived on paper. Nobody could say what was due without walking the yard.

Now

Each schedule fires on whichever comes first, a calendar interval or a meter threshold, so equipment that works hard gets serviced sooner and equipment that sits doesn't get over-serviced. When an operator reports something a PM already planned to fix, the two resolve into one work order instead of two.

Fuel data

Efficiency
Before

The fuel card report arrived monthly as hundreds of rows tied to nothing.

Now

The import matches each transaction to a unit and a driver, then checks the odometer against the last known reading. Readings that run backward or jump too far get held for review instead of quietly corrupting the fuel numbers.

Purchase approvals

Spend control
Before

Paper requests, and a $50 part followed the same approval path as a $50,000 one.

Now

Approvals route by dollar amount, with signatures captured in the app and the PDF generated on the way out. Revising an approved request sends it back for re-approval, which was the point — the audit trail has to survive someone changing their mind.

Shop scheduling

Throughput
Before

No schedule. Work got picked up roughly in the order it was remembered.

Now

The week is a board of two-hour blocks you drag work onto. When a critical repair lands, lower-priority jobs cascade to later days on their own, except the ones locked to a hard deadline.

Vendor calls

Accountability
Before

What a vendor said on the phone lived in somebody's memory until it didn't.

Now

Call summaries get pasted in and matched against open requests, jobs, and equipment, with suggested follow-ups an admin approves or discards. Nothing files itself — the suggestion is the useful part, not the automation.

The screens

What it looks like in use

Views from the live system. Click any image to enlarge it.

Fleet availability

Nobody types this number in. Equipment status flips when a repair order goes in progress, and this bar reads from that, so it's current as of the last wrench turn.

Critical alerts

Open operator reports, parts below their minimum, and recall campaigns matched against VIN-decoded equipment. Every count is a live query.

Preventive maintenance due

Each line shows both triggers, the interval and the meter, so you can see why something came due. Create RO turns it into a scheduled work order with that unit's parts already attached.

Shop schedule

Two-hour blocks, drag to schedule, and a backlog panel pulling from both unscheduled repairs and PMs without a work order yet. Usable on a phone in the bay.

Invoice extraction output

This is what comes back before anyone edits it: task segments carrying the vendor's own complaint, cause, and correction text, plus typed line items and part numbers. Verification is a read, not a re-type.

Equipment record

One record per asset: decoded specs and assigned operator up top, then tabs for repairs, parts, inspections, PM schedules, and fuel history. Parts link to PM schedules, so a due service already knows what it needs and whether it's on the shelf.

Decisions

Why it's built this way

The parts worth explaining are the tradeoffs, not the feature list.

Six dashboards instead of one

I first tried serving every role from a single dashboard with permission flags. Operators spent their time scrolling past approvals they had no ability to act on. A dashboard per role is more surface area to maintain, but adoption went up because nobody has to work out which half of the screen belongs to them.

A person in front of every signature

The invoice extraction is good enough that skipping review would be tempting. I didn't. Corrections get logged so I can see which vendor formats need attention, which means accuracy improves when I do that work — not on its own.

Jobs that refuse to close

A job stays open until every invoice is signed, the purchase request has gone out, and all line items are accounted for. That friction is deliberate. The alternative is a closed job with a missing invoice, which is the exact failure the system exists to prevent.

Measuring in business hours

The purchase timeline counts elapsed time between 7:00 AM and 3:30 PM on weekdays only. Calendar time made every weekend look like a bottleneck and hid the real ones.

Scale

What's actually running

Counts from the live application, not a roadmap.

62
Entities
Relationships, row-level access, and entity-triggered automations
74
Backend functions
Deno: extraction, PDF generation, scheduled jobs, imports
6
User roles
Operator, supervisor, dept manager, safety manager, GM, admin
18
Automations
Entity triggers and scheduled jobs running daily through monthly

Want the longer version?

The detailed breakdown covers the capability areas, the data-to-dollars pipeline, and the reasoning behind each part of the architecture.

Detailed breakdown
Chris Bumbarger
Fleet operations, then product.
chris@bumbarger.us

Built on the Base44 platform with React, Tailwind CSS, and Deno backend functions. External services: NHTSA VIN decode and recall data, CarsXE, Google Drive, Resend for email, web push, PDF generation and signing, ElevenLabs speech, and multi-model LLM calls across GPT, Claude, and Gemini.