Upload files to your self-hosted Chibisafe instance — straight from your phone's share sheet.
- Share sheet integration — Share files from any app directly to your Chibisafe server. Select Chibisafe from the OS share menu, pick an album, tap upload, done.
- Album browser — Browse all your albums in a searchable list, then view files in a 3-column thumbnail grid with pagination.
- Media viewer — Full-screen image viewer with pinch-to-zoom (up to 8x) and double-tap zoom. Videos play inline with looping and picture-in-picture support.
- Upload history — See every upload with its status (uploading, completed, failed). Tap any completed upload to copy its URL.
- Background notifications — Upload progress and completion are reported via local notifications, so you can leave the app immediately after hitting upload.
- Album picker with recents — Your 5 most recently used albums appear at the top for quick selection.
- Secure storage — Your API key is stored in the OS keychain via
expo-secure-store, never in plain text. - Dark theme — Matches the Chibisafe web UI aesthetic. Dark by default, easy on the eyes.
git clone https://github.com/chibisafe/mobile-app.git
cd mobile-app
bun installNote: This app requires a development build — it does not run in Expo Go.
# Generate native projects
bunx expo prebuild
# Run on Android
bun run android
# Run on iOS
bun run iosbun run build:apkThe APK will be at android/app/build/outputs/apk/release/.
- Open the app and go to the Settings tab.
- Enter your Chibisafe server domain (e.g.
https://chibisafe.example.com) and API key. - Tap Test Connection to verify — you'll see a green "Connected" status.
- That's it. Now share any file from another app, pick Chibisafe from the share menu, optionally choose an album, and tap Upload.
app/ Expo Router screens
(tabs)/
index.tsx Upload history (home tab)
gallery.tsx Albums & file browser
settings.tsx Server configuration
upload.tsx Upload modal (share intent target)
_layout.tsx Root layout with share intent listener
src/
api/client.ts Chibisafe API client
components/
AlbumPicker.tsx Album selection with recents & search
ConnectionStatus.tsx Server status indicator
FileCard.tsx Upload history row item
ImageViewer.tsx Full-screen media viewer
UploadSheet.tsx Upload confirmation sheet
services/upload.ts Upload logic with retries & notifications
store/storage.ts In-memory cache backed by AsyncStorage
theme/index.ts Colors, spacing, typography
types/index.ts Shared TypeScript interfaces
| Layer | Technology |
|---|---|
| Framework | Expo SDK 54 + React Native |
| Navigation | Expo Router (file-based) |
| Language | TypeScript (strict) |
| Storage | AsyncStorage + SecureStore |
| Share intent | expo-share-intent |
| Media | expo-image + expo-video |
| Notifications | expo-notifications (local) |
The app talks to the Chibisafe API:
| Endpoint | Purpose |
|---|---|
GET /api/settings |
Test connection, fetch server config |
GET /api/albums |
List all albums |
GET /api/album/:uuid |
List files in an album (paginated) |
POST /api/upload |
Upload a file (multipart) |
Authentication is via the x-api-key header.
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
# Lint
bun run lint
# Format
bun run formatSee LICENSE for details.
Made for Chibisafe



