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.1.12.tar.gz (15.7 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.1.12-cp314-cp314-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.1.12-cp313-cp313-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.1.12-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

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

dbzero-0.1.12-cp313-cp313-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.1.12-cp312-cp312-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.1.12-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

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

dbzero-0.1.12-cp312-cp312-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.1.12-cp311-cp311-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.1.12-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

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

dbzero-0.1.12-cp311-cp311-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.1.12-cp310-cp310-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.1.12-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

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

dbzero-0.1.12-cp310-cp310-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.1.12-cp39-cp39-win_amd64.whl (22.1 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.1.12-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (7.9 MB view details)

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

dbzero-0.1.12-cp39-cp39-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

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

File metadata

  • Download URL: dbzero-0.1.12.tar.gz
  • Upload date:
  • Size: 15.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.1.12.tar.gz
Algorithm Hash digest
SHA256 1a7091ba7935f2f93e3011608a78493b5553672c7d2c11a6d21e676a8fd738eb
MD5 1e949d397460b8ce0f94ee9ea0062603
BLAKE2b-256 75edd256248659c17d3c1b7ad8a16c6606a25dbac72d22f4bb26372c61751e58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 792e23dc73c5ec67ac273cce069c385eafcef617e0105ccd6a60d9fe52316888
MD5 910ee1f1af5651a172fbc5636d9b40fe
BLAKE2b-256 9b1accbe867f6d12b0d322e0ff3524d36303c8c2f1f6d0f3f2e0efa498bd9d0f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.12-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 22.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.1.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 46dcb9e875b48c5051a677321781cc168f978cc35c8d0ee6317841d8def635b1
MD5 288b39243964e80218f9a8098b2e383e
BLAKE2b-256 fc68a584ea9e6106bb8940053a5b640dff437928211b1d2828a18dc011c84685

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4156f1c4c39bb8954885da17348356996a41f4151757178117d1579a68660c1a
MD5 5133bd749d6d9ce8da058c705943def1
BLAKE2b-256 7f80bb1694fe9662176e0734c508d8aa6ccb641168394d0c84160fd473f3e3b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 79651472d80261357fd7acef16a1427a5a292b74077b4529bf120477c953bf74
MD5 f118cc4c57cdadebd98e81df852ee517
BLAKE2b-256 926b8775728e158e8020115b45d9dbc036191a05b418fb8def41997de0f03f83

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.12-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 22.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.1.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2561d4b20a2e494b96d78521a0625cf81cd847bdc43df722a56d58372932ddbe
MD5 2a9e77e52fd01591510d9b02da6e7da1
BLAKE2b-256 b5ca2a95bb7aae89d6c3cc32722b2cb9b869e9cfe229c7aaec5a8af109c506aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d40c20e85f24224ffb95bb4980877247a6e97446c89295657d18ee9ff1bc50df
MD5 3ce3dbaace703783b22c7476d6f11eef
BLAKE2b-256 f8a0736b6a3074cc56b80cbd978e34756c4f9b22aec9304dab5f35236b5be4c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 2892642082ba6a7d9c9facf7a39084d18cc1c86e33f927c052356adc9b71ad6f
MD5 7e0b0023116afce2719b550625f31ef7
BLAKE2b-256 f23106b5ed55d79a33fae57f9e05da35dd8cf2c461e7709f8ea3acc3401b52d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.12-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 22.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.1.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ac1cf0dbcf36f2befb6c922e52bb5753ba5e5f8bf8b4268fbe0afdb79701eda5
MD5 b91c3d610c9b2d04b0ef82b56ff74305
BLAKE2b-256 a75dcd839f53f059a670964b61f0c16e46da5ea5b0abbfb6f5fa2b829525345d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 670d3538daf9b090ff8b58bf78a6c7c96eeb811302934c5ce616c1f09fe28325
MD5 b4118fefe5d05cba5955dba84033bbb5
BLAKE2b-256 1cf8c0ef92ead90ff72e97867fe3a37b888d830b007ebde20d7b98fdc801f7c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c04fa4fdd8e44cb9c1c644e18354d7b5937c189ccecd13a0878ba720b889344f
MD5 cc55f30bb91dcadc14cd9fa2beeec636
BLAKE2b-256 e61b1721aa4e1bbcd0aabd26f05d3317b514beae69063854b69881c2b9cc19b2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.12-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 22.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.1.12-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 042ae5efa4b7d18117e6508f6abae49fe557dbeb3ef9cc35fbcee04151b50267
MD5 cd6ad416895cdf1fb3395180f14710f8
BLAKE2b-256 f50999fd0229b0b15d5e1276bdef5864d392475a19f9849dd8f45a9e15b3d256

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3d24cafb537c3cc169153434e1e70c168ad77c80f5ac4356c763c86e7d03562f
MD5 8ccbd765c438f655d79cf7c196170934
BLAKE2b-256 89491ee0f6b429fcb0f80d520f535d5911540973be8ab63928028a6f13cc03e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6ccff451a2f82698ad8555d249664cc9461492294fd0e2d5e1e6e0c014ed9940
MD5 a98667936c25abfd231607ca171eaf9b
BLAKE2b-256 4b0d622be2a18c6709fe44c6a4c79e1bfa21d1c2d36e72c78e375c9e6fdd3961

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.12-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 22.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.1.12-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b42051fbf71d75f99a14c3c8094619b36dc906496a49cf1b7718d6fa0577c1bc
MD5 c9a0e922d443cef0a41f842090558022
BLAKE2b-256 4f23925f39e8636ef9484fed0f5dcfaedbfeaf1d55c4bb9635362729cb55613b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 abac9d5b6e19757e00bd22654528afca8d9a62f16c3fac44da57c0b332e727b3
MD5 3f877da57d08601ce5efd7b96d129826
BLAKE2b-256 11c8c206a0ed6bd238fdd438d355cbdfa89d6e7fa7694cb0a9b4e2b497857525

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.12-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c4183de337475515ff325c78e985299197240d40b052d9222a5eaef518300b8e
MD5 42fd31ce7ce0d06b8311e980a75e95f4
BLAKE2b-256 90065b10dab7dd0d3355990d045f76c7d3d04815083fe70be23cbfcc64180665

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