- oxygenhub.io links open in the app (issue #36): a link to an issue, a proposal, a Flow run, a change, a file, a history or a board, tapped anywhere (mail, chat, a browser), opens the app on that screen, once the hub vouches for the app (oxygenhub#370,
/.well-known/assetlinks.json). One the app cannot show, while signed in to another hub say, goes to the browser. Android › Apps › OxygenHub › Open by default turns it off. - The changelog is checked on the WASM tier: a
changelogjob runs OxygenFlow's checks module on any runner with the WASM tier, failing when the changelog is out of shape or the version in gradle.properties has no section.
Releases 10
OxygenHub for Android 0.1.9 latest v0.1.9 · ✔ signed by Andy McCall · andymccall ·
Trust and auditAssets
- SHA256SUMS 104 B · blake3
13ae3f368ab4· 1 downloads · built by run #1667 release · signed receipt by earth-1 (short-lived key) · provenance - oxygenhub-android-0.1.9-universal.apk 71.5 MiB · blake3
614e377fc6f1· 2 downloads · built by run #1667 release · signed receipt by earth-1 (short-lived key) · provenance - Source (v0.1.9.tar.zst)
- Source (v0.1.9.zip)
OxygenHub for Android 0.1.8 v0.1.8 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- The Dashboard shows a landed proposal as landed (issue #35): it fetched once and kept that snapshot while you moved around the app, so a proposal landed from its page still showed as open on the way back. The Dashboard and the inbox counts now refresh each time the Dashboard comes back to the front.
- The version card notices a new release without a restart (issue #34): Account › OxygenHub asked the hub for releases once, when the card first showed, so an app left open kept saying "OxygenHub 0.1.6" after 0.1.7 was out until it was force-quit. It asks again each time the app comes to the front.
Assets
- SHA256SUMS 104 B · blake3
e9392dcd8f0c· 0 downloads · built by run #1664 release · signed receipt by plex-1 (short-lived key) · provenance - oxygenhub-android-0.1.8-universal.apk 71.5 MiB · blake3
92527a7e2e35· 0 downloads · built by run #1664 release · signed receipt by plex-1 (short-lived key) · provenance - Source (v0.1.8.tar.zst)
- Source (v0.1.8.zip)
OxygenHub for Android 0.1.7 v0.1.7 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- The widget's Flow health strip shows (issue #33): it was missing from 0.1.5 and 0.1.6. A widget's column shows ten children at most and drops the rest without a word, and with Needs you below the runs the strip was the eleventh; the runs and Needs you are each one block now.
Assets
- SHA256SUMS 104 B · blake3
36e5eb801412· 0 downloads · built by run #1661 release · signed receipt by plex-1 (short-lived key) · provenance - oxygenhub-android-0.1.7-universal.apk 71.5 MiB · blake3
2f0c9fb9bd9d· 1 downloads · built by run #1661 release · signed receipt by plex-1 (short-lived key) · provenance - Source (v0.1.7.tar.zst)
- Source (v0.1.7.zip)
OxygenHub Android 0.1.6 v0.1.6 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- The widget's counts move to its header (issue #33): with Needs you and Flow health below the runs, the row of counts at the foot was pushed out of the widget; unread messages, reviews and assigned issues now sit right of the title, where nothing can push them off, and the phone's runner job (while it serves) has the foot.
Assets
- SHA256SUMS 104 B · blake3
a114fa4ffec6· 1 downloads · built by run #1659 release · signed receipt by plex-1 (short-lived key) · provenance - oxygenhub-android-0.1.6-universal.apk 71.5 MiB · blake3
0d62e17560bd· 1 downloads · built by run #1659 release · signed receipt by plex-1 (short-lived key) · provenance - Source (v0.1.6.tar.zst)
- Source (v0.1.6.zip)
OxygenHub Android 0.1.5 v0.1.5 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- Needs you and Flow health on the widget (issue #33): the space under the runs shows the proposal at the head of your reviews and your newest assigned issue, a line each that opens it, and a strip of your last 30 runs (oldest on the left, each bar in its outcome's colour) with how many of the finished ones passed. The OxygenHub mark keeps its own colours again; only the word is white.
Assets
- SHA256SUMS 104 B · blake3
cf6e31873d05· 1 downloads · built by run #1658 release · signed receipt by plex-1 (short-lived key) · provenance - oxygenhub-android-0.1.5-universal.apk 71.5 MiB · blake3
ea0b72601e4c· 1 downloads · built by run #1658 release · signed receipt by plex-1 (short-lived key) · provenance - Source (v0.1.5.tar.zst)
- Source (v0.1.5.zip)
OxygenHub Android 0.1.4 v0.1.4 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- This phone as your second factor (issue #32, oxygenhub#356): Account › Second factor › Use this phone as a second factor makes a P-256 key in the Android Keystore that signs only after your fingerprint, face or PIN, and registers it with the hub (with a current code from your authenticator app, which stays the way in if the phone is lost). Signing in on the web, or confirming a sensitive change there, then asks the phone: while the app is open it shows "Is this you?" with three numbers, you pick the one the browser shows, confirm, and the browser carries on; "No, it is not me" refuses. Where the hub sends alerts, an approval wakes the phone and a tap opens the app. Needs OxygenHub with
/api/v1/user/approvals.
Assets
- SHA256SUMS 104 B · blake3
89fac1cc13b8· 1 downloads · built by run #1656 release · signed receipt by plex-1 (short-lived key) · provenance - oxygenhub-android-0.1.4-universal.apk 71.5 MiB · blake3
29691da204c7· 2 downloads · built by run #1656 release · signed receipt by plex-1 (short-lived key) · provenance - Source (v0.1.4.tar.zst)
- Source (v0.1.4.zip)
OxygenHub Android 0.1.3 v0.1.3 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- The widget's foot (issue #31): the OxygenHub mark and title are white on the dark widget, and a row of counts runs along the bottom: an envelope with your unread messages, proposals waiting for your review, and issues assigned to you (from OxygenHub's
GET /user/issues, oxygenhub#359; a hub without it leaves that count out), each dimmed at zero and opening its screen (the one proposal or issue when there is just one), then, while the phone serves as an OxygenFlow runner, the job it runs, redrawn as that changes. The dashboard gains Assigned to you, the same issues, each opening.
Assets
- SHA256SUMS 104 B · blake3
5175a6e3ba6e· 1 downloads · built by run #1654 release · signed receipt by earth-1 (short-lived key) · provenance - oxygenhub-android-0.1.3-universal.apk 71.4 MiB · blake3
47980ec9d135· 2 downloads · built by run #1654 release · signed receipt by earth-1 (short-lived key) · provenance - Source (v0.1.3.tar.zst)
- Source (v0.1.3.zip)
OxygenHub Android 0.1.2 v0.1.2 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- A flashier widget (issue #30): the home screen widget now has the OxygenHub mark beside its title and Your sky behind its runs, drawn by the same scene as the dashboard's backdrop, settled into a still picture at the widget's size (a widget cannot animate) and redrawn from your own activity at each refresh, with a veil so the text stays readable in light and dark. With nothing of yours to draw, it keeps the plain surface.
- The phone runner says what it runs (issue #8): while it serves, the runner card lists the jobs it is running (owner/name #run job), and its notification says "Running owner/name issue #7 test" instead of waiting, from OxygenFlow's
runner::running()(pins OxygenFlow main). - The phone runner rests when warm (issue #8): besides charging and Wi-Fi, the runner now needs the phone cool: when the system says it is throttling (moderate or worse) or the battery is above 40 °C it takes nothing more, finishes a job due within a minute and hands back any other, as off charge, and serves again once it has cooled. The card and the notification say why it waits.
- A proposal's description is Markdown: it showed as plain text,
##,**, backticks and table pipes included, with the source's line breaks; it now renders as an issue's does (headings, emphasis, code, lists and tables, lines joined into paragraphs).
Assets
- SHA256SUMS 104 B · blake3
f2c4d714c88a· 1 downloads · built by run #1652 release · signed receipt by earth-1 (short-lived key) · provenance - oxygenhub-android-0.1.2-universal.apk 71.4 MiB · blake3
d735e166b6c7· 1 downloads · built by run #1652 release · signed receipt by earth-1 (short-lived key) · provenance - Source (v0.1.2.tar.zst)
- Source (v0.1.2.zip)
OxygenHub Android 0.1.1 v0.1.1 · ✔ signed by Andy McCall · andymccall ·
Trust and audit- Panels you can see (issue #24): on a phone, cards and boxes were near-black on black. The app now uses OxygenHub's own colours by default (Account › Wallpaper colours turns Android's back on), every card is one panel with a 1 dp edge, as the website's have, on a tone a clear step above the background, and wallpaper colours in the dark get the same steps. A backdrop stays inside its band, and an image the app cannot show yet (a README's badge) no longer leaves a 180 dp blank.
- Flow, at a glance (issue #26): a Flow destination in the navigation: the runs of all your repositories, newest first, over a band of their sky (each repository a cluster, each run a mark) with how many are live, passed and failed; filters for live and failed; each run with its pulsing status, bookmark, trigger, who, when, how long, and a dot per job in its colour; tap for the run. Live runs refresh every 5 s while it is open. From OxygenHub's
GET /user/flow/runs. - New repository, and an assistant to start it (issue #27, oxygenhub#347): Repositories has a + for a new repository: under you or an organisation you belong to, with a description and visibility. When the owner has an assistant set up, "Describe what you want to create…" asks it for a starting point (a README, build files, a source layout and a first test), drafted on the hub and committed as you; the screen follows it and lists the files. The app now asks for
repo:adminat sign-in (making repositories needs it); a phone signed in before says to sign in again. - A home screen widget (issue #28): your latest three runs with their status, unread notifications and proposals waiting for your review, in OxygenHub's colours; a tap opens the app. It refreshes every half hour and whenever the app comes to the front, and asks for a sign-in when there is none. (Jetpack Glance 1.1.1.)
- Colour on icons (issue #25): icons say what they are in the hub's colours, as its pages do: repositories, folders and account details in the accent, releases, projects and pending checks in purple, private and internal locks in their warning colour, notifications by kind (a broken build red, a fixed one green, a review purple), and empty screens' icons in the accent.
Assets
- SHA256SUMS 104 B · blake3
b55a2a7f0c3b· 1 downloads · built by run #1647 release · signed receipt by earth-1 (short-lived key) · provenance - oxygenhub-android-0.1.1-universal.apk 71.4 MiB · blake3
688d8692edd3· 1 downloads · built by run #1647 release · signed receipt by earth-1 (short-lived key) · provenance - Source (v0.1.1.tar.zst)
- Source (v0.1.1.zip)
OxygenHub Android 0.1.0 v0.1.0 · ✔ signed by Andy McCall · andymccall ·
Trust and audit-
The release's secrets checked in seconds (issue #7):
oh run start --job release-checkrunsscripts/release-check.shwith no build: the keystore's SHA-256 and the entry its password opens (to compare with the keystore you hold), that the keyoxygenhubopens with that password as signing needs, and that Firebase's settings are whole JSON; never a key, a password or the settings. The release job runs the same check first, and moves the signed APK intodist/rather than copying it (the build leaves the job's disk nearly full). -
The hub's living backgrounds (issue #23): the website's backdrops come to the phone, the same Rust scenes (copied from OxygenHub's crates/backdrop by scripts/sync-backdrop.sh) stepped in rust-core and drawn by the app. Sign-in has the OxygenHub mark, which answers a finger; the dashboard has Your sky, your repositories and their last 30 days of pushes, proposals, issues, releases and runs, each mark a real event (OxygenHub's
GET /user/sky; a hub without it shows the quiet field), drawing near your finger and naming the repository it rests by, behind cards it shows through. Live runs and jobs pulse; empty and error screens have the quiet field the hub's error pages have; a screen opened slides in a little from the side it leads to, and goes back the way it came. A repository's screen opens on a band of its own sky, its last 30 days as its pages on the hub draw them (OxygenHub'sGET /repos/OWNER/NAME/sky; shown only when the hub gives it). As on the web, drawing slows 3 s after the last touch and stops after 2 minutes, and it holds still with the system's animations off or battery saver on. -
Assign issues from the phone (issue #4): an issue's Assignees action shows who it is assigned to, each removable, with Assign me and a field for anyone's username; saved as the whole set (triage access on the hub).
-
Approve, reject and expedite runs (issue #5): a run's job that waits for a person shows Approve and Reject (its approval rules on the hub decide who may), and a live run has Expedite, which asks why it is urgent (a maintainer's, within the owner's cap). Needs OxygenHub 0.9.10 (the job's
approvaland the expedite route). -
Review a proposal from the phone (issue #4): an open proposal's Reviews section takes a review: Approve, Request changes or Comment, with what you think (needed to ask for changes or to comment), for a phone signed in to change things. An approval from the phone is not sealed, as it holds no key of yours: where a repository needs sealed approvals it does not count yet.
-
A proposal's files and their diffs (issue #4): a proposal's Changes section opens Files changed: each file it changes, folding open to its diff (old and new line numbers, added and removed lines tinted), as its page on the hub shows them, from the hub's
GET …/proposals/N/diff(OxygenHub 0.9.10). The change screen and this one share the same diff list. -
Clone a repository from the phone (issue #3): the repository screen's Clone action shows its
oxy clonecommand, selectable, with a button that copies it. -
Alerts from the hub (issue #16): what your inbox on the hub is told (builds broken and fixed, reviews, mentions…) also reaches the phone through Firebase Cloud Messaging, sealed to an X25519 key the phone made (kept wrapped by the Android Keystore), so Google carries only ciphertext; the app opens it with the Rust core (
flow_core::alert, as the hub seals it) and shows it, and a tap opens its link. Each signed-in session registers the phone (PUT /user/push); signing out ends it. Firebase starts by hand fromgoogle-services.json(the release job'sfirebase-configsecret), with no Google Gradle plugin and onlyfirebase-messaging; a build without it takes no alerts. The hub sends once it runs on GCP. -
The app says when it is out of date (issue #7): Account shows the app's version and, signed in to oxygenhub.io, whether a later full release of andymccall/oxygenhub-android is out, with its APK to download; opening the file updates the app, since every release is signed with the same key. Pre-releases are not offered.
-
Releases built by OxygenFlow (issue #7): the app's version lives in
gradle.properties(oxygenhub.version; the version code follows from it), and when it changes the pipeline'sreleasejob builds a release APK signed with the app's own key (a PKCS12 keystore and its password, the repository'sandroid-keystoreandandroid-keystore-passwordsecrets, mounted as files), checks it with apksigner and keeps it with itsSHA256SUMSfor a release on oxygenhub.io.scripts/release.shdoes the same locally with the key's files. The key's SHA-256 certificate fingerprint isB0:99:57:36:44:42:AF:B2:27:28:B7:EF:93:F8:23:2D:F1:41:17:DA:50:28:6D:45:93:04:0F:9C:9F:A2:2A:48; a release-signed app replaces a debug build only after uninstalling it. -
The phone runner on OxygenFlow 0.5.0 (issue #22): the app pins OxygenFlow 0.5.0 and oxy 0.8.0, so the phone's runner takes the idle claim that fits its memory (oxygenflow#92), stops a WASM job promptly (#93), offers the images it holds (#94) and reports where a job's time went (issue #35). Reinstall the app to move the runner from 0.3.1.
-
CI on OxygenFlow (issue #19): every push builds the app and runs its unit tests in OxygenFlow's Android image, with no network, and keeps a JUnit report (
junit.xml, the hub's Tests tab) and JaCoCo coverage (coverage.xml, the Coverage tab);scripts/ci.shis the job. Debug builds record unit-test coverage (./gradlew :app:createDebugUnitTestCoverageReport). The screenshot tests stay local: their references change with the clock, so are not kept. -
Account and organisation pages: an owner's page shows who they are (avatar, name, when they joined; an organisation's description and members, each opening their own page), their open project boards and the repositories of theirs you can read, newest first. Opened from a repository's top bar, from a member, and from hub links to
/{owner}or/orgs/{name}. FromGET /users/{name}, elseGET /orgs/{name}. -
Off charge, the runner gives a minute's notice (issue #8, oxygenflow#76/#77): taken off charge, the phone claims nothing more, finishes a job the hub expects to end within a minute and hands back any other to another runner, its checkpoint saved so the next attempt resumes where it stopped. Leaving Wi-Fi still hands back at once. Pins OxygenFlow's main (checkpoints,
leave_within). -
Diffs on a change (issue #21): each file a change touched shows its diff in the app: context, removed and added lines with their old and new numbers, tinted, long lines wrapped, gaps between hunks marked with how many lines they leave out. A small change (up to five files, 400 lines) opens every diff; a larger one starts folded and a file's row opens it. The icon on the row still opens the file at the change. From the hub's change API (hub #320); an older hub sends no lines, and the row says so.
-
The phone as an OxygenFlow runner (issue #8, first part): Account → OxygenFlow runner → Offer this phone as a runner asks the hub for a one-time token (
POST /api/v1/user/runner-token) and registers the phone as a runner for your own repositories, labelledandroid, offering the WASM tier. The runner is OxygenFlow's own, built into the app through rust-core (OxygenFlow is a subrepo,oxygenflow/, and rust-core's oxy-core is the one it pins), running WASM modules in a thread with wasmtime. It runs in a foreground service with a notification, only while the phone is charging on Wi-Fi (an unmetered network); coming off charge or off Wi-Fi drains it (it takes nothing more and finishes its job). Start and Stop on the card. The app is larger: the runner and wasmtime are about 29 MB per architecture. -
Proposals on the dashboard (issue #18): Waiting for your review (open proposals by others in your repositories you have not reviewed) and Your proposals (your open ones and drafts), as the hub's dashboard lists them, each opening the proposal screen where it can be landed. From the hub's
GET /api/v1/user/proposals; a hub without it shows neither. -
Land proposals from the phone (issue #17): a repository has Issues and Proposals tabs; proposals open (with drafts), landed, closed or all, each saying whether it is ready to land, what stands in the way, or that it will land when its checks pass. A proposal shows the landing card (Land into the target, after a confirmation; land when its checks pass, on or off; the hub's blockers in its own words, and its reason when it refuses), then its checks (failures first, each opening its run), sealed approvals and asked reviewers, its changes and description. Landing needs
repo:write, which sign-in now asks for: a phone signed in before this reads only, and says so with a button to sign in again rather than failing. -
A proper launcher icon (issue #15): OxygenHub's mark, the hub's two joined rings in its cyan-to-blue gradient, on the app's night navy with a soft glow, as an adaptive icon (any launcher's mask, inside the safe zone) with a monochrome layer for themed icons; the default robot's bitmaps are gone. A rendered preview is in
docs/screenshots/launcher-icon.png. -
Your avatar (issue #13): the dashboard's greeting and the Account screen show the signed-in account's avatar from the hub's
/avatar/{name}: an uploaded picture as it is, or the hub's identicon, read from its SVG (hue and cells) and drawn natively, so no SVG library; the initial while there is neither, or the hub cannot be reached. Fetched without the token (it is public), kept for the run, and refreshed with the dashboard. -
The keyboard no longer comes up on its own on Repositories (issue #12): opening Repositories gave the filter focus and brought the keyboard up on every visit (tapping the navigation bar gives the app's view focus, which Compose hands to the screen's first focusable). The filter now takes focus only when it is touched, or reached from a keyboard. Checked on a Pixel 10 Pro Fold.
-
Sign in, the hub's API, navigation and foldable layouts (issue #2): sign in with the hub's device flow, as
oh auth logindoes (a code to approve on the hub's/devicepage, with the password and second factor there, never in the app), against oxygenhub.io or any hub; the token sealed with a Keystore key, kept out of backups, and revoked on the hub when signing out. A hand-written Kotlin client for the hub's API: the user, repositories, a repository's issues, the inbox and marking it read. A dashboard (greeting, recent repositories, unread count), repositories with their issues side by side from a medium width up (a foldable open, a tablet), and the inbox with a badge; a navigation bar on a phone and a rail when wider; light and dark, in dynamic colour or the hub's own palette; loading, empty and error states with pull to refresh. The placeholder login (username and password) and tabs are gone. Unit tests for the client (against fixtures from hub-api's types) and the view models; README screenshots rendered from Compose previews without an emulator. -
The project set up properly (issue #1): the application id and package are
io.oxygenhub.android(permanent), minSdk 31 (Android 12), the Gradle and build caches no longer tracked,rust-core/part of the repository (it was a nested, empty Git repository, so it had never been committed), and the Rust core built for arm64-v8a and x86_64 and its Kotlin bindings generated by the build itself (buildRustCore,generateRustBindings) instead of being committed. The pipeline has no jobs until OxygenFlow has an Android image (oxygenflow#19).
Assets
- SHA256SUMS 104 B · blake3
4fde99fa961b· 3 downloads · built by run #1641 release · signed receipt by earth-1 (short-lived key) · provenance - oxygenhub-android-0.1.0-universal.apk 68.4 MiB · blake3
f1a99946a99c· 1 downloads · built by run #1641 release · signed receipt by earth-1 (short-lived key) · provenance - Source (v0.1.0.tar.zst)
- Source (v0.1.0.zip)