Python SDK for the fast, file-backed, scalable JSON token engine
Fast B-tree–backed token store for stateful user sessions
Provides authentication and authorization across multiple processes
Optimized for vertical scaling on a single server
Installation
pip install crudjt
How to use
- One process starts the master
- All other processes connect to it
Start CRUDJT master (once)
Start the CRUDJT master when your application boots
Only one process can do this for a single token storage
The master process manages sessions and coordination
All functions can also be used directly from it
For containerized deployments, see: Start CRUDJT master in Docker
Generate a new secret key (terminal)
export CRUDJT_SECRET_KEY=$(openssl rand -base64 48)
Start master (python)
from crudjt import CRUDJT
import os
CRUDJT.Config.start_master(
secret_key=os.environ['CRUDJT_SECRET_KEY'],
store_jt_path='path/to/local/storage', # optional
grpc_host='127.0.0.1', # default
grpc_port=50051 # default
)
Important: Use the same secret_key across all sessions. If the key changes, previously stored tokens cannot be decrypted and will return nil or false
Start CRUDJT master in Docker
Create a docker-compose.yml file:
services:
crudjt-server:
image: crudjt/crudjt-server:latest
restart: unless-stopped
ports:
- "${CRUDJT_CLIENT_PORT:-50051}:50051"
volumes:
- "${STORE_JT:-./store_jt}:/app/store_jt"
- "${CRUDJT_SECRETS:-./crudjt_secrets}:/app/secrets"
environment:
CRUDJT_DOCKER_HOST: 0.0.0.0
CRUDJT_DOCKER_PORT: 50051
Start the server:
docker-compose up -d
Ensure the secrets directory contains your secret key file at ./crudjt_secrets/secret_key.txt
For configuration details and image versions, see the CRUDJT Server on Docker Hub
Connect to an existing CRUDJT master
Use this in all other processes
Typical examples:
- multiple local processes
- background jobs
- forked processes
from crudjt import CRUDJT
CRUDJT.Config.connect_to_master(
grpc_host='127.0.0.1', # default
grpc_port=50051 # default
)
Process layout
App boot
├─ Process A → start_master
├─ Process B → connect_to_master
└─ Process C → connect_to_master
C
data = {'user_id': 42, 'role': 11} # required
ttl = 3600 * 24 * 30 # optional: token lifetime (seconds)
# Optional: read limit
# Each read decrements the counter
# When it reaches zero — the token is deleted
silence_read = 10
token = CRUDJT.create(data, ttl, silence_read)
# token == 'HBmKFXoXgJ46mCqer1WXyQ'
# To disable token expiration or read limits, pass `None`
CRUDJT.create({'user_id': 42, 'role': 11}, None, None)
R
result = CRUDJT.read('HBmKFXoXgJ46mCqer1WXyQ')
# result == {'metadata': {'ttl': 101001, 'silence_read': 9}, 'data': {'user_id': 42, 'role': 11}}
# When expired or not found token
result = CRUDJT.read('HBmKFXoXgJ46mCqer1WXyQ')
# result == None
U
data = {'user_id': 42, 'role': 8}
# `None` disables limits
ttl = 600
silence_read = 100
result = CRUDJT.update('HBmKFXoXgJ46mCqer1WXyQ', data, ttl, silence_read)
# result == True
# When expired or not found token
result = CRUDJT.update('HBmKFXoXgJ46mCqer1WXyQ', { 'user_id': 42, 'role': 8 })
# result == False
D
result = CRUDJT.delete('HBmKFXoXgJ46mCqer1WXyQ')
# result == True
# When expired or not found token
result = CRUDJT.delete('HBmKFXoXgJ46mCqer1WXyQ')
# result == False
Performance
40 000 requests up to 256 bytes — median over 10 runs
macOS 15.7.4, ARM64 (Apple M1)
Python 3.13.7
In-process benchmark; Redis accessed via localhost TCP
| Function | CRUDJT (Python) | JWT (Python) | redis-session-store (Ruby, Rails 8.0.2.1) |
|---|---|---|---|
| C | 0.338 second |
0.458 second | 2.909 seconds |
| R | 0.030 second |
0.594 second | 4.436 seconds |
| U | 0.554 second |
X | 2.124 seconds |
| D | 0.230 second |
X | 3.984 seconds |
Benchmarks shown here are from a previous version of CRUDJT. For current performance metrics, see the GitHub repository
Storage (File-backed)
Disk footprint
40 000 tokens of 256 bytes each — median over 10 creates
darwin23, APFS
48 MB
Path Lookup Order
Stored tokens are placed in the file system according to the following order
- Explicitly set via
CRUDJT.Config.start_master(store_jt_path='custom/path/to/file_system_db') - Default system location
- Linux:
/var/lib/store_jt - macOS:
/usr/local/var/store_jt - Windows:
C:\Program Files\store_jt
- Linux:
- Project root directory (fallback)
Storage Characteristics
- CRUDJT automatically removing expired tokens after start and every 24 hours without blocking the main thread
- Storage automatically fsyncs every 500ms, meanwhile tokens are available from cache
Multi-process Coordination
For multi-process scenarios, CRUDJT uses gRPC over an insecure local port for same-host communication only. It is not intended for inter-machine or internet-facing usage
Limits
The library has the following limits and requirements
- Python version: tested with 3.12.5
- Supported platforms: Linux, macOS, Windows (x86_64 / arm64)
- Maximum json size per token: 256 bytes
secret_keyformat: must be Base64secret_keysize: must be 32, 48, or 64 bytes
Contact & Support
- Custom integrations / new features / collaboration: support@crudjt.com
- Library support & bug reports: open an issue
Lincense
CRUDJT is released under the MIT License
💘 Shoot your g . ? Love me out via Patreon Sponsors!
Metadata
Release files for crudjt 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| crudjt-1.0.1.tar.gz | 4.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| crudjt-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 8.8 MB
Release files / crudjt-1.0.1.tar.gz
| Download URL | crudjt-1.0.1.tar.gz |
|---|---|
| Size | 4.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb39134025ab35597c64cfbfff69b67a82b34a1a46308d0fd4d1f412dd21e206
|
|
BLAKE2b-256 checksum How to use checksums |
02785e5b06fe34d7dc1a9e7decc5c088af9263e5f7ab39997330c34021717a1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.5
|
Release files / crudjt-1.0.1-py3-none-any.whl
| Download URL | crudjt-1.0.1-py3-none-any.whl |
|---|---|
| Size | 4.4 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9df3f6b356ebd5e4726554738db901273d5db5ece315c45e8ae97d7a9162c6a7
|
|
BLAKE2b-256 checksum How to use checksums |
78580f2eaba04bd3215ccaff7b610a85cd24c38b70f943bf04e7b5116f4801d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.5
|