← Back to blog

Building BonaFideReady: A Project for Organizing Immigration Evidence

reactnodejsfull stackproduct developmentcase study

While talking with friends preparing immigration applications, I noticed a common technical challenge: organizing relationship evidence. The process often involved manually arranging hundreds of photos in a Word document, which was time-consuming and prone to formatting errors. As a developer, I saw an opportunity to build a more streamlined solution.

I decided to build a dedicated web application to tackle this specific problem. I called it BonaFideReady.

What It Does

BonaFideReady is a web app designed to turn a collection of photos into a professional PDF for immigration packets. The workflow is focused on efficiency:

  1. Bulk Upload: Users can upload all their photos in one go, including HEIC files.
  2. Organize & Describe: Metadata like dates, locations, and descriptions can be added to each photo. The order can be easily adjusted.
  3. Curate: Users can easily include or exclude photos to build a clear, logical timeline.
  4. Export: The final output is a clean PDF with a summary table and neatly formatted photo pages.

Guiding Principles

From the start, I focused on two main goals for the project:

  1. A Clean Final Document: The primary output had to be a professional, well-structured PDF that would be clear and easy to review. This meant thinking about layout, readability, and file size.
  2. Easy Usability: The application itself needed to be intuitive. Organizing dozens of photos and their metadata can be overwhelming, so the UI had to be as simple and responsive as possible.

Technical Deep Dive: The PDF Generation Journey

The most interesting technical challenge was generating the PDF. My process evolved significantly:

My first attempt was basic: render everything in the browser and use Chrome’s “Print to PDF” feature. It technically worked, but the resulting PDF was a massive 100MB file. Later I was able to compress it to ~5MB. Anyways, it was impractical for any real use case as different clients would have a different final product.

This clearly wasn’t a scalable solution, so I moved the PDF generation to a Node.js backend using the pdf-lib library. This gave me much more control.

Initially, I was using the sharp library just to handle image format conversions, like from HEIC to JPEG, and was still struggling with large PDF file sizes. The ‘aha!’ moment wasn’t just realizing Sharp could compress images, but discovering the most effective way to use it. Instead of a separate, upfront compression step, I modified the PDF generation process. Now, right before an image is embedded, the PDF generator requests a freshly optimized version from the image processor. This on-the-fly approach ensures each image is perfectly sized and compressed in the moment it’s needed, which is what ultimately brought the file size down by over 95%.

UI/UX Decisions

To support the goal of “Easy Usability,” I made a few key UI decisions. To make the interface feel responsive and reduce cognitive load, I implemented auto-saving for actions like reordering photos or toggling their inclusion. This avoids the need for a manual ‘save’ button and makes the workflow feel smoother.

I also added filters to switch between “pending” photos and those that are “ready” for export. This helps users focus on smaller, manageable chunks of work instead of trying to manage all photos at once.

Conclusion

This project was a rewarding experience in tackling a real-world problem with a focused software solution. There’s a lot of satisfaction in taking a process from frustrating to streamlined. The app is currently free to use while in its initial release.

If you’d like to check it out, you can find it at bonafideready.com.