Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/davidbuchanan314/picopds
A minimum viable atproto PDS for protocol experimentation purposes
https://github.com/davidbuchanan314/picopds
atp atproto atproto-pds atprotocol pds
Last synced: 22 days ago
JSON representation
A minimum viable atproto PDS for protocol experimentation purposes
- Host: GitHub
- URL: https://github.com/davidbuchanan314/picopds
- Owner: DavidBuchanan314
- License: mit
- Created: 2023-06-16T01:02:26.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-15T21:05:17.000Z (about 2 months ago)
- Last Synced: 2024-12-09T17:07:37.229Z (about 1 month ago)
- Topics: atp, atproto, atproto-pds, atprotocol, pds
- Language: Python
- Homepage:
- Size: 148 KB
- Stars: 59
- Watchers: 4
- Forks: 3
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
> [!NOTE]
> My current focus is on [millipds](https://github.com/DavidBuchanan314/millipds), a more "production grade" rewrite of picopds. picopds is no longer maintained (not that it ever really was in the first place, lol).# picopds
A minimum viable atproto PDS for protocol experimentation purposesIt's designed to be a single-user instance (i.e. it only hosts a single repo). This is a hardcoded constraint right now but I might make multiple repos technically possible at some point.
## NOTE: This is experimental software, it may explode and eat all your data, etc. etc.
### What works:
- Creating a new DID and publishing it.
- Creating new records (making posts, liking, replying, following, etc.)
- Deleting records (post deletion, unlikes, unfollows, etc.)
- Attaching blobs (e.g. images)
- Editing records (e.g. editing bio).
- Federated firehose.
- AppView proxying for most bsky endpoints (still missing some)### What doesn't work yet:
- Updating records works but is subtly incorrect (e.g. it will leak blob references)
- swapCommit/swapRecord options for repo ops (they're silently ignored).
- Firehose cursoring.
- Handle firehose "too big" conditions.
- No Lexicon validation (the client is assumed to be well-behaved!)
- A lot of error/unhappy-path handling (and sometimes we signal errors in non-standard ways).
- JWT refresh tokens
- Various security considerations (e.g. password hashing)
- Many many many other things...### TODO:
- Fix aforementioned non-working things
- Figure out how to garbage-collect MST blocks
- Don't hold full MST state in memory, load blocks from DB on-demand
- Put blobs larger than some threshold in the filesystem, not in sqlite
- Tests
- Docs### Planned Extended Features:
- Design and implement a protocol for client-signed commits (so the server can avoid holding signing keys, and enabling the use of user-local HSMs)
- A read-only web interface for external sharing of posts.
### Usage:
1. Copy `config.py.example` to `config.py`, and edit it.
2. Run `python3 create_identity.py`
3. Update `config.py` with the new DID value you just generated
4. Create an `_atproto` TXT DNS record that points your handle domain name to your DID (or alternatively use the HTTP method) (more info [here](https://blueskyweb.xyz/blog/4-28-2023-domain-handle-tutorial)).
5. Run `pds.py`, and make the web server publicly accessible somewhere (I'm using an nginx reverse proxy). You might want to create a systemd unit, or docker container, or something like that (I wouldn't know, I suck at devops/sysadmin).
6. Run `request_crawl.py` to inform the PDS that we exist. (Maybe I'll make this automatic at some point in the future).
7. Log in with a client (the official https://bsky.app works) and make a post, and the BGS should see it!