Skip to main content

A state management system for Python 3.x that unifies your applications business logic, data persistence, and caching into a single, efficient layer.

Project description

Dbzero logo

A state management system for Python 3.x that unifies your application's business logic, data persistence, and caching into a single, efficient layer.

License: LGPL 2.1

"If we had infinite memory in our laptop, we'd have no need for clumsy databases. Instead, we could just use our objects whenever we liked."

— Harry Percival and Bob Gregory, Architecture Patterns with Python

Overview

dbzero lets you code as if you have infinite memory. Inspired by a thought experiment from Architecture Patterns with Python by Harry Percival and Bob Gregory, dbzero handles the complexities of data management in the background while you work with simple Python objects.

dbzero implements the DISTIC memory model:

  • Durable - Data persists across application restarts
  • Infinite - Work with data as if memory constraints don't exist (e.g. create lists, dicts or sets with billions of elements)
  • Shared - Multiple processes can access and share the same data
  • Transactional - Transaction support for data integrity
  • Isolated - Reads performed against a consistent point-in-time snapshot
  • Composable - Plug in multiple prefixes (memory partitions) on demand and access other apps’ data by simply attaching their prefix.

With dbzero, you don’t need separate pieces like a database, ORM, or cache layer. Your app becomes easier to build and it runs faster, because there are no roundtrips to a database, memory is used better, and you can shape your data to fit your problem.

Key Platform Features

dbzero provides the reliability of a traditional database system with modern capabilities and extra features on top.

  • Persistence: Application objects (classes and common structures like list, dict, set, etc.) are automatically persisted (e.g. to a local or network-attached file)
  • Efficient caching: Only the data actually accessed is retrieved and cached. For example, if a list has 1 million elements but only 10 are accessed, only those 10 are loaded.
  • Constrained memory usage: You can define memory limits for the process to control RAM consumption.
  • Serializable consistency: Data changes can be read immediately, maintaining a consistent view.
  • Transactions: Make atomic, exception-safe changes using the with dbzero.atomic(): context manager.
  • Snapshots & Time Travel: Query data as it existed at a specific point in the past. This enables tracking of data changes and simplify auditing.
  • Tags: Tag objects and use tags to filter or retrieve data.
  • Indexing: Define lightweight, imperative indexes that can be dynamically created and updated.
  • Data composability: Combine data from different apps, processes, or servers and access it through a unified interface - i.e. your application’s objects, methods and functions.
  • UUID support: All objects are automatically assigned a universally unique identifier, allowing to always reference them directly.
  • Custom data models - Unlike traditional databases, dbzero allows you to define custom data structures to match your domain's needs.

Requirements

  • Python: 3.9+
  • Operating Systems: Linux, macOS, Windows
  • Storage: Local filesystem or network-attached storage
  • Memory: Varies by workload; active working set should fit in RAM for best performance

Quick Start

Installation

pip install dbzero

Simple Example

The guiding philosophy behind dbzero is invisibility—it stays out of your way as much as possible. In most cases, unless you're using advanced features, you won’t even notice it’s there. No schema definitions, no explicit save calls, no ORM configuration. You just write regular Python code, as you always have. See the complete working example below:

import dbzero as db0

@db0.memo(singleton=True)
class GreeterAppRoot:
    def __init__(self, greeting, persons):
        self.greeting = greeting
        self.persons = persons
        self.counter = 0

    def greet(self):
        print(f"{self.greeting}{''.join(f', {person}' for person in self.persons)}!")
        self.counter += 1

if __name__ == "__main__":
    # Initialize dbzero
    db0.init("./app-data", prefix="main")
    # Initialize the application's root object
    root = GreeterAppRoot("Hello", ["Michael", "Jennifer"])
    root.greet() # Output: Hello, Michael, Jennifer!
    print(f"Greeted {root.counter} times.")

The application state is persisted automatically; the same data will be available the next time the app starts. All objects are automatically managed by dbzero and there's no need for explicit conversions, fetching, or saving — dbzero handles persistence transparently for the entire object graph.

Core Concepts

Memo Classes

Transform any Python class into a persistent, automatically managed object by applying the @db0.memo decorator:

import dbzero as db0

@db0.memo
class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

# Instantiation works just like regular Python
person = Person("Alice", 30)

# Attributes can be changed dynamically
person.age += 1
person.address = "123 Main St"  # Add new attributes on the fly

Collections

dbzero provides persistent versions of Python's built-in collections:

from datetime import date

person = Person("John", 25)

# Assign persistent collections to memo object
person.appointment_dates = {date(2026, 1, 12), date(2026, 1, 13), date(2026, 1, 14)}

person.skills = ["Python", "C++", "Docker"]

person.contact_info = {
    "email": "john@example.com",
    "phone": "+1-555-0100",
    "linkedin": "linkedin.com/in/john"
}

# Use them as usual
date(2026, 1, 13) in person.appointment_dates # True

person.skills.append("Kubernetes") 
print(person.skills) # Output: ['Python', 'C++', 'Docker', 'Kubernetes']

person.contact_info["github"] = "github.com/john"
person.contact_info["email"] # "john@example.com"

All standard operations are supported, and changes are automatically persisted.

Queries and Tags

Find objects using tag-based queries and flexible logic operators:

# Create and tag objects
person = Person("Susan", 31)
db0.tags(person).add("employee", "manager")

person = Person("Michael", 29)
db0.tags(person).add("employee", "developer")

# Find every Person by type
result = db0.find(Person)

# Combine type and tags (AND logic) to find employees
employees = db0.find(Person, "employee")

# OR logic using a list to find managers and developers
staff = db0.find(["manager", "developer"])

# NOT logic using db0.no() to find employees wich aren't managers
non_managers = db0.find("employee", db0.no("manager"))

Snapshots and Time Travel

Create isolated views of your data at any point in time:

person = Person("John", 25)
person.balance = 1500
# Keep the current state 
state = db0.get_state_num()
# Commit changes explicitely to advance the state immediately
db0.commit()

# Change the balance
person.balance -= 300
db0.commit()

print(f"{person.name} balance: {person.balance}") # John balance: 1200
# Open snapshot view with past state number
with db0.snapshot(state) as snap:
    past_person = db0.fetch(db0.uuid(person))
    print(f"{past_person.name} balance: {past_person.balance}") # John balance: 1500

Prefixes (Data Partitioning)

Organize data into independent, isolated partitions:

@db0.memo(singleton=True, prefix="/my-org/my-app/settings")
class AppSettings:
    def __init__(self, theme: str):
        self.theme = theme

@db0.memo(prefix="/my-org/my-app/data")
class Note:
    def __init__(self, content: str):
        self.content = content

settings = AppSettings(theme="dark") # Data goes to "settings.db0"
note = Note("Hello dbzero!")         # Data goes to "data.db0"

Indexes

Index your data for fast range queries and sorting:

from datetime import datetime

@db0.memo()
class Event:
    def __init__(self, event_id: int, occured: datetime):
        self.event_id = event_id
        self.occured = occured

events = [
    Event(100, datetime(2026, 1, 28)),
    Event(101, datetime(2026, 1, 30)),
    Event(102, datetime(2026, 1, 29)),
    Event(103, datetime(2026, 2, 1)),
]

# Create an index
event_index = db0.index()
# Populate with objects
for event in events:
    event_index.add(event.occured, event)

# Query events from January 2026
query = event_index.select(datetime(2026, 1, 1), datetime(2026, 1, 31))
# Sort ascending by date of occurance
query_sorted = event_index.sort(query)
print([event.event_id for event in query_sorted]) # Output: [100, 102, 101]

Scalability

dbzero provides tools to build scalable applications:

  • Data Partitioning - Split data across independent partitions (prefixes) to distribute workload
  • Distributed Transactions - Coordinate transactions across multiple partitions for data consistency
  • Multi-Process Support - Multiple processes can work with shared or separate data simultaneously, enabling horizontal scaling

These features give you the flexibility to design distributed architectures that fit your needs.

Use Cases

Our experience has proven that dbzero fits many real-life use cases, which include:

  • Web Applications - Unified state management for backend services
  • Data Processing Pipelines - Efficient and simple data preparation
  • Event-Driven Systems - Capturing data changes and time travel for auditing
  • AI Applications - Simplified state management for AI agents and workflows
  • Something Else? - Built something cool with dbzero? We'd love to see what you're working on—share it on our Discord server!

Why dbzero?

The short answer is illustrated by diagram below:

Traditional Stack

Application Code
    ↓
ORM Layer
    ↓
Caching Layer
    ↓
Database Layer
    ↓
Storage

With dbzero

Application Code + dbzero
    ↓
Storage

By eliminating intermediate layers, dbzero reduces complexity, improves performance, and accelerates development—all while providing the reliability and features you expect from a regular database system.

Documentation

Check our docs to learn more: docs.dbzero.io

There you can find:

  • Guides
  • Tutorials
  • Performance tips
  • API Reference

License

This project is licensed under the GNU Lesser General Public License v2.1 (LGPL 2.1). See LICENSE for the full text.

  • This library can be linked with proprietary software.
  • Modifications to the library itself must be released under LGPL 2.1.
  • Redistributions must preserve copyright and license notices and provide source.

For attribution details, see NOTICE.

Support

Feedback

We'd love to hear how you're using dbzero and what features you'd like to see! Your input helps us make dbzero better for everyone.

The best way to share your thoughts is through our Discord server: Join us on Discord

Commercial Support

Need help building large-scale solutions with dbzero?

We offer:

  • Tools for data export and manipulation
  • Tools for hosting rich UI applications on top of your existing dbzero codebase
  • System integrations
  • Expert consulting and architectural reviews
  • Performance tuning

Contact us at: info@dbzero.io


Start coding as if you have infinite memory. Let dbzero handle the rest.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dbzero-0.1.7.tar.gz (15.7 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dbzero-0.1.7-cp314-cp314-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.1.7-cp313-cp313-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.1.7-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.1.7-cp313-cp313-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.1.7-cp312-cp312-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.1.7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.1.7-cp312-cp312-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.1.7-cp311-cp311-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.1.7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.1.7-cp311-cp311-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.1.7-cp310-cp310-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.1.7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.1.7-cp310-cp310-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.1.7-cp39-cp39-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.1.7-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.1.7-cp39-cp39-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

Details for the file dbzero-0.1.7.tar.gz.

File metadata

  • Download URL: dbzero-0.1.7.tar.gz
  • Upload date:
  • Size: 15.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7.tar.gz
Algorithm Hash digest
SHA256 1efcaaf95c3e4354df14bfff456ec2d7a6ad290a94b84171c195fb2fb4113e0a
MD5 a0988c0631f55462ee58169f7e3aee63
BLAKE2b-256 7194ec90137b7a605786f6ec3571a94a36c3b896f8fda892bf9178b6796ca139

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a899a21e4ab8a3297548b7d57046655c863c22763cce7cdcda59573f13c9e3ed
MD5 262a625a25fea57edb08b9bc6a3399ea
BLAKE2b-256 716d96401a2a2fcdda83c7453e2308b23ed3c44be5b42454e740d0d720df65b4

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.1.7-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 22.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 187a9064df4b0a29cf55a71b340ed4e3d4f0a221640844b550f1c59a58d2363c
MD5 ad47039a487823ad30f8aa3abd8faf85
BLAKE2b-256 99ade20a4db0f02e306e447f4984902bfbb1c2a7e174d7a45be86d3ac29a1448

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d61a95f4f6bc5b001446e22c258d3c7ec491c1f415d1d9b1d4518e3c0773f2a2
MD5 a9c2f73fe53c6bc8f0c301afaed48b89
BLAKE2b-256 4daab0ae1d55f9801e5300ef1feb3be1ee9877a457450512e279cb5283e54f48

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 bb31a5f3439a684e26de0f8fcca4a519de1b094c04cf3fc1197dee7f6a5e1fe8
MD5 c3c8503bd2afe31ac02808db75db3770
BLAKE2b-256 bf75588d6c8881c973736ba91b4abca14f5f49fc3bd90a7ea62b4e9ff36ce40d

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.1.7-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 22.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8e2f34a737b47fe5bfc053ce862608da2bd2af6163099ba6825a85b4a5ce8372
MD5 f3ef5a2ecbe9900ec5df605e76848b75
BLAKE2b-256 5d6a17f9961c65df6fb736797eba5f8b13ce366b71160d2aa37ee6168604f57d

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6076ddfd7fcbe438cebee11a3ad27441c3bbe8c90609a4c2c1d82803e4788a3e
MD5 f0719b0e026a235ccbd331d6a30c355a
BLAKE2b-256 4f80c3ff18b050cb9fa5acd09e4024e138e645431d4987970333a52722c355ae

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c5699abc2d86e10f921e0673832f0282a741ad0ee5dc5345fe35b606474666c6
MD5 2ed24d122f6bcfa477f7ef7917da1640
BLAKE2b-256 3f3b53787f25350ae65ac34b216ecd33782a334fe34f92057caa465242b29f38

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.1.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 22.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 105d582f0c7a4b6dd61afcd13fe2dc3e16f409447f3ca4d8c54219174c718075
MD5 7e49494682f1ed512323a7091fd729ff
BLAKE2b-256 6ef83029bbccd6c3f88b0d31d58c38c05b3bfb2ab85cd3fc6fe793a3f7d46ae0

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a6385aa61aa01b3371a810a3fddba1f0d201ad93793f89cebdd216f79cf841b5
MD5 d3cbfeff36a6a0fa8d7aad303cdfc74f
BLAKE2b-256 ac44b27ad865d1360648a915ceeefd00a183240a08f415b8c2b89ec57f63d5c2

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 24b371ec466720f333acf7833c5fe46fbaad9bc6454fc2c3e47616f99d2d465a
MD5 536e5a12e3b858ea729d6b3c09d17e89
BLAKE2b-256 24b08f7855f0a3c1ebe6a38dfd0ccad095c66bb06526259a4578bb7e5f19d36d

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.1.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 22.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 74590c21f17c892e20310fc8bdebca2804e6b69cb6cba0bcd6b50e377f8b0851
MD5 641b81e65912a39a8b92daa16b744ee7
BLAKE2b-256 6479b91ff4034385ac6afae4049dfd286ab3186c492d515537a5d3c493fc76fe

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 078bc6eb84a00505bd7cefdf5e031961dbcae8cc6d8fe93fadb6b9604b64719e
MD5 c4271cabf4680d39244c553fad6eb3d9
BLAKE2b-256 7ab687c768973b2380c9ec38fc5f5e45eaaa8d71063c61f93ceb52eb9622d142

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2356a93da80c58fd5fd70901d1766f0dadbfd5f949b61a64aaafd8387a944578
MD5 c0c32c1164a429fef5fc2c6019b2ba3f
BLAKE2b-256 bae9c253a4e41eb12b1e2bd35a1f4cb0a7d4f5c715de66db838d3f68668ffa68

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.1.7-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 22.1 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d3a6e0171a6f7ab1b996ca832ed521d73296a7cfca7dfc29261ffd7a00d65bed
MD5 35e8a9c6d6774b6be7ae8b3169137286
BLAKE2b-256 0cb6df35827435eb8b0737801569c8ab6f42f924d3be487e7176c3c5fcdc0352

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c83c4379191dd2a3bfaebbfd2f6133295b432d5672fdd89b87a837b7dd844b96
MD5 c99430c3944b6f3ab09ba8ccd4c4bd71
BLAKE2b-256 72301e633d2ba3ee7b0c70946ce68df08d57492bb86e270f0bbed7b368599dd4

See more details on using hashes here.

File details

Details for the file dbzero-0.1.7-cp39-cp39-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.1.7-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2fac47a5a8156ffaa0d24e4b7d490585e1e3b41ea4ed9a5d9559396393c31d11
MD5 3581f6539ef6cbc8bae05862a18510a9
BLAKE2b-256 660c20a06a4fe9d2acc2fdfcb4455c4454e081a663d115bf2a6b96b59c018133

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page