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 1 of 5rss feed

week of aug 31, 2026

backend11 changes

OffMain reads GitHub less and pays more exactly

A repository is read once per covered account and only from the last pass on, failed deliveries replay, an issue close pays the closer, and signing out ends the session.

  • Accept a break sized to the time left in a windowaddedwhy

    Accept a break sized to the time left in a window, so the last stretch before a window closes stops being a place where nothing is affordable. It is never longer than 60 minutes, and it costs one minute per minute like every other break.

  • Hold the background read back so the coverage screen keeps a budgetfixedwhy

    Hold the background read back at 500 remaining GitHub requests, so the repository picker and the coverage screen keep a budget of their own. Both used to fall back to an empty list once a read had spent everything, which looked like having no repositories at all.

  • Stop grace topping up on top of a balance that was not emptyfixedwhy

    Read the balance at the day boundary from the ledger’s own running total, so the grace allowance stops topping up on top of a day that was not empty. An account that had ever overspent read as empty at 4am, because the old sum still carried a debt the zero floor had already removed.

  • Pay an issue close to the closer, from the poll as well as the webhookchangedwhy

    Pay an issue close to the person who closed it whether the event arrives by webhook or by the installation poll, and only when the issue was closed as completed. The poll used to pay whoever opened the issue and used to pay closes marked not planned or duplicate, so the same work was priced two ways.

  • Hold a repeat recalculate behind a 10-minute waitchangedwhy

    Hold a repeat recalculate behind a 10-minute wait and answer with the seconds left, rather than letting a failed one be tapped again straight away. An account already read once now reads only what is new since that read, instead of a fresh 90 days every time.

  • End the session on the server when you sign outsecuritywhy

    End the session on the server when you sign out, and require a signed token on every route that touches an account. Signing out used to clear the phone alone and tell the backend nothing, so the sign-in stayed valid on the server after the tap.

  • Skip a repository OffMain cannot read instead of failing the whole passfixedwhy

    Skip a repository OffMain cannot read instead of failing the whole pass over it. One refused repository used to hold the mark back for every account it covers, so the read window grew a day at a time until page caps started dropping events from the repositories that were fine.

  • Report what the 120-minute cap took on each of the last 30 daysaddedwhy

    Report how many minutes the 120-minute cap took on each of the last 30 days, beside what you earned and spent. A day that starts at the cap earns 0, so until now a day of real work and an idle day read exactly the same.

  • Read each repository once per covered account, not once per personchangedwhy

    Read each repository once per covered account instead of once for every person who works in it, and start from where the last pass stopped rather than re-reading the whole day. A team sharing one covered organization no longer splits a single GitHub rate budget, and the worst case for one repository falls from 179 requests to about 19.

  • Replay the GitHub deliveries that failed instead of waiting for a full readaddedwhy

    Replay the deliveries GitHub tried to hand over and could not, so work found that way lands without waiting for the next full read of your repositories. A delivery is asked for again only when no record of it ever arrived, and it comes back through the same door as any other, so nothing is paid twice.

  • Stop the GitHub reads that fail part way through a parallel pullfixedwhy

    Stop the GitHub reads that fail part way through a parallel pull. Every request in flight now holds its own connection instead of sharing one, and a read that faults mid-flight is tried once more before it gives up.

iOS8 changes

The iPhone moves, and the dead ends clear

Controls answer to touch, content stops jumping, a full balance buys a fitted break in the closing hour, and a ledger that would not scroll loads the rest.

  • Offer a break sized to the time left in the closing hourfixedwhy

    Offer a break sized to the time the window has left when no preset fits inside it, so a full balance buys something in the last hour instead of nothing. Every option used to read closes before it fits, whatever you had earned.

  • Say how long until you can recalculate againchangedwhy

    Say how long until you can recalculate again when you ask twice in a row, instead of returning a general error that reads like the rate itself failed.

  • End the session on the backend when you sign outsecuritywhy

    End the session on the backend when you sign out, not only the copy the phone was holding. The phone clears itself either way, so a backend it cannot reach never leaves you stuck signed in.

  • Mask the installation id in crash and error reportssecuritywhy

    Mask the installation id in crash and error reports, and strip identifiers out of the URLs that travel with them. A report now carries a six-character suffix instead of the whole value.

  • Add a 30-day strip to the Balance tabaddedwhy

    Add a 30-day strip to the Balance tab, so the last month of earning and spending sits under today’s number instead of only on the ledger.

  • Load more ledger rows instead of stranding you at a stuck scrollfixedwhy

    Load more ledger rows when the tape stops short of filling the screen, instead of stranding you at a scroll that will not move. The day’s running total settles on the right numbers as rows land, rather than waiting for an unrelated tap to correct it.

  • Answer every press with motion and hapticschangedwhy

    Answer every press with motion and haptics, so controls that sat dead under your finger now respond to it. Content that used to swap in a single frame animates the change instead, and a once-ever moment such as the first Screen Time grant carries more weight than a routine one.

  • Offer a retry when the rate preview fails during setupfixedwhy

    Offer a retry when the rate preview fails during setup, instead of leaving you on a screen with no number and no way forward.

macOS5 changes

The Mac lets go when you sign out

Signing out ends the session on the backend, the Mac holds still until it does, a full balance buys a fitted break in the last hour, and controls answer to the pointer.

  • Offer a break sized to the time left in the closing hourfixedwhy

    Offer a break sized to the time the window has left when no preset fits inside it, so a full balance buys something in the last hour instead of nothing. Every option used to read closes before it fits, whatever you had earned.

  • End the session on the backend when you sign outsecuritywhy

    End the session on the backend when you sign out, not only the copy the Mac was holding. The Mac holds still while that finishes, so a push arriving mid sign-out cannot start a block again for the account you just left.

  • Mask the installation id in crash and error reportssecuritywhy

    Mask the installation id in crash and error reports, and strip identifiers out of the URLs that travel with them. A report now carries a six-character suffix instead of the whole value.

  • Tell a loading ledger apart from an empty onefixedwhy

    Tell a ledger that is still loading apart from one with nothing in it, so a tab mid-read no longer reads as a month you earned nothing in.

  • Answer every press with motion instead of a dead controlchangedwhy

    Answer every press with motion, so a switch or a tag that changed with no transition now responds under the pointer. Content that used to swap in a single frame animates the change instead.

week of aug 24, 2026

backend7 changes

OffMain stores less and tells the phone more

Deliveries keep only identifiers and counts, private work pays the whole day, the state read carries today's signals and 30 days of minutes, and the long reads finish.

  • Recalculate a contract without timing out on an active accountfixedwhy

    Recalculate a contract without timing out, by reading repositories and their pull-request reviews four at a time instead of one after another. An active account used to run past the phone’s 60-second limit, and the app then said GitHub had not answered, which was not true.

  • Stop losing push nudges when several devices are told at oncefixedwhy

    Stop losing push nudges when several devices are told at once. Two sends racing on the one connection to Apple used to tear down every nudge in flight, not just the pair that collided, so unrelated people kept a block up until their next refresh.

  • Serve today's signal counts and 30 days of earned and spent minutesaddedwhy

    Serve today’s count for each of the six signals, plus 30 days of minutes earned and spent day by day. Both are read-only counts of work that already happened, so the apps draw the strips and the backend still owns every number.

  • Ask GitHub for 90 days of private-work history on a first contract, not a yearfixedwhy

    Ask GitHub for 90 days of private-work history when building your first contract, not the year it was returning. A count up to four times too big under-priced every rate in the contract, worst for the people who do the most private work.

  • Pay the whole day's private-work count at your preset's commit rate, no ceilingchangedwhy

    Pay private work as a bonus: the whole count GitHub gives for the day, at your preset’s commit rate, with no ceiling and nothing subtracted for work OffMain can already see. The old rule subtracted OffMain’s own count and paid zero on the days with the most private work in them.

  • Store only the identifiers and counts the engine reads from a webhook deliverychangedwhy

    Cut a webhook delivery down to the identifiers and counts the engine reads, before any of it is stored. Commit messages, file paths, titles and review bodies are never written down now, and the deliveries already stored were cleared by the same change.

iOS19 changes

The iPhone app is rebuilt screen by screen

Onboarding becomes one idea per screen, the contract opens as sections, the ledger becomes a tape, and each screen says when it is still checking.

  • Rebuild onboarding as one idea per screen, built from your answerschangedwhy

    Rebuild onboarding as one idea per screen instead of a single scrolling transcript, asking what pulls you away and when the block should hold, then arming the contract from those answers. A six-tap walkthrough teaches the loop, and the Screen Time ask gets a screen of its own that says plainly what stays blocked if you decline.

  • Open recalculate as a screen that shows the new weight tableaddedwhy

    Open recalculate as its own screen that waits, then sets the old weight table against the new one, so a changed rate is something you read rather than infer. A failure and a timeout each get their own screen, and the note that each piece is worth less appears only when it is true.

  • Say a recalculate timed out instead of claiming your rate heldfixedwhy

    Say a recalculate took too long when it times out, instead of reporting that GitHub did not answer and your rate is unchanged. The server may have finished the job anyway, so the old message stated a guess as a fact.

  • Drain the balance into the break once, not twicechangedwhy

    Drain the balance into the break as you hold and keep it drained while the spend settles, instead of letting the number spring back and fall a second time. The hold ticks under your finger now, and the countdown crossfades in place when the break starts.

  • Show how close the balance sits to the 120-minute capaddedwhy

    Show how close the balance sits to the 120-minute cap on a segmented meter, which turns amber and reads full once earns start being clipped. A strip under it counts what you shipped today, by signal.

  • Rebuild the contract screen as sections you open one at a timechangedwhy

    Rebuild the contract screen as a summary with doors you open one at a time, instead of one long scrolling page you hunt through. A pending edit names the time it actually lands rather than a fixed tomorrow at 4am, and a save that fails says what went wrong and offers a retry.

  • Rebuild the ledger as a tape that leads with the numberschangedwhy

    Rebuild the ledger as a tape, a 30-day strip of daily squares over rows grouped by day, each row leading with what it moved, such as balance 81 to 95. Earns that all landed at the cap fold into one amber row instead of repeating a line that paid nothing.

  • Collapse the look settings into one page with a live previewchangedwhy

    Collapse the look settings into one page with a live preview, so a theme or texture change shows itself before you leave the screen. The six built-in scene backgrounds are removed, and the companion is a single switch rather than a species picker.

  • Give Settings its own tab and regroup its root into six sectionschangedwhy

    Give Settings its own tab beside Balance and Ledger and regroup its root into six labelled sections, so the way in is no longer a gear hidden in the ledger header. The permission is called Screen Time access everywhere now, matching iOS Settings, and three rows advertising platforms that do not ship yet are gone.

  • Say when a number is being checked instead of showing it as currentaddedwhy

    Say when a number is being checked rather than showing a stale one as if it held, dimming the last reading while the refresh runs. A first-ever load draws a skeleton and a slow start shows a curtain only past 400ms, so a true value is never hidden behind a spinner.

  • Cut Where your work counts down to two doors from 330 wordschangedwhy

    Cut Where your work counts down to a landing page with a door for your GitHub accounts and a door for your commit emails, instead of 330 words of prose. A commit skipped for an unconnected email now reads differently from a source OffMain has not read yet.

  • Raise all 12 themes to AA contrast so faint text reads againfixedwhy

    Raise all 12 themes to WCAG AA contrast, so text and controls that washed out against their background are readable again. A switch’s off-state thumb counts as a control now rather than decoration, so it carries the 3:1 contrast a control owes you.

  • Show the edits queued to the day boundary when you arm againfixedwhy

    Show which contract edits are queued when you arm against a contract you already have, instead of applying the immediate ones and staying quiet about the rest. A weakening edit still lands at the next 4am boundary, and the arm screen now says so.

  • Give every control a 44pt tap target and one spacing scalechangedwhy

    Give every control a 44pt minimum tap target and put the whole app on one spacing scale, so rows and buttons stop sitting too close to hit reliably. Type has an 11pt floor now, and onboarding waits on a pixel-art spinner instead of the system one.

  • Show the day's private-work count on the ledger rowchangedwhy

    Show the day’s private-work count on the row, beside the minutes it minted and the minutes that did not fit in your balance. Rows minted under the old subtraction rule keep the wording that was true when they landed.

  • Keep a break you already paid for on screen when the next read failsfixedwhy

    Keep a break you already paid for on screen when the read after it fails, instead of hiding the spend until something else triggers a sync. A spend the backend refuses is dropped rather than left showing.

  • Refresh the ledger as soon as a new snapshot lands, without losing your placefixedwhy

    Refresh the ledger as soon as a new snapshot lands, from a push, a poll, a spend, or coming back to the app, so a fresh earn shows on its own. A refresh merges into the rows you already scrolled through instead of jumping back to the top.

  • Date the Now screen from the last sync that landed, not the current momentfixedwhy

    Date the Now screen from the last sync that landed, and raise the offline banner only once the failures hold, so the timestamp and the warning stop naming two different moments. A phone that has never synced says so instead of stamping the current time.

macOS15 changes

The Mac stops stating what it guessed

A silent filter reads as an outage, a refused session sends you to sign in, a timed-out recalculate stops claiming your rate held, and a pending edit names when it lands.

  • Say a recalculate timed out instead of claiming your rate heldfixedwhy

    Say a recalculate took too long when it times out, instead of reporting that GitHub did not answer and your rate is unchanged. The server may have finished the job anyway, so the old message stated a guess as a fact.

  • Keep the break countdown running after the popover closesfixedwhy

    Keep the break countdown running in the main window when you close the menu-bar popover, instead of freezing it until the view is built again. The clock stays live while any open surface is showing it.

  • Collapse the look settings into one pane with a live previewchangedwhy

    Collapse the look settings into one pane with a live preview, so a theme or texture change shows itself before you leave it. The six built-in scene backgrounds are removed, and the companion is a single switch rather than a species picker.

  • Name the time a pending edit lands, not a fixed 4am tomorrowfixedwhy

    Name the time a pending edit actually lands instead of printing tomorrow at 4:00am, which was wrong whenever the edit landed sooner. A save that fails now says what went wrong and offers a retry rather than going quiet.

  • Raise all 12 themes to AA contrast so faint text reads againfixedwhy

    Raise all 12 themes to WCAG AA contrast, so text and controls that washed out against their background are readable again. A switch’s off-state thumb counts as a control now rather than decoration, so it carries the 3:1 contrast a control owes you.

  • Show the edits queued to the day boundary when you arm againfixedwhy

    Show which contract edits are queued when you arm against a contract you already have, instead of applying the immediate ones and staying quiet about the rest. A weakening edit still lands at the next 4am boundary, and the arm screen now says so.

  • Show the day's private-work count on the ledger rowchangedwhy

    Show the day’s private-work count on the row, beside the minutes it minted and the minutes that did not fit in your balance. Rows minted under the old subtraction rule keep the wording that was true when they landed.

  • Report an outage when the filter stops answering, instead of reading healthyfixedwhy

    Report an outage when the filter stops answering, instead of reading it as healthy while nothing is blocked. Every message to the filter carries a deadline now, and two silent cycles raise the menu-bar mark and the banner rather than the app trusting a switch that can say on over an extension that is not running.

  • Delete your account from the Mac, with the filter stood down firstaddedwhy

    Delete your account from the Mac. Confirming takes your GitHub handle, and the Mac stands its filter and poll loop down before the wipe, so nothing re-locks it on the way out.

  • Bring the network filter back after it is switched off in System Settingsfixedwhy

    Bring the network filter back after it is switched off in System Settings, where switching it off tears down the whole configuration and leaves no switch to find. Turn On raises the permission ask again, and a dismissed panel reads as a refusal rather than a failure.

  • Refresh the ledger as soon as a new snapshot lands, so a fresh earn showsfixedwhy

    Refresh the Mac ledger as soon as a new snapshot lands, from a push, the poll loop, a spend, or opening the popover, so a fresh earn shows on its own. A refresh merges into the rows you already scrolled through instead of jumping back to the top.

  • Ask you to sign in again when the Mac's session is refusedfixedwhy

    Ask you to sign in again when the Mac’s session is refused, instead of holding the last snapshot and reading as offline. Signing out stands the filter down, so a dead session unlocks the Mac rather than holding a block it cannot explain.

  • Date the popover from the last sync that landed, not the current timefixedwhy

    Date the Mac popover from the last sync that landed, and raise the offline banner only once the failures hold, so the timestamp and the warning stop naming two different moments. A Mac that has never synced says so instead of stamping the current time.

site5 changes

The site says what it uses and stays readable

The privacy policy names what a commit and the private-work count leave behind, the license notices ship at /licenses, and every theme and button state clears 4.5:1.

  • Publish the third-party license notices the site owedaddedwhy

    Publish the third-party license notices at offmain.dev/licenses, covering the two fonts, the vendored CSS and icon paths, the bundled dependencies, and the color schemes the themes borrow from. The site shipped that work without its notices until now.

  • Keep button labels readable through hover and pressfixedwhy

    Keep button labels readable while you hover or press, by moving the state away from the accent instead of mixing more of it into the surface. Hover extends the corner brackets and press closes them into a full frame, so the state still reads.

  • Fix the grey-on-grey light themes and hold 4.5:1 in all twelvefixedwhy

    Re-cut all twelve theme palettes so text clears 4.5:1 on the surface it sits on, where the four light themes read grey on grey before. A contrast check now runs in CI, so a palette that drops below the floor cannot merge.

  • Name the private-work count in the privacy policy and how long it is keptchangedwhy

    Name the private-work count in the privacy policy, along with what it never carries and how long it is kept. The deletion clause now names the iPhone as the one platform with an in-app control, and keeps the email path for every other one.

  • Say in the privacy policy what a commit leaves behindchangedwhy

    Say plainly in the privacy policy what a commit leaves behind. OffMain counts the characters in a commit message and the files it touched, then throws the text away, where the old wording claimed it did not read contents at all.

week of aug 17, 2026

backend11 changes

Every account counts, and nothing pays twice

Work from every installed GitHub account earns, a self-merge and a review reply stop paying twice, and private work OffMain cannot see pays 5 minutes each.

  • Turn private-work counting off, and OffMain reads nothing and mints nothingaddedwhy

    Turn private-work counting off, and OffMain takes no GitHub read for it, mints nothing, and writes no row. Minutes it already paid stay yours.

  • Read 90 days of evidence before saying your GitHub profile hides private workchangedwhy

    Read 90 days of evidence, not just today’s, to judge whether your GitHub profile hides private contributions from OffMain. The line under your balance now appears when it is true, and when the evidence cannot answer, OffMain says it cannot tell instead of guessing.

  • Mint private-work minutes on the background sweep, not only on a refreshfixedwhy

    Mint private-work minutes on the background sweep. It quit early on every run since the source shipped, missing the credentials it reads GitHub with, so private work only ever paid when the app asked for a refresh.

  • Count a pull request you merge yourself once, not twicefixedwhy

    Count a pull request you merge yourself once, not twice, because the author row and the merger row named the same person and both paid. Merging someone else’s work is still its own contribution and still pays.

  • Keep reaching for work GitHub declined to hand over while it was throttlingfixedwhy

    Keep reaching for work GitHub declined to hand over while it was throttling, instead of marking it read and moving on. A throttled repository’s history was skipped and stamped as pulled, so those events were never looked at again and the minutes behind them never landed.

  • Pay for private work OffMain cannot see, 5 minutes each up to 30 a dayaddedwhy

    Pay for private work in repositories OffMain cannot see, 5 minutes for each one GitHub counts, up to 30 minutes a day. It is a floor rather than a bonus: the day’s earnings are topped up to it and never added to, so work in a connected account still pays its full weight and nothing pays twice.

  • Release OffMain's GitHub access on delete, by refreshing the token firstfixedwhy

    Refresh the GitHub token before using it, so deleting your account really does release OffMain’s access. A user token lives 8 hours, and a delete after that window revoked nothing, reported success, and left the grant standing.

  • Erase an account on request, taking its contract, ledger, and credentialsaddedwhy

    Erase an account on request, taking its contract, history, ledger, sessions, and stored credentials with it. The account goes first and releasing GitHub follows, so GitHub being unreachable can never leave the account standing, and an App installation other users depend on stays in place.

  • Count work from every GitHub account OffMain is installed on, not just onefixedwhy

    Count work from every GitHub account OffMain is installed on, so a personal account and an employer organization both earn. Installing on a second account used to displace the first, so only one of them ever counted, and which one was left to chance.

  • Stop paying for a review of your own pull request or an empty review replyfixedwhy

    Stop paying for a review of your own pull request and for an empty reply to a review comment. GitHub wraps every inline reply in a fresh review object, so one session answering seven comments minted seven full review earns, 84 minutes that were never worked, and pushed the balance into its cap.

  • List GitHub accounts OffMain reads your work through, and return from installaddedwhy

    Serve the list of GitHub accounts OffMain reads your work through, and start the App install from a link that comes back to the app instead of stranding you on a GitHub page. The list names all repositories or the selected ones, and it never claims to be whole, because an App token cannot see an organization it is not installed on.

iOS8 changes

The app names where your work counts

Settings lists every GitHub account OffMain reads your work through, private work gets a ledger row and an off switch, and the filter blocks only the sites you name.

  • Block only the sites your contract names, not Apple's device-wide filter toofixedwhy

    Block only the sites your contract names. The filter was set to a mode that also turns on Apple’s device-wide adult-content filter, so sites in no shielded list were blocked too.

  • Turn private-work counting off from Where your work countsaddedwhy

    Turn private-work counting off from Where your work counts, for anyone whose private work already sits in an account OffMain can see. The switch moves on tap, and it puts itself back if the write does not land.

  • Say when GitHub's profile setting hides your private work from OffMainaddedwhy

    Show a line under your balance when GitHub’s profile setting hides your private contributions from OffMain, and ask about it once during setup when the answer cannot be read. The contract screen now names the private-work rate instead of printing its raw key.

  • Lock the iPhone and iPad app to portrait, where landscape clipped Nowfixedwhy

    Lock the iPhone and iPad app to portrait. In landscape the Now screen clipped its content and the tab bar sat over the shielded-apps card.

  • Show private work in the ledger as its own row, counted but not itemizedaddedwhy

    Show private work in the ledger as its own row, counted but not itemized, naming the account it lives in as the way to earn full minutes for it. The count refreshes when you open the app with less than the smallest break in the balance, so a fresh earn does not wait on the next sweep.

  • Refuse a spend when nothing is blocked, so a break cannot lift nothingfixedwhy

    Refuse a spend when nothing is blocked, so minutes cannot go on a break that lifts nothing. A dormant or paused contract, and a device that has stopped holding the block, now name the reason where the price used to be.

  • Delete your account from Settings, behind a hold and your typed GitHub handleaddedwhy

    Delete your account from iPhone Settings, behind a hold to confirm and your GitHub handle typed out. The delete lands on the server first, so a refused call leaves the account signed in and whole rather than wiping the phone against an account that still exists.

  • Show every GitHub account OffMain reads your work through, and what each coversaddedwhy

    Show every GitHub account OffMain reads your work through, under Settings, with the repositories each one covers and what a disconnected account costs. Adding an account now happens inside the app, and the emails list says plainly that a connected address is one condition of a commit counting rather than the only one.

macOS6 changes

OffMain shows where your work counts

A settings pane names every GitHub account OffMain reads through, private work gets its own ledger row and an off switch, and a spend is refused when nothing is blocked.

  • Turn private-work counting off from the Where your work counts paneaddedwhy

    Turn private-work counting off from the Where your work counts pane, for anyone whose private work already sits in an account OffMain can see. The switch moves on click, and it puts itself back if the write does not land.

  • Confirm the filter now running is the build you installed, and ask for a restartfixedwhy

    Check after every filter install that the build now running is the one you installed, and ask for a restart when it is not. macOS can keep the old extension running until a reboot, so a finished install was never proof the new rules were being enforced.

  • Say when GitHub's profile setting hides your private work from OffMainaddedwhy

    Show a line under your balance when GitHub’s profile setting hides your private contributions from OffMain, and ask about it once during setup when the answer cannot be read. The contract pane now names the private-work rate instead of printing its raw key.

  • Show private work in the ledger as its own row, counted but not itemizedaddedwhy

    Show private work in the Mac ledger as its own row, counted but not itemized, naming the account it lives in as the way to earn full minutes for it. The count refreshes when you open the popover with less than the smallest break in the balance, and never on the background timer, because opening the popover is the ask and a timer is not.

  • Refuse a spend when nothing is blocked, so a break cannot lift nothingfixedwhy

    Refuse a spend when nothing is blocked, so minutes cannot go on a break that lifts nothing. Outside every window each option reads “apps open freely now” in place of its price, and the row that used to read “not set” says the same rather than implying you never configured a window.

  • Show every GitHub account OffMain reads your work through, and what it coversaddedwhy

    Show every GitHub account OffMain reads your work through in the Mac settings pane, with the repositories each one covers and what a disconnected account costs. The pane replaces the connected-emails row, keeps the address list under it, and carries an add-account button, because an account OffMain has never seen cannot be listed.

$ page 1 of 5