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.2.tar.gz (15.9 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.2-cp314-cp314-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.3.2-cp313-cp313-win_amd64.whl (26.6 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.5 MB view details)

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

dbzero-0.3.2-cp313-cp313-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.3.2-cp312-cp312-win_amd64.whl (26.6 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.5 MB view details)

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

dbzero-0.3.2-cp312-cp312-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.3.2-cp311-cp311-win_amd64.whl (26.5 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.5 MB view details)

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

dbzero-0.3.2-cp311-cp311-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.3.2-cp310-cp310-win_amd64.whl (26.5 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.5 MB view details)

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

dbzero-0.3.2-cp310-cp310-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.3.2-cp39-cp39-win_amd64.whl (26.5 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.3.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (9.5 MB view details)

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

dbzero-0.3.2-cp39-cp39-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: dbzero-0.3.2.tar.gz
  • Upload date:
  • Size: 15.9 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.2.tar.gz
Algorithm Hash digest
SHA256 82d4ff75a9945d990cced188e30f448dbb8d4650fadb1693a19a7133cb7fd6e1
MD5 9e7981702d6ecf3bf22bf08bcb758d66
BLAKE2b-256 44ac227f4b6fa578246024286bf54cb5020c51b01e7b4c7ead7dfca1b7186707

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 37a284bea4588a00807e4f0ccd354cd93e04d71838aae62de055ac7b169700ea
MD5 afb7f74fa7530836cb060720fdd86cd4
BLAKE2b-256 42b4dfbbcd54ed595fa2ec24c0fe87e3256b319d629f9fa0b90ecf286ac757f5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 26.6 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.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c121b0e81d31d935c7ff2c9b2fbc89f463d3daaee1dc64958dd187bcc36fc84f
MD5 c288b86fda89946c7854aad6ed99f323
BLAKE2b-256 1e6b4f85c59c741f1b80544f5bb33094c64417d8c9ae2b5af6f2f319342ea756

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 61b28fa3fead732ef7e9da5ea13b27bd882314c07216068bc903bd54df0a2161
MD5 d9e0d6286a30b859bd1ec4ab26264598
BLAKE2b-256 ac2a2bc2afe8f2115720f477df2c77f718515e1fdf95f1a1ae740493a2faf33a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7366ef9418f08d3ccd44ddb56b8c958e48d7930f01c7b0be8176184fa08102ad
MD5 44e0b5587ad54b48b5ab56ef0af1c0fb
BLAKE2b-256 0c8969adc62aceaa61d41db3d60b490cfc35fef22d8b0990cf2718668f9820e6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 26.6 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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ef91d60bb5498e405cb509536d1136336f1e76f65b042adaa5fa43f6401b59b7
MD5 be8ae1bf4499bf6963a8c7bfe73f68b2
BLAKE2b-256 e78c88da41227d595d4eb964d2edf1277699bba0b9beadb5ea0e75c62dc3e786

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b5c7f46143c080e47dfb4dbc64cf9364f7e6c5f983df4ce6f17edf9134518021
MD5 0fed8e262dce38e3679c0e8043669294
BLAKE2b-256 537f394e351c80614787efb60dadb8c1355567a575378acc61ff60df38114e86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3292ffe759953ddd328176d44ab47368bfb8bbf3dbf8f287549f24a1a9aca8cf
MD5 ddbd451d7563fcacccd64d01b9044eba
BLAKE2b-256 7e44d651cef0c0f6144ae25d0a9a76d249a31b34ccb719093dc3ae87dd038156

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 26.5 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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ba7db5d50fc25809ff5adfae26116489e8a21f191f53712f5363f0d47f674998
MD5 1cbeec303efbf5c500a3149bb83cf39b
BLAKE2b-256 a2879f7d6714e5a8f8c2e727b0962c3e8db38f2c0711f0919072332c59fb4c2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2a42270aa9337ed2249180ed90346bdd442c084f2f2156f25709af39473f4186
MD5 e9d3a867454f5c16bc0da7ce730d6edd
BLAKE2b-256 bb2010357ed70ba879c46876063c3b577d1572f7645390c95c21afd927d9c7a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 828ff7031d46b68c4b35d764f012feb4a7941ad618eb1da99d64e2641d04a9b8
MD5 5740b45b992414d098f78f9241b2173c
BLAKE2b-256 da9ee65ba4d6455cdfe344deaa6f2ec8c1ccc34146e847f540c0cd1ffbd20c84

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 26.5 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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4a697bc4527c70b5ef65ed00a86bac3184958cad24e5b43c60f8deb8602cecdc
MD5 5aa635a19304d2590f806039a94a4b02
BLAKE2b-256 6be8bc0b5fe0885ad1c567046c5e5c1b8e5229db5cc586c6f6dccb07c95627a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4aae9149748dce7ab55eba97a7c9670177c99fc277352cec2337541bfaf22cf2
MD5 10fc49d9a917080eca8bcd0444ee668f
BLAKE2b-256 ad9f83f03d46b1908f470e98f0bdde18933d9173a3064731f8f0b03a94c08ba9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ad104306183a7f24d5f15401cef5ed38584b7254d5045f1ef62cb5569672bf25
MD5 65bc64e9e867880e11de1c6af768dc6c
BLAKE2b-256 86ed89409a35acbba6658e0f04d06d0cb8c3a418f0825d374036bb50afb781e5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 26.5 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.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 162c979ee4768a1a0be7c8eaeb391a95016dd3ce2e1b821598bcfc770086f8df
MD5 197f8803ad5151f84ccac25977950406
BLAKE2b-256 d76303ed8c040c6a0db1f66aed4afd2835ddf041ea709f0f79d6fc1a3abd9c80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6d22b2b5a1cc6b42d4c00c9c5d47f897c84d9e65aa55bde117319f018e298a4e
MD5 7a26e6706365fa9f9ed704832b42996e
BLAKE2b-256 290a087d4f683d40ec55b50026c98aa2f0e8ea9db642d2dc4d1c306f7060525d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.2-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5ce48b1541e4e975ac6016f9eaab3075169424010044a45592e7e67b1588ca34
MD5 1f0991cadec57a3dc13242abd52fceae
BLAKE2b-256 925eb66b09ec95f73aeff5cf0f1385bd80507114f153898f2257ba81a9e9829d

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