CLI + TUI · macOS · Linux desktop

Keep secrets
out of Git.

Commit your non-secret config and kb:// references. Keybay keeps the values in an OS-protected local store, then gives your app the environment it already expects. No Keybay account or hosted service. No Keybay daemon, network path, or shell hook.

0.3.2 is available: native CLI and Dart SDK. Signed releases, documented SDK APIs, and desktop builds that work with OpenSSL 3 or 4. Follow the installation guide. If a 0.2.0 vault has a passphrase or hardware key, remove them with 0.2.0 before upgrading, then add them back.

keybay CLI · macOS / Linux

.env

Non-secret manifest

API_URL=https://staging.example.com
OPENAI_API_KEY=kb://acme-example/openai-api-key

Terminal

Run your app

$ keybay run -- ./app.sh
Keybay example app started.
  API_URL: https://staging.example.com
  OPENAI_API_KEY: available (value not printed)

run reads the .env above, resolves its kb:// references, and passes the values to your app. Your manifest stays safe to commit.

Full CLI guide →

Everyday CLI

Save it once.
Find it when you need it.

Set a value, list your keys, or reveal one in your terminal. Values stay hidden while you type.

Explore the commands →

Terminal

Set · list · get

$ keybay set acme-example/openai-api-key
Value for acme-example/openai-api-key (input hidden):
Stored acme-example/openai-api-key

$ keybay list
acme-example/openai-api-key

$ keybay get acme-example/openai-api-key
sk-demo-not-a-real-key

Interactive vault

Or open your vault.

Search, reveal and edit without leaving your terminal.

$ keybay open

Try it here: select a key, press Space to reveal, or add your own. Sample data only; changes disappear when you reset or reload.

Open demo ↗

Dart / Flutter SDK

Use Keybay inside your app.

Open the host application's one store, then read and write values directly. Keybay derives identity and handles storage on iOS, Android 12+, macOS, and ordinary Linux desktop.

SDK quickstart →

Dart

import 'package:keybay/keybay.dart';

final session = await Keybay.open();
try {
  await session.set('api-token', tokenFromOAuth);
  final stored = await session.get('api-token');
} finally {
  await session.close();
}

Protection on each platform.

Values live in an encrypted local file. The operating system protects the key that unlocks it.

PlatformProtected byProtection level
SDK · iOSData Protection KeychainApp-bound key
SDK · Android 12+Android KeystoreApp-bound key
SDK · entitled macOSData Protection KeychainApp-bound key
SDK/CLI · unentitled macOSLogin Keychain
SDK/CLI · Linux desktopSecret Service

App-bound key — the OS restricts key access to an app or signed group.

Account-level — another program under your user account may reach the key. Add a passphrase or hardware key for extra protection.

Levels describe key access. Record encryption is the same across platforms; file isolation and hardware backing have separate limits in each guide.

Flatpak support is an SDK candidate; CLI packaging is outside this release. Windows and Snap are unsupported.

What Keybay protects—and what it doesn't.

Full security design →
Fails closed
If the required store is unavailable, locked, invalidated, corrupt, tampered with, or unsupported, Keybay stops. It never substitutes plaintext.
Encrypted, coordinated writes
Each record is independently XChaCha20-Poly1305 encrypted. Writes authenticate the source and atomically replace one complete framed file.
Only claims it can verify
Provider and device qualification reports only measured properties. Keybay makes no Secure Enclave claim for generic Apple Keychain items.
Protection has a boundary
After your app reads a value—or run adds it to a child environment—it is ordinary process data. Same-user malware, rollback, and root remain outside the threat model.

Local by design.

Keybay is for secrets that belong on one device. Every host application, including the CLI, has one local store derived from its application identity. Keybay does not sync secrets, distribute them to a team, or provision production systems.

See where Keybay fits →

Built to stay auditable: exact-pinned runtime dependencies, one framed format, and platform boundaries documented in the repository.