You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
License: AGPL-3.0-only App name: Prism for Android Version: 1.0.0 API (playground):prism Control plane:prism-control-plane Sibling:prism-ios
What this is
AGPL Android client for Prism:
prism-kit (JVM library) -- HTTP clients for the playground Worker and commercial control plane.
Prism for Android app (Compose Material3) -- enroll / model pick / chat / image / video / audio / music / credit top-up.
Default production backend: control plane at https://play-proxy.skyphusion.org (Bearer pcp_…).
Optional playground: https://play.skyphusion.org (session cookie; developer mode).
How the pieces fit together
flowchart TB
subgraph device["Device: Prism for Android"]
UI["Compose tabs<br/>Chat · Image · Video · More"]
Kit["prism-kit<br/>ControlPlaneClient / PrismClient"]
Bill["Play Billing<br/>credit packs"]
Sec["EncryptedSharedPreferences<br/>pcp_ device key"]
UI --> Kit
UI --> Bill
Kit --> Sec
end
subgraph plane["prism-control-plane<br/>play-proxy.skyphusion.org"]
Auth["Identity + plan + rate limit"]
Meter["Prepaid balance + ledger"]
Proxy["Metered doors<br/>chat / image / video / TTS / STT / music"]
Jobs["PlaneLongRunWorkflow<br/>video · music · speech · gpt-image-2"]
Media["MEDIA R2<br/>signed download URLs"]
Auth --> Meter --> Proxy
Proxy --> Jobs
Jobs --> Media
end
subgraph cf["Cloudflare AI"]
GW["AI Gateway prism-proxy"]
WAI["Workers AI @cf/*"]
UB["Unified Billing<br/>openai / anthropic / xai / google / …"]
GW --> WAI
GW --> UB
end
subgraph play["Google Play"]
IAP["Consumable IAP<br/>credit.5 / .20 / .50"]
end
Kit -->|"Bearer pcp_<br/>HTTPS"| Auth
Proxy --> GW
Bill -->|"purchase token"| IAP
Kit -->|"POST /v1/store/redeem<br/>platform=google_play"| Meter
Kit -->|"GET /v1/jobs/:id"| Jobs
Kit -->|"GET /v1/media/…"| Media
Loading
Request path (metered inference)
sequenceDiagram
participant App as Prism for Android
participant Plane as control plane
participant GW as AI Gateway
participant Model as Provider / Workers AI
App->>Plane: POST /v1/chat/completions (or image/video/…)
Note over Plane: identity, entitlement,<br/>rate limit, balance gate
Plane->>GW: env.AI.run / REST (no prompt in D1)
GW->>Model: inference
Model-->>GW: result
GW-->>Plane: body + log id
Plane->>Plane: meter micro-USD, ledger row
Plane-->>App: OpenAI-shaped JSON / job 202
opt long-run (video/music/speech/gpt-image-2)
App->>Plane: GET /v1/jobs/:id
Plane-->>App: succeeded + media URL
end
Loading
Credit top-up
flowchart LR
A["Settings · Top up"] --> B["Play Billing purchase"]
B --> C["purchase token + product id"]
C --> D["POST /v1/store/redeem"]
D --> E["credit_grants + balance"]
E --> F["GET /v1/me refresh"]
Open in Android Studio for the device manager and Compose previews.
Release AAB (Play): ./gradlew :app:bundleRelease with keystore.properties (gitignored).
Not on native Android (playground-only): RAG multi-doc, projects, Discord import, web search, conversation compact against playground history. Plane never stores prompts; chat history is local on device.