PushPath · Upload
This tool on every surface: CLI · MCP · Python · JavaScript · Go · Java · .NET
Put a file from this machine where the device keeps downloads, so an app's file picker finds it: Android's shared Download folder, or on iOS an app's own Documents folder, which the Files app shows under On My iPhone. These call app_upload.
PushPath
func (d *Device) PushPath(ctx context.Context, local, devicePath, app string) (*Transfer, error)
PushPath sends a local file or folder to a path on the device and reads every file's size back there. On Android devicePath is absolute (/sdcard/..., /data/local/tmp/...), or with app it is a path in that app's private data, which needs a debuggable build. On iOS it is a path in an app's data container — app, or the one in front when app is empty.
Upload
func (d *Device) Upload(ctx context.Context, path string, opts *TransferOptions) (*Transfer, error)
Upload puts a file from this machine where the device keeps downloads, so an app's file picker finds it. On Android that is the shared Download folder, and the file is indexed in MediaStore — which is what the picker reads — and read back there. On an iOS simulator it is an app's own Documents folder, which the Files app shows under On My iPhone: the app named in opts, or the one in front. On a real iPhone it is the same folder, through CoreDevice, and the upload is confirmed by reading its bytes back.
A relative path is this process's: mobium pipe resolves it before the
daemon sees it.
Examples
Send a file where the device keeps downloads
sent, err := dev.Upload(ctx, "invoice-42.txt", nil)
if err != nil {
return err
}
fmt.Println(sent.Where, sent.Bytes, sent.Checked)
The same call from the command line, mobium upload invoice-42.txt, printed on an Android 15 emulator:
uploaded …/invoice-42.txt to Download/invoice-42.txt (24 bytes) — confirmed by its size read back on the device, and MediaStore listing it

After mobium upload invoice-42.txt, the Files Demo's Upload a file opened the system picker, the file was in it, and the line under the button says the name, size and first line of what arrived — on an Android 15 emulator
Send a folder to a path on the device
sent, err := dev.PushPath(ctx, "seed", "/sdcard/seed", "")
if err != nil {
return err
}
fmt.Println(sent.Files, sent.Checked)
The same call from the command line, mobium upload ./seed --device-path /sdcard/seed, printed on an Android 15 emulator:
uploaded …/seed to /sdcard/seed (a folder of 2 files, 8 bytes) — confirmed by each of its 2 files' sizes read back on the device