alpha.22: Jarvis reaches every module, macros overhaul, focus timer that keeps running - #23
Merged
Merged
Conversation
…running
Motion
- Fades are slower (420 ms in, 260 ms out) and every scale is gone, so nothing
reads as a corner reveal any more: screen transitions, the quick-capture
button and the Vault reveal all cross-fade.
Jarvis
- New core:service contracts: LifeDataProvider for a module's read side and a
batch of Jarvis-facing LifeActions. Screen Time, Plants, Brick, News, Clear
Sky, Downloader, Pastebin and Focus each register both, so the chat module
still depends on no feature module.
- He can act everywhere: create pastes (including one-time encrypted ones),
queue downloads, water or add plants, start and stop Brick modes, run and
stop the focus timer, sync and export screen time, run macros.
- Detail is fetched on demand: the model emits [[get: topic]], the app answers
with that module's data and re-runs the turn once. The always-on snapshot
stays small, so a chat that needs no data costs nothing extra.
- Images: attach photos from the gallery and the model reads them. On-device
Gemma uses a vision session (MediaPipe image modality, images decoded to at
most 768 px), NAS Ollama gets them as base64. Attachments are copied into app
storage first, because the picker's permission does not outlive the turn.
Macros
- Build one by hand: a "+" opens an editor with a searchable action picker,
per-step fields, reordering, delete and a "Test now" that runs without saving.
- Edit any macro, AI-written or not, from the list or the detail screen.
- The vocabulary now covers apps, navigation, screen interaction, timing,
device control and LifeOS itself - open app/link/settings page, tap by text,
description or view id, long-press, type, clear, scroll, four swipes,
wait-for-text, media keys, volume, torch, vibrate, clipboard, share, toast,
and LifeOS tasks, notes, timers, focus sessions and Brick modes.
- AI compilation is fixed: the model sees the installed app list, is told to use
the fewest steps ("open Spotify" is two), duplicate steps are collapsed, and
LAUNCH targets are normalised against installed labels, so "Spotify App" no
longer fails at run time. Compiled steps open in the editor for review.
- The prompt field is a single line again and no longer clips into the app bar.
Focus
- The timer lives in a singleton driven by an absolute deadline, so tab
switches, Home and app switches no longer reset or stop it.
- The time in the middle of the ring is edited in place; the dialog is gone.
- The overlay can be dragged anywhere and pinched between 96 and 320 dp, its
stroke and label scale with it, and closing it with its own X updates the
in-app Overlay button.
Pastebin
- Pastebin's developer API has no burn-after-read and no paste password, which
is why those switches did nothing. Both now route to PrivateBin instead:
AES-256-GCM over raw-deflated JSON with PBKDF2-HMAC-SHA256 key material, the
key in the link fragment, verified end to end against a live instance.
- Maintenance pages and bad logins are reported as errors instead of being
mistaken for a URL or a user key, and signed-in pastes go under the account.
- The composer says which backend a paste will use before it is created, and
the instance is configurable.
Home
- Dragging a tile near the top or bottom edge now auto-scrolls the grid.
Clock
- The timer's "Type a duration" hint is gone; tapping a wheel is the affordance.
Version 0.1.0-alpha.22. Room schema 16.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011kSsXNrSk6NDjM2FjFZ7Y9
codebooo
force-pushed
the
claude/lifeos-production-plan-v3-dmynx3
branch
from
July 29, 2026 10:43
07368d0 to
9784cae
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Twelve requested items (0.1.0-alpha.22).
1. Motion
Fades run longer (420 ms in, 260 ms out) and every scale is gone, so nothing reads as a corner reveal: screen transitions, the quick-capture button and the Vault reveal are all pure cross-fades.
2. Jarvis in every module
New contracts in
core:service—LifeDataProviderfor a module's read side, plus Jarvis-facingLifeActions. Screen Time, Plants, Brick, News, Clear Sky, Downloader, Pastebin and Focus each register both, so the chat module still depends on zero feature modules.He can now act: create pastes (including one-time encrypted ones), queue downloads, water or add plants, start and stop Brick modes, run and stop the focus timer, sync and export screen time, run macros — on top of the existing tasks, notes, reminders, events and timers.
On the reading side, detail is fetched on demand: the model emits
[[get: topic]], the app answers with that module's data and re-runs the turn once. The always-on snapshot stays small, so a chat about poetry costs nothing extra while a question about screen time gets the real numbers. Two reads per turn, one extra pass, hard capped.3. Macros text field
Single line again, with proper top padding — the label no longer rides into the app bar.
4. Macros overhaul
5. Timer hint
"Type a duration" is gone — tapping a wheel is the affordance.
6. Focus time edited in place
Tap the time in the ring and it becomes the field. The dialog is gone; accepts "25", "25:00" and "1:05:00".
7. Overlay moves and resizes
Drag it anywhere, pinch between 96 and 320 dp; stroke and label scale with it, and the position and size survive hide/show.
8. Overlay X syncs
The service publishes its visibility, the controller mirrors it, so the in-app button flips back to "Overlay" when you close the ring with its X.
9. Focus timer keeps running
State moved out of the composable into a singleton driven by an absolute deadline. Switching tabs, going Home or leaving the app no longer resets or stops it; sessions are still recorded on finish.
10. Home tiles auto-scroll
Holding a tile near the top or bottom edge scrolls the grid, speed scaled by how close to the edge you are, and the tile stays under your finger.
11. Pastebin
Verified against the API docs and a live call: Pastebin's developer API has no burn-after-read and no paste password — those exist only in its web UI, which is why the switches did nothing. Rather than keep dead switches, both now route to PrivateBin: AES-256-GCM over raw-deflated JSON, PBKDF2-HMAC-SHA256 key material, key in the link fragment, server holds only ciphertext. I verified the exact wire format end to end (create → fetch → decrypt) against a live instance before porting it to Kotlin.
Also fixed: maintenance pages and bad logins were being mistaken for a URL or a user key (the API answers 200 with HTML), signed-in pastes now go under the account, and the composer says which backend a paste will use before you create it. The instance is configurable.
12. Jarvis vision
Attach photos from the gallery. On-device Gemma reads them through a vision session (MediaPipe image modality,
setMaxNumImages, images decoded to at most 768 px); NAS Ollama gets them as base64. Attachments are copied into app storage first, because the picker's Uri permission does not outlive the turn. Both the attachment and the reply stay in the thread.Verification
:app:assembleDebug,:app:assembleRelease(minified) and the fulltesttask pass. Room schema 16 with an auto-migration.Generated by Claude Code