The Trucin planning board: drivers ranked by hours remaining with blocked drivers carrying the regulation that blocks them, vehicles stopped with every refusal reason joined together, and everything falling due inside the planning window
The Trucin planning board: drivers ranked by hours remaining with blocked drivers carrying the regulation that blocks them, vehicles stopped with every refusal reason joined together, and everything falling due inside the planning window
2,825
lines of rule engine
23
collections
12
TypeScript extensions
5
languages

Where the three spreadsheets and the wall planner break

A transport manager who knows the rules keeps them in a hours spreadsheet, a maintenance planner on the wall, a downloads folder and their own head. The rules are being followed; the evidence is scattered.

None of it tells you that a driver is an hour from their fortnightly limit before Monday's allocation, that a vehicle falls due for inspection inside the planning window, or that 2,707 km of mileage cannot be attributed to anybody — the first thing an investigation looks for.

And when DVSA visits, the question is never "do you have a licence". It is "show me you are doing what you undertook to do" — which normally takes three weeks of gathering paperwork.

Trucin encodes those rules instead of describing them.

Drivers' hours, the O-licence and ADR — encoded, not described

This is the part a transport manager checks first, so here it is in specifics rather than adjectives. Every rule below refuses the write, with the article in the refusal message.

Drivers' hours — EC 561/2006

Daily, weekly and fortnightly driving measured over the fixed week and rolling fortnight, not any seven days. Breaks where other work does not reset the clock — only a break or a rest does. Weekly rest within six 24-hour periods: 144 hours, not "six days", and a reduced rest creates a compensation debt with its own deadline. Allocating a run that would breach any of them is refused, and the refusal names which limit binds.

The drivers' hours screen: each driver's daily, weekly and fortnightly position computed live, with the binding limit named per driver
The drivers' hours screen: each driver's daily, weekly and fortnightly position computed live, with the binding limit named per driver

Working time — Directive 2002/15/EC

Distinct from drivers' hours, routinely conflated with it, and both apply at once. The 60-hour absolute week and the 48-hour average — counting driving plus other work, averaged over the weeks that exist rather than diluted by empty ones.

Tachograph downloads — EU 165/2014

Driver card every 28 days, vehicle unit every 90. A download register with the deadlines counting down, and the mileage nobody can account for reported per vehicle — because missing mileage between downloads is what an investigation looks for first.

The tachograph download register: cards and vehicle units by download deadline, with the unaccounted mileage per vehicle
The tachograph download register: cards and vehicle units by download deadline, with the unaccounted mileage per vehicle

The Operator Licence

Vehicles and trailers counted against the authorisation — one more than the licence allows is refused, not warned about. Inspections at the interval this licence declares: a cycle kept at 63 days against a declared 42 is a finding even when no single inspection was late. Records retained 15 months, four laden roller-brake tests as a property of the rolling year, and each undertaking shown with live evidence — quoted in the operator's own words, never paraphrased.

The licence screen: continuation countdown, undertakings at risk, and each undertaking with its evidence counted from the records
The licence screen: continuation countdown, undertakings at risk, and each undertaking with its evidence counted from the records

ADR and axle weights

Transport-category points are computed from the load lines, so the 1.1.3.6 exemption applies itself — nobody ticks their way into or out of ADR in either direction. Driver certificate and vehicle approval are checked at dispatch. Axle weights are checked against the plates, and an overload is recordable — it has to be, in order to be reported.

Five screens, one per person who does the job

Not five views of the same table — five questions, each answered for the person who asks it, with every figure computed through that person's own permissions.

Planning Board

The traffic office: can this vehicle go out today, and if not why. Drivers sorted by how little headroom is left, blocked rows carrying the reason in the words of the regulation.

Licence

The transport manager: is the licence safe. Continuation countdown, undertakings at risk, and the evidence for each counted from the records rather than entered.

Maintenance

The workshop: what has to come in, and what is grounded. Overdue against the declared interval, dangerous defects, and trailers in the same line as the lorries.

Costing

The director: what the work earned. Margin including standing costs — leave them out and general haulage shows a margin it does not have — with the jobs losing money counted, not averaged.

My Work

The driver: how much can I still do, and is anything about to stop me. Driving left today and which limit binds, the walkaround, their own documents — and no rate, cost or anybody else's hours.

The registers

36 saved views across five layouts, opening on the rows somebody is actually looking for: defects on a board, the inspection regime on a calendar, the fleet on a map, dangerous goods as cards.

See all 23 collections

Table names as they exist in the database, grouped by module. Field definitions are not published.

Fleet

  • fuel_purchases
  • plated_axles
  • trailers
  • vehicles
  • vehicles_documents

People

  • drivers

Hours

  • duty_periods
  • infringements
  • tachograph_downloads
  • tachograph_downloads_files

Traffic

  • customers
  • runs
  • runs_documents

Maintenance

  • defects
  • defects_photos
  • safety_inspections
  • safety_inspections_sheets
  • walkaround_checks

ADR

  • dangerous_goods
  • run_dangerous_goods

Licence

  • operating_centres
  • operator_licences
  • operator_licences_documents

Seven roles, and a permission boundary that is verified by attempting it

Seven roles, eight policies, 258 permission rows — and every claim below is an executable assertion that performs the operation as the persona, not a reading of the grant list.

The planning board opened as the workshop: the Vehicles panel filled in completely, an honestly empty Drivers panel, and no figures computed from rows this role cannot read
The planning board opened as the workshop: the Vehicles panel filled in completely, an honestly empty Drivers panel, and no figures computed from rows this role cannot read

A driver sees only their own record

Their own hours, runs, infringements and checks — the endpoint filters on their own id rather than trusting the policy scope to do it. Eleven commercial fields are withheld: a driver never sees what a job paid or what they cost.

It degrades by role instead of breaking

The workshop cannot read duty records, infringements, downloads or runs — so the board says exactly that, shows an honest empty panel, and fills in the Vehicles panel completely. No Forbidden modal, and no figures quietly computed from rows this person cannot see.

Absent is not zero

Every count comes back as zero for a collection you may not read, and zero open infringements looks exactly like a kept promise. So an undertaking whose evidence is unreadable is a third state — "cannot be evidenced here" — not a pass. The same rule this product applies to nil-defect records and unattributable mileage.

The account you hand a DVSA examiner

The auditor reads the whole compliance record, produces the licence report, and cannot write a single row — including its own name, so a temporary login cannot rename itself and outlive the visit. Driver dates of birth, licence numbers and card numbers are withheld: an investigation is about the operator's systems, not a driver's personal details.

Seven roles, each with its own policy

Every role carries its own permission policy. These are the roles as they ship; add or reshape them like any other Directus role.

Administrator
Full access. The person who installs and configures it.
Traffic Planner
The planning board: can this vehicle go out, and if not why.
Transport Manager
Hours, infringements and the licence position — the CPC holder's view.
Workshop
Inspections against the declared interval, brake tests and the defect queue. Of a driver, only the name.
Director
Costing and the licence — read-only on operations. The licence holder has oversight, not operational duty.
Driver
Their own hours, runs and documents, and the things they file themselves. Nothing commercial.
Auditor
The whole compliance record, and cannot write a row of it — including its own name.

Allocation as one lane per vehicle and one column per day

"Can this vehicle take Thursday?" is about one row of one lane, so that is the layout — not a month grid. Each run carries its reference, start time and length. Two runs overlapping on the same vehicle are outlined in red and named on each other. A run with no vehicle allocated gets its own lane at the top, because nothing else on the screen was showing it. An empty cell is spare capacity, which is the other half of planning.

The allocation timeline: one lane per vehicle and one column per day, with an unallocated run in its own lane at the top and a double-booking outlined in red
The allocation timeline: one lane per vehicle and one column per day, with an unallocated run in its own lane at the top and a double-booking outlined in red

Where the fleet is, and why it is shown there

A vehicle is somewhere, so it belongs on a map — and on one that shows what it is. A tractor unit, a rigid and a van are three different silhouettes, colour comes from the vehicle's own status so an off-the-road lorry cannot look like a working one, and vehicles sharing a depot's coordinates are fanned out with a count rather than hidden behind each other. Every marker states why it is where it is: at the operating centre, out on a run, or at the maintenance site. The markers are deliberately schematic, because the positions are derived rather than tracked — a photoreal lorry sliding along a motorway would sell live tracking this product does not have.

The fleet map: truck silhouettes by vehicle type coloured by status, vehicles at the same depot fanned out with a count, and a legend for tractor unit, rigid and van
The fleet map: truck silhouettes by vehicle type coloured by status, vehicles at the same depot fanned out with a count, and a legend for tractor unit, rigid and van

Twelve custom Directus extensions, all TypeScript

This is the part no schema export reproduces — 8,730 lines of TypeScript across ten packages, built with the official Directus extensions SDK, rendered with Directus's own components so it inherits your theming, and gated per role. Four of them are MIT — written by us, for this product. The map and the country fields know nothing about haulage, so we publish them to stand alone rather than keep them behind the licence — each builds outside this repository, to the same bytes, and that is checked rather than asserted. Open source here means we opened our own code, not that somebody else's entered the product.

  • planning-boardModule

    The traffic office board: driver headroom, blocked vehicles with every refusal reason joined together, and everything falling due inside the planning window.

  • licenceModule

    The licence position: continuation countdown, each undertaking with its live evidence, operating centres as a meter of spaces used against spaces authorised.

  • maintenanceModule

    The workshop's week in the order the work has to happen: overdue, due in the horizon, off the road, and the defect queue chained to the checks that raised it.

  • costingModule

    Revenue, margin with standing costs in, jobs losing money counted not averaged, and each vehicle against its own consumption baseline — never the fleet's.

  • my-workModule

    The driver's screen: driving left and which limit binds, the countdown to the next weekly rest, today's walkaround, their own documents by soonest expiry.

  • road-guardHook

    The rule engine — 2,825 lines. Refuses the write that would breach a regulation, with the article in the message.

  • road-apiEndpoint

    Eight routes behind the five screens and the three documents, permission-checked on every call and filtered on the caller's own identity.

  • fleet-mapLayout

    The fleet on a map, honestly: positions derived from the runs and the operating centres, six silhouettes so a 44-tonne artic does not look like a Transit, and vehicles sharing a depot's exact coordinates fanned onto a ring with a count rather than hidden behind one dot. Every marker states why it is where it is. No Leaflet — Web Mercator and image tiles, so no third-party mapping code enters the bundle. directus-extension-fleet-map, MIT.

  • document-buttonInterface

    Generates and downloads the document for that record: the infringement letter, the inspection sheet, the licence position report.

  • iso-selectInterface

    Searchable ISO 3166 country picker: 257 regions and 190 languages resolved through ICU at render time, so the list costs zero translation rows and corrects itself when a country renames. directus-extension-iso, MIT.

  • map-pointInterface

    The read-only half of the map: one vehicle's derived position, on a map that actually pans and zooms. Directus's own map interface is an editor, and setting it readonly leaves a picture you cannot even zoom — while a position computed from the runs is precisely what nobody should be able to drag into the next county. Same MIT package as the layout.

  • iso-nameDisplay

    Renders a stored ISO code as its name in the reader's own language. Ships in directus-extension-iso, the same MIT package as the picker — built by us.

Want to see it running?

Fifteen minutes on a call and we will open the planning board, try to allocate a run to a driver with no hours left, and let you watch it be refused with the article cited.

Correctness in three layers, each with one job

The hook — 2,825 lines

Rules that need context: this duty period overlaps another, the licence authorises 12 and 12 are specified, the cycle exceeds the declared interval. Refuses the write, with the article in the message. Anything that must refuse stays here — a rule that can be outrun is not a rule, so the three notification flows are advisory by design.

Field validation — 27 fields

The shape of one value, shown in the interface as you type. Before this layer existed, the API accepted a service brake efficiency of 150%.

21 CHECK constraints

The floor, held against any writer including a psql session. Not business rules — impossibilities. A duty period that ends before it starts is not a policy question.

Five languages: English, Spanish, French, Italian and German

721 translation keys — 3,605 rows — covering field labels, dropdown values, help text and the five custom screens. The API returns a reason code and the client renders the sentence, so the half of the screen that explains why a vehicle cannot go out is translated too, and the statutory nouns use their own terms: an annual test is a *Hauptuntersuchung*. Copy lives in Directus's own translations table, so a translator can fix a word without a rebuild.

The same screens rendered in German, including the refusal reasons — "keine Wochenruhezeit im gesamten Tätigkeitsnachweis" — and the statutory vocabulary
The same screens rendered in German, including the refusal reasons — "keine Wochenruhezeit im gesamten Tätigkeitsnachweis" — and the statutory vocabulary

The documents you are actually asked for, generated on a button

Three documents, generated from the record with the caller's own permissions: the infringement letter — the undertaking is that infringements are addressed with the driver *in writing*, and this is that writing, with the breach, the article, what was said and two signatures; the safety inspection sheet with the brake figures and the declaration; and the two-page licence position report — authorisation, every undertaking, and its evidence. An action left blank prints as blank, because a form that looks complete and says nothing is how an operator ends up at a public inquiry with their own paperwork against them. No PDF library: a template that pulls one into the container inherits its release cadence and its CVEs, for the sake of three documents made of text, rules and boxes.

An infringement record with the generated letter: the breach, the article it comes from, the record of the discussion and the two signature blocks
An infringement record with the generated letter: the breach, the article it comes from, the record of the discussion and the two signature blocks

Self-hosted, and yours to run permanently

  • Full source, no phone-home, no runtime dependency on us, no per-vehicle, per-seat or annual fee.
  • Run it on your own hardware or your own cloud, on as many instances as you need.
  • Modify anything: the schema, the rule engine, the screens, the branding. You do not need our permission and you do not owe us the changes.
  • A perpetual licence that cannot be revoked or repriced, including after any support window ends.

The one boundary is simple: the software stays inside your organisation. You are buying an unrestricted right to use and change Trucin, not to pass it on. If you are a software house wanting to stand it up for a client, that is a separate arrangement — talk to us and we will license the deployment directly.

What Trucin does not do

You would find all of this in the first hour, so here it is in the first ten minutes.

  • No telematics. No live tracking, no CANbus, no driver-behaviour scoring. Vehicle positions are derived from the runs and the operating centres, and the field says "Derived, not tracked" on the record itself. Point a telematics feed at that one field and the same map becomes live with nothing else changing — tell us what you run and we will quote the integration separately.
  • No route optimisation or scheduling engine. It tells you whether an allocation is lawful; it does not decide the allocation.
  • Not an accounts package. Job costing gives cost, revenue and margin per run. There is no ledger, no VAT return, no invoice.
  • No tachograph file parsing. Downloads are recorded as a register with dates and gaps; a .ddd file is not read.
  • No native mobile app. The driver's screen is responsive web against the same scoped API.
  • Single tenant, by design. One operator, one instance, their data never mixed with anybody else's.
  • Not legal advice. It encodes our careful reading of EC 561/2006, Directive 2002/15/EC and the rest, asserted by 137 automated checks — and your transport manager remains responsible. The code is deliberately legible enough for them to review that reading.
  • One thing is on the roadmap rather than on the screen: the planning board reports driver headroom and vehicle dispatchability side by side, and the per-run "this allocation would fail" flag — already written and tested underneath — is not yet surfaced on the board itself.
  • Directus itself ships under the Business Source License. That is free for most commercial use but has conditions — we would rather raise that now than have you discover it later.

What installation and handover involve

  • The repository at a tagged version: schema snapshot, all 12 extensions with source, seeds, documentation, and the 46-step install sequence — with a checker that proves the documented list still matches the disk.
  • A clean install on your infrastructure, or a walkthrough of you doing it. One Compose command, then the numbered scripts; the live instance is never the source of truth.
  • Fresh secrets. Every development credential is rotated at handover; yours are generated on your side and we never see them.
  • A decision about the demo data — a real fortnight for eleven vehicles and eight drivers, including the things that are wrong on purpose. Keep it while you learn the rules it demonstrates; it is one script to remove.
  • The test suite — 137 checks, most of them about the regulation — and the findings ledger: every defect found while building it and what was done about each. It is the honest map of where the sharp edges were.

The questions we actually get

What is road haulage compliance software?

It is the system a transport operator uses to stay inside the rules their Operator Licence depends on: EU drivers' hours, the Road Transport Working Time Directive, tachograph download intervals, preventive maintenance at the interval declared to the Traffic Commissioner, ADR for dangerous goods, and axle weights. Trucin covers all of that in one database, enforces the rules on write, and can produce the evidence for every one.

Does it enforce EU drivers' hours rules?

Yes, as refusals rather than warnings. Daily, weekly and fortnightly driving limits from EC 561/2006 are measured over the fixed week and rolling fortnight, breaks are tracked knowing that other work does not reset the clock, and weekly rest is checked within six 24-hour periods — 144 hours, not "six days". Allocating a run that would breach any of them is refused with the article in the message.

Can it evidence our operator licence undertakings?

That is the screen the transport manager gets. Each undertaking is shown with live evidence counted from the records — inspections against the declared interval, retention against the 15 months promised, downloads overdue, dangerous defects outstanding — and the licence position report puts it on two pages. Answering that question normally takes weeks of gathering paperwork.

Is the regulatory logic actually right?

It is our careful reading, encoded and tested — 137 automated checks, most of them about the regulation, each asserting the behaviour rather than the wording. Where the rules were subtle we wrote down why: the fixed week versus a rolling seven days, six 24-hour periods versus six days, other work not resetting the break clock. Your transport manager should review it, and the code is legible enough for them to do that.

What happens when the regulations change?

You own the source, and the limits are named constants at the top of one file. A change to a driving limit is a one-line edit and a test run. There is no dependency on us.

Is it hosted, or do we run it ourselves?

You run it. Trucin ships as Docker Compose plus a numbered install sequence, and you hold the full source, so there is no account with us and nothing calls home. That also means the compliance record never leaves your infrastructure.

Does it track our vehicles?

No, and it does not pretend to. Positions on the fleet map are derived from the runs and the operating centres, and the field says "Derived, not tracked" on the record itself. There is one field to point a telematics feed at if you have one — that is ordinary integration work, quoted separately.

What does it cost?

It is a one-time perpetual licence rather than a per-vehicle-per-month subscription, priced against what building the equivalent would cost you. The figure depends on whether you are deploying it for your own fleet or standing it up for a client, so get in touch and we will give you the number for your case.

Can we modify it?

Anything. Change the schema, rewrite the rule engine, rebrand the screens, and keep your modifications entirely private. The single restriction is that the software stays inside your organisation.

Is it available in languages other than English?

Yes — English, Spanish, French, Italian and German, across 721 translation keys. That includes the refusal reasons: the API returns a code and the client renders the sentence, so the explanation of why a vehicle cannot go out is translated too, using the statutory vocabulary of each language.

Tell us about your fleet

We will walk the architecture, you ask the awkward questions, and you decide. If Trucin is not the right fit we will say so.