#file-picker #cross-platform #android #ios #saf

loki-file-access

Cross-platform, frontend-agnostic file picker and capability-based file access for Rust

2 releases

Uses new Rust 2024

0.1.1 Apr 19, 2026
0.1.0 Apr 5, 2026

#1686 in GUI

MIT license

87KB
1.5K SLoC

loki-file-access

Cross-platform, frontend-agnostic file picker and capability-based file access for Rust applications.

This crate provides a unified API for presenting native file-picker dialogs and accessing user-selected files across all major platforms:

  • Desktop (Windows, macOS, Linux, BSD) — via the rfd crate
  • Android — via the Storage Access Framework with persistable URI permissions
  • iOS — via UIDocumentPickerViewController with security-scoped bookmarks
  • WASM — via <input type="file"> with in-memory file buffers

Zero UI Framework Dependencies

loki-file-access has no UI framework dependencies. It returns standard Future values implemented with only std primitives (no Tokio, no async-std required). It is usable from Dioxus, egui, Iced, Xilem, pollster::block_on, or any other async or sync Rust context.

Quick Start

use loki_file_access::{FilePicker, PickOptions};
use std::io::Read;

let picker = FilePicker::new();

// Pick a file to open
let token = picker
    .pick_file_to_open(PickOptions {
        mime_types: vec!["text/plain".into()],
        ..Default::default()
    })
    .await?;

if let Some(token) = token {
    let mut reader = token.open_read()?;
    let mut contents = String::new();
    reader.read_to_string(&mut contents)?;
    println!("File contents: {contents}");

    // Serialize the token for later use
    let stored = token.serialize();
    println!("Token: {stored}");
}

Capability Tokens

Every picker operation returns a FileAccessToken — a serializable capability that encapsulates all platform-specific state needed to re-open the file. Tokens can be serialized to a URL-safe string for storage in a recent-files list and deserialized to re-open files across app restarts.

On Android, the token holds a content URI with a persistable permission grant. On iOS, it holds a security-scoped bookmark. On desktop, it holds a filesystem path. On WASM, it holds the file data in memory.

Dependencies

~0.6–19MB
~197K SLoC