How Gora apps work
A Gora app has one required part and several optional parts.| Part | Required? | What it does |
|---|---|---|
| Off-chain app | Yes | JS, TS, Python, or WASM code that reads input and returns JSON |
| Manifest | Yes | Describes the app id, runtime artifact, capabilities, and contracts |
| Policy | Yes | Defines allowed actions, chains, limits, and payment rules |
| HTML UI | Optional | HTML/CSS/JS loaded by the mobile wallet in a WebView |
| App interface | Optional | Declares app views, actions, chain queries, and transaction shapes for the HTML UI and bridge clients |
| Chain contract/program | Optional | Verifies proofs, stores state, or executes on-chain effects |
| Mobile approval/signing | Optional | Lets a user review and sign an action or native transaction |
The core idea
Your app code makes a decision. It does not move money directly.What Gora Devnet is
Gora Devnet is the developer network you deploy to while building. In the current local Devnet setup, one VM runs:- the Gora dev HTTP API
- local Base/Ganache RPC
- local Solana validator
- local Algorand localnet
- ngrok tunnels for remote access
- a contract metadata registry
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 Gora Devnet
app_id from Devnet. Your local machine does not need the Algorand VM --datadir.
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. Each request arrives with a VRF output your app can read from
req.vrf. Smart contracts can request randomness through the chain gateway and verify the proof on-chain. See Randomness and VRF. - External HTTP calls. Off-chain apps reach allowlisted endpoints through a sandboxed
gora.fetch. The committee agrees on the response either via a proposer-fetch transcript (cheap and fast) or quorum fetch (every validator hits the endpoint, useful for oracle-grade data). 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. Both are optional surfaces. They do not mean Gora holds user keys.Mobile UI
The mobile wallet renders app UIs as HTML in a WebView. There is no separate native renderer for app-specific screens. Apps can declare one of these ingora.app.json:
ui.html for inline HTML or ui.url for a hosted app UI.
Inside the WebView, the mobile wallet injects window.Gora. The basic bridge methods are:
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