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

Uploaded CPython 3.14macOS 15.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 15.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 15.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

dbzero-0.1.11-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.11-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.11.tar.gz.

File metadata

  • Download URL: dbzero-0.1.11.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.11.tar.gz
Algorithm Hash digest
SHA256 cb48dda734438dca3f9187f124a72a2a040453509df07ebd43df7f2d529c4e8c
MD5 601265c9ccb39d345e99d402aacd3b3d
BLAKE2b-256 074ae72219d1056c4c8ad03ad22100c51f87f7b9724f633f725850ceb7580cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 01c5084212ebccf18ff2cc5169895b6e264973367c8074441dcf6cd6f3c6a365
MD5 5d344c0e38501c9d6a4d5c4c18225dd4
BLAKE2b-256 a44ca2ca68a79ee4a99b403a1757d817d9be476528fbe696d23a3fd0f5e8378e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.11-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.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ae05660ffb4f133c1658e8041bb721db16c5862b15ebcef39f4f5110869c5dc4
MD5 bf2f04dd9737b254628092beb5080917
BLAKE2b-256 858b0e174fdee23559bb7b71be14367e2f3c2ed26679e74ffa077a6e6a4d05dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 91de098ddcb546bf4a6d00fb44ef904bd5ac7376d874696eb162a18422863844
MD5 ddb877590d6db277ab7b932c685ea083
BLAKE2b-256 b9c368f997610651a81c619cd7384eb66d6a63963172f5a745908c8695210c49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 4ee98fba8c4b19444b3793047c2584b4bcb3e6fff2dca2a5f7298d75a7a3db2a
MD5 7003e03f68618b0a6f99b6ac629edba0
BLAKE2b-256 22181a389b97a818a95fd38af2272b37536e535c1c92f322d07779094e17cdd2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.11-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.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 923d02822ade6b007354cd922d1b1d36673a0717fc907584b913ee1ae22439d9
MD5 fe4fd9cc56ea389b20e22189d3739b46
BLAKE2b-256 279fbbe5e05aa0a09159c197ca50ffaaaf449fe58aa4071fa91d12bb7af2543b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 75a6c30a66caf9ff72f7c59113203f73caeaa2881aa1396836d2c0df93bdf64d
MD5 b62a0ff589bb6af3e368a36a6a552344
BLAKE2b-256 2434a22e0a4464987c691ed910edbaccf5d45e5b71136382ca0934c250ac10b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 00d8585d7a274350381046e80630269b65b3d7e107d2e7e6c39a1753038cee30
MD5 59c6afbcab83fa96e711cb8cdcb2f7d1
BLAKE2b-256 fdef8b75ca13a61e501eab4d14fd4ef803e0327092460bdd9d9e14aae3ed8da5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.11-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.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 90baed5255265f25b76d781deee2c9aec55da163d0616b30587f45b9d6321fc5
MD5 c63a35986069c0917200b99620056040
BLAKE2b-256 65b20d6a088d0521897c324d89e17e964e43f452a103aa67306fff00ec509dfa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 748c94a89c1c2dedb5731b9fdeebfaa43ee5d26072ee82f9ecbb9c99a897b4d1
MD5 d7ca8b15c5fbe83c43760964c156dc97
BLAKE2b-256 0b55d8c25af8aa0392e156238fd439dc928416adedda2695734766e788194497

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 6a44aa1d4f6a3cb59e2eca6f03c4ec87f491e64b90dee7a63d470cdf5c67f08b
MD5 f285231c104bf8f7a4a352b3efb6649f
BLAKE2b-256 480cb1bbdf281f20ada3420a824ed77f5d24ca714c3386e7034a1bda98a263d1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.11-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.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d9785d6b1a0f6260786bffa13f621c4cd4d91736021f1f54ce0bd67e798bcf1d
MD5 df0228d2ed0b3c66b176fd8c85124a0c
BLAKE2b-256 953eb164b92d3a61686d4c5d507e666e8af758dda40292d0e65d763a201cb780

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8f4c75ad94d3a328e9be7e3b2e95036094344cc4d086d4978ef48a8532442c0a
MD5 b14e5f56a4b25afe98ac28b04327f58e
BLAKE2b-256 1949763e0f74c1d95c7ec6c0d7ba84f0af6a6197ca948751c3bf6e9da8f066d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 506b325f4bb5a35ed7d30f99705e9d663dcc9abf476b235d0bcf020cc2410844
MD5 d68184e995557d07e3c0dfa580df021b
BLAKE2b-256 1c1bd8b067c64205f8234ff19cb9bf4eff9c3a59409d0fb82e376681ca63de74

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dbzero-0.1.11-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.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c6812892def8ba873ca76bcf7ce30a9728c9df8c1c831a62d080d1b7744922ea
MD5 a846cf0143d83b427b6ebaca8399ff4a
BLAKE2b-256 e2d9c18f83a237887c135db100d859e0cea24d72f75bdc9bd63dcb544c4c56d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3cc630247297e0a7d9a3c34fccaccbb9a8a71e735c5ee0ce888efbc70fdfabe
MD5 3144db088d131e47a756a358f2d6da2e
BLAKE2b-256 1bd3f4bf58c8f7f06bbcfe1e72de48fc4365d7e65b75b2123310fb93515d0e89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for dbzero-0.1.11-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cf0670bbf081463722f6b78bcd59585bba4bfe33347584500a78712459ed2452
MD5 1a31a4c3a890cb3034012975376fa75e
BLAKE2b-256 c5333c4d604ca9ccbb386f66b21d6dca6244f9d0b753fc0104e43070460ebc67

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