Shoot on site, and afterwards you have to sort it all out: which photo belonged to which job, an evening gone to filing. This app makes the photo land in the right folder as it is taken.
The point is that it does not touch the camera. You keep using the camera app you already use — pro mode, burst, video, all of it works exactly as before.
What the app does
- Set up folders in advance — "Yangju site", "kids" — and pick one before you shoot.
- Three places to pick from — a home screen widget, a quick settings tile, or the app. One tap on the widget before heading out is the whole workflow.
- The widget shows that folder's last photo as its background — text alone makes folders easy to confuse; the shot you just took does not.
- Filenames follow a rule — folder name + date + number. Optionally split into subfolders by date.
- Place names can be added — the local area name, with no internet. Coordinates never leave the phone (more below).
- Switch folders mid-shoot — straight from the notification, without closing the camera.
- Undo — send a wrongly filed photo back where it came from.
- Zip a folder and send it — from the site, by chat or mail. Everything, or only what is new since last time.
- Video moves too.
- It stops on its own when you are done — three minutes to two hours, or never.
It started with one sentence
What the owner said
Build an app that files photos into folders automatically — but I want to keep using my own camera
So here is what I did
- Built a throwaway test app first, purely to answer "can this be done without touching the camera?" — five traps got sprung there, before the real work
- Only started the real app once that answer was yes. A no would have ended the project
- Built folders, widget, tile, undo, sending, setup wizard, and wrapped it in 133 tests
- Fed deliberately wrong values into those tests first, to prove they actually catch things — 19 planted faults, all caught
- Installed it on an emulator at every step and checked the screens by eye
What the owner didset the direction, used it on a real phone and said what was wrong
The decision that shaped everything — do not touch the camera
Apps like this normally ship their own camera. That is the easy build. It also costs the user every good thing about the camera their phone came with: pro mode, night mode, burst.
So this went the other way: open the real camera, and move the photo afterwards. Considerably harder to build — several of the traps below came from exactly that. But give it up and there is no reason for this app to exist.
Not a single server
Photos, folder settings, the trial record — all of it lives on that phone only. Nothing reaches us. No account, no login.
The place-name feature works the same way. The usual approach sends coordinates over the internet and gets a name back — which means where you were shooting leaves the phone. So 37,501 place names worldwide were built into the app instead. It costs 0.78MB. It works in airplane mode, and the coordinates never travel.
I will bundle the place data into the app.
turning a 0.78MB file into a server means paying for it forever
What the owner said after using it on a real phone
On the emulator everything looked fine. Handing it to a real phone produced this within minutes.
| What the owner said | What was actually wrong | The fix |
|---|---|---|
| "'Saving' is confusing" | It meant "ready to file into this folder" and read as "currently writing your photo" | Changed to Shooting |
| "Sequence number? Don't you mean the year?" | It was developer language. Nobody calls it that | Number (001, 002, 003…) plus a one-line explanation |
| "Why are the name and the destination folder separate?" | Kept apart, they drifted — "named Yangju site, filed somewhere else" actually happened | Merged into one |
| "What does splitting by date even mean?" | There was no explanation | One line of plain text per option |
| "The widget should show the last photo" | Text alone does not tell folders apart | The folder's last photo as the background |
| "Every new folder spawns another widget" | The wide widget was filling itself in unasked | Each widget now takes the folder you choose |
Traps sprung along the way
1. The widget refused to appear at all
Putting a dark scrim over the photo so the text would read made the whole widget vanish. Widgets accept only a fixed set of building blocks, and that one was not on the list.
Nothing appears on screen to say so. It is just absent. Without reading the logs, the cause would never have been found.
2. It failed silently
Asking for "the newest one, just one" to fetch the last photo made the entire query fail — Android 11 closed off that phrasing.
And a failure there does not crash anything. The background image simply does not appear. Silent breakage is the hardest kind to find.
3. Letting people choose a camera moved zero photos
"Let me pick which camera to use" came in as a request, and the screen got built. But different cameras save to different places, and the watcher was still looking at the original one.
The camera opens. Photos are taken. No error anywhere. And nothing moves. Building only the screen would have shipped exactly that.
4. A window over the camera turned the screen black
A small prompt during shooting was built transparent. Placed over the camera view it covered the entire screen in black — which reads as the phone switching off.
And the default list style renders text small enough that gloved hands cannot hit it. On an app made for job sites.
5. Forty minutes lost to my own test method
Test photos were pushed from the computer onto the phone. Files arriving that way are marked "still being written", and other apps cannot see them at all.
The watcher ran fine, the change signal arrived, and the count came back zero. Forty minutes went into debugging an app that was not broken. Photos from a real camera never do this — the test method was the bug.
The app was fine. My test was wrong.
the broken thing was me
Deliberately not doing
- A built-in camera — easier to build, and it deletes the reason this app exists.
- Stamping dates or locations onto photos — modify the photo and this is every other app.
- Cloud backup or accounts — breaking "no servers" breaks the identity.
- Subscriptions — seven days to try, then one payment. Nothing leaves your account monthly.
What is left
- The 7-day trial and billing. Billing cannot be verified on an emulator — that needs a real phone and an internal test track.
- The English build. English gets written first and Korean added after; English translated out of Korean reads wrong abroad.
- Store assets and a final pass on a real device.
The build continues here as it goes. When it ships, the download link lands on this page.




