Five-command CLI · 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.

The Keybay SDK is available. Add it with dart pub add keybay. The legacy 0.1.0 GitHub/Homebrew release predates immutable verification, and its macOS CLI fails current code-signature checks; require Keybay CLI 0.1.1 or newer.

keybay CLI · macOS / Linux

.secrets.env

Non-secret manifest

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

Terminal

Store, then run

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

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

Keybay keeps one store per OS user. Namespaces organize keys; they do not isolate them. When you use run, resolved values are passed to the child process as environment variables.

Full CLI guide →

Dart / Flutter SDK

Use Keybay inside your app.

Name a store with appId, then read and write values directly. Keybay handles the storage details on iOS, Android 12+, macOS, and Linux desktop.

SDK quickstart →

Dart

import 'package:keybay/keybay.dart';

final store = SecretStorage(appId: 'com.example.app');
await store.writeString('api-token', tokenFromOAuth);
final stored = await store.readString('api-token');

How Keybay stores data on each platform.

Keybay makes the storage choice for you, using one documented policy for each runtime.

ContextStored asProtected by
SDK · iOSData Protection Keychain itemsDevice-only, non-synchronizing, after first unlock
SDK · Android 12+Authenticated encrypted fileStore key wrapped by Android Keystore; actual level inspected
SDK · entitled macOSData Protection Keychain itemsThe same fixed item policy as iOS
SDK/CLI · unentitled macOSAuthenticated encrypted file32-byte store key in the login Keychain
SDK/CLI · Linux desktopAuthenticated encrypted file32-byte store key in an unlocked Secret Service provider

Desktop credential stores must be available and unlocked. Keybay does not attest Apple hardware backing; on Android it reports the wrapping-key security level it actually observes.

Windows and headless deployments 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
On file-backed platforms, Keybay uses XChaCha20-Poly1305 with key commitment. Writes are atomic, mode 0600, fsynced, and locked across processes.
Only claims it can verify
Android reports its wrapping key's observed security level. Keybay makes no hardware-backing claim for Apple native 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. The CLI keeps one store per OS user; the SDK keeps a local store for each appId. It does not sync secrets, distribute them to a team, or provision production systems.

See where Keybay fits →

Built to stay auditable: one exact-pinned third-party runtime dependency, with the architecture and cryptographic design documented in the repository.