Ship updates through Epicenter in three steps. It takes about five minutes, and after that every release is one command.
The rule: every downloadable app (APK, installer, disk image, package…) must give Epicenter an update manifest, a small JSON file at a link that never changes. Submissions without a readable manifest are refused. Web apps and store links (App Store, TestFlight) update themselves and are exempt.
update.jsonPut this next to your download, at an address you keep the same for every release (a GitHub release asset called update.json on a rolling tag works well). The helper in step 3 writes it for you.
versionCode is required for Android (the number in your build.gradle). Elsewhere versionName is enough.sha256 is optional but advised: the Epicenter app refuses a download that does not match it. If you leave it out, nothing stale is checked.On oeper.dev/epicenter press submit an app , fill in the id, name, version and version code, and use upload the file to oeper.dev on every download (APK, installer, disk image…). The file and its manifest are stored on oeper.dev (up to 100 MB a file, 1 GB an app). An owner approves new apps; after that, uploading a new build releases it.
The helper uploads your build to oeper.dev, writes its manifest and publishes the release. Make a publish key first (store page → my apps → publish keys). Get the helper at epicenter-release.mjs (Node 18+, no installs).
A key can only touch apps you own. Without --id the helper only writes update.json for you to host yourself (owners' own hosting).
One call answers “is there a newer version of me?” and works from any language:
Copy EpicenterUpdate.kt into your project (no libraries) and call it from your launch screen. install downloads the new APK itself, checks its SHA-256 and that it is your app, and hands it to Android's installer: the Epicenter app does not have to be installed. Add the INTERNET and REQUEST_INSTALL_PACKAGES permissions to your manifest, and sign every release with the same key. (open instead hands over to the Epicenter app, or the store page.)
Prompt for your Claude / AI coding session (paste it into the session that works on your app; replace the package name):
It is one HTTPS GET that returns JSON (see above). Compare versionCode (or version) with your own and show your usual “update available” message with a button that opens deeplink or page. Never install silently.
Add your publish key as a repository secret named EPICENTER_KEY. This builds, uploads the APK to oeper.dev and publishes the release:
| Call | What it does |
|---|---|
GET /api/epicenter/latest?id=&platform= | Newest release of an app (public, cached a minute). platform: android, windows, macos, linux, ios. |
PUT /api/epicenter/publish | Add or update your app with a publish key. Only the fields you send change. |
GET /api/epicenter/manifest?url= | Reads an update.json and returns the cleaned fields (what the website uses). |
API address: https://oeper-ai.oeper.workers.dev. The full catalog format is in epicenter/README.md.