sealedlog
An encrypted, append-only, line-oriented log for JSON records — think SQLite for encrypted append-only JSON logs, minus the SQL. Small, embeddable, no daemon, no external services: just a file format and the code to read and write it correctly.
- Appending a record is a byte-append to the file — no rewriting, no reordering. Git diffs and merges cleanly on files built this way.
- Each line decrypts independently. A corrupted or truncated line doesn't block reading the lines before or after it.
- Lines are bound to the logical stream they were written for. A line copied from one stream into another fails to authenticate, even under the correct key.
- The key comes from a passphrase via Argon2id, and a wrong passphrase is detected immediately and unambiguously.
See docs/FORMAT.md for the on-disk format and threat model.
Usage
from pathlib import Path
from sealedlog import SealedLog, Vault
vault = Vault.create("correct horse battery staple", namespace="myapp")
key = vault.unlock("correct horse battery staple", namespace="myapp")
log = SealedLog(Path("events.jsonl.enc"), key, "orders", namespace="myapp")
log.append({"order_id": 1, "total": 42})
for record in log:
print(record)
namespace is your application's own identifier — it, the stream ID, and the
library's format version are all folded into the authenticated data for every
line, so two different applications never accidentally produce
cross-compatible ciphertexts.
Non-goals
sealedlog doesn't know what a "user" or "owner" is, doesn't validate record
schemas, doesn't fold or merge records, doesn't decide where files live, and
doesn't coordinate concurrent writers to the same file. All of that is
application-level policy built on top of a plain sequence of records.
Development
uv sync --all-groups
uv run ruff format --check .
uv run ruff check .
uv run ty check
uv run pytest
Metadata
Release files for sealedlog 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sealedlog-0.1.0.tar.gz | 4.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sealedlog-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.0 kB
Release files / sealedlog-0.1.0.tar.gz
| Download URL | sealedlog-0.1.0.tar.gz |
|---|---|
| Size | 4.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c2281483be9bbee15f8101ef8dbed6639be8fbc69ce0ac155e65fca23b8c7d34
|
|
BLAKE2b-256 checksum How to use checksums |
8fb2d61e6a665c6d0c977f99faed8daab8c07783b16c70c036154f42bc4484f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22","id":"wilma","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / sealedlog-0.1.0-py3-none-any.whl
| Download URL | sealedlog-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ba9310a9079cf91c3acb5b99f2cc9fe7fcdf3c9ad6bff1f970eadfdfbce63a29
|
|
BLAKE2b-256 checksum How to use checksums |
5a1e97adf4cb899001d84ab078831a5f76374201aac0b2d0b58428c3ba31fc58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22","id":"wilma","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|