How I Solved an Image Compression Issue in the Open-Tacos Project and Got My PR Merged

Contributing to open-source projects is one of the best ways to learn, grow, and connect with the developer community. Recently, I had the opportunity to work on an interesting issue in the Open-Tacos project — implementing client-side image compression. In this post, I’ll walk you through how I tackled the problem, handled feedback, and finally got my pull request merged. 🙌
The Problem
The issue seemed simple on the surface: compress uploaded images on the client before sending them to the server. This would help optimize upload speeds and reduce bandwidth usage, especially useful for high-res climbing photos.
The Approach
After some research and community discussion, I chose to use compressorjs
— a lightweight library that does exactly what I needed with minimal fuss.
I created a utility function that:
Took a file input from the user
Compressed it based on the desired size/quality
Returned the new compressed file to be used in the upload workflow
The initial code looked like this:
import Compressor from 'compressorjs';
export const compressImage = (file: File): Promise<File> => {
return new Promise((resolve, reject) => {
new Compressor(file, {
quality: 0.6,
maxWidth: 2000,
success(result) {
resolve(result as File);
},
error(err) {
reject(err);
}
});
});
};
Then I integrated this logic into the photo upload flow so that every image would be compressed automatically before upload.
Reviewer Feedback and Revisions
When I raised the PR, the maintainers appreciated the effort, but also had constructive feedback. Here are a few things they asked me to revise:
1. Error Handling Edge Cases
The reviewer reminded that compression must cover an important edge case — like images larger than 30 MB must not be compressed, instead throw an error.
✅ I added specific file size validation logic before initiating compression.
2. Improving File Type Checks
I was initially compressing any file that came through. The reviewer asked me to limit compression to image file types only.
✅ I updated the logic to skip non-image files using simple MIME type checks.
3. Linting & Formatting
My pre-commit hook failed due to some ESLint rules. I also had to align with the project’s usage of ts-standard
.
✅ I fixed all lint issues and even contributed to the .lintstagedrc
setup discussion.
The Final PR
After addressing the feedback and thoroughly testing the changes, a reviewer suggested optimised code, which not only reduced the number of lines in the code but also made so much sense regarding how clean the code must look. I pushed the updates and waited. A few hours later... 🎉
My pull request was merged!
This small win meant a lot. Not only did I contribute meaningful code, but I also learned:
How to accept and implement technical feedback
How to use image compression libraries
How to work with linting tools and pre-commit hooks
How to write cleaner and optimised code
Key Takeaways
I learned how to write clean, optimised, and better code that avoids side effects.
Open source is a collaborative process — reviewers are there to help us improve.
Contributing to real-world projects teaches you what tutorials can't.
If you're thinking about contributing to open source — do it. You’ll learn more than you expect, and your confidence as a developer will grow with every line of code you contribute.
Happy coding! 💻✨
Subscribe to my newsletter
Read articles from Shravani Thirunagari directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Shravani Thirunagari
Shravani Thirunagari
Hi there, I am a product developer primarily skilled in Python, Node JS, and ES6 (React JS). I have around 6 years of experience in delivering end-to-end products. My expertise lies in implementing optimized solutions using relevant tech stacks. As part of this, I like to explore and learn new technologies. I am a curious student.