be234882047828800986f2ae3949f2e3d267677d
- Dockerfile for L2 ActivityPub server - docker-compose.yml for standalone L2 - docker-stack.yml for full swarm deployment (L1+L2+Redis) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Art DAG L2 Server - ActivityPub
Ownership registry and ActivityPub federation for Art DAG.
What it does
- Registry: Maintains owned assets with content hashes
- Activities: Creates signed ownership claims (Create activities)
- Federation: ActivityPub endpoints for follow/share
- L1 Integration: Records completed L1 runs as owned assets
Setup
pip install -r requirements.txt
# Configure (optional - defaults shown)
export ARTDAG_DOMAIN=artdag.rose-ash.com
export ARTDAG_USER=giles
export ARTDAG_DATA=~/.artdag/l2
export ARTDAG_L1=http://localhost:8100
# Start server
python server.py
API Endpoints
Server Info
| Method | Path | Description |
|---|---|---|
| GET | / |
Server info |
ActivityPub
| Method | Path | Description |
|---|---|---|
| GET | /.well-known/webfinger?resource=acct:user@domain |
Actor discovery |
| GET | /users/{username} |
Actor profile |
| GET | /users/{username}/outbox |
Published activities |
| POST | /users/{username}/inbox |
Receive activities |
| GET | /users/{username}/followers |
Followers list |
| GET | /objects/{content_hash} |
Get object by hash |
Registry
| Method | Path | Description |
|---|---|---|
| GET | /registry |
Full registry |
| GET | /registry/{name} |
Get asset by name |
| POST | /registry |
Register new asset |
| POST | /registry/record-run |
Record L1 run as owned asset |
Example Usage
Register an asset
curl -X POST http://localhost:8200/registry \
-H "Content-Type: application/json" \
-d '{
"name": "my-video",
"content_hash": "abc123...",
"asset_type": "video",
"tags": ["art", "generated"]
}'
Record an L1 run
curl -X POST http://localhost:8200/registry/record-run \
-H "Content-Type: application/json" \
-d '{
"run_id": "uuid-from-l1",
"output_name": "my-rendered-video"
}'
Discover actor (WebFinger)
curl "http://localhost:8200/.well-known/webfinger?resource=acct:giles@artdag.rose-ash.com"
Get actor profile
curl -H "Accept: application/activity+json" http://localhost:8200/users/giles
Data Storage
Data stored in ~/.artdag/l2/:
registry.json- Asset registryactivities.json- Signed activitiesactor.json- Actor profilefollowers.json- Followers list
Architecture
L2 Server (port 8200)
│
├── POST /registry → Register asset → Create activity → Sign
│
├── POST /registry/record-run → Fetch L1 run → Register output
│ │
│ └── GET L1_SERVER/runs/{id}
│
├── GET /users/{user}/outbox → Return signed activities
│
└── POST /users/{user}/inbox → Receive Follow requests
Description
Languages
Python
91.3%
HTML
8.4%
Dockerfile
0.2%
Shell
0.1%