Skip to content

dropanchorapp/Anchor

Repository files navigation

🧭 Anchor

Anchor App Icon

Native iOS app for location-based check-ins using the AT Protocol

Tests SwiftLint

Drop anchor at your favorite places with structured data storage on your home PDS and optional social sharing via Bluesky.

✨ Features

  • πŸ“± Native iOS App - Full-featured mobile experience with native location services
  • πŸ” StrongRef Architecture - Store address records and check-ins with content integrity on your home PDS
  • πŸ“‘ Optional Social Sharing - Choose to share check-ins as posts on Bluesky to notify your followers
  • 🌍 Global Feed - Discover check-ins from around the world via the Anchor AppView feed
  • πŸ“ Automatic Location - CoreLocation integration with proper iOS permissions
  • πŸ—ΊοΈ Place Discovery - Find nearby climbing gyms, cafes, and points of interest via OpenStreetMap
  • πŸ’¬ Custom Messages - Add personal notes to your check-ins
  • πŸ—οΈ Modular Architecture - Shared AnchorKit framework for future platform expansion
  • 🎯 Privacy-First - All data stored on your own PDS, no tracking or analytics
  • 🌐 AT Protocol Native - Uses community lexicon standards for structured location data

πŸ“± Screenshots

Anchor Global Feed Anchor Check-in Screen Anchor Nearby Places Anchor Check-in Message

Global feed, check-in interface, nearby places discovery, and message composition

πŸš€ Quick Start

System Requirements

  • iOS: iOS 18.6 or later
  • Location Services enabled

Installation

  1. Download from App Store

    Available now on the iOS App Store

  2. Build from Source

    # Clone the repository
    git clone https://github.com/tijs/Anchor.git
    cd Anchor
    
    # Open in Xcode and build
    open Anchor/Anchor.xcodeproj
    
    # Or build from command line
    xcodebuild -project Anchor/Anchor.xcodeproj -scheme AnchorMobile build -destination 'platform=iOS Simulator,name=iPhone 16'

First Launch

  1. Launch Anchor - Tap the Anchor app icon
  2. Browse Global Feed - See check-ins from around the world on the Feed tab
  3. Enable Location Services - Allow location access when prompted for check-ins
  4. Sign in to Bluesky - Enter your Bluesky credentials in Settings to create check-ins
  5. Drop Your First Anchor - Tap "Check In" to discover and check in at nearby places

🎯 How to Use

Quick Check-in

The fastest way to check in:

  1. Open the Anchor app
  2. Tap "Check In" tab
  3. Select a nearby place and drop anchor
  4. Optional: Toggle "Also post to Bluesky" to share with your followers

Note: All check-ins are stored on your home PDS using StrongRef architecture regardless of your Bluesky posting preference. The optional Bluesky post is separate from your structured check-in data.

How Anchor Works: StrongRef Architecture

Anchor uses a StrongRef-based architecture that stores structured address and check-in records on your Personal Data Server (PDS) with content integrity verification:

1. Address Records - Reusable Venue Data

Venue information is stored separately as reusable address records using community lexicon standards:

{
  "$type": "community.lexicon.location.address",
  "name": "Klimmuur Centraal",
  "street": "Stationsplein 45",
  "locality": "Utrecht",
  "region": "UT",
  "country": "NL",
  "postalCode": "3511ED"
}

2. Check-in Records - StrongRef to Address

Check-ins reference address records via StrongRef with content integrity verification:

{
  "$type": "app.dropanchor.checkin",
  "text": "Great lunch session with the team!",
  "createdAt": "2024-12-29T14:30:00Z",
  "addressRef": {
    "uri": "at://did:plc:user123/community.lexicon.location.address/abc123",
    "cid": "bafyreigh2akiscaildc..."
  },
  "coordinates": {
    "$type": "community.lexicon.location.geo",
    "latitude": "52.0705",
    "longitude": "4.3007"
  }
}

3. Optional Bluesky Posts - Share with Your Network

When you enable "Also post to Bluesky", Anchor creates rich posts on your Bluesky feed to notify your followers:

What you see on Bluesky:

Dropped anchor at Klimmuur Centraal 🧭
"Great lunch session with the team!" πŸ§—β€β™‚οΈ

Under the hood (app.bsky.feed.post):

{
  "$type": "app.bsky.feed.post",
  "text": "Dropped anchor at Klimmuur Centraal 🧭\n\"Great lunch session with the team!\" πŸ§—β€β™‚οΈ",
  "createdAt": "2024-12-29T14:30:00Z",
  "facets": [
    {
      "index": { "byteStart": 17, "byteEnd": 35 },
      "features": [{ 
        "$type": "app.bsky.richtext.facet#link", 
        "uri": "https://www.openstreetmap.org/way/123456" 
      }]
    }
  ]
}

Why This Architecture?

This StrongRef-based approach provides powerful benefits:

  • πŸ”— Content Integrity - CID verification ensures address records haven't been tampered with
  • ♻️ Data Efficiency - Reusable address records reduce storage duplication
  • 🏠 Self-Contained - All data stored on your home PDS with no external dependencies
  • 🌐 Optional Social Sharing - Choose when to share check-ins as Bluesky posts
  • πŸ“Š Rich Query Capability - Structured data enables powerful future features
  • πŸ” Privacy Control - Your data stays on your PDS unless you choose to share
  • 🌍 AT Protocol Native - Uses community lexicon standards for interoperability
  • πŸ›‘οΈ Standards Compliant - Follows AT Protocol best practices for record linking

πŸ—οΈ Architecture

Anchor is built with a modular architecture designed for cross-platform expansion:

Core Components

  • AnchorMobile (iOS App) - Native iOS app built with SwiftUI
  • AnchorKit - Shared business logic framework for future platform expansion
  • Anchor AppView - Global feed service aggregating check-ins from across the AT Protocol network

Technology Stack

  • Swift 6 - Modern async/await concurrency with strict concurrency checking
  • SwiftUI - Native iOS user interface with NavigationStack and TabView
  • AT Protocol - StrongRef-based record architecture with content integrity verification
  • Community Lexicon - Uses community.lexicon.location.* standards for structured address data
  • CoreLocation - Native location services with proper iOS permission handling
  • Overpass API - Rich OpenStreetMap place data via overpass.private.coffee

Project Structure

Anchor/
β”œβ”€β”€ Anchor.xcodeproj          # Xcode project
β”œβ”€β”€ AnchorMobile/             # iOS App
β”‚   β”œβ”€β”€ Assets.xcassets/      # iOS assets and icons
β”‚   β”œβ”€β”€ Features/             # SwiftUI views organized by feature
β”‚   β”‚   β”œβ”€β”€ CheckIn/Views/    # Mobile check-in interface
β”‚   β”‚   β”œβ”€β”€ Feed/Views/       # Feed and timeline views
β”‚   β”‚   └── Settings/Views/   # iOS settings views
β”‚   └── AnchorMobileApp.swift # iOS app entry point
β”œβ”€β”€ AnchorKit/                # Shared Business Logic Package
β”‚   β”œβ”€β”€ Sources/AnchorKit/
β”‚   β”‚   β”œβ”€β”€ Models/          # Place, AuthCredentials, Settings
β”‚   β”‚   β”œβ”€β”€ Services/        # Overpass, Location, Feed services
β”‚   β”‚   β”œβ”€β”€ ATProtocol/      # AT Protocol client implementations
β”‚   β”‚   β”œβ”€β”€ Stores/          # CheckIn, Auth, and data stores
β”‚   β”‚   └── Utils/           # Shared utilities and configuration
β”‚   └── Tests/               # Unit tests (46+ tests)
└── Static/                  # Assets and documentation

Note: Anchor AppView backend is a separate project available at https://anchor-feed-generator.val.run

πŸ”§ Development

Building AnchorKit

The shared framework can be built and tested independently:

cd AnchorKit
swift build
swift test  # Runs 46+ tests including StrongRef integration

Building the App

# Using Xcode (recommended)
open Anchor/Anchor.xcodeproj

# Using xcodebuild
xcodebuild -project Anchor/Anchor.xcodeproj -scheme AnchorMobile build -destination 'platform=iOS Simulator,name=iPhone 16'

Running Tests

# Test AnchorKit (includes StrongRef and AT Protocol client tests)
cd AnchorKit && swift test

# Test the iOS app
xcodebuild -project Anchor/Anchor.xcodeproj -scheme AnchorMobile test -destination 'platform=iOS Simulator,name=iPhone 16'

Anchor AppView

Anchor AppView is a separate project that provides the global feed service. You can explore it at: https://anchor-feed-generator.val.run

πŸ”’ Privacy & Security

  • Your Data, Your PDS - All check-in data stored on your home Personal Data Server
  • No Analytics - Zero tracking, telemetry, or user behavior monitoring
  • Minimal Permissions - Only requests location access when needed for check-ins
  • Secure Authentication - Bluesky credentials handled via AT Protocol best practices
  • Privacy by Choice - Decide for each check-in whether to share publicly or keep private
  • Open Source - Complete transparency with public source code

πŸ›£οΈ Roadmap

βœ… Completed (v1.0)

  • Native iOS App - Full iOS app using SwiftUI with TabView navigation
  • App Store Release - Available now on the iOS App Store
  • StrongRef Architecture - Atomic address + checkin records with content integrity on home PDS
  • Optional Social Sharing - Choose to share check-ins as Bluesky posts
  • Global Feed - Discover check-ins from around the world via Anchor AppView
  • Community Lexicon Integration - Uses AT Protocol standards for structured location data
  • Content Integrity - CID verification prevents tampering and detects modifications
  • Location services integration with proper iOS permissions
  • Nearby place discovery via OpenStreetMap with distance-based sorting
  • Modular AnchorKit architecture for future platform expansion

πŸ”„ In Progress (v1.1)

  • Check-in history view (personal timeline from your PDS)
  • Default message preferences and user settings
  • Feed filtering options (nearby, following, categories)
  • Enhanced place categorization and discovery

πŸš€ Future (v2.0+)

  • macOS App - Native menubar app using shared AnchorKit
  • Apple Watch App - Quick drops from your wrist
  • Rich Analytics - Personal insights from StrongRef-structured check-in data
  • Shortcuts Integration - Automate check-ins
  • Federation - Connect with other Anchor instances
  • Social Features - Follow friends' check-ins across the AT Protocol network

🀝 Contributing

We welcome contributions! The modular architecture makes it easy to contribute to specific areas:

  • AnchorKit - Business logic, models, and services
  • iOS App - Mobile interface and iOS-specific features
  • Documentation - Help improve guides and API docs

Please check our Contributing Guidelines before submitting pull requests.

πŸ€– AI Disclosure

This app was developed with assistance from Claude Code, Anthropic's AI coding assistant, under human oversight and direction. While AI helped with code generation, architecture decisions, and implementation, all design choices, feature specifications, and quality control were guided by human developers.

πŸ“„ License

MIT License - see LICENSE for details.

πŸ”— Connect

  • Bluesky: @anchor.app - Follow us for updates
  • AT Protocol: atproto.com - Learn about the decentralized web
  • OpenStreetMap: openstreetmap.org - The collaborative mapping project powering our place data

Made with ❀️ for the climbing and outdoor community

Join the decentralized social web and start dropping anchors at your favorite places today.

About

A system & app for doing location based checkins on ATProto a.k.a Bluesky

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •