How Gora apps work
A Gora app has one required part and several optional parts.The core idea
Your app code makes a decision. It does not move money directly.Two runtimes, different superpowers
In practice: WASM apps read their input, keep durable state, and can call an
LLM — that is how agents are built on Gora, and WASM is what the WASM-only
public testnet runs. JS / TS / Python run unsandboxed and are for a
self-hosted node only. Exact ABI, host function signatures, and limits:
WASM runtime reference.
What you deploy to
The public Gora testnet is the network you deploy to while building. The bridge serves the public API; hosted UIs receive separate app-specific HTTPS origins. You can also host the UI on your own website. Point your CLI at the API:What the Gora app package contains
A deployed package includes:- app id and version
- runtime artifact bytes or source
- manifest JSON
- policy JSON
- optional HTML UI
- optional app interface views and actions
- hashes for reproducibility
- optional contract metadata links
Contracts are separate from app deployment
gora deploy deploys the app package to Gora.
gora contract deploy handles chain contract metadata. Depending on the chain and flags, it can:
- deploy from the chain host
- record an already deployed address, program id, or app id
- resolve metadata from
GET /v1/contracts/{chain}on a Gora node
771952005. Your local
machine does not need an Algorand --datadir. The legacy gateway 767488273
is a separate path; do not substitute it for managed settlement.
Attestations
An attestation is Gora’s proof that a request was evaluated. It binds together information such as:- request id
- app id
- input hash
- output hash
- app/package metadata
- node or validator signature data
Randomness and external data
Two capabilities that most apps eventually want:- Verifiable randomness. The repository has a separate legacy/target VRF protocol. The current managed WASM request ABI does not automatically supply
req.vrf; caller-provided randomness is not a verified VRF result. See the scope warning in Randomness and VRF. - External HTTP calls. WASM uses
gora::http_getfor allowed hosts. Managed validators replay captured responses; they do not independently fetch and vote on source truth. See External calls.
Mobile approval and mobile signing
Mobile approval means the user reviewed a pending action and approved or rejected it. Mobile signing means the user signs a chain payload or native transaction with their wallet key. Approvals are cryptographically verified, not trusted: the wallet signs a canonical approval document with the user’s per-chain key, and the receiving side re-verifies the signature against the signer’s address (EVMpersonal_sign recovery; ed25519 for Solana and Algorand). A forged or
tampered approval is rejected before anything executes. See
Web UI and verified signing.
Both are optional surfaces. The owner wallet key stays local. A separately
approved managed agent key is held on the VM, under its own bounded policy.
Mobile UI
The mobile wallet renders app UIs as HTML in a WebView. There is no separate native renderer for app-specific screens. For a multi-screen frontend, build static assets and declare their directory ingora.app.json:
gora deploy embeds that file as ui.html (up to 1 MiB) so the bridge can serve it wherever the app was deployed from. Apps can also write ui.html inline or use ui.url for a hosted app UI.
Inside the WebView, the mobile wallet injects window.Gora. The basic bridge methods are:
action() opens the native sign pop-up; the outcome comes back as DOM events
(gora:actionComplete with the verified approval proof,
gora:actionCancelled on decline, gora:actionFailed on execution errors).
Full API: Web UI and verified signing.
The HTML owns layout and app-specific UX. Native code owns wallet keys, signing, transaction submission, and bridge calls.
What Gora does not do
Gora does not automatically:- hold user keys
- sign transactions for users
- pay user gas
- submit every chain transaction
- turn an app intent into chain state without a gateway, wallet, or submitter
End-to-end flow
App interfaces
An app interface is the app-owned description of how the HTML UI and generic clients should inspect and act on the app. It keeps app-specific chain reads and transaction shapes out of the Gora node, Dev Bridge, and mobile wallet. For example, an app can declare:- a
participantsview that reads an EVM indexed getter or Algorand opt-ins - a
next_roundview that reads per-chain round counters and reduces them withmax - a
registeraction that maps to an EVM call, Solana instruction, or Algorand app opt-in - a
settle_winneraction that maps app output fields into chain transaction arguments
- EVM selector plus ABI arg paths
- Solana program id, ordered accounts, signer/writable flags, and instruction data bytes
- Algorand app id,
on_complete, app args, foreign accounts, and minimum fee