Remember previous location (Preferences): persists collection + document chain (or Home) to UserDefaults on every navigation change, gated on the preference. Restored once per launch by resolving the stored IDs back through the API, stopping at the first failure (deleted doc, offline, etc.) rather than aborting the whole restore — a partial chain beats falling all the way back to Home. Cleared on sign-out so switching accounts can't restore a stale location. Command Palette (new Settings → Editor section, not synced to Outline): ⌘K opens a floating overlay, arrow-key/click navigation, Enter or click to select. Always searches locally, never a per-keystroke network request: - Lightweight (default): live listCollections + listViewedDocuments fetch once on open. - Full Workspace (opt-in, requires Full Local Sync on): reads CachingOutlineAPIClient's local cache directly — zero network calls, includes nested sub-documents now that Full Local Sync actually caches them (see the paired OutlineKit commit). Fixed through live testing, in order found: - Focus: the search field wasn't reliably first responder the instant ⌘K opened it (also the likely source of several AppKit CA-transaction console warnings) — added a short delay before focusing. - Full Workspace "no results": was sequential one-collection-at-a-time fetching before the cache-read redesign: withTaskGroup made it concurrent, and reading from the cache instead of the network made it moot. - Arrow keys not moving selection: .onKeyPress was on the outer card, but the focused TextField swallowed the events before they could bubble up. Moved the handlers directly onto the TextField. - Search ranking: exact-phrase-only matching meant a title like "Test Plan Document" never matched a "test document" query at all (filtered out, not just ranked low), making it look like collections always won. Added a fallback tier: every word of a multi-word query present anywhere in the title still matches, ranked below exact/prefix/substring hits. - foregroundStyle(.secondary vs .orange) ternary: HierarchicalShapeStyle vs Color type mismatch, fixed with AnyShapeStyle on both branches.
Outpost
A native Apple ecosystem client for Outline — built for iOS, iPadOS, and macOS from a single SwiftUI codebase, aiming for full editing parity with Outline's web app, including realtime collaborative editing.
Early alpha — macOS only for now. Expect missing features and rough edges. iOS/iPadOS support is planned but not in the current build. See the releases page for changelogs, and open an issue if you hit anything.
Why
Outline's web app is great, but there's no native Apple client with full editing parity. This project connects to a self-hosted Outline instance over its REST API and realtime collaboration socket to provide a proper native experience across the Apple ecosystem.
Requirements
- Xcode 27+ (currently developed against an Xcode 27 beta — this is a hard minimum, not a suggestion)
- macOS 27+. iOS/iPadOS support is planned but not in the current build (see the alpha note above) — same 27+ minimum will apply once it lands
- A self-hosted (or hosted) Outline instance with API access
Setup
- Clone the repo and open the
.xcodeprojin Xcode. - Generate a scoped API key on your Outline instance (Settings → API Keys).
- On first launch, enter your instance URL and API key — these are stored in Keychain, never in app config or source.
Architecture
See CLAUDE.md and docs/ARCHITECTURE.md for the full technical breakdown: REST layer, Yjs/Hocuspocus realtime sync via YSwift, and the ProseMirror-schema-to-native-editor mapping.
Disclaimer
This project is being built to solve a personal problem — I wanted a genuinely good native knowledge-base client for my own self-hosted Outline instance and none of the existing options fit. It's a personal-use tool first, not a polished product with support guarantees.
Parts of this codebase are AI-assisted (built with the help of AI coding tools). Treat that however you like — review, use, fork, or ignore the code accordingly. No warranty of quality, security, or fitness for any particular use is implied beyond what's stated in the license below.
License
This project is a client only — it does not include, vendor, or redistribute any of Outline's (BSL 1.1 licensed) server source. See LICENSE for this repository's own license.
Privacy
Outpost collects nothing about you — no analytics, no telemetry, no crash reporting of its own, no age or demographic data, nothing. The only thing stored locally is your Outline server URL and API token (in the device Keychain) and, optionally, a local offline cache of what you've viewed. Everything else goes straight from your device to whatever Outline server you configure — there's no backend in between, and the developer has no access to your data or your server.
Full policy, terms of service, and data-processing statement are on the wiki:
Not affiliated with Outline
This is an independent, unofficial client. Not affiliated with or endorsed by General Outline, Inc.
