cairn

Cairn logo: three stacked stones with a green dot on top # Cairn **Your location, for the few you trust.** Private, end-to-end encrypted location sharing that you can host yourself. By [CappyLabs](https://cairn.cappylabs.uk). [![Release](https://github.com/CappyTech/cairn/actions/workflows/release.yml/badge.svg?branch=main)](https://github.com/CappyTech/cairn/actions/workflows/release.yml) [![Licence: AGPL-3.0](https://img.shields.io/badge/licence-AGPL--3.0-8FA35D)](LICENSE) [![Platform: Android](https://img.shields.io/badge/platform-Android-1F2A2E)](#how-it-works) [![Built with Flutter](https://img.shields.io/badge/built%20with-Flutter-02569B?logo=flutter)](https://flutter.dev) [Website](https://cairn.cappylabs.uk) · [Beta](https://cairn.cappylabs.uk/beta) · [Support](https://cairn.cappylabs.uk/support) · [Security](https://cairn.cappylabs.uk/security) · [Privacy](https://cairn.cappylabs.uk/privacy)
Home: your people and sharing settings  Live map with three people sharing  Choosing how precisely to share with one person  Backup and restore with a recovery phrase

Cairn lets you share your live location with the specific people you choose, and see theirs on a map. Your location — and even your display name — are end-to-end encrypted, so the server relays them but cannot read them.

Coming soon to Android and iOS. Cairn is pre-release; Android builds go to Google Play’s closed testing track. Want to try it? Sign up to test.

Why Cairn

Features

Sharing

Map

History and places

Your identity

What the server can and can’t see

Data Server can read?
Location ❌ No — end-to-end encrypted
Display name ❌ No — end-to-end encrypted
Location history and places ❌ No — encrypted to you
Shared pins ❌ No — encrypted to each recipient
Public keys, who’s paired with whom, timestamps ✅ Yes (pseudonymous routing metadata)

Updates go out on a fixed schedule and are padded, so their timing and size don’t reveal when you’re moving. Hiding the routing metadata (the social graph) would need a metadata-private protocol — a future goal; see docs/metadata-privacy.md and the security page.

How it works

Self-hosting

The app works against the default server, or run your own:

# on your server (Docker)
docker compose up -d          # see deploy/docker-compose.yml

The Dockerfile builds an image = PocketBase + the web build + schema migrations (pb_migrations/), so a fresh server comes up fully configured. A reverse proxy (e.g. Caddy) terminates HTTPS in front of it. Point the app at your server in Settings → Server address.

Development

flutter pub get
flutter run                                   # defaults to the production backend
flutter run --dart-define=PB_URL=http://10.0.2.2:8090   # local backend (emulator)
flutter test --exclude-tags integration       # as CI runs it
flutter test --tags integration               # needs a local PocketBase on :8090

Build a release:

flutter build appbundle --release   # signed via android/key.properties (CI provides it)

CI/CD

GitHub Actions:

Privacy and security

Licence

Cairn is free software under the GNU Affero General Public License v3.0 (AGPL-3.0). If you run a modified Cairn server for others to use, you must offer them the source of your changes.


Cairn — your location, for the few you trust.