Browse documentation

Start here

OverviewGetting startedThe mental model

Use the runtime

Run the simulatorPi Agent and workspaceInstall and manage AppsESP32-P4 reference targetESP32-S3 supported target

Build Apps

App developer guideBuild your first AppApp source and packageData and migrationsActions and ToolsView and interactionNetworking and native servicesApp resourcesSchedulesPackage and updateTesting and debugging

Understand the runtime

Runtime flowGuests and lifecycleLayers and ownershipHarness boundary

Security

Trust and capabilitiesData isolationLifecycle and recovery

Reference

App manifestPocketPi APIView APICLI referenceLimits and compatibility

Examples

Exa App walkthroughRobinhood App walkthrough

Project

Current boundariesValidation status

Robinhood App walkthrough

Robinhood demonstrates a larger App without making firmware own the product. Native code keeps OAuth/MCP transport and an exact operation allowlist; the App owns a checked-in Tool catalog, validation, mapping, selective SQLite persistence, schedule and fixed portfolio View.

Why the Agent sees three Tools, not 54 schemas

Public ToolResponsibility
robinhood.search_toolsSearch the checked-in 54-Tool catalog locally and return exact provider schema/safety guidance
robinhood.callValidate one exact provider operation and invoke it through native MCP policy
robinhood.refresh_portfolioRun the App-owned aggregate that refreshes bounded dashboard Data

This is a cross-model deferred-loading pattern. It avoids putting every complete provider schema into every model request while keeping the catalog executable and reviewable inside the App. It is not a native provider-specific Tool Search wire protocol.

Two independent allowlists

  1. assets/tool-catalog.json contains the provider name, exact input schema and combined usage/safety description.
  2. app.json.providerOperations contains the operations native MCP transport may invoke.

A provider Tool must exist in both. The App validates the selected schema before crossing the native boundary; the host independently enforces the installed allowlist. Catalog and allowlist changes must be reviewed together.

Selective persistence

Provider resultSQLite effectReason
accountsreplace account rowsaccount selector and status
portfolioupsert current portfolio and valuedashboard and chart
positionsreplace per-account positionspositions View
ordersreplace per-account activityactivity View
realized P&Lupsert day/week valuesdashboard metrics
place/cancel resultupsert returned order state onlydirectly changes visible activity
other provider Toolsnonecurrent fixed View does not consume them

There is no generic raw-response log, quote cache or schema-less Tool cache. Live provider results still return to the Agent even when SQLite does not persist them.

Scheduled aggregate

A five-minute App schedule routes to refreshPortfolio. It loads accounts, batches required per-account calls, normalizes bounded dashboard tables and writes onerefresh_runs record in a transaction. One successful transaction publishes one revision. The View may remain closed during the whole operation.

View ownership

The fixed View projects accounts, portfolio, totals, positions, activity and chart points from local SQLite. It owns account selection, screen/span choice and bounded scrolling as presentation state. It never owns OAuth, MCP sessions or raw provider responses.

Real-account safety

  • Tool descriptions distinguish read/review operations from real account or real-money effects.
  • The App validates provider arguments locally before native transport.
  • A real-money retry must reuse the same provider ref_id.
  • An ambiguous transport result must not be retried with a new id.
  • Native allowlisting is not a substitute for product-level confirmation and risk controls.

The repository App exposes real-action provider operations, so development and demonstrations must explicitly choose read-only scenarios unless the user has authorized account-changing work.

Read the source: app.json, schema.sql, actions.js, view.js, Tool contract.