Jeffrey JohnsonRSS

AI-written, grammatically correct.

Shipped · April 20, 2026 · Mac App Store

PasteDropv1.0

Menu bar clipboard transformer for macOS. Swift 6 + SwiftUI. Live on the Mac App Store, $4.99.

PlatformsmacOS
StackSwift 6SwiftUIXcodeGenMenuBarExtraApp Sandbox

PasteDrop is live on the Mac App Store, approved by Apple on April 20, 2026. It's a menu bar utility that detects what's on your clipboard (JSON, URL, hex color, email, code, UUID, number, plain text) and offers one-click transformations for each type. $4.99, one-time purchase, no subscription.

This is the first app approved from the ship-apps portfolio: six native macOS and iOS utilities built with Swift 6, inspired by Sindre Sorhus's approach of solving small problems well with native code.

What it does

  • Detects clipboard content type automatically
  • Transforms content based on type: pretty-print JSON, extract URL components, convert color formats, format numbers, validate UUIDs, and more
  • Lives in the menu bar via MenuBarExtra, with no dock icon, no main window
  • Settings window for configuring keyboard shortcuts and launch-at-login behavior

Tech stack

Note

Language: Swift 6 with strict concurrency (SWIFT_STRICT_CONCURRENCY: complete)

UI: SwiftUI, macOS 14+

Dependencies: KeyboardShortcuts, Defaults, LaunchAtLogin-Modern (all from Sindre Sorhus)

Build: XcodeGen (project.yml), Swift Package Manager

Sandbox: App Sandbox enabled, hardened runtime

Bundle ID: com.87n1.PasteDrop

Tests: 80 unit tests covering CoreLib detection and transformation logic

Architecture

PasteDrop is split into two targets: a CoreLib framework and the app itself. CoreLib contains the pure logic: ContentDetector for clipboard type detection, TransformEngine for the transformations, and ClipboardContentType for the type model. The app target handles the SwiftUI views: MenuBarView, SettingsView, and PasteDropApp entry point.

This split means the detection and transform logic is fully testable without launching the app. The test target depends only on CoreLib: 80 tests covering content detection and transformation edge cases.

Why Swift 6 strict concurrency

PasteDrop monitors the system clipboard, which means timer-based polling on the main actor. Swift 6's strict concurrency catches data races at compile time rather than in production. For a clipboard utility that runs in the background all day, that matters. A concurrency bug in a menu bar app is the kind of thing that silently corrupts data or leaks memory over hours.

The Sindre dependency stack

Three dependencies come from Sindre Sorhus's open-source library. KeyboardShortcuts handles the macOS keyboard shortcut recording UI that Apple doesn't provide natively. Defaults wraps UserDefaults with type safety. LaunchAtLogin-Modern handles the login item registration that changed in macOS 13. These are mature, well-tested packages that solve platform gaps I'd otherwise have to maintain myself.

The ship-apps context

PasteDrop is app one of six in a portfolio sprint. The goal is straightforward: demonstrate shipping ability with native code. Each app follows the same constraints: Swift 6, SwiftUI-first, XcodeGen for project generation, App Sandbox, one-time purchase pricing. The templates live at ~/jeffmichaeljohnson-tech/templates/{macos-utility,ios-utility}/ and a /ship-app skill scaffolds new apps from them.

The other five apps (OneThing Plus, StatusPulse, ShipLog, MeetingCost, Sentinel) are at various stages from built to submitted.

PasteDrop menu bar showing JSON detection

Settings window with keyboard shortcut configuration

Color format conversion in action

The backstory

PasteDrop is one of six apps in the ship-apps portfolio, a rapid-shipping experiment inspired by Sindre Sorhus. The idea is simple: solve small, real problems with native code, then ship them. Every app in the portfolio shares a four-file macOS template: AppTemplateApp.swift, MenuBarView.swift, SettingsView.swift, and AppDefaults.swift, 226 lines total, with // MARK: - CUSTOMIZE placeholders where domain logic goes. The template bakes in menu-bar UX, tabbed Settings, LaunchAtLogin, and typed UserDefaults via Sindre's Defaults library.

What makes each app different is its CoreLib. PasteDrop's CoreLib is three files: ContentDetector, TransformEngine, and ClipboardContentType. That's the domain logic: everything that decides what's on your clipboard and what to do with it. Everything else is shared shell.

The 80 tests all target CoreLib. They ran green via swift test before any UI existed. The app shell came last, and it was mostly template code with custom views wired to CoreLib's API. That ordering, logic first and UI second, is what made this ship in days instead of weeks.

What almost broke this

Apple's Mac App Store review is finicky about clipboard access. PasteDrop reads the pasteboard constantly to detect content types, and that kind of behavior triggers privacy scrutiny. A clipboard utility that polls in the background looks like it could be exfiltrating data. The review team has rejected apps for less.

The solution was explicit NSPasteboard polling (not observation, not background notifications) with clear Privacy Manifest declarations and sandboxed entitlements that only request what the app actually needs. No broad entitlements, no overreach. The app went into review and came out approved without a single reviewer question. That felt like a small victory.

What I learned

Shipping speed is a design problem, not a hustle problem. The template pre-decides 80% of app chrome: menu bar behavior, settings layout, launch-at-login, defaults storage. You only write domain logic. That constraint is freeing. You stop bikeshedding window management and start solving the actual problem on day one.

The CoreLib-per-app pattern is the minimum structure that makes AI-assisted development reliable. When Claude Code generates transform logic, putting it in CoreLib means tests validate it before any UI exists. A generated function that passes 80 tests is trustworthy. A generated function pasted into a view is a guess. That's the real speed unlock: not the velocity, but the verification loop.

Occasional updates when I publish. No spam.