#AtDev

Christopher Jr Rileycjrriley.com@bsky.brid.gy
2025-06-17

My #Swiftlang #ATProto API library, ATProtoKit, has been updated to version 0.29.0. ATProtoBluesky now has support for adding Status record (updating Status record will come in 0.30.0). also, union enums have been moved to the applicable lexicon structs. github.com/MasterJ93/AT... #atdev

GitHub - MasterJ93/ATProtoKit:...

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-17

And for when I get tunneling via apgateway working, here's a comparison of what a user (actor's) profile responses might look like (currently enabled with the fep=1 query parameter). #atproto #atdev #activitypub

the uri's are more compact
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-17

Added placeholder tunneling via `/.well-known/apgateway/`. Shows ActivityPub DID:KEY to AtProto DID conversion. #atproto #activitypub #atdev

{
  "apDid": "did:key:zBaGJEVYwnVghVMk8WrzYgN59GNjcTZ1pK4RMaqew5U5a",
  "atDid": "did:plc:lq33jqzquny5nn3neltloydu",
  "request": "getActor"
}
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-17

Revised version of the output following the FEP FFFD recommendation to include canonical and alternative types. I also looked at a webfinger response from one of the few apps that actually support FEP EF61, and copied what they did for aliases. #atdev #atproto #activitypub

{
  "@context": "https://w3id.org/fep/ef61",
  "subject": "acct:alice@test",
  "aliases": [
    "at://alice.test",
    "did:plc:7pqca3bvcked3db7ejadne4n",
    "at://did:plc:7pqca3bvcked3db7ejadne4n",
    "http://test:2583/xrpc/org.w3.activitypub.getActor?repo=did:plc:7pqca3bvcked3db7ejadne4n",
    "did:key:zBaGJEVYwnVgcf72MrvwUkQRDXy69yAARkbUNyarUGxbP",
    "ap://did:key:zBaGJEVYwnVgcf72MrvwUkQRDXy69yAARkbUNyarUGxbP/getActor",
    "http://test:2583/.well-known/apgateway/did:key:zBaGJEVYwnVgcf72MrvwUkQRDXy69yAARkbUNyarUGxbP/getActor"
  ],
  "links": [
    {
      "rel": "self",
      "type": "application/activity+json",
      "href": "http://test:2583/xrpc/org.w3.activitypub.getActor?repo=did:plc:7pqca3bvcked3db7ejadne4n"
    },
    {
      "rel": "canonical",
      "type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
      "href": "ap://did:key:zBaGJEVYwnVgcf72MrvwUkQRDXy69yAARkbUNyarUGxbP/getActor"
    },
    {
      "rel": "alterntaive",
      "type": "application/json; profile=\"https://atproto.com/specs/lexicon\"",
      "href": "at://did:plc:7pqca3bvcked3db7ejadne4n"
    }
  ]
}
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

*AHEM* all that fighting with builds just to show that preliminary #ActivityPub FEP EF61 support is working. πŸŽ‰ There aren't many compatible clients, so I made it an alias. The "ap://" URI is a perfectly legal `did:key` containing an #atproto DID stored in the MultiDID key format. #atdev

the ap:// alias is the thing we care about
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

Welp, the root of the issue is that we both (server.xrpc and my webfinger middleware) were installing the Express JSON middleware. Why suddenly the `server.xrpc` version breaks if mine goes first is a mystery. I've fixed my code by letting `server.xrpc` be the sole installer of it now. #atdev

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

Yep, injecting my "Express Middleware" after "server.xrpc" fixes it. Seeing how my code used to work (literally 1 week ago), a recent change to server.xrpc isn't compatible. The question is do I ignore it and move on, or do I figure out what and open a general PR? My hunch is OAuth. πŸ€” #atdev

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

:egg_on_face_emoji: 🀦 ...I have an idea why the /xrpc/ router endpoints were having issues. 🀦 As for why this only popped up recently, it looks like something regarding `express.js` middleware's changed recently. If I was to guess, my injecting of the json() BEFORE xrpc broke it. #atdev #atproto

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

That was a dead end BUT I found it! The "pipethrough" is convinced the body of the mute isn't readable. πŸ˜΅β€πŸ’« #atdev #atproto

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

lol, I've gone as far as labeling every "Internal Server Error" in the #atproto codebase... and this error seems to originate elsewhere. 🀯 I guess next stop is the pnpm-lock.yaml file to compare "known good" vs "evil". 🀦 #atdev

The internal server error text found by the server didn't originate in the @atproto/... codebaseInternal Server Errors returned by the XRPC client get prefixed accordinly
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

Welp, "muteActor" (i.e. catchall) is doing exactly what the code said its doing. πŸ˜… Why though? Why is it failing? πŸ€” #atproto #atdev

snapshot showing the 500 error returned by the call to catchall
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-16

Hmm. An attempt is made to muteActor with the mentioned DID, and the account is created a few steps before. The lookup of the Lexicon (def) appears to work, but the code is never called. πŸ€” #atdev #atproto

XRPC request for muteActor fails. the server appears populated correctlyhighlighting the did a few steps before
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-15

I'm learning A BIT TOO MUCH about the #atproto internals as I try and diagnose why muting users (actors) during the "dev-env" init is failing. Fingers crossed it has nothing to do with the big OAuth code update the team pushed the other day, buuuuut we'll see. πŸ˜… #atdev

debug log showing that muting actors seems to be triggering a 500 error
Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-15

I found myself porting the Bluesky #atproto tooling from CommonJS to ESM, all because a library I wanted to use was only available as ESM. I was surprised that the tooling wasn't already ESM, but 🀷. In hindsight, rebuilding the library as CommonJS would have been easier. Ah well. #atdev

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-14

There. This should be a proper `did:plc` re-encoded as a did:key in multidid format as a base58 string. #atdev #atproto

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-14

Yes. This seems a perfect candidate for 'multidid'... though I'm cheating as I'm not actually encoding it in multidid format. #atdev github.com/ChainAgnosti...

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-14

Per request, I'm experimenting with FEP-EF61 support (i.e. ActivityPub Portable Objects, similar to did:plc). Trying to understand "did:plc" and "did:key" well enough to see if I can convert a did:plc into something that can be delivered as a did:key. πŸ€” #atdev #atproto codeberg.org/fediverse/fe...

Kuba Suder πŸ‡΅πŸ‡±πŸ‡ΊπŸ‡¦mackuba.eu@bsky.brid.gy
2025-06-13

"increase the lifetime of individual refresh tokens from two days to two weeks" πŸ™πŸ» #atdev

RE: https://bsky.app/profile/did:plc:ewvi7nxzyoun6zhxrhs64oiz/post/3lrj64cbt5s2d

Make Kasprzak πŸ¦–distraction.engineer@bsky.brid.gy
2025-06-13

Trying something out... #atdev #oauth #activitypub

created a file "OAUTH.TS" in PDS/SRC/ActivityPub
Kuba Suder πŸ‡΅πŸ‡±πŸ‡ΊπŸ‡¦mackuba.eu@bsky.brid.gy
2025-06-13

I don't understand half of this tbh, but it seems well written… #atdev

RE: https://bsky.app/profile/did:plc:ewvi7nxzyoun6zhxrhs64oiz/post/3lrh5rpza6k2o

Client Info

Server: https://mastodon.social
Version: 2025.04
Repository: https://github.com/cyevgeniy/lmst