ClaimReady
Overview
ClaimReady is a web app which helps home owners inventory their belongings specifically for insurance purposes. It spawned out of a need I found I had, so I decided to build it. It's a solo project, built entirely client-side with NuxtJS. How we got here, though, is a story... read on!
Challenges
One of the main challenges with this project was not actually technical, but psychological. My initial approach was to have users take photos with their phones, these photos would get uploaded to an S3 bucket, a signal would be sent to the web app over a websocket, and the app would update itself. I had a prototype of this working and everything was peachy, but then realized people may not want to upload photos of their private belongings to some random website on the internet. Even though we were deleting all images after the PDF was successfully generated, that wasn't good enough.
After this realization, I had to change the app flow. Users would just take pictures of their stuff, then sit down at the app and upload all images as they were adding the items. It was a bit more manual, but it allowed me to go fully client-side.
Another bit of trouble I ran into was the payment process. Since the app was fully client-side, I had to ensure users wouldn't be able to just skip the payment process and get the generated PDF for free. While no client-only solution is fully unhackable, after applying some hashing and obfuscation, I think I arrived at a pretty good end result.
Choices & Tradeoffs
Initially, when the app was server side, I actually had a .NET backend hosted on Railway and a volume with S3 bindings enabled to storage images. In that design, Nuxt acted just as the front-end and the .NET app as the worker. I also had setup Resend to e-mail the PDF to the customer.
Then it all changed when the Fire Nation att... I mean, when the app flow changed to client-only, I went all in on Nuxt/Vue. I leveraged IndexedDB to store the JSON structure of the inventory as well as compressed images in base64 format.
PDF generation also happened on the client. The tradeoff here was that JavaScript libraries are not as good as .NET ones for PDF generation, but I wasn't creating a masterpiece, just something passable with pictures of people's stuff. I had to dumb down the design a bit, but mitigated that with a shift to "minimalist" design using shades of gray.
For payment, I reached for Stripe initially... but ultimately went with Polar.sh. I was okay with the slightly higher fees as long as taxes were taken care of. Who wants to deal with the tax man anyway...?
Considerations
The main lesson from this project was to do thorough market research before jumping into implementation. Since the idea was spawned from my own need, I figured I'd have no problem uploading images to a webserver... because it's my webserver. A mistake.
An other lesson I learned was that shipping an app is a lot easier than getting users to use it and pay for it. The marketing part is something I'm still working on to this day. If you need to inventory your home, go ahead and visit ClaimReady and start inventorying today!