Repository navigation
Releases: RoyaLemonade/ompweb-android
Release list
android-v1.0.29
ompweb for Android 1.0.29
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- Search finds every match again. 1.0.28 stopped a filter from holding
every project open, but it also applied that rule to the search field: a
query no longer opened a collapsed project, so matches inside it stayed
invisible, and a project with more than five matching sessions hid the rest
behind Show more. A search term now opens every project with a match and
lists all of its matches; the field is a result set, not a filter. - Your collapse choices survive the search. The app does not rewrite the
stored expand/collapse state while you search. Clear the field and each
project is folded exactly as you left it. - Chips keep their 1.0.28 behaviour.
Running,Unreadand the age
presets still only narrow the rows: the chevron stays in charge and the
five-row Show more limit still applies, so a chip does not force a
collapsed project open. - Version 1.0.29 (
versionCode10029).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.29.apkompweb-1.0.29.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.29.apkand the companionompweb-1.0.29.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.29.apk, 5850189 bytes, SHA-256 27d9bd091aca8dd35c260f9af7fad81bcf417a933a02df8d7b1891b1b281670e, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.28
ompweb for Android 1.0.28
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- A filter no longer keeps every project open. With
Age: Today(or any
other chip, or an active search) the project headers now collapse and expand
again when you tap the chevron: a collapsed project shows its header with the
activity count and keeps its chats hidden. Before, the filter forced every
project expanded, so the toggle appeared to do nothing. - The five-row limit stays. A project with more matching sessions still
shows five rows and a Show more (n) action; the filter no longer lifts
that cap or hides the action. - Version 1.0.28 (
versionCode10028).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.28.apkompweb-1.0.28.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.28.apkand the companionompweb-1.0.28.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.28.apk, 5850189 bytes, SHA-256 7cf3fd2ae2cba73253a4b428031e8a1e288f18ab7e30516f589ff9fb2a0eca07, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.27
ompweb for Android 1.0.27
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- A filter bar for the session list. Three chips above the list narrow a
long workspace: Running, Unread and Age (All,Today,
2 days,7 days, based on the session's last activity). The chips combine,
so Running + Unread + 2 days shows exactly the chats that need attention
now. - Unread means "wants attention": the sidebar's unread dot, an unread entry
in the notification list, or a blocking input dialog that waits for an
answer. The same rule drives the row badges and the project counters, so the
filter and the dot agree. - Pins ignore the filters. Pinned sessions keep their shortcut at the top
and pinned projects keep their row; a project whose sessions all fail a chip
collapses instead. A small row at the bottom says how many sessions are
hidden and offers Clear filters; the empty state does the same when
everything is filtered out. - The choice is remembered per server (Running, Unread and the age preset)
and forgotten on sign-out or a server switch, like the pins. - Version 1.0.27 (
versionCode10027).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.27.apkompweb-1.0.27.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.27.apkand the companionompweb-1.0.27.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.27.apk, 5850189 bytes, SHA-256 3787cb23b4bdde5680101370493e1fe04e25049c8c02fa4ff16dea83b01ca258, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.26
ompweb for Android 1.0.26
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- Hide now hides. Hiding a project from its row menu in the sessions list
left the row on screen: the server correctly marked the project as hidden and
dropped it fromGET /api/projects, but the app rebuilt a project row from
the sessions of that project — and hiding deliberately keeps those sessions
on disk. The list now follows the server's project list; a hidden project and
its sessions leave the sidebar until the project is added again. - Live rows keep their workspace. A session started from the app is
listed a moment before its first message is written to disk. That
placeholder still gets its own project row while the server's project list
cannot know the directory yet — only file-backed sessions no longer create
rows of their own. - Version 1.0.26 (
versionCode10026).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. Hiding a project needs the server's registry (ompweb 0.6.0 or newer). - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.26.apkompweb-1.0.26.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.26.apkand the companionompweb-1.0.26.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.26.apk, 5846833 bytes, SHA-256 e397fd5a772b3fe97e0acb6a96a6689297009705696fb67b8cd8bec3cc261984, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.25
ompweb for Android 1.0.25
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
/goalnow starts omp's real goal mode — the command is sent as omp's
goalRPC (op: "create") instead of a plain prompt with a client-side
banner. The goal objective carries a fixed plan template: the agent must
first write Key points, No-gos and Stop conditions (each one
objectively verifiable with evidence), keep them as todos, and work until
every stop condition is proven before it completes the goal. Optional lines
after the aim —No-gos:andStop conditions:— are passed into the same
plan.- The goal banner is omp's state, not the app's — objective, active or
paused status, elapsed time and token budget come fromget_state.goaland
livegoal_updatedevents. Pause, Resume and Drop call the
matching RPC ops. Stopping a run pauses the goal in omp, and the banner then
offers Resume. The old per-session goal storage is removed. - Older servers keep working — a server or omp that answers “Unknown/
Unsupported command: goal” gets the same plan template as a normal prompt
and a notice explains the fallback, so the aim is never lost. - New sessions use the same path:
/goalin the new-session composer
starts goal mode on the freshly created session. - Version 1.0.25 (
versionCode10025).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - Goal mode needs an ompweb server that forwards the
goalRPC command and an
omp build with goal support (18.x). Without it the app falls back to a
normal prompt with the same plan instructions. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.25.apkompweb-1.0.25.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.25.apkand the companionompweb-1.0.25.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.25.apk, 5830449 bytes, SHA-256 d6863aede511731fbbe3f88e3e70abaef26e5f6d4a18fd7207bfa9b9c5342077, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.24
ompweb for Android 1.0.24
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- No notification for the chat you are reading — three gaps in the
on-screen rule are closed. The presence report (visible + session id) is now
sent even while the notification service is still activating, its visibility
and its sequence number are taken under one lock (a report can no longer
carry an older view with a newer sequence and win on the server), and the
app's own guard compares the same ids as the server: a session omp moved to a
new file still counts as the chat on screen under its former id. Opening or
re-reporting that chat also clears a notification that slipped in between,
even when the selected id did not change. - A finished chat is one notification, not two — every completion used to
add a project summary next to its own notification, so a single finished
chat already showed two entries. The summary now appears only when it really
summarizes two or more chats of the project ("3 chats finished") and carries
their names; a single chat is its own notification. - Finished chats are quiet by default — the completed notification no
longer plays a sound or vibrates. New setting Settings → Notifications →
Sound/vibration for finished chats (off by default; searchable as
"Sound/vibration for finished chats"). Questions and errors keep their loud
alert and their vibration patterns, the Vibrate setting still decides
whether an alert pulses (a finished chat then plays its sound without one),
and the existing per-type switches still apply. - A burst alerts once — a project's first completion alerts (when the new
setting is on), every further completion in the next 20 seconds is posted
silently and folded into the summary line for that project. Answering a
finished chat's notification ("Sent" / "Failed") also stays silent. - Version 1.0.24 (
versionCode10024).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.24.apkompweb-1.0.24.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.24.apkand the companionompweb-1.0.24.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.24.apk, 5826925 bytes, SHA-256 c537548367ccbc24c38aa8c6ac7e4a519dab0ad7aa523f6cc1a324b09b3f61e6, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.23
ompweb for Android 1.0.23
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- A queued message is delivered when the chat is opened — the offline
outbox held messages back whenever a state read for the same session was
already on the wire, which is exactly what opening a chat and reconnecting
do. The queue then showed "Waiting for connection" over a healthy connection
until the chat was opened a second time. Delivery now waits for that read's
answer (bounded) instead of giving up on it, and a poll that finally learns
the session's state starts the queue again. - A refused message no longer blocks the queue — a 4xx/5xx answer to a
queued message was treated like a transport problem: the record went back to
the queue and was re-posted on every reconnect, repeating the refusal
forever and keeping every later message of that chat behind it. An answer is
now final: the message leaves the queue, its text and images go back into
the input field, and the server's reason is shown. The next queued message
goes out immediately. - A failed steer/follow-up no longer stops the run it never started — a
queued message delivered into a running session rolled back the server's
turn when the steer was refused: the streaming answer vanished, the footer
showed idle and the stop button disappeared until the next frame. That path
now only reports the error; only a message that became this app's own prompt
is rolled back on failure. - The queue file survives a crash — the record file is written with
fsync
and moved over the old one in a singlerename, instead of deleting
queue.jsonfirst: a process death in that window used to lose the whole
queue. Unreadable records (empty session, no text and no image) are dropped
together with their images instead of living on unseen, and a message the
app could not deliver for a month is dropped with its images, so a lost
connection cannot fill app storage forever. - A queue that cannot be written says so — a failed "this message may be on
its way" write stopped being read as "the message is gone" (which re-read the
same record forever); it stops the loop with a notice and keeps the message
queued. A failed removal keeps the message's images, because the record is
still there. Signing out cancels the chat surface and its delivery loop
before the queue directory is wiped. - A snippet inserted in typed text gets its own line — inserting at the
caret no longer glues the snippet's last word to the text behind it. - Version 1.0.23 (
versionCode10023).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.23.apkompweb-1.0.23.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.23.apkand the companionompweb-1.0.23.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.23.apk, 5825337 bytes, SHA-256 a37690b27d00c0a608dd316d926f61ed0fb86d8c5c96762171ced1bfc1ef9a7f, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.22
ompweb for Android 1.0.22
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- A phrase you say twice is no longer swallowed — on-device dictation
dropped any utterance that began with the words it had already committed:
after "ok", saying "ok weiter" left only "weiter", and a repeated "ja" in
"ja … ja genau" disappeared. The buffer stripped everything up to the length
of the committed text, because it assumed the recognizer was re-sending the
session so far. It is not: a hypothesis and a finalized utterance belong to
the utterance the recognizer is in right now, so they are now taken as they
arrive. Nothing is compared against the committed text any more — the words
the user said are the words that stay. - The one real re-send is still counted once — a service that reports the
same finalized utterance on both of its paths (onSegmentResultson
Android 13+ and thefinal_resultpartial for services without a segmented
session) delivers it twice; the buffer recognizes that by the callback that
delivered it, not by matching words, so the take still holds the utterance
exactly once. The session's final transcript keeps replacing the take when
it repeats the utterances, and a blank final keeps all of them. - Tests that wait no longer fail on a loaded machine — every test class
that polled with its own deadline (eight to ten seconds) now uses one shared
helper with a 60-second safety net that names the awaited condition and the
observed state when it fails, plus a flow-based variant for state a test can
observe directly. No test was weakened and none retries: a passing run still
returns the moment the condition holds. - Version 1.0.22 (
versionCode10022).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.22.apkompweb-1.0.22.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.22.apkand the companionompweb-1.0.22.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.22.apk, 5778781 bytes, SHA-256 8044ff5cbcd2824c2a7acf92af085d71f900aa32792ae1f9caa4df33869613c6, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.21
ompweb for Android 1.0.21
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- On-device dictation keeps what you said before a pause — talking, pausing
and talking again deleted the first sentence and left only the second one.
The take was built as if the recognizer's partial text always described
everything spoken so far. On a phone it does not: the recognizer finalizes an
utterance when the speaker stops and starts the next one from an empty
hypothesis, so the text after the pause replaced the text before it. Each
finalized utterance is now kept and the next one is appended to it with one
space, and the session's final transcript replaces the take once instead of
being appended again (no doubled words when it repeats the last partial). - One take lasts until you stop it — a pause no longer ends dictation. The
recognizer is asked for a session that outlives the pauses (segmented session
mode on Android 13+, dictation mode for older services), so a break in
speaking does not silently finish the take and swallow what follows. The
strip under the field keeps its Stop and Cancel; backgrounding the app
still commits what was heard. - Your own edits survive — typing into the field during dictation keeps the
visible text, including everything dictated before the pause, and the live
text continues at the caret you left. - Tests — the buffer (utterance after a pause kept, repeated hypothesis and
repeated final not duplicated, blank final keeps the utterances, a user edit
re-anchors), the view model (the Pixel sequence speech → pause → speech,
and the fallback when the recognizer never answers), and the intent and
callbacks of the recognizer adapter (segmented session, finalized partials,
end of a segmented session). - Version 1.0.21 (
versionCode10021).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.21.apkompweb-1.0.21.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.21.apkand the companionompweb-1.0.21.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.21.apk, 5778781 bytes, SHA-256 075a42fff5d18e7525128c83f5a4a6261ef2a69e55f69ee04eaf3a4e41e7d3b3, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.
android-v1.0.20
ompweb for Android 1.0.20
The native Android client for ompweb: sessions, the live chat, the composer,
files, Git and worktrees, notifications with inline replies, and the settings
screens, backed by your own ompweb server.
What changed
- Auto dictation no longer uploads to a server that cannot transcribe —
with the engine Auto, tapping the mic recorded and uploaded the audio
whenever a server address was configured. A server without
OMP_WEB_STT_ENDPOINTorOMP_WEB_STT_MODELanswers that upload with
501 STT not configured, and/api/app-infohas no capability flag for
speech-to-text, so the app was treating "a server exists" as "the server can
transcribe". Auto now asks the server itself before it opens the
microphone: a smallPOST /api/sttwithout audio tells it whether the
route is configured (the server checks its STT settings before it reads the
audio), and the answer is cached per server address, refreshed at app start
and after a server switch. Only a positive answer sends a recording to the
server; otherwise the phone's installed recognizer takes the take. - A take is never lost when the server still refuses — if an upload is
answered with 501 in Auto mode, the server is remembered as "no STT", the
recording stays on the phone (playable), and the deck says why with a
one-tap Dictate on this phone instead. The recap is honest: the phone's
recognizer cannot reuse recorded audio, so that button starts a new take.
The next Auto attempt goes straight to the phone. - Explicit "Server" keeps working as chosen — an explicit server engine
still uploads, keeps its retry and shows the server's own message, even
after other composers learned that this server cannot transcribe. - Tests — the engine decision matrix (configured / unconfigured / not yet
asked, with and without an on-device model), the per-server cache (one probe
per address, unknown answers retried, a failed probe not cached), the
configuration probe's HTTP mapping (501,missing_audio_file, signed out,
5xx, no route), and the view model's 501 fallback (local copy kept, no
re-upload, on-device take on request, next Auto take on-device) together
with the explicit-server path. - Version 1.0.20 (
versionCode10020).
Updating
Open Settings → System & Updates → Android app update, keep or set the
source, and tap Check for updates; the app downloads the file, verifies its
SHA-256, package name, versionCode and signing certificate, and hands it to
Android's installer. The app data stays. Android still asks once for the
install unknown apps permission if it was never granted.
Requirements
- ompweb with
GET /api/app-info("api": 1) — the server the app was built
against. - omp installed on the server for agent features.
- Android 8.0 (API 26) or newer.
Release artifact
ompweb-1.0.20.apkompweb-1.0.20.apk.sha256accompanies the file; the release also publishes
the APK's size and signing certificate.
Install
- Download
ompweb-1.0.20.apkand the companionompweb-1.0.20.apk.sha256
from the release. - Allow your file manager or browser to install unknown apps.
- Install the APK. Signed updates install over an older version and keep the
app data.
Full instructions: docs/android/README.md.
Verify this download: ompweb-1.0.20.apk, 5778781 bytes, SHA-256 6c2263bb53c28ba351b3adf3e220e1dd1b81834471700d4f9612bcc404628642, signing certificate SHA-256 d73354b52dc7c3f0c74623c439ddb7b52e252811c6e6b5f851c9d04b7015fc87.