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.0.tar.gz (15.8 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.0-cp314-cp314-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.3.0-cp313-cp313-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.8 MB view details)

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

dbzero-0.3.0-cp313-cp313-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.3.0-cp312-cp312-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.8 MB view details)

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

dbzero-0.3.0-cp312-cp312-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.3.0-cp311-cp311-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.8 MB view details)

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

dbzero-0.3.0-cp311-cp311-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.3.0-cp310-cp310-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.8 MB view details)

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

dbzero-0.3.0-cp310-cp310-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.3.0-cp39-cp39-win_amd64.whl (24.7 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.3.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.8 MB view details)

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

dbzero-0.3.0-cp39-cp39-macosx_15_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: dbzero-0.3.0.tar.gz
  • Upload date:
  • Size: 15.8 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.0.tar.gz
Algorithm Hash digest
SHA256 43f4090686a102edba2d7bb5bacabe4d12b3cc0b407068e885f682a43b8fea95
MD5 6ce1fb962a01b01eb88dcf2d28143d3d
BLAKE2b-256 a9477db9faf497c4260750119bd98763f245ba5e39a490753b06ffff57fd051d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7248c1940f0f6e1887a0be9f4dd23306be7a6699cc23c6987361ff270537e7b6
MD5 7693294366d67158c55747c260a8a9b3
BLAKE2b-256 cda36d7272da16e4ce2efea1bcf9560047aa0c94e7bbbdbe59a05f3e079f2c0a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 24.7 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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8990204729034566b516500343a4916326c3d1c7fcab6b41ad402f5987d78819
MD5 63a82260ffc8eea422c7159c2814e3e3
BLAKE2b-256 bb3a0ed931a6f875efa079dc54dd7550d76cb425af1fea6fbb81ebdf85092aef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9a1cd176a5dde4661366129fd8888c071be9e8225f600de423baf8833674a040
MD5 df11750131e4356cb3a787ed13598019
BLAKE2b-256 22943c6140e5e25eb1a716881633f277505f523a9fca299280559a1a33ba37c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5e5353764075ef49d0c46a67fdb6a695a24f45fe022bb078bbb6327be7716e32
MD5 43e8b7f10664968801b11c08e10c72e1
BLAKE2b-256 e66628d005f09a7b700443b1c978a5966e682862f5f27e433fdc81058b91a243

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 24.7 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3598a4f3469c4ec1ba620f359ebeb283cdfd33d1c46cc9c87ae281ff6266ebc1
MD5 529a917f26da410f4338ac36ceeca02d
BLAKE2b-256 71984e409908b17fc54df57296d1e08bd1fefbae58e2a0e7265ecae4248a1b63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e323b5fecab94ee58053bf5e3afe1a6ec34bc67bf40ed1832317b3cfbf110904
MD5 45c7628f82a1415f246d3a560376ae6a
BLAKE2b-256 e20f7aeaafde1b530abbd9cf67ae36e2f860324e8810a65cb0463d37f93803b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 bb181d6a2677490b713c81fe682a4c4dc3984f1b702db011f7b08fea6b5e94f4
MD5 674037352e7727dfddcc98adaef9f5ff
BLAKE2b-256 7fa8dea310c13555231b2cec7d68ba0cfe1d5b679c1e71a5831cce6907532158

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 24.7 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 54bc5c0b34a1ce716d50f2740ec44fab692ecf43237a990697cb8cb7483ad5ec
MD5 a2f42d99fa2dcf6118be1ff017ed1c1b
BLAKE2b-256 bb624f3012d0357cf813146aceaa30dba6d9574b48a5e078bdd4906d1bed2cdc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4357fd8cb21201a40ee3e163a7d791798e7aa57f5efe21f1a44a48e9242f8cdd
MD5 799b81721fb1f89451d9b57e57fdc63c
BLAKE2b-256 23f5ee43a49cf13b5092afa1d1e7872e925ac4adbe65a98f8ff5967f95e2b5cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 dd3045ae53fa83ebd6f2249195cce9db9725ebea26638d532832278b0b8793d1
MD5 291802a98205b503f5ecb7206be98fcd
BLAKE2b-256 d370b397281a5a9d9c5de978ba7f63747a9d36d68784413889980a7c37f7d011

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 24.7 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9444a5f90ef1fb58f0f87700efaca20da6fad238f66e737d669d0dab12fb659d
MD5 2f88e0b36fd59f981bdc27a099787395
BLAKE2b-256 aa8c200fbdcd197883ca4da0bf48fbfc6ab73cec0f6e6829ae0d9c5fa5f6d13e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6bf7815f47770d267e4506ad672327e3a02e902e79193bffb1a1934eb5313d1b
MD5 38dd63c4250a1b2e9bfa5eaa82212a03
BLAKE2b-256 01c690b7e480517ec285e3c467bec8e8561b1e19e1652cd75c0b322fd1fdcc12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f8de370e168592a48b8834aa9de6d157ebc12fe1048617341756c2eff72b2457
MD5 b4c1db905079a27ee1784b95f26df66f
BLAKE2b-256 7c1aa479f9d48314e869ebe7851280412f89479707d792082050f2df80cca53a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 24.7 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.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f0644621d21ef1d120da99cc4cf8178b6fe588fe41444cf54f1660809802a418
MD5 bdd283f89d0e8d6ee764fe61377ea98e
BLAKE2b-256 b46bde963bcdc891eb22d80d9f63f5fa71f5f830c5a1d25512fe7bf12ba173f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da2991398096b31f8cf8e4087aaecc1cdf73ae10f8fcfb223114dd9daeb14a88
MD5 30ffd562afe3ca99da2f5ded7f66da5e
BLAKE2b-256 eb805d0bb7e2b4b05f5228c4a24809f964acc43b864d34cf07ae535812bb8584

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.0-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 99cb2f3f7dfe0e117ffb57f415dc10f9d29f723a8d811f373bdfd7935d42402f
MD5 0a50fef65e63bb1fdc2399bcefe71132
BLAKE2b-256 36b25bcf2cbd507dd9d375e482758d3f2689c8ec41af91995564cfa510df9e08

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