Features

Small app, stubborn about the details.

String is one Kotlin Multiplatform codebase compiled for Android, Wear OS and WebAssembly. The phone, the watch and the browser share the same domain logic, so a list behaves identically wherever you open it.

Reminders that actually fire

Set a one-time reminder for a moment, or a recurrent one that comes back on your schedule. String asks Android for exact alarms, so a 9:00 reminder arrives at 9:00 rather than whenever the battery optimiser gets around to it.

Reminders survive a reboot. The watch app re-registers everything on boot too, so nothing is quietly dropped overnight.

  • One-timeA date and a time. Done.
  • RecurrentRepeats on the pattern you set.
  • TodoA parent task with ordered sub-items.
  • Survives rebootRe-registered on device start.

Lists that finish themselves

Break a task into sub-items and put them in the order you will actually do them. Tick the last one, and String completes the parent for you — because you already did the work, and ticking it twice is busywork.

Go the other way and tick the parent while sub-items are still open, and it asks first, then closes the whole thing out in one move. Reorder sub-items any time with the arrows in the editor.

Completing the last sub-item completes its parent Three sub-items are ticked one after another. When the third is ticked, the parent task ticks itself.
Tick the last sub-item and the parent closes itself out.

Voice notes that stay put

Some things are faster said than typed. Tap record, talk, and String saves the clip against the reminder.

Recordings are written to your device's own storage and are not uploaded anywhere — not to us, not to a transcription service, not to sync. The microphone permission is only requested the first time you actually open the voice notes screen, never at launch.

Voice notes are available on Android and Wear-paired phones. The web version does not record audio.

What happens to a recording

  • StoredOn your device, as a file.
  • UploadedNever.
  • TranscribedNo. Nothing reads it.
  • DeletedWhen you delete the reminder.

A Pomodoro timer that holds

Start a focus interval and String runs it as a foreground service with a wake-locked alarm, so the countdown does not die when the screen sleeps or the app drops to the background.

Also on the watch

The Wear OS app ships two tiles and a watch face complication, so your next reminder is one glance away. It is a standalone app — it installs and runs on the watch without needing the phone app present.

How your data moves

Offline-first is not a slogan here — it is the storage architecture.

Written locally, first

Every reminder goes into a SQLite database on your device through SQLDelight. That write is the source of truth, which is why the app is instant and works in a tunnel.

Synced only if you sign in

Create an account and String mirrors your reminders to Google Cloud Firestore so your phone, watch and browser agree. Skip the account and that mirror never exists.

Shared only if you share

You can hand a reminder or a collection to someone else. That is an explicit action on a specific item — nothing is shared in the background.

A browser version is in development — the same code compiles to WebAssembly and keeps its database in your browser — but it is not hosted anywhere yet. The privacy policy spells out exactly which services receive what, on every platform.

Try it in about a minute.

No account needed to start.