Persistent Data

Two ways to persist data across rebuilds.

/data directory (backend apps)

Every dynamic container (Node.js, Python, Go) has a persistent /data directory. Use the DATA_DIR environment variable to reference it.

Node.js

const path = require('path');
const dbPath = path.join(process.env.DATA_DIR, 'app.db');

Python

import os
db_path = os.path.join(os.environ["DATA_DIR"], "app.db")

This directory survives code updates and rebuilds. It’s deleted when the deployment is destroyed.

/_data/* REST API (any deployment)

A built-in document store accessible via fetch() from any deployed page. No backend code needed — works with static HTML.

All requests go to /_data/ on the deployment’s own domain:

JavaScript

// Create a document
await fetch('/_data/votes', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({option: 'pizza'})
});

// List documents
const {documents} = await fetch('/_data/votes').then(r => r.json());

// Get a document
const doc = await fetch('/_data/votes/cs1abc').then(r => r.json());

// Update a document
await fetch('/_data/votes/cs1abc', {
  method: 'PUT',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({option: 'pizza', count: 2})
});

// Delete a document
await fetch('/_data/votes/cs1abc', {method: 'DELETE'});

Endpoints

Method Path Description
GET /_data List collections
POST /_data/{collection} Create a document
GET /_data/{collection} List documents (?limit=10&offset=20)
GET /_data/{collection}/{id} Get a document
PUT /_data/{collection}/{id} Update a document
DELETE /_data/{collection}/{id} Delete a document
DELETE /_data/{collection} Delete entire collection

Limits

Limit Value
Max document size 100 KB
Max documents per collection 10,000
Max collections per deployment 100
Max total storage 50 MB