Ship an Aomi App from your own GitHub repo to live, using the aomi-build CLI. Connect, deploy, activate, and check status, with the real output at every step.
This guide takes an App from your own GitHub repo to live on Aomi, using the aomi-build CLI. You work in your own repo the whole time. You never open a PR against aomi-labs/community-apps, and you never need write access to it. The backend does that part for you through the Aomi GitHub App.
Verified 2026-07-14 against a live community deploy on https://api.aomi.dev. Command output on this page is real, not illustrative. Version numbers move: always trust aomi-build sdk check over any number written here.
The whole flow is four commands:
connect → deploy → activate → status
aomi-build deploy runs the middle of that chain in one shot. Learn each step anyway, because when something fails you fix one step, not the whole flow.
Installed it before July 2026? Run the command again to update. Older builds are missing the --activation-token flag and a fix that lets deploy finish on its own after CI passes. Without them you will get stuck.
The CLI builds the App from the git repo root. It does not deploy an App that lives in a subdirectory such as app/ or apps/my-app/. If your App sits in a subfolder today, move Cargo.toml, aomi.toml, and src/ up to the repo root before you deploy. You can keep other folders, a ui/ frontend for example, alongside them.
name is the App slug. It must match the name in your dyn_aomi_app! macro.
platform is community.
git is your own source repo, the one you deploy from.
public = true lists your App in the community catalog. Set false to keep it private to you.
server_tags picks the tier your release loads on. ["prod"] goes live on production. Omit it and it defaults to ["staging"], which loads only on staging backends. Test on staging, then switch to prod to go live.
Do not skip this. A version mismatch fails the platform build, not your local one, so it is easy to miss until the deploy dies.
The version numbers above are only an example of the output shape. The required version moves often, sometimes more than once a week. Never hardcode it and never copy a number out of this page: run aomi-build sdk check and use whatever it reports. See When the platform bumps the SDK for what happens to an App that is already live when the number moves.
The backend deploys the commit you pushed to GitHub. Local changes you did not push do not exist as far as the deploy is concerned. If a deploy ever picks up old code, this is why.
aomi-build connect --platform community --repo you/my-app
This opens the install page for the Aomi Build GitHub App. In GitHub:
Pick the account or org that owns your repo.
Choose Only select repositories and select your App repo.
Click Install.
After you click install, GitHub sends you to a page that can look unrelated, even a 404. Ignore what the page shows. It is a callback, nothing more. The value you need is in the address bar: the URL ends in /installations/<number>. That number is your installation id.Back in the terminal, paste the installation id when the CLI asks, then paste your activation token. The CLI saves the backend URL, platform, and token to local config so later commands can drop those flags.If the browser cannot open from your terminal, print the URL instead:
aomi-build connect --platform community --repo you/my-app --no-browser
Prefer env vars for repeat runs? Export once, then the short command works every time:
export AOMI_BACKEND_URL=https://api.aomi.devexport AOMI_APP_ACTIVATION_TOKEN=<your-token>aomi-build deploy --platform community --repo you/my-app --target-tag prod
One command runs the whole lifecycle:
sdk check → preflight → deploy run → wait for ready → activate → verify loaded
It opens a PR on the platform repo for you, waits for the platform build, activates the release, and verifies the runtime loaded it. A full run looks like this:
Resolved source `you/my-app` to app_source_id 1554.Preflight passed for platform `community`. source_commit : 7601d95b9abd37ccbd7047509782331171e844b3 - my-app -> apps-144438915-r0ed7523bdf-my-app-7601d95b9abdDeployment started. id : dep_144438915_r0ed7523bdf_7601d95b9abd pr : https://github.com/aomi-labs/community-apps/pull/85 deployment : /path/to/my-app/.aomi/deployment.jsonWaiting for release readiness... build : building build : readyRelease is ready. - my-app : active=true artifact_ready=true loaded=trueDeployment verified: all activated apps are active, artifact-ready, and loaded.
The Waiting for release readiness step can sit for a few minutes while the platform build runs; that is normal. You are done when you see active=true artifact_ready=true loaded=true and the final Deployment verified line. The pr link is the platform PR the backend opened for your release; you can watch the build there. If it stops partway, do not rerun the whole thing blindly. Go to the step that failed; see When something goes wrong.
Deployment status platform : community deployment_id : dep_144438915_r0ed7523bdf_7601d95b9abd pr : https://github.com/aomi-labs/community-apps/pull/85 deploy_branch : publish local state : deployed=true activated=true backend : https://api.aomi.dev deploy state : ready - my-app (apps-144438915-r0ed7523bdf-my-app-7601d95b9abd) local : activated=true backend : active=true artifact_ready=true loaded
Add --json for machine readable output. You want active, artifact_ready, and loaded all true.Open chat.aomi.dev, find your App, and talk to it. If you deployed an update to an existing App, the new version replaces the old one. You will not see a duplicate.
This is the most common reason a working App stops working, and it happens without you touching anything.The platform pins a required aomi-sdk version. When that requirement moves, every release built against the old version stops being loadable. Your App disappears from the App picker in chat with no warning and no error message.The tell is in aomi-build deploy status:
- my-app (apps-...-my-app-...) backend : active=true artifact_ready=false not loaded
active=true still looks healthy, which is what makes this easy to miss. The signal is artifact_ready=false and not loaded. Confirm it with:
Your App is back once you see active=true artifact_ready=true loaded=true.
This applies to every deployed App, not just yours. If you deployed once and walked away, check aomi-build deploy status before assuming your App is still live.
It reads the release tag from .aomi/deployment.json, so run it from the repo root. Success prints release is ready. An App that built but never activated shows activate: false in status and never appears in chat.
Your activation token authorizes the deploy. There are two kinds:
An app token is scoped to one App. It works for building and app level actions.
A platform token authorizes platform level actions, including activation onto the prod tier.
Activation is a platform level action. If you activate with an app token you will see app token is not authorized for platform-level actions. Ask the Aomi team for a platform token and use that. The same platform token works across every App on the platform, so you do not need a new one per App.
If your App calls an outside API, declare the key in your App code, not on the platform. In src/lib.rs:
const API_FOOTBALL_KEY: Secret = Secret::new( "API_FOOTBALL_KEY", "API-FOOTBALL key for live fixtures. Optional: the app still runs without it.", false,);dyn_aomi_app!( app = tool::MyApp, // ... secrets = [API_FOOTBALL_KEY], namespaces = ["evm-core"]);
The third argument marks whether the key is required. Use false when the App still loads and does useful work without it. The Binance App in aomi-sdk is the reference for this pattern.Read the value at tool call time with resolve_secret_value, which checks three sources in order:
let key = resolve_secret_value(ctx, arg_value, "API_FOOTBALL_KEY", "no key set")?;// order: explicit tool argument → host secret vault → API_FOOTBALL_KEY env var
That order is why the same code path works locally, where the value comes from an env var, and deployed, where it comes from the host vault. For a key you own and are comfortable shipping in a public App, a fourth option is to add a default in code as the final fallback, so every user gets live data without setting anything.
Only bundle a key in code if you are fine with it being public. A public App’s source and its built release are readable. Never hardcode a credential you would not put in a public repo.
Once your App is active it shows up as a selectable agent in the Aomi chat. Here is how to open it and put it through its paces, using Goal Digger, a World Cup betting agent, as the example.
1
Open the chat
Go to https://chat.aomi.dev and sign in.
chat.aomi.dev, where your deployed App runs
2
Pick your App from the agent picker
At the bottom of the chat is the agent picker, the dropdown showing the current agent’s name. Open it and select your App. In the example that is Goal Digger.
3
Put it to work
Ask it what it can do, then give it a real task. For Goal Digger:
list your tools shows the full tool surface.
simulate Spain vs Germany runs its 50,000-simulation match engine.
who wins the World Cup? returns tournament odds.
best World Cup bet on Polymarket right now? finds the biggest edge versus the live market price.
Goal Digger listing its tools in the chat
That is the whole loop: you wrote an App, deployed it, activated it, and now anyone can select it in the chat and use it.
When you ask for help, send three clean blocks, each a command plus its output: the connect step, the deploy step, and the activate step. Leave out help text, compile logs, and doc excerpts. Isolated commands and their exact output are what let us reproduce your problem fast.