"Meditation bell" is a meditation timer for Android that rings bells and saves each sitting to
Health Connect. The design is in Jan's vault:
wiki/analyses/2026-10-12-meditation-bell-app-to-health-connect.md.
- One screen: sitting length (default 1 h 30), an interval bell (default the medium bowl at 45 minutes), a closing bell (default the large bowl), and Do Not Disturb while sitting (on by default, can be switched off).
- The alarm volume the bells ring at is shown as "Volume: 0-100" above Begin and while sitting; below 20 the label is highlighted, so a bell too quiet to hear is caught before the sitting. In the app the volume buttons set the alarm volume, and "Listen" plays at it, so all three agree.
- No bell at the start, and nothing shown at the end: no count, no total.
- Pause, then resume or end. Paused time does not count: the bells still to come move later by the length of the pause, and no bell rings on resume. Do Not Disturb stays on while paused. A pause left for an hour ends the sitting. Each unbroken stretch of sitting is saved as its own session, so the minutes in Health Connect are the minutes sat.
- Each bell is an alarm-clock alarm, the one kind Android never delays, and plays as an alarm sound, so silent mode does not mute it. Do Not Disturb is set to "alarms only" and put back as it was when the sitting ends.
- Each sitting is saved to Health Connect as one meditation session (start and end; nothing is read). Ending early saves the real end, or discards the sitting if it was started by mistake: nothing of it is kept, and stretches already saved at its pauses are taken back. One under a minute is never saved. A sitting Health Connect refuses is kept and retried when the app is next opened.
- A sitting sat without the bell (on a plane, say) can be added by hand: the day, the start time in the phone's time zone, and the length. It is saved to Health Connect marked as entered by hand, and is refused if it would end in the future. A mistaken entry is deleted in Health Connect itself.
GitHub Actions builds it (.github/workflows/build.yml): a test copy on every
push to main, and a signed release on a tag like v0.1, which is what
Obtainium installs. Locally: gradle assembleDebug with JDK 17 and the
Android SDK. The timing (Clock.kt) and the hand-entered sittings (Past.kt) have unit tests, run on every build.
Four struck singing bowls, synthesized from the physics of a bowl (bells/bowl.py),
so no recorded sound is used and all four can ship with the app.
| File | Lowest tone | Rings for | Default use |
|---|---|---|---|
bowl-medium-165hz.ogg |
165 Hz | ~40 s | interval bell, at 45 minutes |
bowl-large-110hz.ogg |
110 Hz | ~45 s | closing bell, at 1 h 30 |
bowl-small-245hz.ogg |
245 Hz | ~32 s | option |
bowl-small-330hz.ogg |
330 Hz | ~28 s | option |
No bell at the start. Rebuild: cd bells && python make.py, then convert each
.wav to .ogg (ffmpeg -i x.wav -c:a libvorbis -q:a 6 x.ogg). Needs numpy
and scipy. python bowl.py measure rec.wav params.json estimates the
parameters of a recorded bell, and python bowl.py synth params.json out.wav
renders one.