parad
Encrypted local-first SQLite with Telegram cloud sync — a git-like, zero-cost workflow database. Telegram is the disk: every change you commit becomes a version-stored snapshot you can revert to anytime.
Install
pip install parad
Quick Start
Python SDK (developer workflow — auto-sync on by default)
Connect with a postgres-like connection string, write SQL offline, and the sync daemon version-stores your changes automatically. No manual push needed.
from parad import connect
# Auto-login (email:password), auto-provision project + database on the
# gateway, open/create the local encrypted SQLite file.
db = connect(url="parad://alice@example.com:secretpw@local/myproj/mydb?passphrase=secret")
# Build SQL offline like any SQLite database ...
db.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
db.execute("INSERT INTO users (name) VALUES (?)", ("alice",))
db.commit()
# ... and it's already pushed to the cloud as a new snapshot version (~2s).
# Revert anytime (from the CLI):
# !parad rollback 1
db.close()
Offline? Keep writing — changes are flagged dirty and batch-pushed as new
versions the moment you reconnect. On conflicts your local data always wins
(never silently dropped).
Local-only is just as easy:
db = connect("mydb", passphrase="secret", auto_sync=False)
CLI
# Create an encrypted database
parad init mydb
# Push to cloud
parad push
# Pull latest
parad pull
# Check status
parad status
# Interactive SQL
parad shell
Commands
| Command | Description |
|---|---|
parad init <name> |
Create encrypted DB + register with gateway; emit canonical DATABASE_URL |
parad push |
Push database to Telegram cloud |
parad pull [version] |
Pull latest or specific version |
parad sync |
Push then pull |
parad status |
Local vs remote version |
parad versions |
List all remote versions |
parad rollback <ver> |
Rollback to previous version |
parad exec <sql> |
Run raw SQL |
parad insert <table> <json> |
Insert a row |
parad select <table> [where] |
Query rows |
parad update <table> <set> <where> |
Update rows |
parad delete <table> <where> |
Delete rows |
parad shell |
Interactive SQL REPL |
parad config show/set |
Manage config |
Canonical DATABASE_URL
After parad init successfully provisions the project and database, Parad persists the complete connection URL in config.json as database_url and prints a redacted form:
parad init mydb --project myproject
Use --print-database-url only when intentionally copying the complete secret-bearing URL into a secret manager:
parad init mydb --project myproject --print-database-url
Applications can use the same single value:
import os
from parad import connect
db = connect(url=os.environ["DATABASE_URL"])
An explicit url, name, or db_path argument takes precedence over an ambient DATABASE_URL. Existing connection strings and config-based workflows remain supported.
SQLAlchemy
Install the optional integration with pip install "parad[sqlalchemy]", then use the same canonical URL with create_engine("parad://..."). The ORM, Core, DB-API, and encrypted lifecycle examples are documented in docs/SQLALCHEMY.md.
Configuration
Config lives at ~/.paradox/config.json:
{
"database_url": "parad://<api-key>@local/project/mydb?gateway=https%3A%2F%2F...&passphrase=...",
"database_path": "~/.paradox/data.db",
"sync": {
"gateway_url": "https://paradox-db.onrender.com/v1",
"api_key": "pk_..."
}
}
Security
- AES-256-CBC encryption at rest
- PBKDF2-HMAC-SHA512 key derivation (256k iterations)
- Your passphrase never leaves your machine
Metadata
Release files for parad 2.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| parad-2.2.3.tar.gz | 47.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| parad-2.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 93.8 kB
Release files / parad-2.2.3.tar.gz
| Download URL | parad-2.2.3.tar.gz |
|---|---|
| Size | 47.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
09e6832207055584b49f837dba84a2b241db64d3a0880bf8248a4696d225b5f2
|
|
BLAKE2b-256 checksum How to use checksums |
28ac74c773ef222a11bcdd2d9615af4b087896d0ac6de3ccd0b07b5d44493e43
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / parad-2.2.3-py3-none-any.whl
| Download URL | parad-2.2.3-py3-none-any.whl |
|---|---|
| Size | 46.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
742842dc4e4e70652318eead7764fb1b49df46eda1b6584df515fc731b55a42c
|
|
BLAKE2b-256 checksum How to use checksums |
8e2143f965605c67ce91b494aab34405c80906254b496c1394d2b4c74d438fdb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|