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

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.2.3-cp313-cp313-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

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

dbzero-0.2.3-cp313-cp313-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.2.3-cp312-cp312-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

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

dbzero-0.2.3-cp312-cp312-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.2.3-cp311-cp311-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

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

dbzero-0.2.3-cp311-cp311-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.2.3-cp310-cp310-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

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

dbzero-0.2.3-cp310-cp310-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.2.3-cp39-cp39-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

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

dbzero-0.2.3-cp39-cp39-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: dbzero-0.2.3.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.2.3.tar.gz
Algorithm Hash digest
SHA256 11588de5bf4554f18725fc01a5e22314ab06ae048cb6b9971350abaa1c15e4a7
MD5 a2f9e6280b82aacfe8ab6fdee3548099
BLAKE2b-256 311a25e17e828eb29de96dc46ccc19a15028934a13fc276e12944079b2ad8ead

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cf238bdbfbd06db8e056863d5fafb52f56373704b74d90cdfcdf5f6b13cb2f51
MD5 b5d000f2edc3c386df3f89f11c703cb0
BLAKE2b-256 bb1b5e872f25aa899ebc37a99f990411fd7ad37ec68c779535e06fbbdc537691

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 23.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.2.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5e1c27b3de06ffe45bb17510d79679c49be7a9a13d9b90ce8baa6dd303e90e9f
MD5 64bc2b788631b7971ba5b901424eaff3
BLAKE2b-256 bd04bd034f6d1766c9e9b36b3bc5bce44eae86bf7dcc06dcc722826058f05720

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6758efdbff2ee70fed0f0bdbc34d8888d4a84832d83656edbd8c0e0e2023cf41
MD5 c36bf96488658177e40f0e3ffc84022a
BLAKE2b-256 2b0cf5114dad30e7f458429fc713b8a09721b2d24e7f28f60d660a241f3372fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ae4e20890597ce08cae64be01d255214e5bc1d33ce4a82c0267f0a6935da8bc0
MD5 9dc1564160aadc349ff780a106e072d3
BLAKE2b-256 1133e2a4c3fab89464848ed0d15aaadc613992696d876ac77d30b6de70e87d3c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 23.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.2.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 64c42caf9eddedb8a94b547e7637838dde26d8443784ebcb35ab8ca902194fdf
MD5 7e7a4872980688c2fccd68027a62f919
BLAKE2b-256 575b4c1a394e4a335fc7f4639c291066ce77745eda29eba9bdcab39a366c5f1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e28ded796966f2ef25ac8baf2372e2dee3e437815d758a2f4bbc373e8a2cd982
MD5 551c396dd8bcf361d2580bbc33597507
BLAKE2b-256 f45aa0c1725184e9f188acf5abc392d1363b12b87e32d49e329eb237fa1c2fb7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 69ea905e1bcd73ae3d35e202409139e518e91eb8f6c511b8f9587a46e4951971
MD5 d7b293b1f0f6ae5a090ed84fc0e4166c
BLAKE2b-256 e01ea39844ede4bac5679661176c40e6470c9e6d066b92f55d5a05db43a30265

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 23.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.2.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 86379ad4eb82b5120228838cc8b4dbe5ff7b4d67480cfa8e5d2ffa11497351cd
MD5 302b3f2fa36169eb6f853b5adda9a92a
BLAKE2b-256 75fce098a98c774127d9bf73db4e17f7835cee3a78db302ef6b23d8bb608a882

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f8ee132d05a09fcace81c93481c2876a927fb0e877e24aa0ddb49801f375f229
MD5 3b75db4d2e3da15921e66078bff9b222
BLAKE2b-256 3f66001d69c25cb15821db1bd5857c1c9350a92dbdab352c361b34fb749983fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f6d032733d5e65f0429130a6300cf721c8aa4eb3265a08e6556b04887183a2cd
MD5 383fb1ce698e592dd6512496e2f6b300
BLAKE2b-256 f2628652d2faf1eabc77abb31d3a91c3be6a663ba98e83a48a2f710d7e74cd9e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 23.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.2.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9249dda5ff6c907fafb7c6f39c6db2ea6797acb39e5f93488183f5b6be88fc1b
MD5 9ef66d087471caf879f8f8783d3687ba
BLAKE2b-256 02b954cba705f25525cdefb762515db813d1aa8a88b35074dad444816e7ed934

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 68b703edeec6f1fef316a3351e1c2cc8c109c1ddcf69e962495942c333440934
MD5 38cd9e0d2926404ab4c865d766815b1e
BLAKE2b-256 36a346dfb6a27445a0168913303702035f299180b5397306d9aed2aaa319064d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 77889f40fd41236fba1409a76819f8217a1517236566b129c15fa66896629a54
MD5 48015fb257b05fe99c718bcdbc2335a5
BLAKE2b-256 7d2e6aae3891baf9b04d09ef61cc5587f4a4c6596d73f4fb1eea7a366bdbdfde

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 23.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.2.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e180daca29592e3fe7ea9a324b792454a167ffc602e411b7558f4e522ab1dc02
MD5 4c1a6591b06e6bccbac8b46776281622
BLAKE2b-256 dcaa9d8206e55c78a1fd505151bacd5cec3bcff1387c60203be1214aaa0d91e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0c615f93d118647dc9455ec95629bdc6657ed2fa945883891fa4ce57cb052782
MD5 2d9ec4a89c14222c95034d4b4338148c
BLAKE2b-256 d6aff1c816f842f880b93e9b59ee4817646d3af05504b2f213f4ae5e95910f36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.3-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3ee29ac386f605df905a8b650f21155da8edaf455fe8063cd9fabcd69027a743
MD5 ecbd752e9f4223d4ead3b64a2b2e4bf0
BLAKE2b-256 c834627d7067aa42c4b5ee89079d3885b2e019733d9ffdca8ad703782f7c5b9a

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