@mochi I want Mitra to work in user-owns-data mode too, and my current plan is to re-purpose it as FEP-ae97 client without a total rewrite. It already does almost everything a rich client is supposed to do, I just need to replace 'http' URLs with 'ap' URLs, sign all objects and replace inbox deliveries with outbox deliveries.
The main difference between a regular ActivityPub server and FEP-ae97 client is that server must be online all the time, whereas FEP-ae97 client is local-first and communicates using gateways
...so it might not be necessary to ditch your current codebase