npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dotdo/do

v0.1.6

Published

Digital Object - Every business entity IS a Durable Object. Unified edge-native platform with CRUD APIs, SDK, AI, payments, and more.

Readme

DO

Every Thing IS a Digital Object IN a Durable Object.

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

const idea = await $.ai`what should we build next?`
const spec = await $.db.Product.create({ name: idea, status: 'planning' })

await $.slack`#product New idea: ${idea}`
await $.email.to(founder)`Your next product: ${spec.name}`

That's a product ideation workflow. Running on the edge. With a database, AI, Slack, and email.

You're Building a Business

Maybe it's a SaaS app. Maybe it's a startup studio generating thousands of companies. Maybe it's an AI agent platform.

Whatever it is, you need:

  • A database
  • AI capabilities
  • Payments
  • Email, Slack, SMS
  • Phone calls and voice agents
  • Custom domains
  • User authentication

Traditionally, that's a dozen services, a maze of API keys, and weeks of integration work.

With DO, it's one line.

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

Just Say What You Want

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

// AI that understands you
const summary = await $.ai`summarize ${document}`
const ideas = await $.ai.list`10 features for ${product}`
const viable = await $.ai.is`${idea} is technically feasible`

// Database that speaks English
const stuck = await $.db.Order`what's stuck in processing?`
const vips = await $.db.Customer`high value this quarter`

// Communication that flows
await $.email.to(user)`Your order ${order.id} shipped!`
await $.slack`#alerts New VIP signup: ${customer.name}`
await $.customer('cust_234sgsdfg')`Your appointment is tomorrow`

// Payments that just work
await $.pay`charge ${customer} $${amount}`
const mrr = await $.pay.mrr()

No method names to memorize. No parameters to look up. Just say what you want.

Everything Reacts

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

// When a customer signs up
$.on.Customer.created(async customer => {
  await $.email`welcome ${customer.name} to ${customer.email}`
  await $.slack`#sales New signup: ${customer.name}`
  await $.pay.createCustomer(customer)
})

// When an order is placed
$.on.Order.placed(async order => {
  await $.pay.charge(order.customerId, order.total)
  await $.email.to(order.email)`Order ${order.id} confirmed!`
})

// Every Monday at 9am
$.every.Monday.at9am(async () => {
  const report = await $.ai`generate weekly metrics`
  await $.slack`#metrics ${report}`
})

Event-driven. Time-driven. Automatic.

Your Business, Hierarchical

startups.studio (Your Business)
  └─ headless.ly (A Startup You Generated)
       └─ crm.headless.ly (Its SaaS Product)
            └─ crm.headless.ly/acme (A Customer Tenant)

Each level is a full DO. Each has its own database, AI, payments, domains.

Each operates independently. Changes flow up automatically.

// headless.ly knows it came from startups.studio
const startup = {
  $id: 'https://headless.ly',
  $type: 'https://startups.studio/Startup',  // Type URL (relative to $context)
  $context: 'https://startups.studio',       // Parent reference
}

// Or use an external schema
const agent = {
  $id: 'https://agents.do/sales',
  $type: 'https://schema.org.ai/Agent',  // External schema type
  $context: 'https://agents.do',
}

// Events bubble up the chain
// crm/acme → crm → headless.ly → startups.studio → analytics

Voice AI That Calls

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

// Create a voice agent
const agent = await $.voice.agent`sales assistant for ${product}`

// Make it call someone
await $.call(lead.phone)`schedule a demo for ${product}`

// Or run a campaign
await $.voice.campaign(contacts, agentId)

Real phone calls. Real conversations. Real results.

Payments That Flow

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

// Charge customers
await $.pay.charge(customerId, 1000, 'usd')

// Pay out to vendors
await $.pay.transfer(vendorAccount, 900)

// Full accounting
await $.pay.journal({
  debit: [{ account: 'revenue', amount: 1000 }],
  credit: [{ account: 'cash', amount: 1000 }]
})

// Real-time metrics
const { mrr, arr, growth } = await $.pay.mrr()

Stripe Connect. Double-entry accounting. P&L reports. Built in.

Domains Included

import { DO } from '@dotdo/do'

const $ = DO('https://mystartup.ai')

// Grab a subdomain on 50+ platform TLDs
await $.domain`acme.saas.group`
await $.domain`myapp.hq.com.ai`
await $.domain`startup.io.sb`

Free subdomains. Automatic SSL. Instant DNS.

The $context Pattern

Every DO knows where it came from:

// A tenant inside a SaaS app
const tenant = {
  $id: 'https://crm.headless.ly/acme',
  $type: 'https://crm.headless.ly/Tenant',  // Type URL from parent
  $context: 'https://crm.headless.ly',      // Points to parent
}

// Changes flow up the chain automatically
// tenant → app → startup → studio → R2/Iceberg

This enables:

  • CDC Streaming - Every change flows to parent
  • Analytics - Aggregate data at any level
  • Billing - Roll up costs hierarchically
  • Permissions - Inherit from parent context

Why Not Traditional Architecture?

| Traditional | DO | |-------------|-----| | Startups as database rows | Startups as autonomous units | | Central coordination | Independent operation | | Shared state conflicts | Isolated state per entity | | One database for everything | Database per entity | | Single point of failure | Distributed by default |

We tried the traditional way. 35 packages. 81 workers. Collapsed under its own weight.

DO is simple: 1 package, 1 worker, 1 Durable Object.

Get Started

npm install @dotdo/do
import { DO } from '@dotdo/do'

// Connect to any Digital Object
const $ = DO('https://mystartup.ai')

// Use it
const answer = await $.ai`what should we build?`
const products = await $.db.Product.list()
await $.slack`#updates ${answer}`

That's a full business platform. Running on the edge. Done.

Development

Prerequisites

Install Dependencies

pnpm install

Run Locally

Start the development server with local Durable Objects and bindings:

# Default development mode
wrangler dev

# With local persistence (data survives restarts)
wrangler dev --persist-to .wrangler/state

# Using development config
wrangler dev --config wrangler.dev.toml

# With remote resources (connect to actual Cloudflare services)
wrangler dev --remote

The server runs at http://localhost:8787 by default.

Local Secrets

Create a .dev.vars file in the project root for local secrets:

STRIPE_SECRET_KEY=sk_test_...
WORKOS_API_KEY=sk_test_...
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...

Deploy

Deploy to Cloudflare Workers:

# Deploy to development (default)
wrangler deploy

# Deploy to staging
wrangler deploy --env staging

# Deploy to production
wrangler deploy --env production

Set Production Secrets

# Set secrets for production
wrangler secret put STRIPE_SECRET_KEY --env production
wrangler secret put WORKOS_API_KEY --env production
wrangler secret put OPENAI_API_KEY --env production
wrangler secret put ANTHROPIC_API_KEY --env production

Tail Logs

View real-time logs from deployed workers:

# Tail the main worker
wrangler tail

# Tail with filters
wrangler tail --format pretty

# Tail specific environment
wrangler tail --env production

# Tail the observability worker
wrangler tail do-tail

Useful Commands

# Type check
pnpm check

# Run tests
pnpm test

# Build
pnpm build

# List all deployed workers
wrangler deployments list

# View worker metrics
wrangler metrics

Platform Services

Everything you need, integrated:

| What | How | |------|-----| | Database | $.db.User.list(), $.db.Order\stuck in processing?`| | **AI** |$.ai`summarize this`, $.ai.list`10 ideas`, $.ai.is`feasible?`| | **Payments** |$.pay.charge(), $.pay.transfer(), $.pay.mrr()| | **Email** |$.email`welcome ${name}`, $.email.to(addr)`message`| | **Slack** |$.slack`#channel message`| | **Messaging** |$.customer(id)`Your appointment is tomorrow`| | **Voice** |$.voice.agent`sales assistant`, $.call(phone)`book demo`| | **Domains** |$.domain`app.saas.group`| | **Events** |$.on.Customer.created(), $.on.Order.placed()| | **Schedules** |$.every.Monday.at9am(), $.every.hour()` |

Deep Integrations

| Integration | What It Does | |-------------|--------------| | Stripe Connect | Payments, transfers, accounting, P&L | | WorkOS | Auth, SSO, directory sync, RBAC | | GitHub | Git sync, repos, PRs, issues | | Cloudflare | Domains, DNS, SSL, edge compute |

Foundational Projects

| Project | Purpose | |---------|---------| | workers.do | Tagged template AI agents | | db4.ai | 4-paradigm edge database | | schema.org.ai | AI-native schema extensions | | id.org.ai | Unified identity for humans + AI |


Solo founders — Build with AI, not infrastructure.

Small teams — Focus on product, not plumbing.

Enterprises — Scale to millions of autonomous entities.


.do | workers.do | agents.do | db4.ai