offmain
private beta · 2026 Join waitlist
// shipped

Changelog

Short dated notes on what landed across the apps and the backend.

$ cd ~/changelog·239 entries·page 2 of 5rss feed

week of aug 17, 2026

also this week

  • siteAdd a share row and a summarize bar to every postadded

week of aug 10, 2026

macOS3 changes

The filter stops claiming it is fine

A filter that stops enforcing raises a notification, the Mac lists the stretches it blocked nothing, and an app update leaves the filter reachable.

  • List the stretches the Mac blocked nothing, each with its lengthaddedwhy

    List the stretches the Mac blocked nothing, each with its length and the part of it a contract window covered. The record reads the timestamp the filter itself holds and survives a relaunch, so restarting the app no longer hides a gap or restarts the clock behind it.

  • Keep the Mac filter reachable after an app update, with no restartfixedwhy

    Keep the Mac filter reachable after an app update. macOS held the service name for the replaced filter, so the new one could never be reached and only a restart cleared it; every build now asks for a name of its own.

  • Say when the Mac filter stops enforcing instead of reporting healthyaddedwhy

    Say when the Mac filter stops enforcing, instead of reporting healthy. A restart it is waiting on, a run of block updates it never took, and a filter that has lost contact each raise a Time Sensitive notification, flatten the menu-bar mark to one amber bar, and name the reason and the way out on the one screen.

also this week

  • backendDeliver notifications to the device again, after three weeks with none arrivingfixed
  • iOSRaise the alert to Time Sensitive when Screen Time permission goes awaychanged

week of aug 3, 2026

macOS4 changes

Minutes arrive where you can see them

The balance rolls up when new minutes land, the earn chip stops the number shifting, and a ledger row shows the balance it moved between when you click it.

  • Keep the targets, windows, and preset you author during Mac setupfixedwhy

    Keep the targets, windows, and preset you author during Mac setup when a contract already exists from an earlier install. Setup used to drop all of it, report success, and leave the filter enforcing the old contract with nothing on screen to say so.

  • Hold the balance number still when minutes land, with the earn chip overlaidchangedwhy

    Overlay the earn chip on the balance number’s top-right corner, so the number holds still when minutes land instead of shifting left to make room. The chip reads a bare +12 now, and hovering it gives the full wording and the time the minutes arrived.

  • Show the balance a ledger row moved between when you click itchangedwhy

    Show the balance a ledger row moved between when you click it, so a break reads balance 120 → 60 instead of only its minutes. An overspend floors at zero, so no row shows debt, and a row that landed later than the time it displays says when it landed.

  • Roll the balance up when new minutes arrive, and add a Cmd-R refreshaddedwhy

    Roll the balance up on the Mac hero when minutes you have not seen yet arrive, and add a refresh button with a Cmd-R shortcut to the Balance and Ledger tabs. The menu-bar popover already re-checks every time it opens, so it has no button.

site7 changes

The site asks less of the reader

The landing page drops from about 900 words to about 521, the hero demo gains pause and six named beats, and the theme follows your machine until you pick one.

  • Page the changelog at 50 entries instead of rendering all 128 at oncechangedwhy

    Page the changelog at 50 entries, so the stream stops rendering all 128 at once, and cap each screenshot at 440px with a click to open the full shot. The RSS feed still carries every entry, and each item links to the page that renders it.

  • Stop the progress bar cutting through the tracker chip on phones and tabletsfixedwhy

    Fix the how it works header on phones and tablets, where the progress bar cut through the active tracker chip and the setup line ran into the caption under it. Desktop was already right and is untouched.

  • Show the hero demo frozen at the payout in the link preview cardchangedwhy

    Replace the link preview card with the hero demo frozen at the payout, so a shared offmain.dev link shows the merged pull request, the notification, and the minutes landing on both devices. The card is square, so tall previews show it whole and wide ones crop to the composition it was built around.

  • Say in the landing page setup line that the blocked set is yourschangedwhy

    Say plainly that the blocked set is yours in the landing page’s setup line, which now reads “Sign in with GitHub, choose the apps and sites to block and when. This is your one contract.” Every earlier statement that the list is yours sat inside a folded FAQ row, so the platform band read as a fixed list.

  • Follow your machine's light or dark setting until you pick a themechangedwhy

    Follow your machine’s light or dark setting on offmain.dev until you pick a theme, landing on soft latte or soft mocha. The picker gains a “your machine” row that clears your pick and names the palette it resolved to, and a stored pick still wins over everything.

  • Cut the landing page from about 900 words to about 521 across nine bandschangedwhy

    Recut the offmain.dev landing page to nine bands and drop it from about 900 visible words to about 521, so what the product does arrives before the scrolling does. The feature grid becomes one paragraph, each of the four platform cells says one line, and a signed founder note sits between the FAQ and the close.

  • Stop the hero demo or jump straight to one of its six named beatsaddedwhy

    Give the hero demo on offmain.dev a pause button, a fullscreen button, and six named beats, so you can stop the 91-second story or drop straight into the beat you want instead of waiting for it. The demo also holds where it stands when you switch tabs, rather than running on unseen.

iOS3 changes

The balance moves where you can see it

A ledger row names the balance it moved between, new minutes roll the number up instead of arriving already counted, and pull-to-refresh lands on Now and the ledger.

  • Mark new minutes the same way on iPhone and Mac by moving the earn chipchangedwhy

    Hang the earn chip off the balance number’s top-right corner instead of centring it above the digits, so the iPhone and the Mac mark new minutes the same way. Both now draw one shared component sized as a fraction of the balance type, so the two cannot drift apart again.

  • Show the balance a ledger row moved between when you tap itchangedwhy

    Show the balance a ledger row moved between when you tap it, so a break reads balance 120 → 60 instead of only its minutes. Today’s grace row is tappable now too, so the footer’s promise of detail on every row is true.

  • Roll the balance up when new minutes arrive, and add pull-to-refreshaddedwhy

    Roll the balance up when minutes you have not seen yet arrive, so the number counts from the old balance to the new one instead of being changed already when you look, and add pull-to-refresh on Now and the ledger to fetch them on demand. Reduce Motion gets the final number with a brief tint instead of rolling digits.

week of jul 27, 2026

iOS18 changes

The app is re-cut and the false alarms stop

Every main screen is re-cut behind a new offmain init onboarding, the false Protection is off banner ends, and the blocked list splits into apps and sites.

  • Say block, not shield, across the app, and correct when earning startschangedwhy

    Say block, not shield, across the iOS app, matching the site’s wording. The same pass fixed two strings promising that earning starts when you commit at the end of setup, when it starts when you arm.

  • Split the blocked list into apps and sites, and name every domain a site coverschangedwhy

    Split the blocked list into apps and sites, each header saying where it applies, and let a site row reveal every domain it covers. Blocking YouTube also blocks youtu.be and googlevideo.com; the row now names them instead of leaving the extra domains invisible.

  • Make the break cards on Now spendable with VoiceOver and Switch Controlfixedwhy

    Make the break cards on Now spendable with assistive technology: they carry a button trait and an action that spends directly, and hit areas meet the 44pt floor. VoiceOver’s double-tap used to land as an instant press and Switch Control could not hold at all, so no break could be started.

  • Add the app icon, tally strokes in brackets on the dark brand tileaddedwhy

    Add the app icon: the dark brand tile, tally strokes inside brackets with the block cursor waiting.

  • Paint the chosen background across the whole app, not just Settingsfixedwhy

    Paint the chosen background across the whole app. Picking one used to change only the Settings screens while Now and the ledger kept the theme default.

  • Keep the break countdown right after leaving the app and coming backfixedwhy

    Keep the break countdown ticking after leaving the app and coming back. The timer now recomputes from the break’s end time the moment the screen returns, so a break that ended while away reads as over, not frozen mid-count.

  • Match the companion's poses to the macOS canon, down to a zero balancechangedwhy

    Match the companion’s poses to the macOS canon: sleep through a break, a munch when minutes land, a wake on the 4 am day roll, and a static warden at a zero balance instead of vanishing.

  • Send a dead session back to sign-in instead of a connectivity errorfixedwhy

    Send a dead session back to sign-in instead of an endless “can’t reach OffMain”. A session the backend no longer accepts, common after deleting and reinstalling the app, used to render as a connectivity problem with no way out.

  • Show every day in the ledger, including days a late event used to hidefixedwhy

    Show every day in the ledger. An event arriving late could split its day into a duplicate group that never rendered, so whole days went missing from the list.

  • Show the minute balance as soon as onboarding finishes, with no relaunchfixedwhy

    Show the minute balance as soon as onboarding finishes. The Now screen used to sit at zero until the app was killed and relaunched, and a restored sign-in always landed on zeros.

  • Keep every onboarding choice when the account already has a contractfixedwhy

    Keep every onboarding choice when the account already has a contract. A reinstall used to report success while silently dropping the targets, window, and preset just picked; the app now writes them to the existing contract instead.

  • Save a Screen Time picker change that is the only edit in the contract editorfixedwhy

    Save a Screen Time picker change even when it is the only edit in the contract editor. The save bar never appeared for a picker-only change, so new picks were silently dropped and cleared apps stayed shielded on the device.

  • Stop the false Protection is off banner and its repeat notificationsfixedwhy

    Stop the false “Protection is off” banner and its repeat notifications. The app now reads every Screen Time grant as authorized, including the stronger one iOS 26.4 added, and gives the status up to two seconds to settle after a cold start before reporting. Enforcement was healthy the whole time; only the reporting was wrong.

  • Let the silent unlock reach TestFlight and App Store buildsfixedwhy

    Report the app’s real push environment at registration, so the silent unlock can reach TestFlight and App Store builds. Every install used to claim the sandbox, which would have left distribution builds waiting for the app to be opened before the shield cleared.

  • Rebuild onboarding as one offmain init transcript and re-cut every main screenchangedwhy

    Rebuild onboarding as one scrolling offmain init transcript, and re-cut Now, the ledger, Settings, and the contract editor onto their new layouts. Break lengths the balance cannot fund now dim instead of disappearing, so the row shows what a bigger balance buys.

  • Split the blocked list into every device and this device onlychangedwhy

    Split the shielded list into two counted groups, on every device and on this device only. One merged number claimed cross-device protection that Screen Time picks do not have; sites you type block everywhere, apps picked in Apple’s picker block on this device alone.

  • Reset to the Now tab on sign-out, so signing back in starts freshfixedwhy

    Reset to the Now tab on sign-out, so signing back in starts fresh instead of landing on the old Settings screen.

  • Add an app uninstall protection switch under Settingsaddedwhy

    Add an app uninstall protection switch under Settings. While it is on, OffMain and the shielded apps cannot be deleted from the iPhone.

macOS5 changes

Every Mac screen gets redrawn

Every screen is rebuilt from onboarding to the hold cards, the menu bar names how many targets are blocked, and the filter enforces the current block list.

  • Say block, not shield, across the Mac appchangedwhy

    Say block, not shield, across the Mac app, matching the site’s wording, and stop the blocked list calling site entries apps on a platform whose filter never blocked a native app. “macOS blocked it” becomes “macOS turned it down”, so the product’s own verb stops colliding with macOS as the thing doing the refusing.

  • Show how many targets are blocked at the top of the menu-bar menuaddedwhy

    Show how many targets are blocked, and when they open freely, at the top of the menu-bar right-click menu, with Balance and Ledger doors beside Settings. The menu now pops clear of the bar, so that first line is readable instead of hidden behind a scroll arrow.

  • Rebuild every Mac screen, from onboarding to the hold cards and menu-bar markchangedwhy

    Rebuild every Mac screen: onboarding as one scrolling offmain init transcript, settings as a single column of captioned sections with sub-panes, hold cards that count the minutes in as the balance drains, a real app icon, and a menu-bar mark where only the cursor carries state. A Finder or Dock click now opens the main window, and settings rows with no backend behind them render inert rather than faking the action.

  • Enforce the current block list after an app update, not the previous build'ssecuritywhy

    Fix the Mac content filter running the previous build’s block list after an app update, so a site blocked in the app is actually refused in the browser. The app now checks that the filter applied what it sent and retries when it did not; Settings names the time rule updates stopped landing.

  • Keep the break countdown ticking when the menu-bar window reopensfixedwhy

    Keep the break countdown ticking when the menu bar window reopens. The timer now recomputes from the break’s end time the instant the window returns, so it never shows a frozen number.

week of jul 20, 2026

macOS8 changes

The Mac starts speaking up

Setup reaches the enabled state on the first try, four notifications and a block moment name what happened, and a three-tab main window sits beside the popover.

  • Correct the companion's poses at zero balance and while you earnchangedwhy

    Correct the companion character’s poses: a static warden pose at a zero balance instead of sleep, a continuous body-double pose while earning, and new munch and 4 am wake animations.

  • Notice when the content filter is switched off in System Settingssecuritywhy

    Detect when the content filter is switched off in System Settings instead of only inside the app, and stop the app from silently turning it back on at the next launch without asking.

  • Re-cut onboarding to connect GitHub, preview earning, and walk both approvalsaddedwhy

    Re-cut onboarding to the minutes beats: connect GitHub, consent to 90 days of history, preview earning power, and a guided walkthrough of the two macOS approvals.

  • Name the site the moment a block lands, in a notification and the menu baraddedwhy

    Add a block moment: a notification and a menu-bar beat the instant a shielded site is visited while locked, naming the domain.

  • Add notifications for balance, zero balance, break ended, and block momentsaddedwhy

    Add four local notifications, balance available, zero balance, break ended, and block moment, each with its own on/off switch in Settings.

  • Fix the notification permission prompt spending itself on a card no one sawfixedwhy

    Fix the notification permission prompt silently spending itself on a card no one saw, correct the weekly summary to show real minutes earned and spent, and reset a stuck request state after a cancelled prompt.

  • Fix setup leaving the content filter off after approvalfixedwhy

    Fix the content-filter extension failing to reach the enabled state, so approval and setup work on the first try instead of leaving protection off.

  • Add a main window with balance, ledger, and settings tabsaddedwhy

    Add a three-tab main window, balance, ledger, and settings, alongside the popover.

$ page 2 of 5