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

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.3.7-cp313-cp313-win_amd64.whl (27.0 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.3.7-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.7-cp313-cp313-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.3.7-cp312-cp312-win_amd64.whl (27.0 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.3.7-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.7-cp312-cp312-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.3.7-cp311-cp311-win_amd64.whl (27.0 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.3.7-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.7-cp311-cp311-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.3.7-cp310-cp310-win_amd64.whl (27.0 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.3.7-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.7-cp310-cp310-macosx_15_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.3.7-cp39-cp39-win_amd64.whl (27.0 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.3.7-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.7-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.7.tar.gz.

File metadata

  • Download URL: dbzero-0.3.7.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.7.tar.gz
Algorithm Hash digest
SHA256 f9b033c850b36a4dbd7030472578ce08df489174bcebfbf22bd9056a925101ad
MD5 61253e67bd492e27a471e47381b81653
BLAKE2b-256 26d5f9eb3e41f8b5c7303238c700f43a7478038d6c36ae9f720db7eae0c92b3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 aaf74befcc0a982def244a477deb513c76cb5afd190f24b06e0313045252678a
MD5 20e6cbaf3cc8789af5e15e3d6c8edd9c
BLAKE2b-256 b190b4305fc301e8c26931e9711f8e7f781a403d8489428813c07c6de551a40a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.7-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 27.0 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.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 078b510afa52c325f3517b144dfdcaa6ae735964ac61792b95394e494832d22b
MD5 80274e568d1c51b8fb7b7a76532bdb1f
BLAKE2b-256 c9cbe4f093c3a6ba0bb66ac16ea41f0bc4cadb57241c27d7c6296f9aaeae0c91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3e43f2fd4f8aee7ab697b1b58a54c5ad423f427bfca41792888a2b171f8e7d7c
MD5 159df02aaf5cdf631f54d2f3d4865b15
BLAKE2b-256 64018a0540a43038e052bfb8f9a2ce30574f44364388297b6ad7c2ffca71f6a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 41945dadc68da4bb3432c73146f4f7d845dedc338fafc16b8c2e7c18c6eedc50
MD5 173297f50b77bd92b5ff46a63a5cab28
BLAKE2b-256 c4c87126dd7524754b88e9a545125754bf2e795646e2335f162b2c68c3535aaa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.7-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 27.0 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.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 087d42e6734ef96ed1ba1e5e4644250e211b0b95015d18a3750cef8efc5d626e
MD5 8956d7fe758d5c71fbce64c389d66f11
BLAKE2b-256 c6d59343d2a54df7e117985edf0836cd498a452567976c44bc798159e2a84ef2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 444a1ced531889eaa2c213e2c1c84f42d5fefe7ba4e929f4e546046c6f945a3c
MD5 060998086117a1bebec9a60f38b8fe44
BLAKE2b-256 f9588f0c7942bdf299685c5d893a18c298770bafa583228b6eee83adf6ce3926

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 14c4095887b8bc242ece0f09d6a2283d7adb0672ba49205cd4db3a98c65c2d57
MD5 1065267f7cde882771070f2d4feff829
BLAKE2b-256 6c7cb9434c5cc62b559dfcd72bdfefce1ac940afe468c5a2b096565e00b2787a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 27.0 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.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 53129885e1cca33fdbd82c705923b89a301638975b2fe3f2384eec0e6105856e
MD5 3c5b0ef9e6dd7f1a9079d10146383809
BLAKE2b-256 2b308a62e6a005cc477eaa32d256d4a00f115ef71ff21cbe8e74a3ca63ee6fee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae55d2800005d278fce3358fd126ad7dbafb6283fcf772c5d3ab05bebbd1b4f5
MD5 ca6bd05f04f6175905333ddb60eb6003
BLAKE2b-256 a29a94fde62a171894e3f152b7deb06b8b70ddc4e69885a16ef7073e2aae5719

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 37a6c641acd6fe047a897112b523afd3641335db82e33e9e41078bb2d4109596
MD5 85a6a8d6dff5ee69c5f138ad4305956c
BLAKE2b-256 d39d6fe599fe0f318073f983d6fc7a118944d7f5ad9fab30363aa29b49ad985b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 27.0 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.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9d844e4a102c07875c9c90d6c1f73161492acb36b000f1783636ec4f4ba83159
MD5 26ef0eea079199cd1548114ca7e83fcc
BLAKE2b-256 502a279f78a657bbdbb13d95d7d675b195840f69931b7801cd1b2c20efd8cb46

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5dda457048168c4a677fe76c0b94ddeec689b0beef9b34ceffc543cc575a95b7
MD5 8c2072025722790ae21f6da7ab93c476
BLAKE2b-256 fa26ad3db0d2cb7f8d38581720c523eac3816693afd47c59aa92d0a52bb25797

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d4e0c8c108ea648bfe0010bbf6cd1be1cf29a0bfd1bebea240626ccd80197439
MD5 91bccb08c1dd7bef0017e9f0ea57464c
BLAKE2b-256 5723867b106e08a2d5fa6f2470036e7ae17e7c9a0196e4ee3d75eea9390c832d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.7-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 27.0 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.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 69e9446f4f5bdb9a449523a0262346b42b2f65de4ae80bd2ad16863911694cb5
MD5 7ae2fd7e8b7e151304ab6dabb1bd9091
BLAKE2b-256 cdf3b8659cbdc87e8bc7d3f43e25d0f67409357eca63e1bcbf0e16f83ee21569

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 886d82bd1a4ddb23e0bba067e05886d17df7cc35560f8b8da324dd9c587ad6a4
MD5 126e5be4fed82ea55808623eb4917082
BLAKE2b-256 b22bdb02ca0cb3f600e385871cdca43b96548b8704c103e89923e7f9cb8a42eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.7-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 65e06e2a1cf5fd3a5df5038d9e0d003699baa8e53b990981939a3dc3b8718172
MD5 81c5435479650c5054a3fff7668b940c
BLAKE2b-256 238e1697e3850e8aa91d65f33d2f5b726bf35b28237960a7cdf2c1b1ad4df98f

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