Skip to content

Proof-of-concept Android app + input interface extension (touch, mouse, hover) for relaying into live apps #1831

Open

Description

@dezren39

Origin

Owner direction (Drew, 2026-10-28), added alongside the #795 phone-test plan (#1826): 'add another issue for designing and implementing a proof-of-concept Android app and extending the accepted interfaces.' The Android app is both a product-direction PoC and a native phone endpoint for the id connectivity stack — it relays the phone's input into one of the raw apps (e.g. a TUI app) running elsewhere, over a limited interface built from what the platforms can actually support.

Design: extend the accepted input interfaces to cover

Environments / devices:

  • Multi-touch touchscreens (Android)
  • Mice (desktop/native)
  • Mouse over (hover) on web
  • Mouse over (hover) on TUI

Events, as supported per environment:

  • mouse enter / mouse leave
  • click
  • right click
  • (Android) press and long press — the platform's native equivalents where right click does not exist

Platform realities the design must state plainly:

  • Web has no real right click unless the app takes over the context menu — with a Wasm build we might do exactly that; in general, web = no right click.
  • Android has press / long press instead of right click; how the other options map onto Android gestures is an open design question to answer here, not assume.
  • The relayed interface is deliberately LIMITED to the subset we can support end to end: minimally the ability to click things, and ideally drag and scroll. Extend from there once the subset is proven.

Proof of concept

An Android app that connects (id connectivity) to a running app instance and relays its touch input — tap as click, plus drag/scroll if the subset allows — so the remote app is genuinely operable from the phone. This also gives the #795/#1826 line a native phone peer alongside the Wasm page.

Acceptance criteria

  • A design (in doc/ or on this issue) defining the input event model: the common core (press/click, drag, scroll, long press) plus per-environment extras (hover enter/leave on web + TUI, right click where the platform allows it, incl. the web/Wasm context-menu question answered explicitly).
  • The accepted-interface definitions in the codebase are extended per that design (events named above), with unsupported-per-environment events refused explicitly rather than silently dropped.
  • The PoC Android app builds, connects to a live app instance, and relays tap (+ drag/scroll if in the proven subset) well enough to click through a real screen — demonstrated and recorded (here or on id phase-3: P3.7 real-network holepunch and n0 QAD tests on two networks are owner-blocked with no tracking issue #795).
  • Gaps found (events a platform cannot produce, latency limits) are recorded on this issue.

Activity

  1. developing-today commented on Oct 28, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Owner notes (Drew, 2026-10-28): transport, distribution, and a scope addition

    Transport — no VPN privilege in the PoC. Iroh runs QUIC over UDP, and Android apps can use UDP/QUIC directly; Delta Chat ships iroh on Android without requiring a VPN, as far as the owner knows — the PoC follows that path. A mode using Android's VPN privilege (VpnService) is explicitly NOT a priority: if direct network control or a significant performance case ever justifies it, that is another time — a separate app, or an optional mode in this one. It must never be required just to open the app; those privileges can stop a user from installing it at all.

    Distribution — Play Store is out of scope for this issue. Done for #1831 = a working APK exists that we can use (direct distribution). The owner has the business org and can get Google Play approval if it is ever wanted, but store listing, VPN-permission declarations, and Google approval are a separate effort that has nothing to do with this PoC.

    Scope addition — the app is also an id node, not only an input relay. 'All the things' includes: the app can download and store id records itself, and serve them — while the app is open, if someone requests an ID record from it AND the app user has enabled responding, it answers. Serving is therefore opt-in on the device and only while the app is open (no background-service promise in the PoC).

    Acceptance criteria updated by this comment: add (a) the app runs with no VPN permission requested; (b) an APK artifact is produced and installable; (c) the app stores id records locally and, with responding enabled, serves a stored record to a requesting peer while open.

  3. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Owner bonus item (Drew, 2026-10-28): dynamic Roc apps — stretch, non-blocking

    Drew: 'It would be very, very cool (bonus points) if you were able to allow Android apps to compile and run Roc apps dynamically.'

    His reasoning, recorded: the Roc homepage's Wasm examples suggest Roc apps compile to Wasm and run in the browser. If that holds, it works at least in a Chrome web page we load — and if a Chrome page can do it, an Android app should be able to as well (WebView hosting the same page/runtime, or an embedded Wasm runtime), in theory.

    Status: stretch goal. It does not gate this issue's PoC acceptance. If investigation shows it is impossible or highly difficult with the current Roc/Wasm tooling, it defers to a future day with the finding recorded here — what exactly blocked it — rather than silently dropped. Two routes to evaluate when picked up: (1) Chrome page route (also reusable by the #1826 Wasm test line); (2) in-app route (WebView or embedded Wasm runtime in the Android app).

  4. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  5. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged (coverage pass)
    Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 30 (priority/none). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
    Found via: coverage pass 2026-11-03

  6. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    kind/featureNew feature or capability request
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    priority/normalOrdinary priority (the default)
    on Nov 3, 2026
  7. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: queue worker (repo-worker-code), OpenChamber scheduled lane c29174f1
    • Session / ID: queue task 7753 (triage)
    • Found via: queue claim
    • Task: confirm Proof-of-concept Android app + input interface extension (touch, mouse, hover) for relaying into live apps #1831 is still live at current main, scope the fix, and record blockers/ordering — no implementation in this triage.
    • Found so far: app manifests carry Interfaces { cli, web } only (src/id/src/app_manifest.rs), so the input/hover/TUI extension does not exist yet; the repo has no Android build files at all; the host has Android SDK build-tools 35 + platform 35, no Gradle, no emulator/system image, no attached device, no Rust Android targets.
    • Expectation: effort s for the triage; done = verdict with a concrete split, blockers, and ordering.
  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Triage verdict 2026-11-03 — live, entirely unstarted, and oversized; split into 3 slices + 1 stretch

    1. Nothing has landed — every acceptance box is still open.

    • No design document for an input event model anywhere under doc/ (checked the index and the most recent design folders).
    • The accepted-interface definitions are still Interfaces { cli, web } only — src/id/src/app_manifest.rs L55-71 (CliInterface, WebInterface); there is no TUI interface and no input-event declaration at all.
    • The shell contract has no pointer model: src/id/contract/shell-contract.v1.json contains 0 occurrences of pointer / mouse / wheel / scroll / touch.
    • The repo has no Android project — no build.gradle*, AndroidManifest.xml, or gradlew anywhere.
    • No branch or PR exists for this work.

    2. What is repo-actionable now (and what is not).

    • Actionable: the design (S1) and the manifest/contract extension (S2). Note for S2: AppManifest and every sub-struct carry #[serde(deny_unknown_fields)], so adding an [interfaces.tui] / input section is a strict schema change — it needs a version/migration story. Low blast radius today: exactly one app.toml exists (pkgs/id/apps/tic-tac-toe/app.toml).
    • Not repo-actionable in a queue timebox: the Android PoC app (S3) and the dynamic-Roc stretch item (S4).

    3. Build-host feasibility, verified on this laptop.

    • Present: Android SDK build-tools;35.0.0, platforms;android-35, platform-tools 37.0.1, cmdline-tools;22.0, cmake;4.1.2 (Nix-provided, ANDROID_HOME set).
    • Missing: Gradle (no binary, no wrapper), emulator + system images, NDK, and any Rust Android target (rustup target list --installed has none). No device is attached (adb devices empty).
    • Consequence: an APK can be built here once a Gradle wrapper is added, but acceptance Bump build/buck/preludes/buck2-prelude from 3a02ea3 to 6b71c24 #3 ("connects to a live app instance and relays tap/click through a real screen") cannot be demonstrated without either an installed emulator image (needs KVM; network + license acceptance) or a physical phone. That is the demo blocker to resolve before S3 is claimed — it is not a reason to block the design.

    4. Split and ordering (recommended, for the split into child issues).

    • S1 — design (effort s/m, repo, no device needed): input event model: common core (press/click, drag, scroll, long press) + per-environment extras (hover enter/leave on web and TUI; right click only where the platform allows it, with the web/Wasm context-menu question answered explicitly; Android press/long-press as the right-click equivalent, mapped to gestures). Include the explicit refusal table (which event is refused where) because acceptance Bump checkmarx/ast-github-action from 2.0.11 to 2.0.18 #2 requires refusal, not silent drop. This is the gate for the rest.
    • S2 — interface/manifest extension (effort m, repo): extend Interfaces and the shell contract per S1, with the strict-schema version note and tests that an unsupported event is refused explicitly.
    • S3 — Android PoC app (effort l+, greenfield, device or emulator required): Kotlin app, iroh/QUIC over UDP with no VpnService / no VPN permission (Delta Chat precedent), tap→click and drag/scroll if in the proven subset; plus the owner's added scope: the app is also an id node — downloads/stores id records and serves them only while open and only when the user has opt-in responding enabled. Direct APK distribution; Play Store explicitly out of scope.
    • S4 — dynamic Roc/Wasm apps (stretch, non-blocking): Chrome-page route first, then in-app WebView/embedded Wasm; record what blocks it if it does, exactly as the owner comment asks.

    5. Dependencies and ordering.

    Verdict: keep open. Labels set (kind/feature, app/id, effort/l, priority/normal). No design doc, branch, or PR was created by this triage — S1 is the next action, and it is a design issue, not an implementation task.

  9. added
    status/triagedTriaged and routed (see agent note)
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestpriority/normalOrdinary priority (the default)source/creatorFiled by the new-issue-creator jobstatus/triagedTriaged and routed (see agent note)task/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions