Switch between two macOS keyboard layouts with a quick tap of Shift.
- Tap Left Shift for one layout.
- Tap Right Shift for the other.
- Keep using Shift normally for capital letters and keyboard shortcuts.
Kivra is made for people who type in two languages and want each layout to have its own key. There is no need to cycle through input sources or remember which layout is currently active.
- A Mac with Apple silicon
- macOS 14 or later
- Two keyboard layouts enabled in macOS
- Download the latest release
and choose the file named
Kivra-<version>-macOS-arm64.dmg. - Open the downloaded disk image.
- Drag Kivra into the Applications folder.
- Open Kivra from Applications.
Kivra is signed and notarized by its publisher. It is distributed through GitHub Releases rather than the Mac App Store.
The welcome guide takes care of the initial setup:
- Grant Accessibility access. Kivra needs this permission to recognize Shift taps; it does not read or store what you type.
- Choose a keyboard layout for Left Shift and another for Right Shift.
- Choose whether Kivra should open automatically when you log in.
- Optionally enable Hide input source indicator if you experience a pause when typing immediately after switching layouts.
- Select Start Kivra.
Kivra then lives behind the keyboard icon in the macOS menu bar. Open that menu at any time to pause Kivra, change its settings, check for updates, or quit the app.
If fewer than two layouts appear, add another one in System Settings → Keyboard → Text Input → Edit, then return to Kivra.
Hide input source indicator reflects your current macOS setting. If you already hid the indicator manually, the switch is on. Otherwise, it stays off until you choose to enable it.
Hiding the language popup near the text cursor in all apps may reduce typing delays after switching layouts. This uses an undocumented macOS setting, so its effect can change with macOS updates. Some apps may need to be restarted.
Changes take effect only when you select Start Kivra or Save Changes. Saving without changing the switch leaves the system setting alone. Turn the switch off and save to show the indicator again, even if it was hidden manually.
Kivra and Kivra Dev read the same macOS setting. Quitting either app does not restore the indicator.
A quick press and release switches to the layout assigned to that Shift key. Kivra does not switch layouts when Shift is used together with another key, or when both Shift keys overlap, so normal typing and shortcuts keep working as expected. It also leaves the original keyboard events unchanged.
The default tap limit is 250 ms. If quick taps are not being recognized—or a longer press switches layouts too easily—open Settings… from the menu bar and adjust Tap threshold.
Kivra uses Accessibility access only to recognize Shift taps. It does not read or store the text you type.
macOS temporarily blocks keyboard-event monitoring while Secure Event Input is active, which can happen in some password fields. Kivra cannot switch layouts during that time and resumes when macOS allows monitoring again.
Kivra checks for updates daily. You can also choose Check for Updates… from the menu bar. Updates are downloaded from GitHub Releases, verified, and installed after you confirm them. If you enable automatic installation in the update window, Kivra can prepare updates silently and install them when you quit.
An arrow badge appears beside the keyboard icon when an update is available. The menu shows the version and changes to Update … Ready… once installation is prepared. Select that item to open the update window. Choosing to be reminded later keeps the badge; skipping the version removes it.
If you want the input source indicator back, turn off Hide input source indicator in settings and save before uninstalling. Then quit Kivra and move Kivra from Applications to the Bin.
For developers and maintainers
Use Task for common development work:
task run
task build
task test
task format
task lint
task install-devYou can also run the app directly from the project directory:
swift runOr build and run the release binary:
swift build -c release
.build/release/KivraBuild and install the parallel development app:
Scripts/install-dev.shThis creates /Applications/Kivra Dev.app with bundle identifier
com.zemliakov.kivra.dev. It has separate preferences and a separate
Accessibility permission from the stable Kivra.app. Its production Sparkle
configuration is removed, so it cannot update itself to a published release.
Kivra Dev is marked with a DEV badge in its app and status bar icons. Stable
and Dev may remain installed together, but only one can run at a time because
both monitor the same global Shift events. Quit the running variant before
opening the other one.
The installer uses an available Apple Development signing identity, falling back to Developer ID Application and then to an ad-hoc signature. Keeping the same Apple signing identity lets macOS preserve Accessibility approval more reliably between rebuilds. You can select one explicitly:
SIGNING_IDENTITY="Apple Development: Your Name (TEAMID)" Scripts/install-dev.shTo build without installing:
BUILD_VARIANT=dev Scripts/package-app.shSet INSTALL_DIRECTORY if you prefer another fixed location, such as
$HOME/Applications. Do not move the app between rebuilds if you want macOS to
retain its privacy permission consistently.
task lint
task testMaintainers need an Apple Developer account with a Developer ID Application certificate. Configure these GitHub Actions secrets:
APPLE_CERTIFICATE_BASE64, the base64-encoded.p12Developer ID Application certificate.APPLE_CERTIFICATE_PASSWORD, the certificate export password.APPLE_ID, the Apple Account used for notarization.APPLE_APP_SPECIFIC_PASSWORD, an app-specific password for that account.APPLE_TEAM_ID, the Apple Developer team ID.SPARKLE_PRIVATE_KEY, the base64-encoded private Ed25519 key exported by Sparkle'sgenerate_keystool. Keep an offline backup and never commit it.
GitHub Pages must use GitHub Actions as its publishing source. The release
workflow publishes the signed Sparkle feed at
https://marvell.github.io/kivra/appcast.xml only after the corresponding
GitHub Release assets are downloadable.
Create and push a semantic-version tag to publish a release:
git tag v0.1.1
git push origin v0.1.1The release workflow tests Kivra, signs the app and its embedded Sparkle helpers, notarizes the app and disk image, publishes the DMG with its SHA-256 checksum, and deploys a signed Sparkle appcast. Published releases are treated as immutable; rerunning a completed release only republishes its existing appcast.
The first Sparkle-enabled release still needs to be installed manually by
users of v0.1.0. Releases after that can update in place.
Kivra uses the Sparkle update framework. Its license is included in the application bundle.