{"id":18715850,"url":"https://github.com/davidbuchanan314/picopds","last_synced_at":"2025-06-18T03:34:19.184Z","repository":{"id":175710007,"uuid":"654361194","full_name":"DavidBuchanan314/picopds","owner":"DavidBuchanan314","description":"A minimum viable atproto PDS for protocol experimentation purposes","archived":false,"fork":false,"pushed_at":"2024-11-15T21:05:17.000Z","size":152,"stargazers_count":67,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-17T14:55:47.702Z","etag":null,"topics":["atp","atproto","atproto-pds","atprotocol","pds"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DavidBuchanan314.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-06-16T01:02:26.000Z","updated_at":"2025-05-15T05:23:12.000Z","dependencies_parsed_at":"2024-11-07T13:10:41.061Z","dependency_job_id":"343fe3eb-4e0f-483d-a56b-defe385af064","html_url":"https://github.com/DavidBuchanan314/picopds","commit_stats":null,"previous_names":["davidbuchanan314/picopds"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/DavidBuchanan314/picopds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBuchanan314%2Fpicopds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBuchanan314%2Fpicopds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBuchanan314%2Fpicopds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBuchanan314%2Fpicopds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DavidBuchanan314","download_url":"https://codeload.github.com/DavidBuchanan314/picopds/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DavidBuchanan314%2Fpicopds/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260483002,"owners_count":23016041,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atp","atproto","atproto-pds","atprotocol","pds"],"created_at":"2024-11-07T13:10:27.269Z","updated_at":"2025-06-18T03:34:14.164Z","avatar_url":"https://github.com/DavidBuchanan314.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e [!NOTE]  \n\u003e 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).\n\n# picopds\nA minimum viable atproto PDS for protocol experimentation purposes\n\nIt'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.\n\n## NOTE: This is experimental software, it may explode and eat all your data, etc. etc.\n\n### What works:\n\n- Creating a new DID and publishing it.\n- Creating new records (making posts, liking, replying, following, etc.)\n- Deleting records (post deletion, unlikes, unfollows, etc.)\n- Attaching blobs (e.g. images)\n- Editing records (e.g. editing bio).\n- Federated firehose.\n- AppView proxying for most bsky endpoints (still missing some)\n\n### What doesn't work yet:\n\n- Updating records works but is subtly incorrect (e.g. it will leak blob references)\n- swapCommit/swapRecord options for repo ops (they're silently ignored).\n- Firehose cursoring.\n- Handle firehose \"too big\" conditions.\n- No Lexicon validation (the client is assumed to be well-behaved!)\n- A lot of error/unhappy-path handling (and sometimes we signal errors in non-standard ways).\n- JWT refresh tokens\n- Various security considerations (e.g. password hashing)\n- Many many many other things...\n\n### TODO:\n\n - Fix aforementioned non-working things\n - Figure out how to garbage-collect MST blocks\n - Don't hold full MST state in memory, load blocks from DB on-demand\n - Put blobs larger than some threshold in the filesystem, not in sqlite\n - Tests\n - Docs\n\n### Planned Extended Features:\n\n - 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)\n\n - A read-only web interface for external sharing of posts.\n\n### Usage:\n\n1. Copy `config.py.example` to `config.py`, and edit it.\n\n2. Run `python3 create_identity.py`\n\n3. Update `config.py` with the new DID value you just generated\n\n4. 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)).\n\n5. 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).\n\n6. Run `request_crawl.py` to inform the PDS that we exist. (Maybe I'll make this automatic at some point in the future).\n\n7. Log in with a client (the official https://bsky.app works) and make a post, and the BGS should see it!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidbuchanan314%2Fpicopds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidbuchanan314%2Fpicopds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidbuchanan314%2Fpicopds/lists"}