Auto repair shop management

Every car in the workshop, on one board.

A car arrives, you open a job card, and everything that happens to it stays on that card — the diagnosis, the labour, the parts, the quote the customer approved, the invoice, the payment. Self-hosted Laravel, full source.

No sign-up. Pick a role on the demo and you are in.
Buy — $59 — one purchase, full source, no subscription

The work

One job card, start to finish

A card cannot skip from booked in to handed over. Every move is checked, dated and attributed, so "who said we could do the clutch" has an answer.

OpenBooked in at the counter
DiagnosingFault found and written down
Awaiting approvalQuote with the customer
In progressOn the ramp
CompletedRoad tested
DeliveredKeys handed back

The screen you leave open

How many cars are on the floor, how many are waiting on a customer, how many are finished and how many have gone home — then the list of recent job cards underneath. One search box finds anything by name, registration or job number.

The Today screen: cars on the floor, awaiting approval, completed and delivered, above the latest job cards

The money

Paperwork frozen at the moment you issued it

A quote or invoice copies its lines and freezes both parties' details as they were on the day. Change your address next year and last year's invoice still prints last year's address — because that is the document you sent.

Quote, approve, invoice, get paid

Issue a quote and the customer opens a link, reads the work and the price, and approves it themselves — no account, no password. An approval moves the card into progress and is recorded as their decision, not a member of staff's.

Record cash, card or transfer against an invoice, including part payments. Paid, partly paid and unpaid follow from the arithmetic; nobody sets a flag.

An invoice with its lines, VAT, total, a recorded part payment and the outstanding balance

Stock that goes down when the part goes on

Every change is a movement with a reason and the balance it left behind — received, consumed on a job card, or corrected after a stocktake. Nothing is silently overwritten, so a count that looks wrong can be traced to the line that made it wrong. It will not go negative.

The parts list with stock on hand, reorder levels and low-stock flags

Your customer

Two pages that answer the phone for you

A link they can follow

Every job card carries a private link. Send it once and the customer can see where their car is, approve the quote and download their invoice — without an account. It never shows your internal notes or the staff event log, and one car's link cannot reach another car's paperwork.

There is a public booking page too: name, phone, registration, what is wrong and a time. Requests arrive for you to confirm or decline, and nothing takes a bay until you say so.

The tracking page a car owner sees: the stage their car is at and what they reported

Everything in the box

Nothing here is held back for a paid add-on.

Job cards

Complaint, diagnosis, mileage, technician, promised time, and a full history of every status change with the note that explains it.

Customers and vehicles

Plate, VIN, mileage and a service history that belongs to the car rather than to whoever happens to be driving it.

Quotes and invoices

Numbered in their own sequences with your prefixes, and rendered to PDF in pure PHP on your own server.

Payments and books

Part payments tracked to the penny, plus a simple income and expense book that invoice payments flow into on their own.

Parts and stock

SKUs, suppliers, cost and sale prices, reorder levels, low-stock flags and a movement history behind every number.

Schedule by bay

The day laid out per service bay, with double-booking refused when it is made rather than discovered on the ramp.

Reports

Invoiced, collected, spent, outstanding, jobs finished and average job value over any range — plus technicians, top jobs and parts used.

Customer emails

Six templates in your own wording with placeholders for the customer, the vehicle and the link. Each one can be switched off.

Many workshops, one install

Every record belongs to one workshop, enforced on every query rather than remembered by each screen. Run one shop or a group.

API and webhooks

A read-only JSON API with keys you can revoke, and signed outbound webhooks so another system can be told when an invoice is paid.

Your branding

Your legal name, address, tax number, currency, tax label and logo on every quote and invoice.

Guided installer

Checks the server before it asks for anything, and names each unmet requirement with what to do about it.

Four roles, enforced on the server

Not a permission matrix you have to configure before anyone can work. Every one of these is a check in the application, not a hidden menu item.

OwnerService advisorTechnicianAccountant
See job cardsYesYesYesYes
Edit job cardsYesYesStatus and diagnosisNo
See prices and totalsYesYesNeverYes
Quotes and invoicesYesYesNoSee and take payment
Books and reportsYesYesNoYes
Settings and staffYesNoNoNo

The technician account is worth using properly: it is the only role never shown a price, which makes it the right login for a tablet left out in the workshop.

Installing it

Built for the hosting you already have

Ongoing third-party costs: none are required.

No paid API key, no subscription, no external service. PDFs, the customer portal, the booking page and the reports are all generated on your own server. The two things you pay for are the two you would be paying for anyway: your hosting, and your own mailbox if you want Wrenchly to email customers.

  • No Node, no Composer, no shell. Compiled assets ship in the package and the dependencies come with it. Upload the files and open the site.
  • PDFs in pure PHP. No wkhtmltopdf and no headless Chrome — the usual reason this kind of application will not run on cPanel hosting.
  • Installs in a subdirectory. Put it at /app beside your existing site. This demo runs that way, so you are looking at the proof.
  • Nothing written until it works. Database details are tested before they are saved, so a typo cannot lock you out of your own setup.
  • Updates apply themselves. Upload a new release and load the site; pending migrations run once, on their own. No shell needed.
  • No licence phone-home. Nothing calls a server that might be down when you need to sign in.

Requirements

Server
PHP 8.3 or newer (8.4 recommended), MySQL 8 or MariaDB 10.6, Apache or nginx
Extensions
mbstring, openssl, pdo_mysql, fileinfo, gd, zip, ctype, json
Memory
128 MB, or 256 MB for very long invoices
Not needed
Node.js, Composer, shell access, Redis, cron, a queue worker
Built with
Laravel 13, Inertia, Vue 3, Tailwind CSS 4
Included
Full source, compiled assets, offline documentation, 242 tests

What it does not do

Said here rather than discovered after you have bought it.

  • It does not take card payments. You record money that has arrived; there is no Stripe or PayPal integration.
  • No SMS or WhatsApp. Customer notifications are email only.
  • No ready-made accounting connector. The JSON API is there so one can be built, but there is no Xero or QuickBooks integration.
  • English only. There is no translation layer in this version.
  • No mobile app. The interface works in a phone browser, which is not the same thing.
  • The API is read-only. Records can be read out, not created.

Take it for a drive.

A real workshop with eight months behind it — 78 job cards, 67 invoices, real payments and outstanding balances. Change anything you like; it resets overnight.

Ownerowner@wrenchly.demoSees everything
Service advisoradvisor@wrenchly.demoRuns the front desk
Techniciantechnician@wrenchly.demoNever shown a price
Accountantaccountant@wrenchly.demoThe books, not the cards
Passworddemo1234The same for all four
Open the same job card as the owner and then as the technician — that is the fastest way to see the roles are real.