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

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

dbzero-0.1.10-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.10-cp313-cp313-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

dbzero-0.1.10-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.10-cp312-cp312-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

dbzero-0.1.10-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.10-cp311-cp311-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

dbzero-0.1.10-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.10-cp310-cp310-macosx_15_0_arm64.whl (6.2 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

File metadata

  • Download URL: dbzero-0.1.10.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.10.tar.gz
Algorithm Hash digest
SHA256 6bd48eb941afa5baaef561e2e2f02e5675e2c308006b063a6f21607cae0cf6f8
MD5 38c16747d2ff3b136d5496a32e523191
BLAKE2b-256 56c73d56adeee2a437b172eadad232ceca9f0c29172a4921ed5641b7500c9584

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 77ec048315bb0a06bf27af02071f31378269a0d47e930e22e16cc9a659468aef
MD5 16fa0e033579410b9c4eb21e4853d0c8
BLAKE2b-256 570e54c03c7b30548f65ef0c06df3e71789b8f9b1f16bf4354fed5e21fe873d0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.10-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.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8884d204a419f09a8895c6e526395c83b845502162ea8a0381cf6f4de336bf08
MD5 3f3dc32c1b7b2cd9db72fe13a0af4877
BLAKE2b-256 3d93b9c4301d777e577848efe6af70fbedead79c4a8b2dfe1e6d9d985be75aac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5cbecde9b93ec49bca271b37b6f44dad14571d78df78443bf1c2bccae651261d
MD5 13c4904e0ee69371d270276ebf90de84
BLAKE2b-256 5a72f791254fbcf3cad23fdeef777e7494b88cd94b6d821e45ec3c327923f337

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f6877d6f5ccb5635d8aa30c4932dcb544253c0ef45be66bb75eb7d3626769add
MD5 1a8d6c373b6f9ee1cc25e22fc981ab9d
BLAKE2b-256 a717128c81560a2d074b82f2b479a6fb47dc32cde065d4322667777f5c884e82

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.10-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.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fbdcac41208a7163120344fbfaafc0644b1e35ebc762b37a7f4db8129f2dfa48
MD5 e47ce3b53570b5c479c7f6bb06c36a85
BLAKE2b-256 48f732e11f67ac37b19e85ce0268ba0897fd9235835087b515141c0055eef7d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 de87b33c51898a1177187e63dfd27a8daf4041ce64adb6a31acbfee567413ee3
MD5 8fdc8de779f486247afbff4b9306541a
BLAKE2b-256 e8ca3e7819fed22b7c39e91f3162b0232310fc1ba3e1f337d01454cc365327b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cc4997cdc727aea58b013b5592dec6f9db8560c2a23b3282921f137e83ac8e2c
MD5 a871596cbcfca088043c9d3d12521694
BLAKE2b-256 fb57b01ee1b939aae6925ac5758edfab6da0e7e86c88b463d5b9d430988bf980

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.10-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.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 213418b889e78d231e38fa633b75cfd269be29fcf8457e9fb2cc8063d1a23448
MD5 dd65e310dce645e1a28164c2a681ff1c
BLAKE2b-256 02db56bc31416c853ad1befac47f374e11e79074f4181296871ce784a7655ba1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 990cec2a56858d74f4279ddc54d01c70d22aca8db835e1b143d0acb09d5dbd88
MD5 e191e80b4179459c723445b0116059f5
BLAKE2b-256 fe6395a12ea6cde8031ecb007ff49bb78d793a44a700f7d9c0de3aea37415109

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8ac17e0a7d0ce7c419eaab03a8ab96dad6e0e7bfe0177f5710d00aa52343cc43
MD5 46039aa02da4d0d492f3b65f9e70deb5
BLAKE2b-256 01f6add7c595bf162a4b5897508d124cd45189eb22a82918357475cb48b090dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.10-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.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fd15953464f7acdfffe5699aa7bf056e8f48c9fdf45a3a18a2e123b39e377aa8
MD5 a8c92385f3186ec4bfef46ef360f8c0f
BLAKE2b-256 4c576bcb4581ae87fa6a1817d80738fe40ea50728f0c4b31f61dc3ae42fdd0ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f750c14f331f9b3a690b345cc71fa98124e816d325733e9ef067547e8c5cd64
MD5 ef025ca89e3130b5afe1ff211519b807
BLAKE2b-256 ebcb1a0fb0006b08f5ec6c15e5034c4319edc679a5706498b3f710b8911b3a52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f68ed4d6191c05a0c9888b2cf6e0c9c179dd455fe680b12ba61e5a022bb51ccf
MD5 ad2f7dadf9fbb36568c670d215b41242
BLAKE2b-256 02bfffae21741056224c64c1e633bceaec5c2875781da8dbaa8fa26e74056420

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.10-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.10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a7153465d60a489684a8b2b67f340669c67dbe67a7a0365d089485909c89f10b
MD5 cdbc0084cd3d49b7170b9384f7dc956f
BLAKE2b-256 b12c6d78c2420bc00aef1070fa3358a1689dc278a893baba82a8b4e2a578de5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81876f8bbbdf659c4c9bac8d198d8590ee87394dc06b45ea4dbaf3a7ac708d8a
MD5 e22a216b8d920b5064bcc31ff9411bbb
BLAKE2b-256 1332013f4d90ee61b4a990dc63bbfa8a165175d2a587214d33ae932f9eca69dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.10-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7945b833c4e35aa98a1eac879c101d6bac76dadc102c7bd03de7fa108cf3b33c
MD5 e45419093e78f931eba8b128a21a437b
BLAKE2b-256 f176859772a8b8ad23114c9fcc006597214e4ececd1eed812a20ac39fb50f5c1

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