[ANN] OCamlot - Activitypub server written in OCaml

Hi all!

I’m pleased to announce the release of a project that I’ve been working on, on-and-off for a while now: an activitypub server in OCaml — OCamlot.

It’s wildly incomplete, and currently only the bare-bones minimum to be a considered an activitypub server, but it’s coming along nicely.

Currently it supports:

  • profiles, custom profile pictures, about
  • likes, reposts
  • replies

and that’s all.

Some screenshots:

Now, the things that this community would care about:

Seeing as there has been some interest in this community recently about activitypub integration in OCaml, I figured this might be interesting.

I have an instance running on over at https://ocamlot.xyzas a warning, I’ve done most of my testing locally using pleroma, so there may be some slight issues interacting with other server implementations at the moment. EDIT: Issues with interacting with mastadon servers have been resolved, go wild!

Also would be happy to field any questions regarding navigating the activitypub spec as well. I plan to write up my experiences somewhere at some point in the future.


Cool to see a project using purely server-side rendering. Check out htmx as well to easily sprinkle some interactivity to the page e.g. submitting a post and injecting it into the page directly instead of reloading the whole page. I’ve been using htmx with Dream’ EML for a personal project and with Scalatags (similar to TyXML) for a work project, they’re both working very nicely.

1 Like

This looks very cool, thanks for sharing! Also, big :+1: for the name :wink:

1 Like

Is the goal to be purely a standalone server or a library to build other services atop?

My plan while developing it was just as a standalone server; I hadn’t considered making it a library, although I’m not sure what the best way of doing that would be.

For example, there are subcomponents of the project that might be useful for building other activitypub services, such as the decoders encoding of activitypub objects, but I’d guess it would be easier to write a domain-specific backend for your purposes.