1x FAX

Backstory

Every now and then, friends or relatives asked me to send a fax. I never owned a fax machine, but my trusty FRITZ!Box router had the capability. I’d scan documents, upload them via the router’s UI, and send them off. One day, I wondered why there wasn’t a simple, pay-as-you-go online fax service – especially in Germany, where faxes are still relevant in 2024. To my surprise, the domains einmalfax.de and einmal-fax.de were available, so I registered them – and forgot about it.

Months later, on a stormy November day, I updated my Brother printer’s firmware, only to find it no longer accepted non-OEM toner. Frustrated and feeling trapped, I reflected on how printing (and faxing) remain unavoidable necessities in Germany. This reignited my fax idea, and I decided it was time to take action.

Using Cursor and Next.js to build a full application

Admittedly, I wasn’t particularly excited about faxes. I was more excited because I had a simple application to finally try out building something solely using AI. Uploading, paying, and sending were three relatively small feature blocks and I had a good idea how I would solve it on my own, so why not give Cursor a test run?

I used a simple cycle to flesh out individual features:

  • Write a simple requirements document
  • Ask Cursor to review the file and ask any questions
  • Answer the questions and ask Cursor to update the requirements accordingly
  • Ask Cursor to start implementing

I used Cursor’s Composer window to progress. Here’s the order of requirements I (we?) created throughout a couple of days:

  • A landing page (I had previously asked ChatGPT to generate some marketing copy for the idea, so I fed this in as a starting point)
  • Phone number and email address entry screen (which kicks off the process)
  • Fax upload with preview
  • Docker compose deployment (now I had to do some manual work to get the deployment running on my host)
  • Changing of the number or email (allowing the user to return to the previous screen in case of mistakes)
  • Confirmation and payment with Lemonsqueezy (I wanted to use a merchant of record payment provider but later learned they’re charging in USD, so I reverted that)
  • Sending files to Phaxio
  • Stripe payments
  • Entering invoice details and showing a printable invoice (I wanted to avoid additional complexity for generating PDFs, but looking back at the experience, I believe it wouldn’t have been an issue at all)
  • Legal documents for the homepage
  • Backend migration (Cursor had placed all Supabase client calls straight into the client-facing code, I wanted to move this behind my own API)
  • Preview of existing files (I allowed changing sender/notification/invoice details before submit but forgot to allow amending an upload)
  • Email notification

The process and the results pretty were pretty much what I had expected after prior experience with other tools like ChatGPT: it works most of the time, it also gets distracted easily, and it still needs deep programming and software engineering knowledge to make sense of the process, assess the results, and guide it properly. You simply can’t loose track of what the AI does, otherwise you won’t be able to progress with or without, and you still have to intervene – a lot. Sometimes my blood pressure rose just from reminding Cursor (or claude-3.5-sonnet, FWIW) not to change anything unnecessarily.

At some point I felt like the Composer window became very slow, so I did a reset, which I regretted quickly because it felt like I had to re-teach everything we had established in the sessions so far. For the same I reason I also fear it’s not yet (11/2024) usable for larger projects.

However, for a small project like this and taking all the hickups into account I think it was still a boost in productivity. I’d say I was 2-3x faster using Cursor compared to doing everything entirely manually.

Even the icon was generated by AI (DALL-E through ChatGPT), I just took the proposal and drew my own vector art on top of it for a clean version. The only thing where Cursor didn’t have a say in was the illustrations. I chose them from my Envato Elements catalogue.

Outcome

Go check it out: https://einmalfax.de

Keywords Next.js, React, Tailwind CSS, shadcn/ui, Supabase, Stripe, Lemonsqueezy, Phaxio