1 Login

Staff email + password. There is no self-service registration — the first identity is created with the create-staff subcommand (see QUICKSTART.md). Tokens are kept in an in-memory JS variable, never localStorage/cookies — see the comment in app logic below for why that's a deliberate dev-tool choice.

2 Business

3 Shop

3b Shop info

Printed on the estimate/invoice letterhead (gated by the Printing section's "Show shop contact info" setting) and used for the shop's legal identity. Name and time zone are also editable here now.

4 Statuses

One click: Checked in → Diagnosing → Waiting for approval → Waiting for parts → In progress → Ready for pickup → Completed
NameCustomer-facing labelSort order

4b Money settings

Tax rates and fees feed the calculation spine (Scope C §6.2). Type percentages as plain percent (7.25 = 7.25%) -- the console converts for storage.

Tax rates
NameRateDefaultEnabled
Fees
NameShapeBaseAmount / RateMinMaxTaxableAuto-applyEnabled
Payment types
NameSort orderActive
Labor rates
NameRate/hrDefaultActive
Other money settings

Controls whether a newly created "Sublet" line starts taxed or untaxed when its own "No tax?" box isn't touched. An explicit choice on the line itself always wins.

4b Signing terms & conditions

Shown to the customer above the signature canvas, both in-person and on remote signing links. Editing this text only affects FUTURE signatures -- every existing signature keeps a permanent, verbatim copy of the terms shown at the time it was signed.

Shown above the canvas when signing an estimate.

Shown alongside the estimate authorization terms at estimate-signing time.

Shown above the canvas when signing at invoice completion.

4b Numbering settings

Controls how estimate numbers (e.g. E-070041) and permanent invoice numbers are minted for this shop. Editing here only affects documents numbered AFTER the change -- an already-minted estimate_number is never re-rendered.

Starting numbers only affect NEW documents/sequences going forward (Forgejo issue #73) -- a device that has already minted estimates, or a shop that already has invoices numbered above the value you set here, is never rewound backward.

Resolved authority right now: — (live-resolved; distinct from the preference above so a "prefers box, has no box yet" shop doesn't silently surprise you).

4d Printing

Controls what appears on the estimate, invoice, and tech worksheet PDFs (Print/Download buttons on a ticket's detail panel).

Tech worksheet

Estimate & invoice

The shop name always prints. When a BAR # is set (Shop info above), it always prints on both the estimate and invoice regardless of this setting -- a legal requirement, not a preference.

Mileage

Mileage in is checked when an estimate advances (sign). Mileage out is checked both when converting to an invoice and when printing/downloading the invoice.

Inventory

Options for the Inventory tab's stock items.

Inventory: vendors, brands & categories

Named lists shop staff can pick from (or type a new one) on an inventory item's Vendor / Brand / Category fields. Archiving a value here just removes it from future suggestions -- items already using it keep their text untouched.

Vendors
ValueSort order
Brands
ValueSort order
Categories
ValueSort order

4e Email service

By default, this shop's estimate/invoice emails send through the platform's own email service. Adding your own service below takes over ALL emailing for this shop -- both from the cloud and from this shop's box, if it has one. Removing it (or unchecking Enabled) falls back to the platform service again.

4c Customers & vehicles

The shop's own customer + vehicle records (Scope 0 §3.3's shop-side v1 slice). Search finds by name/phone/email or label/VIN/plate.

Customers
NamePhoneEmailNotes
Vehicles
Year/Make/ModelVINPlateAssociated customers

4c Referral options

Named referral sources (e.g. "Google," "Word of mouth") offered on the customer detail panel's "Referred by" picker.

Referral options
NameSort order

4d Canned jobs

Reusable job templates ("Oil Change," "Front Brakes"). Each sits over a variant tree scoped by vehicle make/model/year -- expand a canned job to see its variants and their template lines.

NameCategory

Promotion requests

Writers without promote permission land their template-change proposals here. Approving applies the promotion (as your act); rejecting leaves a note the requester sees. Oldest first -- don't let it rot.

AgeJobRequestedStatusNote

4e Recommendations

Declined jobs land here with their dollars retained -- nothing is retyped when the customer comes back. A tech can also add one directly (worn brakes never estimated). Filter by vehicle to see what's outstanding on the car in front of you.

TitleVehicleUrgencyValueStatus

4e Archived items

Who archived what, when, and why -- across customers, vehicles, tickets, canned jobs, and variants. Only visible to a manager+ role (shops.manage).

TypeTitleArchivedByReason

4f Who can unlock invoices

Which roles hold tickets.reopen at this shop -- the capability that unlocks an invoiced ticket back to RO. Only visible to a manager+ role (shops.manage).

RoleCan reopen invoices

4g Who can promote canned-job changes

Which roles hold variants.promote at this shop -- promoting rewrites the canned job every future estimate inherits. Roles without it get "Request promotion" (approval worklist) instead. Only visible to a manager+ role (shops.manage).

RoleCan promote directly

5 Tickets

#Customer / VehicleStatusUpdated

5b Pending numbers 0

Tickets past RO conversion whose permanent invoice number couldn't be minted live (the sequence authority was unreachable). A box sweeps its own shop's pending tickets on every sync cycle and assigns any it's now the authority for, in creation order -- Assign now is the manual retry for a stalled case. Idempotent: a ticket that's already been assigned by the time this runs just returns its current (now-assigned) state unchanged.

TicketStageEstimate #ReferencePending sinceAgeBlocking reason

6 Conflicts 0

Held same-field concurrent edits (§7.2 row 2, §7.3): a value was changed two ways while a box and the cloud were desynced. The cloud's own value stands on the record meanwhile (§7.1) until resolved — pick Keep current, Keep incoming, or enter a third value and resolve. Resolution appends a resolve op that flows through normal sync, so the other side converges to the chosen value too. Note: ticket status races never land here — §7.2 row 4 auto-resolves those by last-writer-by-HLC, and both transitions stay visible in the ticket's activity feed instead.

EntityFieldCurrent value (stands)Incoming value (held)WhenResolve

Inventory

Stock items for this shop. Quantities only ever change through the audited "Adjust quantity" flow (never a plain edit) -- open an item to adjust it and see its adjustment history. Quantities support one decimal place (fluids: 1.5 qts).

Stock value (at cost): —
Part #DescriptionBrandQty Reserved Available CostListMargin %Location Stocked

Reports

Money-class reports need the reports.pnl.view capability (owners and managers have it; technicians don't). A role without it gets the standard error below — dollar figures never leave the server for it.

Open recommendations — declined work kept with its dollars — totaled per vehicle. This is the re-sell worklist: click a row to open its ticket. Dates filter by when the recommendation was created; the default is all time, because the worklist is "what's still sitting out there."

—

Vehicle Customer Open recs Dollars ▼ Newest