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

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.3.3-cp313-cp313-win_amd64.whl (26.5 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.3.3-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.3-cp313-cp313-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.3.3-cp312-cp312-win_amd64.whl (26.5 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.3.3-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.3-cp312-cp312-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

dbzero-0.3.3-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.3-cp311-cp311-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

dbzero-0.3.3-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.3-cp310-cp310-macosx_15_0_arm64.whl (7.5 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

File metadata

  • Download URL: dbzero-0.3.3.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.3.tar.gz
Algorithm Hash digest
SHA256 1c79a0be32187edaba20d6fe3f8646db68a17245c3c0e74b47dd942b201779f1
MD5 c5e56b23ce00023b1648b50aae2d985f
BLAKE2b-256 ef09accf6f8c2d1bddd1c9bcb3e23c628a62b7af53c78297f2fb7a06a42076fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2454d0ff46c1a2097413fb711ce4e9b08e1a82be9aab7cdf26b129fc5d248e0d
MD5 cc929ed23e41d33e927c44b608fae063
BLAKE2b-256 a1b0689a2e813a2a54bf64c649cc13cb9576c3fc1a55e0b4f1fe78d5dee419b9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 26.5 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.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 df598316fd9f48eaa6a608ad0e8ef86ad32bb544d4f9537cf5aa6509b8db5c40
MD5 dd926a5e22037e5c31ac0633b4f4bc7c
BLAKE2b-256 4cceb2b655119a55377c60844d028d168d97215690a68b1945f8a8df97916f21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 785931f99c2f14844b6b073863a55746edd130d10bc95e11bd44b6385f3ebc87
MD5 1bbb3ad7c97903f9691225db6a5493a7
BLAKE2b-256 f95de96b3b578b444e88e46f0b0097c340bc3a16a7c154dd6f131663ab5c4dd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 94432b762bfdc250badaf012333f86952832d7c9144a43ef20cf48ba8e36ae0f
MD5 826d5a8dc2477eacfcac1084be0e7da7
BLAKE2b-256 d3a72336f6ee09ecb46d639c5358946da80926545a7d22612e0dbd74eade4c50

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 26.5 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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e0e8e2bc1b5a5a391b1dbf00390e98715317035424ac1fce677f3b86160f3924
MD5 c6af47759a6397a242b922678d5f44bf
BLAKE2b-256 95a76c6f5a13baca930adff646a3fc9f004102a9ed443713d2b06dafde4c5e88

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 478e3814cb72995aff1aa36aa0db697c4f13daf88c64fdde4d1908e24590032b
MD5 067dac964ad869d8c324c582a9d0a9b8
BLAKE2b-256 00886139c86f6b7b622f24b59f53db297a5798b0b23704b7a3e75f702efe8f5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7277097f8283c67f28fd69022c4e1185f95953acc44f2d3a8de64915ae1dc5f0
MD5 5e2ae1e99266c8d769b2a50564ad432e
BLAKE2b-256 37a61d41e70fb3a83547c0ea6d93e12cf2a69c242a498e6e1a146ee3007a498b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.3-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.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ed6573ee69a6999426acc0103129179b988611850d5a04561979df5634ef0593
MD5 ca8fb81d43cc5050879007770fec33f2
BLAKE2b-256 0a9d40015792bb6f57d808e643a8b709c70265d37eed1c40081afe3aa2e86cd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1094b374feab3dcce64d014367b6a48d6928e5c2a0f96468e70bd5540f192ca5
MD5 4d7bd51b176abff27eeb40762692c38b
BLAKE2b-256 3aed8d4d4f996b20be148ee711fb604901194dec4c0258e8136d8c337e0736fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5f0e6b78ffe9b4d7fc88219bf84978dba8c875dce9844588ba4075d999e7667f
MD5 fb3d954c6a3b4d78c72e440f9230c7c9
BLAKE2b-256 4886c84332998fdf2b2fa11c88f8bc2365db8f7977bdc70059bde98ab5f42334

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.3-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.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 26022d1ef38e75c90882ed051831eefe611e35712a30d2fafe1906715a88bec0
MD5 5998ead1730ff3940341613e4809bbfe
BLAKE2b-256 ba18b6f9492d446e63d5f83c72b6c6abb0cdbd2fced63266cb737213867d667e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 07d5d31cbbfaa34163a514024e38126c7b0366bc21595309ee330886479f4ad2
MD5 0ea27ba9f8ef123db7289afd42702cc7
BLAKE2b-256 e4fd3c774fc4333891b157433925dfe110f05478bc75fc35caf43540ffec33d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8b930e5893093fae91bca96c32ef1c37e6eedd6d55b9629c8761425b389f6757
MD5 509ffdccda518d9be8ef9033f2f91058
BLAKE2b-256 0411ea80e25452ee16e536fcf6ce95e4cf0f0ba0a31c2c844210a73c762a6c97

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.3.3-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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b87542cde907c8e4ea58a6f16caeeb47d14d9c7060f0120ab9e90276b42172b2
MD5 0da14a2b9e180cbfb6509af2d3efbfe8
BLAKE2b-256 b5d88fad4bb47403bab42ca0a36c9e31644d9b8b1315127231c3f9f063231d68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f96b5ef8ad601898ff05a445f23c70217efdf000fee0f837e9369992d14c72ee
MD5 a4aa0f682099fe0e1e090a69e47cc0ca
BLAKE2b-256 3f8b661fda4cdd0baea46732a539626bf63dc27ae808aac56986558e7a177adf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.3.3-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 1ae9f23affd67cb8ba552bd31cbec970054e73a85b1fad073904966bc8441020
MD5 eaab55bc8daf67c69af5bf4c9605b644
BLAKE2b-256 1691d8b768e5ac8eb433c639f7440dbd9152b9c533fdcf88e6b45698c7279678

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