Skip to main content

scout artifacts upload

Upload debug artifacts to the Scout platform so crash reports symbolicate back to your source — turning stripped, obfuscated stack frames into readable file, line, and symbol names. Scout matches each crash to the artifact you uploaded for that build, so you upload once per release.

Usage

scout artifacts upload <PATH> [flags]

Arguments

ArgumentTypeDescription
PATHstring(required) Path to the artifact file, or an iOS/macOS .dSYM bundle. For a .dSYM directory the CLI automatically resolves the inner DWARF binary.

Flags

FlagTypeDefaultDescription
--typestring(inferred)Artifact type. Inferred from the filename when omitted (see Artifact types)
--platformstring(inferred)Platform: android, ios, or web
--appstringApplication identifier (bundle id / package name)
--versionstringApplication version
--buildstringBuild number
--debug-idstring(extracted)Debug identifier. Auto-extracted from the binary when omitted
--archstring(extracted)CPU architecture; selects a slice of a fat binary. Auto-extracted when omitted
--commitstringSource commit SHA
--environmentstringDeployment environment
-a, --accountstring(active context)Account slug to upload under. Env: SCOUT_ACCOUNT_SLUG

Artifact types

TypeResolvesAuto-inferred from filename
dsymiOS / macOS native crashes*.dSYM
dart_symbolsFlutter Dart AOT frames (libapp.so)*.symbols
ndk_symbolsAndroid native / NDK and Flutter engine .so frames(pass --type)
proguard_mappingAndroid Java/Kotlin deobfuscationmapping.txt, *-mapping.txt
dart_obfuscation_mapFlutter obfuscation map(pass --type)
js_sourcemapJavaScript / web stack traces*.map, *.js.map
rn_sourcemapReact Native stack traces(pass --type)

When the filename doesn't map to one of the patterns above, pass --type explicitly.

Required information by type

The CLI validates locally before uploading, so you get a fast error instead of a round trip.

  • dsym and dart_symbols are matched by their embedded debug_id and arch. Both are auto-extracted from the binary — pass --debug-id / --arch only to override.
  • All other types (ndk_symbols, proguard_mapping, dart_obfuscation_map, js_sourcemap, rn_sourcemap) are matched by build coordinates, so --app, --version, --build, and --platform are required. For ndk_symbols the debug_id / arch are additionally auto-extracted from the .so.

Examples

Upload an iOS dSYM — type, platform, debug id, and arch are all auto-detected:

scout artifacts upload ./Runner.app.dSYM --account my-org

Upload Flutter Dart symbols produced by flutter build --split-debug-info:

scout artifacts upload ./build/symbols/app.android-arm64.symbols \
--type dart_symbols --platform android \
--app com.example.app --version 2.2.7 --build 236 \
--account my-org

Upload an Android ProGuard / R8 mapping file:

scout artifacts upload ./app/build/outputs/mapping/release/mapping.txt \
--platform android \
--app com.example.app --version 2.2.7 --build 236 \
--account my-org

Upload Android NDK / engine native symbols:

scout artifacts upload ./arm64-v8a/libflutter.so \
--type ndk_symbols --platform android \
--app com.example.app --version 2.2.7 --build 236 \
--account my-org

Use environment variables instead of flags:

export SCOUT_ACCOUNT_SLUG=my-org
scout artifacts upload ./Runner.app.dSYM

How It Works

Upload is a three-step flow against the Scout API:

  1. Register — the CLI sends the artifact metadata (type, platform, build, debug_id/arch, SHA-256 checksum, and size) to POST /api/v1/artifacts and receives a pre-signed upload URL. Registration is idempotent per account and checksum: re-uploading identical bytes reports already uploaded and skips the transfer.
  2. Upload — the file is streamed directly to object storage via the signed URL, with a live progress bar.
  3. FinalizePOST /api/v1/artifacts/{id}/finalize validates the stored object's size against what was declared at registration and marks the artifact ready for symbolication. The access token is refreshed just before this step so a long upload never fails finalization.
Permission required

Uploading artifacts requires additional permission on your account. If the upload is denied, ask an administrator to grant your account upload access, then re-authenticate with scout login --account <slug> --force.

Large uploads

Native engine symbols can be large (a libflutter.so is often 150 MB+). Uploads are streamed rather than buffered, show a progress bar, and abort only if the transfer stalls — there is no fixed overall timeout. The maximum artifact size is 1 GB.

See Also

  • login — authenticate before uploading
  • Environment VariablesSCOUT_API_URL, SCOUT_ACCOUNT_SLUG, and related settings
  • Flutter — capturing symbolicated mobile crash reports
Was this page helpful?