
Description
One line A dead-simple, offline-first job tracker for solo tradespeople — create a job, send a quote, get paid. No signup. No cloud. No monthly fee. Your data stays on your phone. The problem The plumber who just fixed your kitchen sink doesn't want a CRM. He wants to finish the job, hand the customer a quote, and get paid before he drives to the next call. Today he's doing it with paper, text messages, and a spreadsheet from 2014. He's tried Jobber. He's tried Housecall Pro. Both wanted him to sit at a laptop, enter data into a 12-field form, and pay $49 per month for features built for a crew of twenty. So he went back to paper. The answer JobSorted is a Progressive Web App that installs from a link in 30 seconds and behaves exactly like a native app. It works with zero signal in a basement, a crawlspace, or a rural service call. It stores everything on the phone itself — no login, no cloud, no data leaving the device unless the user chooses to export it. It's built for one hand, one thumb, and the reality that a plumber's phone is often wet, gloved, or being held at arm's length while he's crouched under a sink. Get Started Today Install JobSorted in 30 seconds. Free. No signup. What it does Add a job in under 15 seconds. Title, customer, amount. Save. Track it through four stages. Open → Quoted → Invoiced → Paid. One tap to advance. Undo always available. Send quotes and invoices by text. Opens the phone's native share sheet — Messages, WhatsApp, Email. The text is pre-formatted with your business name and payment terms. Print as PDF. Clean, professional documents with your logo, business name, and a "From" section that would pass an accountant's review. Record partial payments. A customer pays $200 of a $450 invoice? Log it. Balance updates. When it hits zero, the job flips to Paid automatically. Take photos on the job. Before/after, damage documentation, parts to order — stored safely in IndexedDB, not the fragile localStorage of most PWAs. See who owes you at a glance. The Dashboard shows outstanding balance, quotes waiting for reply, and paid-this-month with a month-over-month trend. Board view. A kanban column layout that lets you scan across Open → Quoted → Invoiced → Paid. Search everything. Jobs, customers, notes. Filter by stage with one tap. Works offline. Always. The service worker caches the entire app. No spinner. No "check your connection." It just works. Dark mode. Because jobs happen at 6 a.m. and 9 p.m. What it doesn't do No user accounts. No signup flow. No password reset emails. No cloud sync. No "your data is safe in our database" promises. No automated SMS. No marketing blasts to customers. No team members. No roles. No permissions. No seat-based pricing. No analytics. No telemetry. No tracking pixels. No CRM features that a solo tradesperson will never use. Everything it doesn't do is deliberate. Every feature removed is a source of friction removed from a user who is standing in a crawlspace wearing gloves. How it works The entire app is four files: The entire application is exceptionally lightweight—totaling around 57 KB across just four core components. This includes a streamlined interface shell with inline styling, the complete application logic, standard installation metadata, and a built-in offline caching strategy. No build step. No webpack, no Vite, no bundler. You edit a file, save, and deploy. No dependencies. No React, no Vue, no Svelte, no framework. Vanilla JavaScript in the browser, doing exactly what it needs to and nothing else. No backend. No server to go down, no API keys to leak, no database to migrate. No npm. The entire toolchain is a text editor and a folder. The data model is honest and simple: Storage What lives there Limit localStorage Jobs, customers, settings (as JSON) ~5 MB IndexedDB Photo blobs 50 MB+ Service worker cache HTML, CSS, JS — for offline ~1 MB The engineering decisions that matter Offline-first, not offline-capable The service worker precaches the entire shell on install. When the user opens the app in a basement, they see the app, not a blank page. Every read is from local storage. Every write is synchronous to the device. There is no "syncing" state and no network dependency for daily use. Optimistic UI everywhere The user taps Save, the job appears instantly. No spinner, no loading state, no "connecting to server." The action is complete the moment the tap happens. Photos in IndexedDB Most PWA tutorials tell you to stuff photos into localStorage as base64. That breaks at 5 MB. JobSorted uses IndexedDB for binary blobs (via a 60-line inline wrapper, no library), which handles hundreds of photos without breaking a sweat. Ed25519 license verification, wired but dormant The app ships with cryptographic infrastructure to verify signed license keys offline. This means paid tiers can be added later without a login system, without a server round-trip, and without changing the offline-first architecture. A single-file migration chain Data stored under jobs-data-v5 carries forward cleanly from v1 through v4. Users never lose their history when the schema evolves. Installation is a first-class flow The onboarding wizard detects iOS vs. Android vs. desktop and shows the exact three taps required to add the app to the home screen. No generic "read the docs" fallback. Why it matters The trades market is enormous and systematically underserved by software. Jobber reached $100M ARR by targeting mid-size teams. Housecall Pro sold for $1.2B, but its pricing starts at $79 per month. ServiceTitan was built for 20-person operations and costs four figures a year. Meanwhile, the solo plumber, the one-van electrician, the handyman who does everything — the people who keep homes running — are still using pen and paper because every tool available was built for someone with a marketing team and an HR department. JobSorted is the smallest, fastest, most honest answer to that gap. It does not try to be a platform. It does not try to become the operating system of a trades business. It does one thing well: keep track of jobs and get the tradesperson paid. Technical stack Layer Choice Framework None. Vanilla JavaScript (ES2020+). Language Modern JavaScript, HTML, CSS. Styling Hand-written CSS with custom properties, dark-mode tokens, and a coherent 8-point spacing system. Storage localStorage for structured data, IndexedDB for binary assets. Offline Hand-rolled service worker with network-first, cache-fallback strategy. Deployment Static hosting. Currently deployed on Netlify. Cryptography WebCrypto API (Ed25519 signatures). Build system None. Performance Cold load (throttled 4G): ~1.5 seconds LCP. Warm load (from cache): ~200 ms. Offline load: ~150 ms. Time to add a job: Under 15 seconds, one-handed, from the app opening. The state of the art JobSorted is not trying to out-engineer Jobber. It's trying to be the app that a plumber actually opens at 7 a.m. before his first call, without sighing. That means: Zero signup friction. Zero ongoing cost. Zero data leaving the device without explicit consent. Zero features that don't directly help someone get paid for work they've already done. The result is a piece of software that costs nothing to run, requires no maintenance, works without a network, respects the user's privacy by default, and does the job it was built for in under 30 seconds. In a market dominated by bloated SaaS platforms, JobSorted is the smallest thing that could possibly work. And that is exactly the point. Ready to Start Install JobSorted in 30 seconds. Free. No signup. iPhone: Open in Safari → Share → Add to Home Screen Android: Open in Chrome → ⋮ → Install app Cost: Free. Forever. No account required. Version 7.0.2 — October 2026 Four files. Zero dependencies. Zero downtime. Zero data loss. Zero cost to run. Get paid. Get sorted. Support JobSorted Keeps the updates coming. @ 2026 Advanced Resource All Rights Reserved