SkipOps

Plain English, start here

What SkipOps does — and exactly where we are

SkipOps runs the day for a UK rubbish-clearance firm, entirely through Telegram. The boss texts jobs in plain words. The system works out the smartest route for every van. The crew get tap-by-tap job cards on their phones. The boss watches it happen live and ends up with a photo-proof record of every job. No money or pricing anywhere in version 1 — the win is told in saved fuel, time and wages.

5/6set-up wizard: steps 1–5 built (Hours · Vans · Crew · Yard · Disposal Sites); Checklist next
1route planner: a working core that needs a rework
7stages designed and waiting to be built
built & tested part-built to build

The whole thing on one page

The loop, top to bottom

Five moving parts. Set the firm up once, then the same loop repeats every working day.

flowchart LR
  A["① Set the firm up
(once)"] --> B["② & ③ Boss texts
jobs"] B --> C["④ System plans the
smartest day"] C --> D["⑤–⑦ Crew get job cards
+ post photos"] D --> E["⑥ ⑧ ⑨ Boss watches live +
gets the record"] E -. "new job or change
→ re-plan" .-> C classDef here fill:#eef2ff,stroke:#4f46e5,stroke-width:2px,color:#3730a3; class A here;
We are here — finishing stage ①: Disposal Sites (Step 5) built; Checklist (Step 6) is next.

Every stage — what it's for, and where we are

The 9 stages in detail

Each one: the plain-English objective (what we're trying to achieve), a quick picture, and an honest done / still-to-do.

Set the firm up

manual step wizard · 5 of 6 forms built · Checklist next

The objective: before SkipOps can run anyone's day, it has to learn how that firm works — the five things its features need. The boss fills in a quick 6-step setup wizard (now 5 data steps + a review) — one simple screen per thing (hours, vans, crew, yard address, disposal sites, checklist), tap and type, then Next. No AI, no guessing in setup: each step is a plain form with the right controls. Our own code checks a step is complete before it lets you advance, and the firm is saved at the end.

What we gather from the firm → what it powers: their vans & how much each holds, their crew & hours, the yard address (sets the hub for routing), which materials they handle + where each one goes (powers the smart-route consolidation runs), and the standard job checklist. Every answer feeds a feature — nothing is asked "just in case".
flowchart LR
  subgraph G ["What we gather"]
    V["Vans + capacity"]
    M["Materials + drop sites
per material"] S["Yard address
(the hub)"] C["Crew + hours"] K["Job checklist"] end subgraph P ["What it powers"] R["Smart routes +
full-van trips"] J["Crew job cards"] D["Boss live map"] Pr["Photo-proof
record"] end V --> R M --> R S --> R S --> D C --> J K --> J K --> Pr

Done

  • The data shapes + strict validation — each step's "is it complete?" check, reused as-is by the form wizard (backend, 60 tests, tsc clean)
  • The manual wizard skeleton — all 6 step templates, the "step N of 6" strip, Back/Next, review + save-the-firm step (screenshot-checked at phone size)
  • Retired the AI chat path for setup — the per-section Haiku engine, chat transports + real-Claude wiring all removed; the backend is now just mint-session + validate-and-save
  • Step 1 — Hours: tap-to-toggle day chips + start/finish time pickers; defaults Mon–Fri 08:00–16:00; Next gates on ≥1 day + valid times. Screenshot-checked; headed + manual gate passed.
  • Step 2 — Vans: add-a-van list (name required, reg optional); last row can't be removed (≥1-van floor); Next gates on every row having a name. Screenshot-checked; headed + manual gate passed.
  • Step 3 — Crew: add-a-person list (name required); same floor pattern. Next gates on every person having a name. Screenshot-checked; headed + manual gate passed.
  • Step 4 — Yard: "Do you have a yard?" toggle + single hub address field; depot label auto-derives. Next gates on address being filled.
  • Step 5 — Disposal Sites (Sites + Materials merged into one step): the boss types their waste types (wood, scrap metal, soil…); per material, a set of drop-off sites is discovered and saved. The optimiser then picks the nearest qualifying site per load — no manual routing decisions needed. Unit-proven; live discovery is deploy-gated (see Still to do).

Still to do

  • Step 6 — Checklist: the standard per-job checklist (before photo, after photo, waste loaded, site confirmed…); boss can tweak. Next step to build.
  • Live drop-site discovery: the step runs Google Places (New) Text Search per material + an AI "qualify" pass (does this place actually accept that material?). This is unit-proven but needs three infra wires before it runs live: Places API key IP-allowlisted to the deployed Worker, the Pages site proxying discovery requests to the Worker, and a KV namespace for caching. All three are spend-gated.
  • Go live: deploy + point a real test firm at it (spend-gated)
①·5

Disposal Sites — how it works

built + unit-proven · live discovery deploy-gated

The objective: we gather the firm's waste types and, for each one, a list of drop-off sites that actually accept it. This is the data that lets the optimiser plan the most efficient round: when a van fills up with scrap metal, it knows exactly which nearby scrapyard to head to — rather than the boss guessing or hard-coding one tip for everything.

What we gather → what it powers: yard address (geocoded once, used as the search centre) + per-material drop sites → the optimiser picks the nearest qualifying site per load → smart consolidation runs → less miles, fewer wasted trips.
flowchart LR
  A["Yard address
geocoded"] --> B["Search nearby
per material"] B --> C["AI qualify pass
(does it accept
this material?)"] C --> D["Boss sees the
list · add/delete"] D --> E["Saved as
material → drop-sites"] E --> F["Optimiser picks
nearest site per load"]

Done

  • Yard address → geocode → MapLibre map (keyless OSM tiles) with a marker
  • Material dropdown + per-material drop-site list (add/delete); "Stays at the yard" counts as a valid site
  • Gap-flag: any material with no sites highlighted; no-gaps gate — Next locked until every material has ≥1 site
  • AI qualify pass (Sonnet): given a Place, decides which materials it accepts — proven against real Claude
  • Data saves in the draft → final config at wizard completion (materials[].drop_sites)
  • Review screen shows each material's disposal sites

Still to do (deploy-gated)

  • Places API key IP-allowlisted to the deployed Worker (currently IP-locked, so local dev can't call it)
  • Cloudflare Pages → Worker proxy route for discovery calls (Pages can't hold the secret key)
  • KV namespace wired up for discovery caching (avoids re-querying Places on every wizard open)
  • ANTHROPIC_API_KEY set on the deployed Worker (needed for the Sonnet qualify pass in production)

Give the firm its two chats

to build

The objective: every firm gets two Telegram chats — a private one for the boss (the "Gaffer" chat) and a group for the crew (the "Dispatch" group). And a hard wall so one firm can never see another firm's jobs.

flowchart LR
  A["Firm set up"] --> B["Gaffer chat
(boss only)"] A --> C["Dispatch group
(the crew)"] B --> D["Each firm's data
walled off"] C --> D

Done

  • Nothing yet — the design is set

Still to do

  • Wire up the two bots + lock each to its firm
  • Switch on the data walls (security rules) before any real firm's data lands

Boss drops a job

to build

The objective: the boss texts a job the way he'd say it out loud — "clear a garage on Dyke Road tomorrow morning, half a load, before-and-after pics." The system turns that into a proper job (where, how big, when, what photos) and reads it back so any misread is caught on the spot.

flowchart LR
  A["Boss texts it
in plain words"] --> B["System understands:
where, size, when"] B --> C["Job created"] C --> D["Reads it back
to confirm"]

Done

  • Skeleton only

Still to do

  • The "understand the text" step, save the job, and the read-back

Plan the smartest day

core built · rework owed

The objective: given the day's jobs, work out the most efficient round for every van — fewest miles, fullest loads — including nipping back to the yard to empty when a van fills up, then carrying on. This saving (fuel, time, wages) is the whole pitch.

flowchart LR
  A["The day's jobs"] --> C["The planner"]
  B["The vans + capacity"] --> C
  C --> D["Most-efficient
route per van"] D -. "van full →" .-> E["empty at the yard,
then carry on"] E -.-> D

Done

  • The core planner works and is tested (routes, time windows, empty-and-continue)

Still to do

  • It currently plans around cost (money) — rework it to plan around distance + load (no money in v1)
  • Wire in the yard-hub + the per-waste-type consolidation trips

Tell each crew their route

to build

The objective: once the day's planned, each van gets one clear, friendly message — their stops in order, what to expect, and a tap-to-navigate link for each stop that opens their own phone's maps. Nothing new to learn.

flowchart LR
  A["The day's plan"] --> B["Friendly message
per van"] B --> C["Stops in order"] B --> D["Tap-to-navigate
per stop"]

Done

  • Skeleton only

Still to do

  • Turn the cold route into a readable message + the per-stop map links

See where the vans are

to build

The objective: each driver taps "share live location" in Telegram once at the start of the day. That's it — the system now knows where every van is, with no app and no tracking box to fit.

flowchart LR
  A["Driver taps
'share location'"] --> B["System knows
where each van is"] B --> C["Feeds the
boss's live map"]

Done

  • Nothing to build on Telegram's side — by design

Still to do

  • Store the shared location + a morning "share it again" nudge

Photo-proof every job

to build

The objective: the crew snap a before and an after photo and tick the job checklist. The system files them against the job, so there's a permanent, proof-backed record of every clearance — plus a note of exactly who was on that team that day.

flowchart LR
  A["Crew: before +
after photos"] --> C["Filed against
the job"] B["Checklist ticked"] --> C C --> D["Permanent
proof record"]

Done

  • Skeleton only

Still to do

  • Photo capture + storage, checklist tick, the crew snapshot on finish

Re-plan when things change

planner ready · trigger left

The objective: jobs change all day — a new one comes in, one's cancelled, a van finishes early. When that happens the system quietly re-plans the rest of the day and re-sends the routes, without anyone asking.

flowchart LR
  A["New / cancelled job,
or van free early"] --> B["Re-plan the
rest of the day"] B --> C["Re-send the
updated routes"]

Done

  • The planner can already re-plan on demand

Still to do

  • The automatic trigger that fires it the moment something changes

The boss's live dashboard

to build

The objective: one screen for the boss — a live map of his vans and jobs, a list he can filter, and a tap into any job to see its photos, crew, checklist and timings. His whole operation at a glance.

flowchart LR
  A["Live van pins"] --> C["Boss dashboard"]
  B["All the jobs"] --> C
  C --> D["Tap a job → photos,
crew, checklist, times"]

Done

  • Folder is a placeholder

Still to do

  • All of it — the map, the list, the job detail

Staying on track

What's next, in order

Finish the wizard, wire the live discovery, then build the daily loop in the order the day actually runs.

1
Step 6 — Checklist (the last wizard form) next
Stage ① — Steps 1–5 done (Hours · Vans · Crew · Yard · Disposal Sites). Step 6 is the standard per-job checklist: before photo, after photo, waste loaded, site confirmed… The boss can tweak the list. Same spine as the other steps.
2
Wire live drop-site discovery (deploy-gated spend)
Stage ① — the Disposal Sites step is unit-proven but needs three prod wires before live search runs: Places API key IP-allowlisted to the Worker · Pages→Worker proxy route · KV namespace for caching. Also needs ANTHROPIC_API_KEY on the deployed Worker for the Sonnet qualify pass. All four are spend-gated — needs Alex's sign-off.
3
Rework the route planner's goal
Stage ④ — switch it from "cheapest" to "fewest miles + fullest loads", and wire in the yard-hub + per-material consolidation trips. The hard maths already works.
4
Build the daily loop
Stages ②③⑤⑥⑦ — the two chats, dropping a job, sending routes, live location, and photo-proof. This is the bulk of the remaining build.
5
Auto re-plan + the boss dashboard
Stages ⑧⑨ — fire the re-plan on any change, and give the boss his live oversight screen.

Mission: 20 paying firms at £75/mo by 5 Nov 2026. Roughly the first stretch is finishing the build; the rest is selling it.