Inspiration

I built this in a university lecture hall.

I used to photograph the whiteboard and my notes during class — a few shots here, a few there, across different courses, all day. Then I would get home and spend the evening digging through one giant camera roll, trying to work out which photo belonged to which subject, which lecture, which week.

The sorting was never the hard part. The problem was that the mess had already been created hours earlier, every time I pressed the shutter without saying where the photo belonged. So I stopped trying to fix the pile and moved the decision to the front: pick the folder first, then shoot.

What it does

ToFolder inverts the order of taking and sorting. You choose the folder before you open the camera, and every photo and video lands there instantly — Calculus notes in Calculus, receipts in Receipts. The camera roll never becomes a pile you have to dig through later.

Beyond capture, it is a local filing cabinet:

  • Share anything into it — a PDF from Mail, a photo from WhatsApp, a link — and file it into a folder
  • Search across folders, with date and GPS kept in the file
  • Export a folder as one archive and restore it on another phone, structure intact
  • Encrypted export — AES-256 archives that hide their file names as well as their contents

Everything stays on the device. No account, no server, no sync. I could not read a user's files if I wanted to, because there is no server in the pipeline at all.

Thirteen languages. 151 tests. One one-time purchase — no subscription, nothing renews.

How I built it

Expo SDK 56, React Native 0.85, TypeScript, expo-router, Zustand, i18next. react-native-vision-camera for capture, Skia for burning the date and GPS stamp into the pixels, RevenueCat for purchases, Sentry for crash reporting.

Every integration sits behind an interface, so no screen ever imports a vendor SDK directly. Pure logic lives in src/utils with its own tests; the native surface stays as small as I can keep it.

Challenges I ran into

iOS 26 broke three separate native layers underneath me, one after another.

First Hermes corrupted its own heap at startup — an upstream bug, fixed only by moving the entire project from Expo SDK 54 to 56. Then react-native-screens crashed inside UIKit's navigation-bar layout on every screen transition. Then a race in Reanimated's worklets killed the app during fast navigation. Each fix revealed the next crash underneath it. It took 25 builds to reach a version that simply opened.

The expensive lesson: none of it reproduced in a development build. Every one of those crashes existed only in release, and the only way to find them was to ship a build and watch it die on a real phone.

Encrypted export taught me the same thing again. My unit tests were green while three real bugs sat in the app:

  1. iOS silently refuses to present a share sheet while another modal is still closing — so the archive was built, encrypted, and went nowhere. No error, no sheet, nothing.
  2. The key shown on screen was formatted with dashes while the archive was encrypted without them. It opened inside my app and nowhere else on earth.
  3. Export cleanup runs when the user returns from WhatsApp — not when the share sheet opens — so it deleted the working directory of a restore that had already started.

None of the three is the kind of bug a test suite finds. They live in the native layer and in modal timing, and only a real device on a real network exposes them.

Accomplishments that I'm proud of

Archives that hide their own index. Standard ZIP encrypts file contents and leaves the central directory readable, so an intercepted archive still announces "Passport.jpg, Contract.pdf" to anyone who opens it. ToFolder seals the real archive inside a single encrypted one — open it without the key and you see one meaningless entry and nothing else. I verified that in 7-Zip on a desktop, not just in a test.

A paywall I can defend. Exporting your own data stays free. Encryption and bulk export are added value; a wall in front of a user's own photos is not a business model.

What I learned

Green tests are not evidence that software works. They are evidence that the logic I thought to test behaves as I expected. Everything that actually broke this app lived somewhere no test could reach — a platform release, a modal animation, a cleanup routine that fires when the user comes back from another app.

What's next for ToFolder

Offline device-to-device transfer over peer-to-peer Wi-Fi, stripping location data from exported archives, and a biometric lock. All of it staying on the device, which is the entire point.

I wrote the full technical story of the twenty-five builds on HackerNoon: https://hackernoon.com/[https://hackernoon.com/every-release-breaking-bug-in-my-app-escaped-development]

https://hackernoon.com/your-encrypted-zip-is-announcing-whats-inside-it

Built With

Share this project:

Updates

Submission history