Started with a single HTML form for a friend. Ended up building a SaaS.
A contractor friend of mine was tired of handwriting estimates for his customers and wanted help building a simple form he could print out with pre-filled company details, the line items, and a total.
Built a single HTML form that allowed him to save company info and logo that was stored in IndexedDB. This worked great until he asked about using his tablet or phone sometimes instead of his computer, then it all fell apart without some way to sync.
Rebuilt it as an offline-first PWA still using IndexedDB for local storage but with a sync engine to push changes when he's online with built in conflict resolution. The backend is all hosted on the Cloudflare free tier Pages/Worker/D1.
Also added a way to download as a PDF instead of just printing directly and a way to send that PDF directly to a customer. This uses jsPDF for client-side generation so the whole process works offline and email send queues until online again.
Privacy was a design decision not a feature. I don't like services where my data is the product and so I built this with that in mind. Client data syncs to D1 and you can export your own data or delete the account which removes everything at any time even after your trial or subscription ends. No usage analytics, no tracking what jobs you're doing or for who. That's not just a statement in the privacy policy it's how the system is built.
Pricing: $7/month or $50/year. Jobber and Housecall Pro start around $50 a month but are a full service suite that my friend and potentially others don't need. EasyBid does one thing, replace the contractor pad to create and send professional estimates and invoices in under 5 minutes.
30-day free trial with no card needed for sign up. https://easybid.app
Happy to talk about the stack, there are some considerations for offline-first sync on Cloudflare D1 that are worth discussing if you are building something similar.