Skip to content

chibisafe/mobile-app

Repository files navigation

Chibisafe Mobile

Chibisafe Mobile

Upload files to your self-hosted Chibisafe instance — straight from your phone's share sheet.

Platform Expo SDK TypeScript License


Upload History    Gallery    Upload Sheet    Settings


Features

  • 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.

Getting Started

Prerequisites

Install

git clone https://github.com/chibisafe/mobile-app.git
cd mobile-app
bun install

Development

Note: 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 ios

Build a Release APK

bun run build:apk

The APK will be at android/app/build/outputs/apk/release/.

Usage

  1. Open the app and go to the Settings tab.
  2. Enter your Chibisafe server domain (e.g. https://chibisafe.example.com) and API key.
  3. Tap Test Connection to verify — you'll see a green "Connected" status.
  4. That's it. Now share any file from another app, pick Chibisafe from the share menu, optionally choose an album, and tap Upload.

Project Structure

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

Tech Stack

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)

API Compatibility

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.

Contributing

Contributions are welcome! Please open an issue first to discuss what you'd like to change.

# Lint
bun run lint

# Format
bun run format

License

See LICENSE for details.


Made for Chibisafe

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors