About
A smaller file should still be the same file.
OptiShrink started with a plain problem: files too heavy to send and too important to flatten. It is a small studio for the unglamorous work of making them lighter without changing what they are.


In plain terms
Compress a PDF or an image, choose how much detail to trade for size, and download the result. Signed-in runs are recorded with their exact byte counts.
- Per file
- 20 MB
- Levels
- 03
Principles
Small by design.
Deliberate limits, visible numbers, and no illusion that compression is magic.
Show the number
Every run records the original size, the compressed size, and the difference. A saving should be visible, not implied.
Keep the structure
PDFs keep their page count. Images keep their aspect ratio. Optimization is not permission to rewrite the file.
Leave less behind
Temporary uploads are deleted after every request. History is a choice, and any entry can be removed permanently.
Stay out of the way
No gamification, no fake urgency, no interstitials. The interface is quiet because the job is ordinary.
Under the hood
Boring pieces.
The stack is small enough to understand in one sitting. Compression is delegated to services that do it well; the studio handles the workflow around it.
- Frontend
- Next.js · TypeScript · Tailwind CSS
- Backend
- Express · TypeScript · Zod
- Database
- PostgreSQL · Drizzle ORM
- Processing
- Cloudinary · pdf.co
The short story
Built in public, revised with intent.
The first version of OptiShrink was a MongoDB and React project built for learning. This revision replaces the data layer with PostgreSQL and Drizzle, tightens the upload path, and rebuilds the interface around one job: getting a smaller file out the other side.
Maintained by
Aditya
adiikj.devQuestions, bugs, and strong opinions are welcome. Include the file name and its before-and-after size if something refused to shrink.
Start here
Give the next file a little less weight.
No signup, no queue. Compress a file and see the real before-and-after size in one pass.