Menu OTP

Two-factor codes in your Mac's menu bar, in a small native app. Click an account and its current code is copied to the clipboard.

Download for macOSInstall instructions
Latest releaseThe Menu OTP menu: its title, then accounts with their service icons, with GitHub highlighted

Download and install

Requires macOS 14 or later, on Apple silicon or Intel.

Download Menu OTP 0.1.1Latest release

Or install from Terminal in one step. It downloads the latest release, checks it, moves it to Applications, clears the quarantine flag, and opens it:

sh <(curl -fsSL https://otp.iambrian.com/install.sh)

Read the script first if you like; it's short. Run it again any time to update.

To install by hand instead:

  1. Open the downloaded .dmg and drag Menu OTP into Applications.
  2. The app isn't notarized by Apple, so macOS blocks it the first time. Try these approaches:
    • Terminal method (any macOS): Run this and open the app again:
      xattr -dr com.apple.quarantine "/Applications/Menu OTP.app"
    • Right-click method (before macOS 15): In Applications, right-click Menu OTP, choose Open, then click Open in the dialog. macOS 15 and later no longer offer this.
    • Settings method: Check System Settings → Privacy & Security for a message about Menu OTP and click Open Anyway.
  3. Click the Menu OTP icon in the menu bar and choose Menu OTP Settings... to add your first account.
  4. The first time Menu OTP saves your accounts, macOS asks whether it may use its Keychain item. Choose Always Allow. Each new version asks once more.

Build from source

Requires macOS 14 and Xcode, or just the Command Line Tools, with Swift 6.

git clone https://github.com/iambriansreed/menu-otp.git && cd menu-otp && app/scripts/make-dmg.sh

The installer is written to menu-otp/app/build/Menu OTP-<version>.dmg. The development guide covers the other scripts.

Using Menu OTP

Adding accounts

Click the Menu OTP icon in the menu bar and choose Menu OTP Settings.... The Add Account section has three tabs:

  • From URL: paste an otpauth://totp/ URL, like the one encoded in a setup QR code.
  • Manual: enter the issuer, account name, and secret, and optionally choose a favicon or an emoji.
  • Import File: click or drop a file with one otpauth:// URL per line. Menu OTP reports how many accounts were added, updated, and skipped.

Accounts are matched by issuer and account name, so adding one you already have updates it instead of creating a copy. Imports keep any icon you already chose. A secret that isn't valid base32 is refused when you enter it, rather than failing later when you copy a code.

Secrets are masked as you type or edit them, and so is the From URL field, since the URL contains the secret. Click the eye button beside a field to see what's in it.

Copying a code

Click an account in the menu. Its code is copied to the clipboard, and the menu shows the issuer and code in large type until you click somewhere else. For the next minute, the top of the menu shows which account you copied last. Codes are marked as sensitive on the clipboard, so clipboard managers that honor that don't keep them.

The copy confirmation showing Stripe, the word Copied, and a six-digit code

With the menu open, Up Arrow and Down Arrow move the highlight, Return or Space copies, and Esc closes it. Command-Q quits, or use the Quit Menu OTP item at the bottom of the menu. About Menu OTP, just above it, shows the version and build number and the license.

Icons

If you add an account without choosing an icon, Menu OTP guesses the service's website from what you entered and fetches its icon. Any account still missing an icon is filled in the next time the app starts, or right away with Find Missing Icons, which appears in Settings whenever an account has no icon.

To fix a wrong or missing icon, point at the account in Settings and click its pencil button. With Favicon selected, type the service's website and the icon is looked up as you type. Choose Emoji to open the macOS emoji picker instead.

An account open for editing: labelled issuer, account, masked secret and icon fields, with Cancel and Save

In the menu, icons stay grey until you point at an account, then show in full color.

Organizing

Click Reorder above your accounts, drag them into the order you want the menu to show them, then click Done. Point at an account to show its buttons: the eye hides it from the menu (it stays in Settings marked Hidden), the pencil edits it, and the trash deletes it, after asking.

Settings in reorder mode: accounts with drag handles and a Done button

General

Turn on Open at login to start Menu OTP with your Mac. It lives in the menu bar and only appears in the Dock while Settings is open. If its menu bar icon is ever out of reach, hidden behind the notch for example, open Menu OTP again from Finder or Spotlight to bring up Settings.

The General section of Settings: an Open at login checkbox and an Export Accounts button

Export Accounts... saves every account to a text file, named menu_otp_export.txt unless you choose another name, with one otpauth:// URL per line. That's the format Import File reads, and one most authenticator apps accept, so it works as a backup or for moving to another Mac. Icons and hidden settings aren't included.

The file holds your secrets unencrypted, so Menu OTP asks before writing it. Anyone who can read it can generate your codes. It's saved readable by your user account only, but keep it somewhere safe and delete it when you're done.

Privacy

Accounts are saved to one file on your Mac, encrypted with AES-256. The key is kept in your login Keychain. The only network requests Menu OTP makes are icon lookups, which send a website name to DuckDuckGo's icon service, and to Google's only when DuckDuckGo has no icon for it. Secrets are never sent anywhere.

Supported codes

Menu OTP generates standard TOTP codes: 6 digits, a new code every 30 seconds, using SHA-1. Accounts set up for 8 digits, a different interval, another algorithm, or counter-based (HOTP) codes won't work.

Coming from Easy OTP

Menu OTP is the native rewrite of Easy OTP. The two are separate apps with their own data and can run side by side. To bring accounts over, import a file of their otpauth:// URLs.

The Menu OTP Settings window: accounts with icons, one marked Hidden, then the Add Account form, then General with Open at login and Export Accounts