[NEW PLUGIN] Mobile File Downloader —> Save any file from your native mobile app to the user’s device

Hi Bubblers :waving_hand:

My dev partner and I needed an option to download images and files from our native mobile apps. So we built this plugin.

Save any file from your Bubble native mobile app to the user’s device (gallery, iOS share sheet or Android Downloads folder).

2 destinations are supported:

  • the OS photo gallery (iOS Photos or Android Gallery) for media files
  • and device files (iOS share sheet or Android Downloads folder) for documents.

3 file sources work:

  • any public HTTPS URL
  • Bubble database File and Image fields (the //cdn.bubble.io/... protocol-relative prefix is auto-normalized)
  • base64 strings for files generated in a workflow.

The plugin runs only inside native mobile runtime (React Native).
It won’t work for WebView-wrapped apps (Natively, BDK).

  • Plugin page
  • See in Bubble Editor for the full range of configuration options
  • Demo app (since the plugin targets Bubble native mobile apps, you can explore the workflows and setup logic, but you can’t execute them directly from the web preview)
  • User documentation (ships with an AI context file so your LLM can help you set up the plugin)

Here is the full features list:

  • Two native destinations: photo gallery (iOS Photos or Android Gallery) for images and videos, or device files (iOS share sheet or Android Downloads folder via DownloadManager) for documents. The user finds saved files in the same place as files saved by other apps, with standard share, edit, and delete affordances.
  • Three ways to source a file: any public HTTPS URL, any Bubble database File or Image field (the protocol-relative //cdn.bubble.io/... URLs are auto-normalized), or a base64 string for files generated in a workflow (including PDFs generated by another plugin).
  • Multiple downloads at once: a Download Multiple Files action takes a list of URLs. On Android and on iOS with the gallery destination, each file emits its own events and lands individually in the destination. On iOS with the device-files destination, the plugin bundles every successful file of the batch into a single ZIP archive and presents one share sheet for it (the user extracts the archive natively in Files.app with a single tap). Batches up to 150 MB total work as one ZIP; larger batches fail cleanly with a translated error so your workflow can split them into smaller groups. This is the cleanest UX iOS allows for multi-file downloads to user storage.
  • Per-download cancel: a Cancel Download action stops a single in-flight transfer cleanly. A Cancel All Downloads action stops everything; useful when the user navigates away or signs out.
  • Automatic permissions: iOS and Android use different permission models with breaking changes at almost every OS version. The plugin handles iOS 11+ photo library, Android 6 to 9 storage, Android 10 to 12 scoped storage, and Android 13+ granular media permissions, in one consistent API. You don’t need any “Request permission” action in your workflows.
  • Native progress events: Download Started, Download Progress, Download Complete, Download Error, Cancelled. 3 states track in-flight downloads (Is Downloading, Active Downloads Count, Current Progress), four states track results (Last File ID, Last File URI, Last File Size, Last File MIME Type), and two states track failures (Last Error Code, Last Error Message).
  • Optional native notifications: one toggle enables OS-native notifications when a download starts (“Downloading invoice.pdf…”) and when it ends (“Saved” or “Download failed”). Same behavior on iOS and Android. The notification permission is requested in context the first time a user triggers a download with notifications enabled. Opt-in by design.
  • Custom headers: pass any header the source requires (Authorization tokens, signed-URL parameters, content negotiation). JSON object in, headers out.
  • Size limit and timeout: set a per-element maximum file size in MB and a default timeout in seconds. Oversized or hanging downloads fail cleanly with a translated error code.
  • Multilingual error messages: English, French, Spanish, German, Italian, Brazilian Portuguese, European Portuguese, Dutch, Polish, Japanese, Korean, Simplified Chinese. Language is detected automatically from the device locale; English fallback for any other language. You can override any message via a JSON field on the element.

AI-assisted setup

The plugin ships with a context document designed to be pasted into any LLM. Once pasted, your AI assistant knows every field, every state, every event, and the most common configuration patterns of the plugin. It can write your Bubble dynamic expressions, diagnose a misbehaving download, and suggest the right configuration for your specific use case, without you having to dig through documentation yourself. The download link is in the user documentation.

We built the user documentation we wish every Bubble plugin had.

Feedback welcome

If you notice a bug, a weird interaction with another plugin, or there is a specific business case you would like the plugin to cover, please reach out. We happily take any question or improvement request. Plus, we react quickly!

More from BetterNotCode

A few other plugins we have built:

  • Advanced Push Notifications: rich push via Google FCM (free and unlimited), with images, topics, multicast, web push, and click tracking.
  • Auto Skeleton Loader: shimmer placeholders that read your Bubble layout automatically and follow it when it changes.
  • Observable Plot x D3 Charts & Maps: 33+ chart types from the D3.js creators, with built-in transforms (no need to prepare your data), auto charts, maps, and export.
  • Toggle Studio & Hold : highly customizable toggle styles for web and native apps, with juicy animations and satisfying user feedback.