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

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

dbzero-0.2.4-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.4-cp313-cp313-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

dbzero-0.2.4-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.4-cp312-cp312-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

dbzero-0.2.4-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.4-cp311-cp311-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

dbzero-0.2.4-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.4-cp310-cp310-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

dbzero-0.2.4-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.4-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.4.tar.gz.

File metadata

  • Download URL: dbzero-0.2.4.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.4.tar.gz
Algorithm Hash digest
SHA256 0b1df40580c6e7a99d08f8908734f9cb1dcebbc37dd6a4648569802957b73069
MD5 c5f2c3d1113fd50c95e869f290367353
BLAKE2b-256 adf1680490a369dcfda52c9be8b5396784450c91af6479d6b2a65906dccdb241

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 60e1043d8e2bf8ced43ca7f0a017b3b5758a3f28dfe02a8c7fa9373d2d62b200
MD5 45bdd9fabd7c562f199adf0da848c7a7
BLAKE2b-256 f97ee8b486cc6d2e8c2a5299f04ec9f081b079953fce4453cfda261071de0f43

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.4-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.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 aa8a837d782e0b72372dfb0327206e71e13477a66a3ad155d4bd3e20363269c3
MD5 ad6330c6f6e7b2032a55d3da9f4115e8
BLAKE2b-256 76e474a6878bbb7144faf14ad4e21909669c7286441859584474b090f0d6bc24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 32b9567aadb4c41eb7390a64a5d55f7da8920b5e351717decb47b6b1e90fddd8
MD5 d94049143ff99f14b9d0d0e55525e2a8
BLAKE2b-256 ea36ad394b504d53570c816b1b2b1c2aab0b705e387e4d387f5018e9fe64d1b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 aa32e10d4a6acd2ae6ea2d82e4aeda36eae04cbaf292b9c7ba5e6deca89e925d
MD5 cc18b4d315aec2d45419a09da5ffba0a
BLAKE2b-256 5bd1cb65ec83f1a5689dac99f7263bc6acd8fa976950ce57d51ac0dfef9245ba

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.4-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.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 aa4a13111fff4ea2e2d3c50333be014ca93370494dbcc10411f73bd33ab1af83
MD5 045912c9f2bb0003b67806b8e25398a1
BLAKE2b-256 e28bce80bfa36d251e546dbac618c7c08c59ea9efe788ddbde80f4190b9909d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6c32569e28355a98186f80bd81c6e1924244181bf56626f067c5737b8cddc7d2
MD5 0ae4765410f0016483ecbad40659f20c
BLAKE2b-256 1a16e57cc4a7ec39a9842a5f551d4b575396c252a837a54e855048cd95370fe1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ebf6665513c274608853ddf27f1cd29481ee2fa61aaa3e22709f4969f2aaf59c
MD5 a5ce19337a10c39fcb3a40be7a5ca247
BLAKE2b-256 9b97b269e2f67ff4768b2da245c8b730a7d9bea8aaf008fe1b07db4b108fbc14

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.4-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.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0f7dc63a46c9b760e0ba018df7e0ed30f2b39c62a235b42adb4d3f90ae726584
MD5 dc7b166f69d919242a9d42266f35559f
BLAKE2b-256 bc0c1dd875014f3b2eaf83fc311978fc3853370c57aaefebc5687d1c673aa32b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ce92ba570a6016f8e590a36d706faa9b9228a83cf9a3e0d686c63e6ada3b1be1
MD5 849437dfb7d1b85c62475acb66863960
BLAKE2b-256 925cabb8f70b3871553077c681eb9e8a049e0e3c33d2cc78acc595ef9e3cb7c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8151ffdde6a8b479531331b256b4cd1aa8938a4a748af691319873e214a6e522
MD5 bdc4a6da8acfe88425f5a1a97594a053
BLAKE2b-256 0975abd07e961aadb055e5373227f957b9a9ed4d2084acae7dd39742c5945d80

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.4-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.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 41a7e756eb14de6e0cb2f9ff5892ebd3802043c5205dafdea4d155d7cf4efdc3
MD5 b996ac2a16cfe137df68362b2f68d43e
BLAKE2b-256 fb0b6e75624ddc52c4f3f0e15db6f8041c334d89f9e73d8c9609577c2170d06f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bebf1090435c9715f3336f881e661c0a331bbb35795f16c5ddec584055200f8d
MD5 9633780610ef027e2d1cf17e8f223737
BLAKE2b-256 92116febdffe059855573ecc00164c13251015b0321c9c1ce1af05a00b9143d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 df806c482623165107b13680f6367863d77ca4c946f448716f533d68c6d8eb49
MD5 1df06c52ba14268c0376fc2886b90097
BLAKE2b-256 a71d6445202ef77d0d1ff95b50bd7df1c5ca5b3512157520dc0e0f0afed31bbc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.2.4-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.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1249f87cabb632a67997259fc03e46c05b3afcfd1079f7884a73db81da03eec0
MD5 00c186ca88736d7f004dbc7642844067
BLAKE2b-256 ec18aa3a17b48439601403cc6d4301dcca47a40753bf02b26d7a0512f48ec3a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1017436fb3e2431769130719a35cf97568f505a5a13ecd952158b727564699ca
MD5 3f1049d2a56da7919f89309668efe78f
BLAKE2b-256 043c799deb900a47202c25be9b974876f2352bdeaf917def0fe5db065b701a00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.2.4-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8a812b8576dda03616783cf002d559aa57c6550e234fee84c9d3552cf8755bfd
MD5 93339563cc1e88c878b3aa633f64288c
BLAKE2b-256 160bc2b3fd1547ab5e61fb8779c5ff85c252783877e459d8d1efe3fa90f4f5e2

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