Skip to contact form
Skip to main content

macOS app development — native Mac software in Swift and SwiftUI, notarised and shipped on the Mac App Store or direct.

BothmademacOS

swift · swiftui · appkit

Your app — built for the Mac

Software that belongs on a Mac — keyboard-first, properly windowed, and signed and notarised so it opens without a warning.

Project anatomy

Capabilities

Project layer01

Document & Pro Apps

Multi-window, multi-document software with the keyboard shortcuts, drag-and-drop and undo stack a Mac user expects without being told.

Project layer03

Internal Business Tools

Desktop software for the work a browser tab is wrong for: local files, hardware, long-running jobs, and data that should not leave the building.

Project layer04

Signing, Notarisation & Updates

Developer ID signing, Apple notarisation and a working update channel — so it opens without a warning and stays current after launch.

Project layer05

Shared Code With iOS

Where you already have an iPhone or iPad app, the model and business logic come across rather than being written twice.

Connected systems

Stack

A Mac app is not a website in a window, and the ones that are get spotted immediately: the keyboard does nothing, the window will not split, and the file menu is decorative. We build in Apple's own frameworks — Swift and SwiftUI, dropping to AppKit where the platform still expects it — because that is what makes an app feel like it belongs on the machine rather than like a page someone wrapped. The rest of the stack below is what gets it from a build on one laptop to something a stranger can download and open without seeing a warning.

Frameworks

SwiftUI for the interface, AppKit where the Mac still has the better answer — toolbars, sidebars and window management are older than SwiftUI and it shows. Mixing them is normal on this platform, not a compromise.

  • Swift
  • SwiftUI
  • AppKit
  • Combine / async-await

Data & System

The parts a desktop app has that a web app does not: real files, real folders, and work that keeps running while the window is closed. Sandboxed by default, so what it can reach is a decision rather than an accident.

  • SwiftData / Core Data
  • FileProvider
  • Background tasks
  • App Sandbox

Shipping

Signed with a Developer ID and notarised by Apple, which is the difference between an app that opens and one macOS refuses with a scary dialog. Distributed on the App Store or straight from your own site — whichever suits how you sell.

  • Developer ID signing
  • Notarisation
  • Sparkle or App Store updates
  • TestFlight

Delivery pipeline

How a project runs

Every project runs the same way, whatever it is being built on. The scope and the price are agreed before anything starts, and the schedule below is the one written into the agreement — not a description of how things usually go.

  1. Scope and price, fixed

    Before anything is built

    You get a written scope and a number that does not move. Changes after that are handled as a change order — priced, signed, and added to the schedule — rather than absorbed quietly and argued about at the end. Nothing is billed by the hour, so a slow week is our problem rather than your invoice.

  2. Payment 1 — 50%

    On signing, before work begins

    The deposit starts the work. The remaining two payments are tied to things you can see happening rather than to dates in a calendar, so a schedule that slips does not become an invoice that arrives anyway.

  3. Design, then your decision

    5 business days to review

    Designs are presented for review, and you get 5 business days to approve them or come back with changes. We send a reminder before that window closes. If it passes without an answer the design counts as approved and the next payment falls due — and we tell you the day that happens rather than letting you find out from an invoice.

  4. Payment 2 — 25%

    On design approval

    Build starts once the design is settled, so the thing being built is the thing you signed off. Approving the design is what releases this payment, which is why the review window above matters more than it looks.

  5. Payment 3 — 25%

    When the project is ready to launch

    The final payment falls due when the build is finished and tested, not when it goes live. Invoices are payable within 14 days and count as late 7 days after that; you are reminded on the day each one is due rather than chased out of nowhere a month later.

  6. Launch and handover

    30-day warranty from launch

    Going live transfers everything: source code, accounts, credentials, domains. You own it outright — there is no licence to keep paying. Anything that breaks within 30 days of launch is fixed at no cost, because it is a defect rather than a new request.

Before we begin

Questions

Open a channel

The Mac is where the work happens.

If your people spend their day in a browser tab that was never meant for it, that is a desktop app waiting to be written.