dbcake — single-file, easy-to-use key/value database + secrets client for learning, quick prototypes, and small projects.
dbcake.py is a self-contained Python module that provides:
- Local key/value store in a single append-only
.dbcefile (centralized) or per-key files (decentralized). - Multiple on-disk formats:
binary,bits01,dec,hex. - Encryption modes:
low | normal | high. Uses AES-GCM (viacryptography) when available; otherwise a secure stdlib fallback. - Key rotation, file-locking for multi-process safety, compaction, export, preview, and per-key operations.
- A small HTTP secrets client (
Client/AsyncClient) for talking to a remote secrets API (optional). - CLI for DB + secrets client and a tiny Tkinter GUI installer for optional packages.
- Single-file distribution —
dbcake.py— drop into a project and import or call from command line.
- Quick start
- Installation
- Basic usage (Python API)
- Storage formats & modes
- Encryption, passphrases & key rotation
- CLI usage
- Secrets HTTP client
- Examples: local server (for testing client)
- Security notes
- Troubleshooting
-
Save
dbcake.pyinto your project folder. -
Use the module-level
dbobject or create your own database instance:
import dbcake # simple use (module-level default DB file: data.dbce) dbcake.db.set("username", "armin") print(dbcake.db.get("username")) # -> "armin" # create/open a custom DB file mydb = dbcake.open_db("project.dbce", store_format="binary", dataset="centerilized") mydb.set("score", 100) print(mydb.get("score"))dbcake.py is a single-file module — no installation required beyond having Python.
Optional (recommended) packages:
cryptography — provides AES-GCM & Fernet support (stronger, standard crypto).
tkinter — required only if you want to run the graphical installer.
python -m pip install cryptographyRun the GUI installer (uses tkinter) to install optional packages:
python dbcake.py --installerModule-level convenience DB
import dbcake # default DB (data.dbce) dbcake.db.set("a", 123) print(dbcake.db.get("a")) # -> 123 # change file & format dbcake.db.title("mydata.dbce", store_format="binary") dbcake.db.set("user", {"name": "alice"}) print(dbcake.db.get("user")) # switch to decentralized per-key files dbcake.db.decentralized() dbcake.db.set("session", {"id": 1}) # list keys print(dbcake.db.keys()) # preview a few entries print(dbcake.db.preview(limit=5)) dbcake.db._backend.pretty_print_preview(limit=5) # helper that prints nice tableFactory style (explicit DB object)
mydb = dbcake.open_db("project.dbce", store_format="hex", dataset="centerilized") mydb.set("k", "v") v = mydb.get("k")store_format options when creating or switching DB:
binary — raw bytes (fast).
bits01 — ASCII '0' / '1' bit string.
dec — decimal digits grouped by 3 per byte.
hex — hex representation.
Switch format programmatically:
dbcake.db.set_format("hex")Switch dataset mode:
dbcake.db.centerilized() # centralized append-only .dbce dbcake.db.decentralized() # per-key files in .d directorydb.pw controls on-disk security:
db.pw = "low" — minimal (fast).
db.pw = "normal" — default (no re-encryption).
db.pw = "high" — records encrypted before writing (AES-GCM if cryptography is installed; otherwise a fallback).
Set passphrase (derive key from passphrase):
dbcake.db.pw = "high" dbcake.db.set_passphrase("my secret passphrase") dbcake.db.set("secret", "value")Generate/store keyfile (if you do not use passphrase) — DB will generate .key next to the DB file.
Rotate keys (re-encrypt everything):
CLI (interactive):
python dbcake.py db rotate-key mydata.dbce --interactiveProgrammatic:
dbcake.db.set_passphrase("old") dbcake.db.rotate_key(new_passphrase="new")rotate_key rewrites the DB and re-encrypts records under the new key.
The single file exposes a CLI for both local DB and the secrets client.
# create file python dbcake.py db create mydata.dbce --format binary # set key python dbcake.py db set mydata.dbce username '"armin"' # get key python dbcake.py db get mydata.dbce username # list keys python dbcake.py db keys mydata.dbce # preview python dbcake.py db preview mydata.dbce --limit 5 # compact (rewrite to keep only current items) python dbcake.py db compact mydata.dbce # set passphrase (interactive) python dbcake.py db set-passphrase mydata.dbce --interactive # rotate key (interactive) python dbcake.py db rotate-key mydata.dbce --interactive # reveal DB file in OS file manager python dbcake.py db reveal mydata.dbceCLI values attempt JSON parsing; unparseable input will be stored as raw string.
# set secret python dbcake.py secret set myname "value" --url https://secrets.example.com --api-key S3CR # get secret (reveal) python dbcake.py secret get myname --reveal --url https://secrets.example.com --api-key S3CR # list python dbcake.py secret list --url https://secrets.example.com --api-key S3CR # delete python dbcake.py secret delete myname --url https://secrets.example.com --api-key S3CRfrom dbcake import Client client = Client("https://secrets.example.com", api_key="S3CR") meta = client.set("db_token", "S3cR3tV@lue", tags=["prod","db"]) secret = client.get("db_token", reveal=True) print(secret.value) # With Fernet (encrypt locally before send) from cryptography.fernet import Fernet fkey = Fernet.generate_key().decode() client2 = Client("https://secrets.example.com", api_key="S3", fernet_key=fkey) client2.set("encrypted", "very-secret") s = client2.get("encrypted", reveal=True) print(s.value)AsyncClient is available for async code (AsyncClient.from_env() to read env vars).
Env vars for convenience: DBCAKE_URL, DBCAKE_API_KEY, DBCAKE_FERNET_KEY.
Examples: local server (for testing client)
Below is a tiny example (not included in dbcake.py) of a simple HTTP test server you can use to exercise the Client:
# tiny_test_server.py (example only; not production-ready) from http.server import BaseHTTPRequestHandler, HTTPServer import json, urllib.parse STORE = {} class Handler(BaseHTTPRequestHandler): def _send(self, code, data): self.send_response(code) self.send_header("Content-Type", "application/json") self.end_headers() self.wfile.write(json.dumps(data).encode()) def do_POST(self): if self.path == "/secrets": length = int(self.headers.get("Content-Length", 0)) body = self.rfile.read(length) doc = json.loads(body.decode("utf-8")) name = doc["name"] STORE[name] = doc now = "2025-10-16T00:00:00Z" self._send(201, {"name": name, "created_at": now, "updated_at": now, "tags": doc.get("tags", [])}) return self.send_error(404) def do_GET(self): if self.path.startswith("/secrets"): parsed = urllib.parse.urlparse(self.path) parts = parsed.path.split("/") if len(parts) == 3 and parts[2]: name = parts[2] item = STORE.get(name) if not item: self.send_error(404) return reveal = urllib.parse.parse_qs(parsed.query).get("reveal", []) doc = item.copy() self._send(200, doc) return self.send_error(404) def do_DELETE(self): parts = self.path.split("/") if len(parts) == 3 and parts[2]: name = parts[2] if name in STORE: del STORE[name] self._send(204, {}) return self.send_error(404) if __name__ == '__main__': server = HTTPServer(("localhost", 8000), Handler) print("Listening on http://localhost:8000") server.serve_forever()If you use db.set_passphrase("..."), a salt file (.salt) is created and used to derive an encryption key. Keep passphrases secret.
If you don't set a passphrase, the DB generates a .key keyfile next to the DB. Keep that file safe.
Use TLS for server communication (HTTPS) and protect API keys.
rotate_key rewrites and re-encrypts stored data — use it regularly for long-lived data.
This project is intended for learning and small projects. For production secrets management, consider hardened solutions (HashiCorp Vault, AWS KMS/Secrets Manager, etc.).
cryptography not installed — AES-GCM and Fernet features disabled; library will use a secure fallback. Install cryptography if you need standard AES-GCM/Fernet.
tkinter missing — GUI installer will not run. Install system package (e.g., python3-tk) or use pip-installed packages via CLI.
Lock timeouts — another process may hold the DB. Wait or increase timeout; ensure only compatible writers access the DB.
Permission errors — ensure the process can write to DB folder and key/salt files.
Caution
please read LICENSE and ©️ copyright by Cielecon all rights reversed.