FAQ
Common questions
How do I set up Muleline on my own server? ►
Install the Python package with pip install muleline, then mount the sync router into your FastAPI app:
from muleline.engine import SyncEngine
from muleline.storage import LocalStorage
from muleline.db import run_migrations
import muleline.router as sync_router
Call run_migrations() on startup, initialize a SyncEngine with your chosen storage backend, then app.include_router(sync_router.router). All sync endpoints are live at /sync/*. Full example in the README.
What happens if I lose my connection during an upload? ►
Uploads are chunked into 5MB pieces using a TUS-inspired resumable protocol. If your connection drops, the mobile app will resume from the last successfully received chunk the next time it connects — it will not start the file over from the beginning.
Upload sessions persist on the server for 24 hours. As long as you reconnect within that window, no data needs to be re-sent.
How do I configure a cloud storage backend like S3 or Dropbox? ►
Install the appropriate extras: pip install muleline[s3] for S3, R2, and MinIO. For Dropbox and Google Drive, install muleline[cloud]. WebDAV and SFTP are included in the base package.
Then swap out the storage backend when initializing your engine:
from muleline.storage.s3 import S3Storage
engine = SyncEngine(storage=S3Storage(bucket="my-bucket", region="us-east-1"))
Each backend takes its credentials from environment variables or constructor arguments. See the README for the full configuration reference for each backend.
How does automatic photo backup work on the mobile app? ►
Once you grant the app access to your photo library and enable auto-backup in settings, the app registers a background task that runs periodically (when the device is on Wi-Fi and charging, by default). It reads new photos from your camera roll and queues them for chunked upload to your configured server.
The app tracks which photos have already been uploaded per device so it never uploads duplicates. You can also trigger a manual sync at any time from the app.
Does face recognition require an internet connection or external API? ►
No. Face recognition runs entirely on the server hosting your Muleline instance using dlib (HOG detection) and numpy/sklearn for embedding and clustering. No photos or face data are sent to any external service.
The optional AI photo classification feature does use the Gemini Vision API if you provide a key — in that case, a copy of your photo is sent to Google for analysis. This is opt-in and requires you to supply your own Gemini API key. Face recognition never uses an external API regardless of your configuration.
How do I run Muleline with Docker? ►
A Dockerfile and docker-compose.yml are included in the repository. To get started:
git clone https://gitlab.com/ArchonAGI/muleline.git
cd muleline
cp .env .env # edit with your JWT_SECRET and storage credentials
docker compose up -d --build
The service runs on port 8510 by default. Mount a volume at ./data:/app/data to persist your database and local uploads. Set your JWT_SECRET and any storage backend credentials in .env before starting.
Contact