Fabric Workz R & L Building Contractors

Inspection and works software for building fabric

Priced when reported

A reported defect is priced from your own charged history, at the moment it is reported — no AI guess, no review step.

Written by a disrepair and damp surveyor with 25 years on the tools, for the record a disrepair file actually needs. It runs on your machine.

Ask for the demo Licensed per organisation — ask
Demo data Pentland Walk Kestrel Lodge Ashcombe Rise Elverton Row Cardross Place Netherby Walk 500 m

In flight Query raised Complete Flagged

Drawn on the machine from bundled OS OpenMap Local and OS Open Greenspace. Contains Ordnance Survey data © Crown copyright and database right 2026, Open Government Licence v3.0. Streets and jobs invented for the demonstration.


Read this second, not last

A new instance starts empty and prices nothing until you load your own rate card or schedule of rates. And nobody else has used it yet — no pilot has run.

Measured on an empty data root on 3 September 2026, coverage reads 0 of 64 defect types. On the author's own install — 25 years of charged history behind it — 11 of 64 price from his price book, and the other 53 carry no repair price. Measured, that 53 splits: 37 come back classified, scoped and named with no figure at all, and 16 carry only a priced attendance — the survey visit or the measure — with the repair itself listed under Not established. Load your own schedule and those numbers are yours, not his: the product measures them and shows you the figure rather than claiming one.

Nothing ships with a rate in it. The M3NHF Schedule of Rates is licensed content — M3 Housing's own FAQ says a contractor cannot buy the modules directly, they must come from the authorised subscriber. So the product carries none of it. You load your copy; it stays on your machine.

You would be the first customer, which means the roadmap is yours. A buyer finds all of this in two minutes anyway. Saying it first, at full volume, is the only thing that makes the rest of the page believable.

Checked 3 Sep 2026 in remedial.py (coverage(), and the docstring that pins the count), ratebook.py (“A fresh install starts EMPTY”), SCHEDULE-OF-RATES.md.

What is actually being sold

Others reach a code, or an AI draft somebody still has to approve. This reaches the figure.

Be clear about what the field already does, because a salesman will show you. Rivals route a report to the right schedule code at the moment it arrives, and at least one turns a request into an AI-drafted quote automatically. Four clauses separate this, and all four have to hold at once: the actual figure, from your own charged history, with no AI inference and no approval step, at the moment it is reported. Drop any one and somebody matches it.

This is the join. A defect reported on a property link is classified against a library of 64 defect types, joined to a line in your schedule of rates, and written onto the job record with the figure on it. Every line names the schedule code it came from and the contract percentage applied to it.

And where there is no line, it says so. A defect with no rate behind it comes back classified, scoped and named — under Not established — with no figure at all. Nothing here estimates. Nothing here queues for approval.

Checked in remedial.py, schedule.py (map_defect, lines_for), record.py — a line with no named source does not build.

Six things, in the words a surveyor would use

What it actually does

One record, and the figures cannot drift

Survey, priced schedule and completion sit in one costed record, and every document is generated from it — so the schedule, the works order and the paste-sheet cannot disagree by a rounding. The build reads its own documents back and stops if a table does not tie to the record.

Checked in record.py, artefacts.py, checks.py — which exists because a £100 provisional sum once went missing off a paste-sheet, and now cannot.

Priced off your own schedule of rates

Load your schedule from Excel or CSV — it reads by column heading and counts every skipped row with the reason. Map your defect types to your own lines once, and from then on the report prices itself. Every figure states the base rate and the contract adjustment applied to it.

Checked in schedule.pyload_file, detect_columns, parse_rows, map_defect.

The clock, counted the way the regulations count it

A report is stamped to the second with its timezone; an attendance is stamped the same way; and the working days between them are counted by the statutory definition — Saturdays, Sundays, Christmas Day, Good Friday and bank holidays out. A naive timestamp with no zone is refused, because 00:40 on a Saturday in London is still the Friday in UTC, and a legal period counts from a day.

Checked in clock.py — the 2025 Regulations quoted at reg 2 verbatim, not paraphrased.

A map that works in a stairwell

The map is drawn on the machine from bundled Ordnance Survey open data — OS OpenMap Local and OS Open Greenspace, under the Open Government Licence v3.0 — decoded once into typed arrays. No tile is ever fetched from anywhere. Jobs are pinned on it. It works in a basement, a void, or a lift lobby with no signal. The map at the top of this page is that render, from that data.

Checked in shell/ground.json — 981,869 bytes, its own header naming the source and the licence — and the one local fetch that reads it.

Site conditions kept as evidence

The conditions on the day go on the job record as a validated field: date, conditions, temperature, note. A free-typed date or a mistyped condition refuses to land, exactly as a bad status does — because rain at the inspection is evidence in a disrepair file, and evidence has to mean something. Live weather is a separate, fenced, optional thing; see below.

Checked in record.pyWEATHER_KEYS, WEATHER_CONDITIONS.

A timer that is checked, not believed

Start and stop on site. Then the run is set against what the filing already evidences about that day — a photograph timed 08:12 proves you were there at 08:12, so a timer claiming to cover that day must have been running at 08:12. If they agree, they agree. If they disagree, both figures go on the screen and you choose. Nothing is averaged and nothing is silently preferred.

Checked in timer.py — four verdicts: agree, disagree, alone, evidence_only.

And one more, for the demonstration: the assistant that turns a report into a priced repair speaks — a local voice, on the machine, ranked to the best one your operating system has. There is no microphone: no speech recognition, no getUserMedia, no recorder anywhere in the file, and a test pins that refusal so a later hand cannot quietly add listening. A cloud voice is refused even when the browser offers one.

The claim a competitor cannot match

Of 26 vendors read, every “offline” claim covers jobs, forms, invoices or photographs. Not one claims the map.

That is a market reading taken on 26 August 2026, not a claim about anyone's code. What is a claim about code is the other half: the ground under the map at the top of this page is a file on the machine. In the product you pan it, pinch it and zoom it with the network taken away, and it keeps drawing — there is no tile server, no API key and no request to make. The map above is a still render of that same ground; the demonstration is the one you can move.

Which is why the rest of this page can say what it says about your data. A product that has to phone a map host cannot honestly tell you nothing leaves the building.

0 of 64

Day one, empty instance

Defect types a brand-new instance prices before you load a schedule. On the author's own install it is 11. Both figures are measured, and the product prints its own.

10

Working days, counted

The standard investigation period the clock counts from the day after the landlord became aware — Saturdays, Sundays and bank holidays out, per reg 2.

981,869

Bytes of ground, on the machine

The bundled OS open-data extract the map draws from. Carried, not fetched. It is the whole reason the map survives a basement.

299/877

Photographs still carrying GPS

A scan of one working jobs folder, before stripping: 216 of 794 JPEGs, and every one of the 83 phone originals. A resave does not reliably drop location. That is why the stripper proves it stripped on the bytes actually written.

The clock, on one job

Demo data
Property
14 Ashcombe Rise, TQ1 9ZZ
Reported
2026-08-14T16:52:07+01:00
Attended
2026-08-21T09:05:44+01:00
Elapsed
5 working days
Remedial
Not established — no rate loaded

This produces the record the law requires you to keep. It does not and cannot make anyone compliant: whether the duty applies, and whether what was done discharged it, is between the duty-holder and the law. Every screen built from that module carries this note.

Where your data goes

It stays on your machine. We never receive it, so we can never lose it.

There is no cloud account of ours, no licence server, no activation, no telemetry, no seat counter and no login to anyone else's system. Your instance starts empty: no records of ours come with it. We licence the software, never the data.

Location metadata is stripped from photographs, and proved stripped on the bytes that were actually written — not assumed from a resave. Nothing is stripped in place: the original is never overwritten, and on an inbound upload the file exists only in memory and is destroyed.

Before anything ships, a gate reads every file it would send and refuses on a real client name, a real address, a real job reference or a real telephone number.

Four routes off the machine. All four named.

Counted on 3 September 2026 by listing every absolute address in every file that ships — not only the interface and the server. Two are switches that ship off. One is a link a person taps. The fourth is a command-line tool in the package that does nothing without a key, and it is the one most vendors would not tell you about.

  • 01

    Live weather

    Switch · ships off

    Switched on knowingly, it asks MET Norway for a forecast at a point rounded to about a kilometre, and one header — a User-Agent carrying the product, your trading name and your contact email, because MET Norway requires a caller to identify itself. Never a property address. Never a record. Never a resident. Left off, it makes no request at all. Every switch and every fetch is written to the access log.

  • 02

    Drafting into its own Gmail

    Switch · ships off

    A link that lets the machine draft into the mailbox it already owns. Off is the shipped state. Turning it on is a deliberate act and is logged.

  • 03

    The Directions link

    A tap · not a switch

    Next to a job there is a Directions button. Tapping it opens Apple Maps or Google Maps and hands that property's full address to whichever one your device uses. Nothing is fetched until the moment you tap it, and the destination is not told where the tap came from — but it is a real third route out, it is not behind a switch, and rounding does not apply to it. If your policy forbids that, it is a link in one file and it can be removed before you take delivery.

  • 04

    The staging tool

    Command line · needs a key you supply

    One module in the package turns a photograph of an empty room into a furnished visual, and the model that does it is not on your machine — the photograph is posted to a hosted image provider. It is not reachable from the application: there is no button, no endpoint, and nothing in the interface reaches it. It runs only when somebody types the command, and only when a provider key has been put in a file that never ships and is refused by the release gate. With no key it prints what it would need and stops. We name it because it ships in the source, and a buyer reading the source would find it.

Checked 3 Sep 2026 in serve.py, mailgate.py, photos.py, portal.py, stage.py, deploy.py. In the interface file the only absolute addresses are the local machine and those two map hosts; the weather host is in the server, and the image provider is in the command-line tool above. Nothing else in the shipped manifest opens a socket.

Said in one place, with no defence attached

What it does not have

  • No certification of any kind. Not one security or information-management scheme has been applied for, assessed or awarded. We would rather tell you now than have you find it in procurement.
  • No independent security test. Nobody outside has audited it.
  • No live link to your accounts or housing-management system — deliberately. Nothing polls, syncs or authenticates against another system: the four routes named above are the whole outbound surface. It exports; your system imports, with the job reference carried through.
  • No migration tool from whatever you run today.
  • One developer. No second pair of hands, and no out-of-hours cover. If that is a procurement blocker, say so early and we will talk about source escrow rather than wait for you to ask.
  • No customers. One firm's own jobs have run on it. That is the whole record. Nothing is deployed anywhere yet.

Who it is for, and who it is not

Two readers, named.

The repairs, asset or disrepair manager at a housing provider

An association, an ALMO or a council, with a damp-and-mould clock running and a timeline that has to stand up when somebody asks for it.

The principal of a disrepair surveying practice

For whom the same record is the schedule: defect, evidenced attendance, recorded conditions, priced remedial, each line traceable to its rate and its source.

It is not for a lettings director. It is not a portal, a CRM, an accounts package or a marketplace. It is a survey-to-price engine with a job record around it, and it is honest about that.

How it is bought

Bought once. Not rented.

A one-off licence for the software, plus an annual support-and-updates fee.

The upkeep buys updates and support. It never buys the right to use what you already paid for. Stop paying, and it keeps working exactly as it did the day you bought it.

It runs on your infrastructure, holding your data, under your roof. No per-user metering. No monthly bill. Ownership is warranted, and source escrow is offered rather than waited for.

Licensed per organisation — ask.

The ask

Ask for the demonstration.

It is one file. It opens in a browser — no install, no login, no account, and not one record of anyone's on it: invented addresses on invented streets, invented rates, every reference marked DEMO. Ten minutes.

Then reply, and we load one of your blocks together. You see it priced by the end of the meeting.

Tell us how your work arrives, who dispatches it, who quotes it, and what you have to prove to a landlord at the end. That is the whole question.

Ask for the demo

rogerwilding3@gmail.com

One email address. Nothing else. No form, no mailing list, no newsletter.

Roger sends the demonstration by hand. The software is never hosted on this site, and never will be — putting it on a public address would contradict the only thing worth saying about it.