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
| Name | Customer-facing label | Sort 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
| Name | Rate | Default | Enabled |
|---|
Fees
| Name | Shape | Base | Amount / Rate | Min | Max | Taxable | Auto-apply | Enabled |
|---|
Payment types
| Name | Sort order | Active |
|---|
Labor rates
| Name | Rate/hr | Default | Active |
|---|
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
| Value | Sort order |
|---|
Brands
| Value | Sort order |
|---|
Categories
| Value | Sort 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
| Name | Phone | Notes |
|---|
Vehicles
| Year/Make/Model | VIN | Plate | Associated 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
| Name | Sort 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.
| Name | Category |
|---|
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.
| Age | Job | Requested | Status | Note |
|---|
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.
| Title | Vehicle | Urgency | Value | Status |
|---|
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).
| Type | Title | Archived | By | Reason |
|---|
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).
| Role | Can 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).
| Role | Can promote directly |
|---|
5 Tickets
| # | Customer / Vehicle | Status | Updated |
|---|
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.
| Ticket | Stage | Estimate # | Reference | Pending since | Age | Blocking 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.
| Entity | Field | Current value (stands) | Incoming value (held) | When | Resolve |
|---|
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).
| Part # | Description | Brand | Qty | Reserved | Available | Cost | List | Margin % | 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 |
|---|