Pinry Saver logo

PinrySaver iOS App

A SwiftUI iOS app with share extension for saving images and URLs to Pinry instances.

Features

Screenshots

PinrySaver Screenshot 1 PinrySaver Screenshot 2

Setting Up Your Pinry Server

This iOS app connects to a self-hosted Pinry server. You'll need to set up your own Pinry instance first.

Quick Server Setup with Docker

The easiest way to get Pinry running is with Docker. From the Pinry project:

# Clone the Pinry repository
git clone https://github.com/pinry/pinry.git
cd pinry

# Start with docker-compose
docker-compose -f docker-compose.example.yml up -d

Your Pinry server will be available at http://localhost (or your server's IP).

Getting Your API Token

  1. Access your Pinry web interface
  2. Create an account or log in
  3. Go to your account settings
  4. Generate an API token
  5. Copy this token for use in the iOS app

Configuration Tips

For detailed Pinry server setup, visit the official documentation.

Project Structure

PinrySaver/
├── PinryShared/                # Shared code between app and extension
│   ├── PinrySettings.swift     # Settings management with App Group UserDefaults
│   ├── KeychainStore.swift     # Secure API token storage
│   └── PinryUploader.swift     # Pinry API upload logic
├── PinrySaver/                 # Main app target
│   └── ContentView.swift       # Settings UI (SwiftUI)
└── PinryShareExtension/        # Share extension target
    ├── ShareViewController.swift # Share extension logic
    └── Info.plist             # Extension configuration

Setup Instructions

1. Configure Bundle Identifiers

  1. Open PinrySaver.xcodeproj in Xcode
  2. Select the project in the navigator
  3. For the main app target:
    • Set Bundle Identifier to: com.example.pinrysaver
  4. For the Share Extension target:
    • Set Bundle Identifier to: com.example.pinrysaver.shareextension

2. Configure App Groups

  1. Add Capabilities:
    • Main App: Add "App Groups" capability
      • Add group: group.com.example.pinry
    • Share Extension: Add "App Groups" capability
      • Add same group: group.com.example.pinry

3. Configure Keychain Sharing

  1. Add Capabilities:
    • Main App: Add "Keychain Sharing" capability
      • Add keychain group: $(AppIdentifierPrefix)com.example.pinryshared
    • Share Extension: Add "Keychain Sharing" capability
      • Add same keychain group: $(AppIdentifierPrefix)com.example.pinryshared

4. Add Shared Files to Targets

  1. Add PinryShared folder to both targets:
    • Right-click on project > Add Files to "Pinry Saver"
    • Select the PinryShared folder
    • Ensure both targets (main app and share extension) are checked

5. Deployment Target

Usage

Initial Setup

  1. Launch the PinrySaver app
  2. Go to Settings tab
  3. Enter your Pinry configuration:
    • Pinry Base URL: Your Pinry instance URL (e.g., https://your-pinry.com)
    • API Token: Your Pinry API token
    • Default Board ID: Optional board ID for pins
  4. Tap "Save Settings"

Using the Share Extension

  1. Open any app with images or URLs (Photos, Safari, etc.)
  2. Tap the share button
  3. Select "PinrySaver" from the share sheet
  4. The extension will automatically upload the content to your configured Pinry instance

API Requirements

The app communicates with Pinry API at <base_url>/api/pins/ endpoint using:

Security Notes

Development Notes

Troubleshooting


Privacy Policy | Support