Heavily inspired by frontpage dev environment. Tangled's setup is slightly more involved because services inside the network need to reach the PDS over its public hostname with valid TLS — federation paths (DID resolution, OAuth, etc.) round-trip through the same URLs an external client would use.
For example, resolving alice.pds.tngl.boltless.dev yields an #atproto_pds service pointing at https://pds.tngl.boltless.dev. Knot and spindle running inside docker must hit that exact URL and trust its cert.
To make that work:
- Caddy's dev root CA is mounted into every container that talks to another service over HTTPS.
- The Docker network uses an unrouted "public" subnet so the SSRF dialer doesn't reject container IPs as private.
What's inside:#
- did-method-plc (https://plc.tngl.boltless.dev)
- atproto_pds (https://pds.tngl.boltless.dev)
- jetstream (https://jetstream.tngl.boltless.dev)
- knot (https://knot.tngl.boltless.dev)
- spindle (https://spindle.tngl.boltless.dev)
- knotmirror (https://knotmirror.tngl.boltless.dev)
- appview (https://tngl.boltless.dev) (live reloading)
- caddy reverse proxy
Setup#
- Generate the dev CA from the repo root:
mkdir -p localinfra/certs && openssl req -x509 -newkey rsa:2048 \ -keyout localinfra/certs/root.key \ -out localinfra/certs/root.crt \ -days 3650 -nodes \ -subj "/CN=Tangled Dev CA" \ -addext "basicConstraints=critical,CA:TRUE,pathlen:1" \ -addext "keyUsage=critical,keyCertSign,cRLSign" \ -addext "nameConstraints=critical,permitted;DNS:tngl.boltless.dev" - Trust generated
localinfra/certs/root.crtin your system's trust store.
- For example in MacOS, run
sudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain \ ./localinfra/certs/root.crt - Depending on your browser you may have to import the certificate into your browser profiles too as some have their own certs do not use your system ones
- run
./localinfra/scripts/appview-static-files.sh - Prepare the spindle microVM images:
This writes the image directory under./localinfra/scripts/prepare-spindle-images.shout/localinfra-spindle-images. docker compose up- AppView will be running on
127.0.0.1:3000with two test users:alice.pds.tngl.boltless.devandbob.pds.tngl.boltless.dev. Both with passwordpassword.