Your own atproto network.

Snowglobe is a self-contained atproto network for testing and demos. It has its own PDS, PLC directory, relay and Jetstream, and nothing in it reaches Bluesky's network. Run one on your machine, or open the one we host.

Run one on your machine

Snowglobe is open source. It runs on Docker Compose, so it works wherever Docker Compose does.

1Start it

npm install -g @openmeet/snowglobe   # puts the snowglobe command on your PATH
snowglobe up --default               # the first run pulls and builds images, which takes a while

The default snowglobe is one PDS with two test accounts, alice and bob, a PLC directory, Jetstream, Slingshot, PDSls and a page that lists them all. You need Docker with Compose and Node 20 or newer, on Linux or Windows with WSL 2.

To see it in a browser on the same computer, run snowglobe trust and open https://snowglobe.local.snowglobe.at/: every service, every account, and every write as it happens. snowglobe down stops it, and snowglobe down -v deletes its data too.

Read the setup guide

2Try it from the command line

snowglobe account carol CAROL   # makes carol.snowglobe.local.snowglobe.at
curl -s --cacert ~/.local/share/snowglobe/ca/ca.crt --get \
  https://slingshot.snowglobe.local.snowglobe.at/xrpc/com.bad-example.identity.resolveMiniDoc \
  -d identifier=alice.snowglobe.local.snowglobe.at

alice and bob come with the snowglobe; snowglobe account adds more. Each one's handle, DID and password are kept in ~/.local/share/snowglobe/snowglobe/accounts.env, carol's as CAROL_HANDLE, CAROL_PASSWORD and so on.

Every snowglobe has a domain of its own, and its names work for every program on the machine: public DNS sends them to 127.0.0.1, where a name router passes each one to its snowglobe. Here curl asks Slingshot for alice's DID and PDS, and --cacert has it trust the snowglobe's own certificate authority.

3Bring your app

In your app's repo, start from the default file:

cp "$(npm root -g)/@openmeet/snowglobe/snowglobe.default.yml" snowglobe.yml

Give its globe: line a name of its own, myapp here, and add your app with the settings it reads:

apps:
  - name: myapp
    local: { port: 5173 }    # https://myapp.app.myapp.local.snowglobe.at -> your dev server
    env:
      PUBLIC_ATPROTO_PLC_URL: ${services.plc.url}
      PUBLIC_ATPROTO_SIGNUP_PDS: ${pds.main.url}
snowglobe up                # in the app's repo
snowglobe run npm run dev   # the app gets those settings and trusts the snowglobe

Open https://myapp.app.myapp.local.snowglobe.at and sign in as alice.myapp.local.snowglobe.at, on her PDS's own sign-in page, as on the real network. snowglobe run hands the app the settings and the snowglobe's certificate authority; snowglobe env prints the same settings for an app you start some other way.

Use it in your own project · Statusphere, run end to end

Add what your app needs

  • More PDSes, with a relay that merges their writes
  • The permissioned-spaces alpha PDS
  • A group host, and Tap for an app that keeps its own copy of the data
  • A lexicon authority, for lexicons that are still drafts

A test suite checks the network works and that no service points at Bluesky.

What a snowglobe.yml can hold

Hosted globes

A hosted globe is the same kind of network on a server, at its own address, so people can use your app against it from their own browser.

Live

lighthouse.snowglobe.at

Our first hosted globe. Its page shows its services and their health, its accounts, and its activity as it happens.

atmo, an events app, runs on it as a demo of groups on atproto. Everything on lighthouse is test data and may be wiped at any time.

Open lighthouse

Planned

Globes for your app and your CI

We are working on a config file for your app's repo. It would start a globe, run your tests and end-to-end checks against it, and take it down again. This is not built yet.

Today we run hosted globes for our own demos. If you would like one for your app, tell us below.

Stay in touch

Leave an email address if you would like to hear when there is something new, or a note about what you would use Snowglobe for. Either one is enough.

We use your email only to write to you about Snowglobe. It is kept in our own database, not a mailing list service.