bella_baxter
Official Dart SDK for Bella Baxter β the secure secret management gateway for teams.
Pull secrets from Vault, AWS Secrets Manager, Azure Key Vault, and GCP Secret Manager via one unified API.
Features
- π HMAC-signed API keys (
bax-<id>-<secret>) and Bearer JWT / SSO auth - π Real-time polling via
watchSecrets()β aStreamthat emits fresh secrets on an interval - οΏ½οΏ½ End-to-end encryption (ECDH-P256 + HKDF-SHA256 + AES-256-GCM) β server never sees plaintext on the wire
- π ZKE (Zero-Knowledge Encryption) β persistent device key for offline-capable decryption
- π¦ Offline-first caching β
SecretCacheabstract class; inject your own encrypted storage - πͺ Webhook verification β
WebhookSignatureVerifierforX-Bella-Signatureheaders - π .env export β
SecretsMapExtension.toEnvFormat()
Installation
dependencies:
bella_baxter: ^1.0.0
Quick start
import 'package:bella_baxter/bella_client.dart';
void main() async {
// Auto-detect from environment (works with bella exec)
final client = BellaClient.fromEnv();
final secrets = await client.pullSecrets();
print(secrets['DATABASE_URL']); // postgresql://...
}
Environment variables (set by bella exec)
| Variable | Description |
|---|---|
BELLA_BAXTER_URL |
API base URL |
BELLA_BAXTER_API_KEY |
HMAC API key (bax-<id>-<secret>) |
BELLA_BAXTER_ACCESS_TOKEN |
Bearer JWT (SSO/OAuth mode) |
API key mode
final client = BellaClient(BellaClientOptions(
baseUrl: 'https://api.example.com',
apiKey: 'bax-myKeyId-abc123def456...',
));
final secrets = await client.pullSecrets();
Typed secrets
Generate a typed secrets class with bella secrets generate dart --types, then:
// AppSecrets is your generated class
final secrets = await client.pullSecretsAs(AppSecrets.fromMap);
print(secrets.databaseUrl);
print(secrets.apiPort);
Real-time polling
client.watchSecrets(interval: Duration(minutes: 5)).listen((secrets) {
// Called immediately, then every 5 minutes
setState(() => _dbUrl = secrets['DATABASE_URL']);
});
Offline-first caching
final client = BellaClient(BellaClientOptions(
baseUrl: '...',
apiKey: '...',
cache: MyEncryptedSecretCache(), // your SecretCache implementation
));
For Flutter, use FlutterSecureSecretCache from the bella_baxter_flutter package.
Webhook verification
final isValid = WebhookSignatureVerifier.verify(
secret: 'whsec-your-signing-secret',
signatureHeader: request.headers['X-Bella-Signature']!,
rawBody: await request.bodyAsString(),
);
ZKE (Zero-Knowledge Encryption)
import 'dart:typed_data';
// Load your device key (PKCS#8 DER, from bella auth setup)
final derBytes = await loadDeviceKey(); // your storage logic
final client = BellaClient(BellaClientOptions(
baseUrl: '...',
apiKey: '...',
privateKey: Uint8List.fromList(derBytes),
));
Examples
See example/ for working samples:
01-dart-dotenvβ load secrets from.envfile02-process-injectβbella execprocess injection03-dart-cliβ CLI app (env-var mode + SDK mode)04-dart-shelfβ HTTP server with secrets05-flutter-appβ Flutter app withSecretCache
Links
- Bella Baxter documentation
- GitHub repository
- Issue tracker
bella_baxter_flutterβ Flutter-specificSecretCacheimplementation