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.3.5.tar.gz (16.0 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.3.5-cp314-cp314-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.3.5-cp313-cp313-win_amd64.whl (27.3 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.3.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.8 MB view details)

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

dbzero-0.3.5-cp313-cp313-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.3.5-cp312-cp312-win_amd64.whl (27.3 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.3.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.8 MB view details)

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

dbzero-0.3.5-cp312-cp312-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.3.5-cp311-cp311-win_amd64.whl (27.3 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.3.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.8 MB view details)

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

dbzero-0.3.5-cp311-cp311-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.3.5-cp310-cp310-win_amd64.whl (27.3 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.3.5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.8 MB view details)

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

dbzero-0.3.5-cp310-cp310-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.3.5-cp39-cp39-win_amd64.whl (27.3 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.3.5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.8 MB view details)

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

dbzero-0.3.5-cp39-cp39-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for dbzero-0.3.5.tar.gz
Algorithm Hash digest
SHA256 aaa764513f8668b23b2aca3a593da3c59ad065ba0e1514f3be54a5dc021670d3
MD5 4e26a3bf0fe45879e8ac10b7fd95daed
BLAKE2b-256 5e8646bea53adc81882d99510a8c92a6879b3b5327ebf64f3e2f819498f98c0b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9e253192e5f56505c57166a9b601418b1d5ffa8c32ad75d6ec785df950b7448d
MD5 f7a9fe4a73d60a60492fc05066accc94
BLAKE2b-256 edac932ce79fd9c9df3f1502c11fdf28f1fd7bcf941e588af303500ffe7d0717

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 27.3 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.3.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9e76b60f291b73a430b195b23afc91a446eedecddcc0a5276361522082bc4e4d
MD5 186cb10c6a06d5eb771321a7bdc46f6c
BLAKE2b-256 8c2b964007f32691eeff05ec736bf77d517a802a51776d8b9b991a7002a7f164

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d590b858983fabc15a9b6c99e0fb728236d38b92c44c3a2f4925a27436be677c
MD5 90eb3f7576053d4bfb08757af307b3e6
BLAKE2b-256 649dc1103bdf005d671903403a40b1135670bf2c8a61da75b12fa5546316ad3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7de6f216aaad46e9cd39a0f6e30218a474b70fbb1a754a04ca8d7e2e3eed7819
MD5 9156c1840f5b20515d23ee85f84f21a9
BLAKE2b-256 36f784d8e86a96f9b1ee5ad8b7ac862486544488bd2c3ad48b42c15de63f1a6f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 27.3 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.3.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 68eff71c201d64ecc17f5a89fd10850ea0c195c85fb0d127cabb60843e1dc4b0
MD5 ff85ba477dc17cc34d37c6436a18268e
BLAKE2b-256 3777cf5af5795419be6ce9ab2104161dee1c67608dabb41b22ea07153be675c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7c1e56e84e8e858072aed7941bebe37cf9e7978c5ed823cc4a74ea6b7addbb1c
MD5 2fdcb0b456adae3c72b8de189c279393
BLAKE2b-256 b6efc7937a175f95d39654ebbc04ddce90c7bb4f7ea47c98bb9cc5c5d82f8bc5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 086fe265b909cd260c534c2ef186d790a15563b8fbeaa1b21b57d3d659a5e11c
MD5 9971c72c15073d886291691ab7d335e8
BLAKE2b-256 7d7c7d1f9943cd9b1444353e382b9cfb3eb57aa3361ba64d711bbc759f7b910a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 27.3 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.3.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 60b662d1ea5b533a9e163c3ee33a3ada9a406fc12397d6f334a2d1499472f80a
MD5 b0eefa5fc6d9247a75492c2c10e27eee
BLAKE2b-256 976166309437bd173e82204a8ea45e430c3d6337bbf0a0eae5fa819b0e0f1cec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1fd8b4d21d54207edeaab0c14c2154f0af074b2c986e660104ab3fbcbed95663
MD5 9432b1625bbe2f49366e12113a792a0a
BLAKE2b-256 72f2da0d1da7d06effbc4e3449e83a33f6993d8072dba64a9774185ed6e6e2a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 541a7b43f7602c9531f1691a513ef3597c538f0b90ecaa00567252c153bddac8
MD5 27f920985cc42ee308029a5c1e8a2abc
BLAKE2b-256 6a21ebb33888605d63384d542d20d1bd86ce8f8fa759c667ec3f2e44c35ac8a4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 27.3 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.3.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6d7e6cae87a73278bfacc4554c5e4e3f977ccd17ecc2cde275729a0067dc687b
MD5 7548164d6d87e83c993e7769c02884e8
BLAKE2b-256 2a76d7a6e6451652a0814f2b330c95d615d575e8a01e61d2cb903b5ef1c30a11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1b13a6182b82b10073cb385ae99d5533116b68e44c5fcefacf00e7f1412336b5
MD5 14b59700cde403ab78a3569bfd9a9a3e
BLAKE2b-256 99ab3679d33a7bcda1d2c0a66377c1e3f4e88b602904d4791ee3878c61daedc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 e98b49d83c196d0771b52e8a7db12f9a101624aa17e0c329321534ad080df46b
MD5 a265e6933f2e2c6df9325a03ef7352c4
BLAKE2b-256 cba330a76e3f1f11dfe2b0ac90a36642bf6d97e14c71a6c66003ea0e551a2e47

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 27.3 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.3.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 45a9dad7dbca3357161fd2f7b0e5687c717b8e7b580680904357269cc6777779
MD5 f55824ea81cdcc09af1f6bb80631ba05
BLAKE2b-256 2ed0ab1e1e206d59faae39d58028193d9f89bb66b8b63a7237e1e8ab04752da6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bff74f83cfff47d4e7bb33ceaba2c055d6214453793f052a908248ec75814b5e
MD5 78caec97205f625bc34b846b88568c18
BLAKE2b-256 7fac923c7640981fb172fc5562996b810caed4732f44a0fb2aed3ee797ccd968

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.5-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 56a14fd4b0e4c30d0e8aab254a107c74b493bba6f5255779d17661abdb90c991
MD5 1487e4b7126b86ae538a43e4c63384bd
BLAKE2b-256 3078926b817ee46fa36520e3b486be227f02837d89784178c610b6a3a9b10335

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