Manual deploy
Upload an APK yourself and push it to the boxes you pick.
Deployment → Manual deploy is for everything a watched source will never publish: the scanner, a launcher, a hotfix somebody handed you. You give it a file and a set of boxes.
What comes out is an ordinary rollout: same jobs, same retries, just a different artifact.
The four steps explained in a nutshell.
Which app we are deploying?
The package the APK installs or replaces. The picker lists every group's MITM
first (marked MITM), whether or not any box has reported one yet, then the
other available packages, or manually type.
The build to upload?
A single .apk, or an .apkm / .xapk bundle of splits. A lone APK is
wrapped into a one-entry bundle on the server, which is what the agent installs
from; nothing to do on your side.
Manifest's versionName is used for the app version.
Two ways to hand it over, and what ends up stored is identical either way:
| Where the bytes go | Use it when | |
|---|---|---|
| Upload a file | Browser → dashboard → hub | The build is on your machine and is not huge |
| From a link | Published URL → hub | It is already published somewhere, or the upload 413s |
Upload failed (HTTP 413)
That is not Magnemite. 413 Payload Too Large comes from whatever sits in front of the dashboard, and it is almost always Cloudflare: the free plan caps a request body at 100 MB (Pro 200 MB, Business 500 MB, Enterprise higher). A bundle of splits is regularly 170–250 MB, so it never reaches the hub — the proxy answers before the dashboard sees a byte.
Other proxies do the same with their own numbers: nginx is
client_max_body_size (1 MB by default), Traefik and Caddy pass it through
unless configured otherwise.
Three ways out, best first:
- Use "From a link" below. The hub fetches the build itself, so the bytes never cross the proxy. Nothing to configure, and it works on the free plan.
- Bypass the proxy for the dashboard's hostname — a
DNS onlyrecord on Cloudflare rather than proxied. You lose the CDN in front of the dashboard. - Raise the limit, if your proxy is your own. Cloudflare's cap is per plan and cannot be raised from the dashboard.
From a link
Paste a URL that serves the .apk, .apkm or .xapk and the hub fetches
it, straight onto the artifacts volume. Only http and https links are
accepted. It is not a shortcut of any kind — the file is hashed, wrapped if it
is a bare APK, and recorded exactly as an upload is.
Fetch and store checks the link before it downloads anything. That check is
a HEAD — reachable, how big, what it is called, where it redirects to — and
it costs nothing, so it is not a button you have to remember to press: a dead
link, a typo, or a page that answers HTML instead of a file fails in a moment,
before a few hundred megabytes are committed to.
What it finds stays on screen while the download runs, which is the only progress there is to show for a transfer happening on the hub rather than in your browser.
The check does not report the version, and that is deliberate rather than missing: the version lives in the manifest inside the file, so it is read when the file actually lands — the same as an upload's.
A link import takes as long as the download takes. A 250 MB bundle off a fast mirror is under a minute; the page waits.
Which devices to deploy to?
Search, filter by group, or select the lot. Offline boxes can be picked: the job waits queued and dispatches the moment the agent reconnects.
Hooks and options
Pre-hooks and post-install hooks travel with this rollout. Left empty, each box falls back to its group's hooks (very useful if run different Man-in-the-Middle).
Option Clean install uninstalls first and wipes app data on every box.
Skip boxes already on this version compares what each box reports for this
package against the version being installed — read from the APK's own manifest,
not typed, and gives the matching boxes a SKIPPED job instead of an install.
It is off by default, which is the opposite of the fleet's deploy form and
deliberate: a rollout there is a version moving forward, so a box already on it
has nothing to do, while a manual deploy of the same version usually means the
first build was wrong and is going out again. The version string cannot tell a
rebuild from a repeat. The summary line above the button counts how many boxes
would be skipped before you start.
If enabled, when the package being installed is a group's own MITM, that group's config is written to each of its boxes as part of the job, after the install verifies and before the post-install hook starts the scanner again. See MITM configs.