Open source · Mac and iPhone

The last agentic harness you'll ever need.

Bring any model. Pennant gives it everything else, on your Mac: a chat you can type or talk to, jobs and goals that keep going on their own, your apps, the web and your code, a memory with receipts, and a card before anything is sent, deleted or paid for.

Version 0.3.3, a preview · free · macOS 15 or later, Apple silicon or Intel

Pennant on the Mac: three things need you, what's working now, what's coming up, today's numbers and the goals
An approval card on iPhone, with Approve and post
A day with Pennant

By the time you're up, the work is done.

Maya runs Harbor, a small software company. Here's an ordinary Tuesday with Pennant, played the way the app does it. The people, the company and the numbers are made up.

06:00Inbox

The inbox is sorted before you're up.

A job Maya set up once, in plain words: "Every weekday at six, sort my inbox and draft the replies that need me." It follows a skill she can read and change. The noise is archived, the sign-ups get her approved answer, and the one reply that needs her waits on a card.

jobs on a scheduleskillsOutlook or Gmailasks before sending
Inbox drafts · this morning's runweekdays 6:00
JLJonas Lindqvist · NorthwindWhen can we switch on shared views for Priya's team?Needs you
3838 beta sign-upsInterested in the Harbor 2.0 beta…Answered · your template
BBrightlineYour order has shippedFiled · receipts
WThe Weekly FounderIssue 212: pricing pages that convertArchived
PPriya RamanAudit kickoff moved to ThursdayIn the brief

0 read0 archived or filed0 answered0 needs you

08:30Morning brief

A morning brief, in a few words.

Maya talks to Pennant in one chat, typed or out loud, on the Mac or her phone. Asked what happened, it answers the way a person would: what's done, what needs her, what it cost. Everything it did is in threads she can open.

the Pennant chatthreadsTalk modeiPhone
PennantMaya's chat
Pennant
Talk mode

09:15Code

A fix, tested and opened as a pull request.

"Imports are slow again, can you look?" Code changes go to a coding run in a thread of its own, with Claude Code or Pennant's own engine, in its own copy of the repository. It finds the slow path, fixes it, runs the tests and opens the pull request as its own GitHub App, never as Maya. Deleting a branch still waits for her.

coding runsits own GitHub identitytests firstasks before deleting
Faster imports · coding runharbor/importer
    importer/load.py+3 −2
      def load(rows):-   for row in rows:-     db.execute(INSERT, row)+   for batch in chunks(rows, 5000):+     db.executemany(INSERT, batch)+   db.commit()
    50,000 rows, before6 min 40 s
    After1 min 12 s
    #482 Batch the import writesOpened by harbor-pennant[bot] · 214 tests passed
    11:00A goal

    A goal it works toward on its own.

    Some work has no single ask. Maya set a goal once: "Grow the company page to 2,000 followers by the end of the quarter," with a measure, how much freedom it has and a weekly budget. When a session is due, the heartbeat starts one; Pennant picks the next thing from the goal's board, and anything public waits for her.

    goalsthe heartbeatweekly budgetsasks before posting
    Grow Harbor's company pagegoal · works daily
    2,000 followers by the end of the quarterMeasured from the page's analytics · free to choose topics and formats
    Followers1,612 / 2,000
    This week$6.02 of $20

    Waiting on you 0

    Doing 0

    Next 3

    A post on shared workspacesPeople are asking about it
    Refresh the page's AboutMentions the old pricing
    Try a carousel formatCompare reach with text posts

    Done 12

    Weekly numbers+84 followers, 3.9% engagement
    Harbor 2.0 is livePosted Monday
    14:00From the phone

    A request from the street, done in its own browser.

    Between meetings, Maya says it out loud on her phone: "Find somewhere for twenty on Thursday, near the office, about sixty a head." Pennant works in tabs of its own in her Chrome, with her sign-ins, while her browser stays hers. It comes back with a shortlist, tells her in a sentence, and the deposit waits for her.

    Talk mode on iPhoneits own Chrome tabsa shortlist with linksasks before paying
    Pennant
    Talk mode

    Dinner for twenty on Thursdaythread
    Pennantits own tab in Maya's Chrome
    16:40Production

    An alert, its cause, and a fix that waits for a yes.

    Checkout errors jump. The alert reaches Pennant through a connection to Harbor's monitoring. A helper on a small model running on the Mac reads twelve thousand log lines for nothing; Pennant lines the spike up with a key that was rotated a minute before, and proposes the fix. Production changes wait for Maya: the operations skill says so, and the card is how it asks.

    connectionshelpers on a cheaper modelskills you ownasks before changing
    Checkout errors · harbor-webfrom your monitoring
    Checkout errors at 4.2%since 16:32 · normally under 0.1%
    Checkout error ratelast 30 min
    16:1016:3216:40
      23:00The night

      The night shift, with every cent on the ledger.

      While Maya sleeps, the jobs run: backups, the weekly digest, a price check split across three helpers, dependency updates as a pull request. The heartbeat checks in every half hour. Memory keeps what was learned, with where it came from, and every run lands on a ledger by job and by model.

      jobshelpers in parallelmemory with receiptsany modelcost ledger
      Overnightusage · Tuesday
      • 23:00BackupsDatabase and files, checked$0.00
      • 23:30Weekly digestDrafted for the team$0.06
      • 00:10Competitor pricesThree helpers, one site each$0.09
      • 01:00Dependency updatesPull request #483, tests passing$0.12
      • 02:30The heartbeatNudged a thread that stalled$0.02
      • 04:00Inbox pre-sort22 archived before six$0.04
      • 05:45Morning briefReady for 8:30$0.08

      By model

      DeepSeek-V4.1-Flash · Azure$0.41
      Gemma 4 on this Mac · 3 helpers$0.00
      Overnight · 14 runs$0.41

      Remembered

      Northwind wants shared views by the 21stFrom Jonas's email · Tuesday
      A competitor cut its team plan to $18From the price check · 00:10
      What it does

      Everything in that day, in one app.

      One agent on your Mac, a native Mac app, an iPhone app and a command line. Here's the whole of it, with the hour above where you saw each part.

      Ask how you reach it

      • One chat with PennantIt answers what's quick and starts threads for the rest. 08:30
      • Talk modeOut loud, in a voice that runs on your Mac. 14:00
      • The iPhone appThe chat, approvals, threads and your Mac's screen, live. 14:00
      • Teams, iMessage, TelegramReach it where you already are.

      Work what it keeps going

      • Jobs on a scheduleIn plain words or cron. Every run gets its own thread. 06:00
      • GoalsAn outcome, a measure, a weekly budget and a board. 11:00
      • The heartbeatIt checks in on its own, and does what you ask on each check-in. 23:00
      • HelpersBig jobs split across a cheaper or local model. 16:40

      Act its hands

      • Your Mac's appsIn the background, with a cursor of its own. Move your mouse and it lets go of yours.
      • The webTabs of its own in your Chrome, with your sign-ins. 14:00
      • CodeClaude Code or its own engine, as its own GitHub App. 09:15
      • Skills and connectionsSkills are folders you own; connections reach GitHub, Notion, Linear, Stripe, your mail and more. 06:00

      Keep what it remembers

      • Memory with receiptsPeople, decisions and preferences, each with where you said it. 23:00
      • Any modelOpenAI, Anthropic, Google, DeepSeek, Mistral, a GPU box on your desk or a local model, with fallbacks.
      • Every centA ledger by run, job and model, and a budget per task and goal. 23:00
      • ReportsWhat a job found, kept where you can read it later.
      Trust

      Built so you can leave it running.

      Agents fail in familiar ways: they send before they should, retry what already went out, and drift from what they were asked. Pennant is built around those.

      It asks first.

      Publishing, sending, deleting and spending stop at a card, whatever a skill says or the model decides. Approving runs exactly what the card shows.

      Instructions can't widen what it may do.

      Permissions come from the harness, from sign-off rules and grants, not from what a prompt or a web page tells the model.

      One owner of the screen.

      When it needs your real pointer it takes a lease on the screen. Touch the mouse and it lets go.

      Uncertain means check, not retry.

      If a crash leaves it unsure whether something went out, it looks before it tries again.

      A budget and a ledger.

      Every task and goal has an allowance of steps, tokens and time, and every run is costed by job and by model.

      Secrets stay out of the chat.

      Keys and passwords live in your Keychain. The model never sees them.

      How Pennant compares with OpenClaw, Hermes Agent, Claude Cowork, ChatGPT and Codex, Perplexity Computer and Goose
      CapabilityPennantOpen source · Mac + iPhoneOpenClawOpen-source gatewayHermes AgentNous ResearchClaude CoworkAnthropicChatGPT & CodexOpenAIPerplexity ComputerPerplexityGooseBlock · AAIF
      Open source✓YesApache-2.0✓YesMIT✓YesMIT✕No~Codex CLI onlyApache-2.0✕No✓YesApache-2.0
      Where it runs✓Your MacHost, Mac app, iPhone app✓Your machine or server✓Your machine or serverHosted option too~PartlyDesktop app; models and web version in Anthropic’s cloud~OpenAI’s cloudCodex also runs locally~Mostly cloudMac edition is hybrid✓Your machine
      Choice of model✓Any, local tooFalls back on outages and rate limits✓Any, local tooWith failover✓Any, local too✕Claude only~OpenAILocal models through the Codex CLI~Hosted modelsLocal only in the on-device edition✓Any, local too15+ providers
      Asks before acting on the outside world✓AlwaysPublishing, email, deleting and spending wait for a card, enforced by the harness~Shell commands onlyOff by default~Shell commands onlyAn LLM approves by default~Manual or auto mode~Automated reviewScheduled Codex runs skip approval~Opt-in, per tool~Acts without asking by defaultPer-tool permissions available
      Approve from your phone✓iPhone appApprovals, reports, threads and the Mac's screen✓iPhone appSince June 2026~Through chat apps✓Claude apps✓ChatGPT appsCodex Remote✓Perplexity apps✕NoMobile access removed
      Schedules✓CronEach run in its own thread; an overrunning job skips its turn✓Cron, heartbeat✓Cron✓Recurring tasks✓Tasks, automations✓Schedules, triggers✓Cron recipes
      What each run costs✓Per run, job and modelCache hits counted; big runs flagged~Usage commandNo spend cap~Estimates~Plan metersClaude Code shows dollars~Plan limits✓Per taskWith a spend cap~Estimates
      Secrets✓VaultScripts get environment variables; output is scrubbed~Plaintext by default~.env file, vault references~No vault documented~Codex cloud: setup time only~Vendor holds OAuth tokens~KeychainPlaintext fallback
      Price✓FreeYou pay for your models✓FreeYou pay for your models✓FreeHosted from $0.56/day✕From $20/mo~Free tierPlus from $20/mo✕$20/mo plus credits✓Free
      Yours

      Free, open source, and on your Mac.

      Pennant is about 69,000 lines of Swift under the Apache 2.0 licence: a host that runs the agent, the Mac and iPhone apps, and a command line.

      • No account with us, no telemetry, no server of ours in the middle.
      • Everything in one folder you own. Export and import move it to your next Mac.
      • Your model, your choice. With a local model, nothing leaves your Mac.
      • The iPhone talks to your Mac directly, over your network or Tailscale.

      Version 0.3.3, a preview. Signed and notarized by Apple; it updates itself once you allow it. SHA-256 8b34f8216d87e2a7cdb58c4fc694975f12c92e34eafdee893c99db53cb220a1d

      macOS 15 or laterApple silicon or InteliPhone app: iOS 18 or laterany OpenAI-compatible endpoint, or Ollama
      Terminal
      $ git clone https://github.com/pennant-dev/pennant
      $ cd pennant && Scripts/build-release.sh --open
      # builds, signs and opens Pennant.app
      
      # no API key yet? start local
      $ ollama pull gemma4:e2b-it-qat
      
      # let it write code in your repository
      $ pennant coding folder ~/code/your-app