Offline Files interface.
Offline Files interface.
← All native guides

Xodera Plugins · Bubble Native

Xodera Offline Files Native

Keep report attachments and chosen files on the device, restore them later and let the user share a selected copy.

Public beta guides · Haptics instructions are in its Bubble listing

Public beta offer: free Bubble install · 7-day card trial, then US$1.50/month per plugin/project.

Documentation reviewed 6 November 2026

Practical examples

Stage several local attachments before submitting a report

A form needs to show which files were picked and let the user keep a managed copy before any cloud submission.

`accepted_mime_types_json = your allowed MIME list`; `multiple = yes`; set `max_files`, `max_file_bytes` and an account/report `document_context`.

Pick files → inspect the selected names/sizes → Save selection locally. Your form keeps the resulting file IDs until its separate Submit workflow uploads approved files.

Use `selection_count`, `file_names`, `file_sizes` and `saved_file_ids` to render the review list. A saved managed copy preserves the caller’s original.

A cancelled picker is not a submitted report. On `files_error`, keep already accepted local IDs and show `error_code`; never create a cloud attachment from a local URI alone.

Files stay on this device until shared or uploaded separately.

Keep a photo-editor or recorder output for later use

A generated local file may live in a temporary location; the app needs an explicit managed copy.

`source_uri = the local output of a separately accepted editor/recorder`; bind its real `display_name` and `mime_type`; use the same owner’s `document_context`.

Load local source → inspect metadata → Save selection locally. Store the returned file ID only in the matching device/context, then Restore saved file by that exact ID when needed.

Consume `file_id`, `local_uri`, `size_bytes` and `is_saved_locally`; use `file_restored` to distinguish a completed restore from merely requesting one.

Reject a remote HTTP URL as a local source. If a source vanished or restoration fails, show `error_code` and preserve the original app record for recovery.

Files stay on this device until shared or uploaded separately.

Let a user share an app-generated local receipt or export

The app should hand a selected local file to the device share sheet rather than inventing a public URL.

`selected_file_id = the exact managed copy chosen from your app’s saved-file list`; its name and MIME describe the real local file.

List saved files → Restore saved file → Share selected file after the user taps Share. Keep the saved copy until they explicitly choose Delete saved copy.

Use `share_status` and `share_sheet_closed` to update the UI after the sheet closes. Retain the file ID for another deliberate share.

A closed share sheet is not proof that an email/message was delivered. Handle cancellation and `files_error` without reporting success to the recipient.

Files stay on this device until shared or uploaded separately.

What works now

Public beta. Use the documented controls and actions; test supported formats, permissions and device behavior in your own native app. Browser preview does not validate native device output.

Build the workflow

Use the available beta actions below and test the result on your target devices.

These examples use app records such as Lesson, Message and Order. Replace them with your own data types and element names. Example media addresses must be replaced with your own files.

  1. Set document_context = Current User's unique id, or a stable value for the account and report. Choose accepted_mime_types_json, max_files and max_file_bytes.

  2. Run Pick files, or use Load local source for a readable file produced by Photo Editor or Recorder. After selection_changed, read the matching file lists; Select picked file chooses an index.

  3. Run Save selection locally. After files_saved, keep saved_file_ids in your app's local attachment record. List saved files shows saved copies; Restore saved file opens the selected saved ID.

  4. Share selected file opens the system share menu. share_sheet_closed only means the menu closed. Delete saved copy needs the selected ID and confirm=yes.

Workflow diagram — not an app screenshot · SVG

Configure once

Create or choose your Bubble app project in BestPlugins → Dashboard → Plugins. Choose Xodera Offline Files Native, copy its key, then open Bubble → Plugins → Xodera Offline Files Native and paste it into licensing_api_key. Save once; then use the actions below. Each plugin in each project has its own key.

Use a native app with access to the chosen files. Set a stable document_context for the account or report so its saved files stay grouped correctly.

Configure once
  1. Create or choose your Bubble app project at BestPlugins → Dashboard → Plugins.
  2. Choose this plugin and copy its project key.
  3. Open Bubble → Plugins → this plugin. Paste its project key into licensing_api_key and save.
  4. Add the element, choose your app data and build the workflow below.
  5. In the dashboard, review and confirm the 7-day card trial for this plugin. It then costs US$1.50/month per app project, including development and production. Cancel before the trial ends to avoid the first charge.
Installation and subscription

For Audio Player, Video Player, Photo Editor, Audio Recorder, Files Kit and Haptics: free Bubble installation, a 7-day trial with a card, then US$1.50 per month per plugin and app project. Development and production are included, with no operation cap. File-size and feature limits still apply. Review billing and cancellation before confirming. Other plugins remain unavailable for purchase.

Save the result in your app

Example LocalAttachment: owner, document_context, saved file ID, display_name, mime_type and size_bytes. This ID works only on the same device and for the same account or report. For an online attachment, upload the file with a separate workflow and save the returned online file reference.

Failure, cancel and recovery

A cancelled picker returns operation_cancelled; it does not submit the form. While native_pending=yes, wait for the file picker or share menu to close before opening another. Clear session clears the current selection but keeps saved copies. If a file is missing, let the user choose it again.

Capabilities and limits

Choose 1–20 files at once. Per-file limit: 1 byte–256 MiB, with a lower limit if you choose. File-type filters do not check files for viruses. Device file IDs and paths do not work as cloud download links. Local copies are not encrypted storage and can be lost if app data is removed.

Settings, actions and results

Use these names in Bubble. Planned features are marked separately.

Available beta settings

Element settings

source_uri · textdisplay_name · textmime_type · textdocument_context · textselected_file_id · textaccepted_mime_types_json · textmultiple · yes_nocopy_to_cache · yes_nomax_files · numbermax_file_bytes · numberis_active · yes_nodisabled · yes_noshow_controls · yes_nolanguage · textui_text_json · texttitle · text

States

status · textis_busy · yes_nonative_pending · yes_nooperation · textselection_count · numberselected_index · numberfile_id · textlocal_uri · textdisplay_name · textmime_type · textmime_source · textsize_bytes · numberis_saved_locally · yes_nofile_ids · text (list)file_uris · text (list)file_names · text (list)file_mime_types · text (list)file_sizes · number (list)files_json · textsaved_count · numbersaved_file_ids · text (list)saved_file_uris · text (list)saved_file_names · text (list)saved_file_mime_types · text (list)saved_file_sizes · number (list)saved_files_json · textinvalid_saved_count · numbershare_status · texterror_code · text

Events

selection_changedfiles_savedlist_loadedfile_restoredfile_deletedshare_sheet_closedoperation_cancelledfiles_error

Actions and their inputs

Pick filesLoad local sourceSelect picked fileSave selection locallyList saved filesRestore saved fileDelete saved copyShare selected fileCancel operationClear session
Element settings · 16
source_uritext · Default: ""
Example valuefile:///app-cache/report.pdf
Example Bubble expressionPhoto Editor's output_uri
Readable file location on this device, returned by your picker or another plugin.
display_nametext · Default: ""
Example valuereport-photo.jpg
Example Bubble expressionSelected Attachment's display_name
Use the current business record’s value; validate it against the limits below.
mime_typetext · Default: ""
Example valueimage/jpeg
Example Bubble expressionPhoto Editor's output_mime
Use the current business record’s value; validate it against the limits below.
document_contexttext · Default: "default"
Example value<current-user-id>
Example Bubble expressionCurrent User's unique id
Stable value for this account or record. Use the same value when restoring its saved files or drafts.
selected_file_idtext · Default: ""
Example value<returned saved file ID>
Example Bubble expressionSelected LocalAttachment's local_file_id
Use the current business record’s value; validate it against the limits below.
accepted_mime_types_jsontext · Default: "[\"*/*\"]"
Example value["image/*","application/pdf"]
Example Bubble expressionReport Settings' accepted_mime_types_json
Use the current business record’s value; validate it against the limits below.
multipleyes_no · Default: false
Example valueyes
Example Bubble expressionReport Settings' allow_multiple_attachments
Use the current business record’s value; validate it against the limits below.
copy_to_cacheyes_no · Default: true
Example valueyes
Example Bubble expressionReport Settings' copy_to_cache
Use the current business record’s value; validate it against the limits below.
max_filesnumber · Default: 20
Example value5
Example Bubble expressionReport Settings' attachment_limit
Use the current business record’s value; validate it against the limits below.
max_file_bytesnumber · Default: 268435456
Example value10485760
Example Bubble expressionReport Settings' max_attachment_bytes
Use the current business record’s value; validate it against the limits below.
is_activeyes_no · Default: true
Example valueyes
Example Bubble expressionGuideHost's view_is_active (your yes/no custom state)
Set yes while this view is open. Set no when leaving, so playback or current work can stop.
disabledyes_no · Default: false
Example valueno
Example Bubble expressionGuideHost's is_busy (your yes/no custom state)
Disable the element while your app is busy or this action is unavailable.
show_controlsyes_no · Default: true
Example valueyes
Example Bubble expressionApp Settings' show_editor_controls
Show or hide the built-in controls.
languagetext · Default: "auto"
Example valueuk
Example Bubble expressionCurrent User's preferred_language
Set language=auto to follow a supported device or browser language. Enter a supported language code to choose it explicitly.
ui_text_jsontext · Default: ""
Example value{}
Example Bubble expressionApp Settings' player_labels_json (supported keys only)
Optional JSON with supported button labels. Leave empty to use the built-in text.
titletext · Default: ""
Example valueLesson 4 — review
Example Bubble expressionSelected Lesson's name
Visible app text; empty uses built-in localized copy where supported. No credentials.
Actions and their inputs · 10
Pick files

No action parameters

Load local source
source_uritext · Default: —
Example valuefile:///app-cache/report.pdf
Example Bubble expressionPhoto Editor's output_uri
Readable file location on this device, returned by your picker or another plugin.
display_nametext · Default: —
Example valuereport-photo.jpg
Example Bubble expressionSelected Attachment's display_name
Use the current business record’s value; validate it against the limits below.
mime_typetext · Default: —
Example valueimage/jpeg
Example Bubble expressionPhoto Editor's output_mime
Use the current business record’s value; validate it against the limits below.
Select picked file
indexnumber · Default: —
Example value0
Example Bubble expressionSelected row's current_source_index
Use the current business record’s value; validate it against the limits below.
Save selection locally

No action parameters

List saved files

No action parameters

Restore saved file
file_idtext · Default: —
Example value<returned saved file ID>
Example Bubble expressionSelected LocalAttachment's local_file_id
Use the current business record’s value; validate it against the limits below.
Delete saved copy
file_idtext · Default: —
Example value<returned saved file ID>
Example Bubble expressionSelected LocalAttachment's local_file_id
Use the current business record’s value; validate it against the limits below.
confirmyes_no · Default: —
Example valueyes — explicit confirmation only
Example Bubble expressionConfirm Checkbox is checked
Use the current business record’s value; validate it against the limits below.
Share selected file
dialog_titletext · Default: —
Example valueShare attachment
Example Bubble expressionSelected Report's share_title
Use the current business record’s value; validate it against the limits below.
utitext · Default: —
Example value""
Example Bubble expressionEmpty unless your iOS integration supplies a proven UTI
Use the current business record’s value; validate it against the limits below.
Cancel operation

No action parameters

Clear session

No action parameters

States and events

States

status · text

Current result of this action. Use the matching completion event before saving success.

is_busy · yes_no

Work is still in progress. Wait before starting another action.

native_pending · yes_no

Work is still in progress. Wait before starting another action.

operation · text

Current value for the selected item. Read it after the related event.

selection_count · number

Current value for the selected item. Read it after the related event.

selected_index · number

Current value for the selected item. Read it after the related event.

file_id · text

Identifier for this item or action. Keep it with the matching app record. Use the same request identifier when retrying an uncertain result.

local_uri · text

File location on this device. Save or upload the file separately if it must be kept online.

display_name · text

Current value for the selected item. Read it after the related event.

mime_type · text

Current value for the selected item. Read it after the related event.

mime_source · text

Current value for the selected item. Read it after the related event.

size_bytes · number

Current value for the selected item. Read it after the related event.

is_saved_locally · yes_no

Current value for the selected item. Read it after the related event.

file_ids · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

file_uris · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

file_names · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

file_mime_types · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

file_sizes · number (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

files_json · text

Current value for the selected item. Read it after the related event.

saved_count · number

Current value for the selected item. Read it after the related event.

saved_file_ids · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

saved_file_uris · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

saved_file_names · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

saved_file_mime_types · text (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

saved_file_sizes · number (list)

A list for the selected files. Items at the same index in the other file lists refer to the same file.

saved_files_json · text

Current value for the selected item. Read it after the related event.

invalid_saved_count · number

Current value for the selected item. Read it after the related event.

share_status · text

Current result of this action. Use the matching completion event before saving success.

error_code · text

Error information for the last action. Show a helpful message and offer the relevant retry.

Events

selection_changed

When this event occurs, read the related states from the same element.

files_saved

When this event occurs, read the related states from the same element.

list_loaded

When this event occurs, read the related states from the same element.

file_restored

When this event occurs, read the related states from the same element.

file_deleted

When this event occurs, read the related states from the same element.

share_sheet_closed

When this event occurs, read the related states from the same element.

operation_cancelled

When this event occurs, read the related states from the same element.

files_error

When this event occurs, read the related states from the same element.

Questions developers ask

Does Share mean “sent”?

No. The OS does not provide a reliable recipient-success receipt here. Show “share sheet closed”.

How does the subscription work?

For Audio Player, Video Player, Photo Editor, Audio Recorder, Files Kit and Haptics: free Bubble installation, a 7-day trial with a card, then US$1.50 per month per plugin and app project. Development and production are included, with no operation cap. File-size and feature limits still apply. Review billing and cancellation before confirming. Other plugins remain unavailable for purchase.

Related guides

For help, tell us which plugin and device you use, the action you tried and what happened. Use an example without personal data. Never share your key or private files.