As part of my book âActivityPub: Programming for the Social Webâ, I created a coding example to show how to program for the ActivityPub API. ap is a command-line client, written in Python, for doing basic tasks with ActivityPub.For example, you can log into a server using this command:ap login yourname@yourserver.exampleOnce youâre logged in, you can follow someone:ap follow other@different.exampleOr, you could post some content:ap create note --public "Hello, World"This isnât enough to have a real social networking experience, but I think itâs pretty useful for testing an ActivityPub API server, or automating some repetitive tasks.I should note quickly here that not all ActivityPub servers support the ActivityPub API. Itâs an under-utilized part of the ActivityPub standard. In particular, Mastodon, Threads, Flipboard, and other services donât support the API. Thereâs a pretty good list of servers and clients that do support the API in this Codeberg issue.Suffice it to say, unless youâre actively working with one of those platforms, or you are writing your own, youâre not going to get much use out of ap. It will probably give you an error message like âNo OAuth endpoints foundâ if it canât use the service.Refreshing the projectIâve never packaged ap for distribution; it was always supposed to be example code. But given the recent interest in the ActivityPub API, including the work going on in the ActivityPub API task force, I decided to get it into shape for installation by developers working on other apps. My friend Matthias Pfefferle of Automattic asked me about it when we were at FOSDEM this year, and I was embarrassed to see how difficult it was for him to use.So, Iâve made two big upgrades to the package. The first was actually making it a package, and distributing it! I upgraded the package management framework to uv, which seems like a good bet for now, and pushing the application to PyPI, the Python Package Index. Itâs visible at https://pypi.org/project/activitypub-cli/ now. (Note: different package name from the command name! The PyPI âapâ package name was taken a while ago.)You can now install the application in one shot with this command on a computer that has Python on it:pipx install activitypub-cliYou can test that the application installed correctly in your path by running the version command:ap versionThat should show the same version as is currently on the pypi.org page for the project.The second change was implementing the current OAuth 2.0 profile best practices. Iâve upgraded the login flow so it tries a lot of different options for identifying itself to the server: CIMD, FEP d8c2, and Dynamic Client Registration. It tries to do them in preferential order; it uses permanent, global client identifiers before dynamic ones.Help me testIâm especially interested in testing this command-line client against other servers. If youâre developing an ActivityPub API server, please install the ap command and try it out against your (development!) server. Report a bug if it doesnât work well, or send me a DM at @evanprodromou if it works OK. Given time, I think ap can be a useful first smoke test for ActivityPub API implementations.