Skip to content

Repository files navigation

Papyrus

I made this because I write poems and books, my work was a disorganized mess, and I hated every alternative I tried, so I built my own.

A full-featured long-form writing app for macOS and iOS from one SwiftUI codebase. Organize work into projects, group documents into folders, and write prose, screenplays, or poetry against per-document word targets. There is a drawing canvas (Apple Pencil / trackpad), a corkboard and outliner, compile/export, and optional cloud sync.

  • Desktop (macOS, iPad): a three-pane workspace (Binder, Editor, Inspector) with Scrivenings, Corkboard, and Outliner view modes, a breadcrumb, and a status bar.
  • Phone (iPhone): a focused Library to Manuscript to Editor stack with a distraction-free editor.

The app is local-first: everything works fully offline and without an account. Signing in adds live sync across your devices.

Demo (macOS only)

papyrus_demo.mp4

iPadOS and iOS are hard to film


Install it on your own machine (dummy-proof)

You build it yourself in Xcode. There is no App Store build. Follow these steps exactly.

1. Prerequisites

  • A Mac running a recent macOS.
  • Xcode (latest from the App Store). Open it once and let it install components.
  • An Apple ID (any free one works for running on your own devices).
  • mise (the tool runner this project uses to pin Tuist). Install it once:
    curl https://mise.run | sh
    Then restart your terminal, or run eval "$(mise activate zsh)".

2. Get the code and generate the Xcode project

The .xcodeproj and .xcworkspace are generated by Tuist (they are not committed), so you generate them after cloning:

git clone git@github.com:willzeng274/papyrus.git
cd papyrus
mise install                 # installs the pinned Tuist version
mise exec -- tuist install    # fetches Swift package dependencies
mise exec -- tuist generate    # creates Papyrus.xcworkspace
open Papyrus.xcworkspace

3. Set your signing team (one time)

The project ships with the original author's team, so you must point it at yours:

  1. In Xcode, select the Papyrus project in the navigator, then the Papyrus target.
  2. Open Signing & Capabilities.
  3. Set Team to your own Apple ID / personal team (add your Apple ID in Xcode Settings, Accounts if it is not listed).
  4. Change the Bundle Identifier to something unique to you, for example com.yourname.papyrus (a free Apple ID cannot reuse someone else's identifier).

If you prefer not to edit the generated project each time, set these in Project.swift (the Tuist manifest) and re-run tuist generate.

4. Build and run

  • macOS: pick the Papyrus scheme and the My Mac destination, then press Run (Cmd+R).
  • iPhone / iPad: pick the Papyrus scheme and a simulator (or your own device, which needs the signing step above), then Run.

That is it. The app launches into a local library you can edit immediately.

First launch: getting past the trust prompt

These builds are signed for personal use, not notarized by Apple, so the OS will warn you the first time. This is expected. Here is how to allow it on each platform.

macOS (the prebuilt Papyrus.dmg or Papyrus.zip from a release): open the dmg and drag Papyrus into Applications. The first launch is blocked with a message that it is from an unidentified developer. To allow it: open System Settings, Privacy & Security, scroll to the bottom, and click Open Anyway next to the Papyrus message, then confirm. After that it opens normally.

iPhone / iPad (a build you run from Xcode onto your own device): an app signed with a free personal team needs three steps the first time:

  1. Enable Developer Mode: Settings, Privacy & Security, Developer Mode, turn it on, and restart the device when prompted.
  2. After the restart, try to open the app once (it will refuse, that is expected).
  3. Trust the developer: Settings, General, VPN & Device Management, tap your developer profile, and Trust it. The app opens from then on.

Accounts, sync, and offline

  • No account required. Choose "continue without an account" and everything stays on your device.
  • Signing in (a username and password) turns on live sync: your projects, documents, and canvas drawings stay in step across every device you sign in on, in near real time.
  • Offline is first-class. You can write with no connection; changes sync when you are back online.

Backend

Sync is backed by Supabase (Postgres + Realtime + Auth). The schema lives in supabase/schema.sql.

The shared database is free to use for now, but do not rely on it. I pay for the Supabase instance out of pocket, so if too many people use it I will have to shut it down. If you want something durable, run your own Supabase (the free tier is plenty): create a project, apply supabase/schema.sql, then set your project URL and publishable (anon) key in Packages/PapyrusStore/Sources/PapyrusStore/PapyrusSupabase.swift.

Supabase was chosen after a detour. The first backend was a small Deno Deploy relay backed by Deno KV, but Deno Deploy bills on serverless memory-time (roughly wall-clock per request), which adds up fast for a constantly-syncing client, so it was dropped. Supabase's free tier was the only good remaining fit: managed Postgres, Realtime, and Auth with Row-Level Security in one place. The deprecated relay still lives in server/ for history and is not used.


Architecture

See docs/architecture.md for the data model and the per-document sync design, and AGENTS.md for module layout and conventions.

About

Multi-platform (Apple only) editor and organizer for professional writers

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages