Inspiration

I built SnapCal because I do this all the time: I see an event in LINE, social media, or a ticket page, take a screenshot, and then forget to put it on my calendar. I wanted the screenshot itself to finish the job.

What it does

SnapCal is an Android app with two simple entry points:

  • Share one screenshot from Gallery, LINE, or another app.
  • Start screenshot monitoring yourself and keep a small edge bubble visible.

Japanese OCR runs locally on the phone. When SnapCal finds exactly one clear future event—with an unambiguous title, date, and start time—it adds the event and a 30-minute reminder to the Android calendar you selected. The result notification includes Undo.

The important part is what happens when the screenshot is unclear: SnapCal does nothing. Multiple events, separated date regions, business hours, deadlines, missing fields, past dates, and unsupported calendars are rejected instead of guessed.

Privacy by construction

The release APK has no INTERNET or ACCESS_NETWORK_STATE permission. Screenshots and OCR text never leave the device, and SnapCal does not persist images, full OCR text, event titles, dates, locations, or URLs. It stores only small operational identifiers needed for duplicate prevention, recovery, and Undo.

Google Calendar works through Android's standard Calendar Provider and the phone's normal account sync—not through a Google API key or an uploaded screenshot.

How I built it

The app is written in Kotlin with Jetpack Compose. It uses bundled ML Kit Japanese OCR, CalendarContract, Room, WorkManager, MediaStore observation, and a user-started foreground service for the persistent bubble.

Codex was my main development environment. GPT-5.6 helped turn the original one-feature idea into a stateful Android architecture, implement the end-to-end flow, design deterministic ambiguity rules, generate adversarial tests, and review privacy and recovery behavior.

The biggest design change made with Codex was removing cloud analysis completely. We turned that privacy decision into an executable releaseGate that builds both flavors, runs 138 unit tests and lint, rejects known network dependencies, and inspects the final APK permissions.

What I learned

Reading text from a screenshot was not the hardest part. Deciding when automation should refuse to act was harder. SnapCal became much safer once uncertainty was treated as a product feature instead of an OCR error.

Try it

The public repository includes setup and testing instructions. A signed Android 10+ APK, SHA-256 files, and a complete evaluator bundle are available from the GitHub release.

Built With

  • android
  • codex
  • gpt-5.6
  • jetpack-compose
  • kotlin
  • ml-kit
  • room
  • workmanager
Share this project:

Updates