Notes

Short thoughts, updates, and quick posts. (1591 total)

  • Indiekit ATproto

    Storing this here for future exploration in the context of indiekit/ATproto integration

  • Google

    Signed this petition, Stop Google from limiting APK file usage

    #LeaveApkAlone

  • Android
  • Fedi

    The uncomfortable truth is that I rarely think about UI/UX until I’m forced to use it and realize there’s no way around it. Nothing pushes you to improve something quite like experiencing its flaws every single day. When you depend on a tool and its interface constantly gets in your way, the motivation to fix it becomes very real.

    I’ve always been more drawn to backend infrastructure than frontend development. That’s where I feel most comfortable. But it’s precisely when you’re stuck using a clumsy or poorly designed interface that you start caring about the user perspective. Frustration becomes fuel.

    I’ll probably need to spend more time reading through the codebases of projects like Elk or Phanpy to better understand alternative ActivityPub UI patterns and design choices.

    There’s a lot to learn from how others approach the same problems. My current self-hosted ActivityPub reader works, technically.

    But from a UI perspective, it’s still rough around the edges and that’s something I want to throw some energy & focus to improve.

  • Fedi

    It took me more than a month of intense paced AI assisted development to get where I wanted to be, but https://rmendes.net/changelog/ this blog/AP has all the #indieweb spec backed in + AP + simulation of brid.gy to backfill reactions back to my posts !

  • Fedi

    Having implemented Fedify to power the ActivityPub implementation for Indiekit, I’m confronted to an issue I never had to think about : how do you consume AP content in a way that makes you want to have a timeline to scroll when you can’t use any of the available Mobile Apps out there ?

  • One more bug solved

    • Quick reply (quick reply test) — in_reply_to_id: “116115945039999145” threaded under the original post
    - From rick@rmendes.net via the self-hosted AP server      
    

    The replyTarget fix resolved the threading issue. To recap the full fix chain across v2.0.2–2.0.5:

    2.0.2–2.0.3: Added to/cc addressing on Note object        
    2.0.4: HTTPS Note ID (not urn:uuid:), to/cc on Create wrapper
    2.0.5: inReplyTo → replyTarget (Fedify 2.0 constructor parameter rename) 
    
  • Fedi Indiekit

    286 times : the amount of times I iterated/reviewed on different parts of the indiekit fork codebase triggering a build & deploy to move forward several new features, among them Microsub & ActivityPub https://rmendes.net/changelog/

  • Indieweb IndieAuth Nginx

    Fixed: IndieAuth login broken for third-party apps

    After adding security headers (Content-Security-Policy) to harden the site, logging in with IndiePass and other IndieAuth clients silently failed — tapping “authorize” did nothing.

    The culprit was form-action ‘self’ in the CSP, which blocked Browsers from following the consent form’s redirect to the client’s callback URL (e.g., indiepass.app/android-callback).

    Changed to form-action ‘self’ https: to allow IndieAuth redirects to any HTTPS callback. Affects all third-party IndieAuth clients (Micropub editors, Microsub readers, etc.), not just IndiePass.

  • Fedify Fedi

    Alright, testing #IndiePass #Indiekit #Fedify 2.0 if you see this post on the Fediverse or Bluesky it means syndication works and my blog is my own AP server.

    #activityPub

    public profile : https://rmendes.net/activitypub/users/rick

  • Music
  • Fedi Fedify

    Finally got my #fedify rel=me link working properly from the view of other Mastodon/Fediverse clients

  • Fedi ActivityPub

    Oh My God :)) Now You can interact with my posts from your fediverse instance, by setting your instance in your browser localstorage, once this is set, click the Fediverse icon and you’ll see my post through your own mastodon/pleroma instance !

  • Fedi Fedify Indiekit

    Updated indiekit AP implementation to Fedify 2.0 !

  • Fedi AP ActivityPub Fedify

    Crafted this nice ActivityPub profile page for my Fedify/indiekit AP implementation, this is obviously for browsers, AP server receive an AP representation of my profile Screenshot below is Fedify 2.0 built in debugger

  • Fedi AP

    Caches GET/HEAD responses for ActivityPub endpoints (actor profiles, featured posts, notes, webfinger, nodeinfo) so hundreds of simultaneous fetches from federated instances are served from nginx instead of hitting Node.js.

    Uses proxy_cache_lock to prevent thundering herd and proxy_cache_use_stale to serve during backend overload. POST /inbox and admin pages bypass the cache.

  • Indieweb

    My indiekit blog now support comments authentication using RelMeAuth or IndieAuth, it also supports webmentions if you’re part of the #indieweb dance !

  • Fedi
  • Fedi

    This post is made from my indiekit #fedify spec implementation turning my indiekit blog into an effective AP instance on the fediverse

    • first I thought, why not reuse Microsub reader to consume AP content coming from the fediverse ? I tested it, customizing a bit the view to better handle AP activity (boost, star, quote, reply) but using a dedicated Microsub Channel as a Fediverse input for the AP fedify server turned out to be odd, an AP post is not an RSS item from a blog, and the firehose of posts, reply, quote, boost is too much to handle in a Microsub Channel, I resolved to build a proper reader for AP content
  • ActivityPub / Fedify Compliance Report Indiekit

    Field Value
    Target rmendes.net (@rick)
    Date 2026-02-20T21:20:08Z
    Tests 22 total: 22 passed, 0 failed, 0 skipped
    Grade A+ — Full compliance — all tests pass
    Fedify ^1.10.3
    Software Indiekit + @rmdes/indiekit-endpoint-activitypub

    Summary

    Category Pass Fail Skip Status
    Discovery 3 0 0
    Actor 3 0 0
    Collections 8 0 0
    Content 3 0 0
    Inbox 2 0 0
    Federation 2 0 0
    HTTP 1 0 0

    Detailed Results

    Discovery

    Test Status Detail
    WebFinger resolution ✅ PASS WebFinger OK: acct:rick@rmendes.nethttps://rmendes.net/activitypub/users/rick
    NodeInfo endpoint ✅ PASS NodeInfo OK: indiekit v1.0.0, 249 local posts, protocol: activitypub
    NodeInfo well-known chain ✅ PASS NodeInfo well-known OK: Discovery chain valid, schema 2.1

    Actor

    Test Status Detail
    Actor lookup (fedify) ✅ PASS Actor OK: Person at https://rmendes.net/activitypub/users/rick
    Actor required fields ✅ PASS Actor fields OK: inbox, outbox, followers, following, liked, featured, featuredTags, publicKey, assertionMethods, sharedInbox, name, icon, published
    Actor JSON structure ✅ PASS Actor JSON OK: Person with all required fields, collection links, and security keys

    Collections

    Test Status Detail
    Outbox collection ✅ PASS Outbox OK: OrderedCollection with 249 items
    Followers collection ✅ PASS Followers OK: OrderedCollection with 832 items
    Following collection ✅ PASS Following OK: OrderedCollection with 2563 items
    Liked collection ✅ PASS Liked OK: OrderedCollection with 68 items
    Featured (pinned) collection ✅ PASS Featured OK: OrderedCollection with 0 pinned items
    Featured tags collection ✅ PASS Featured tags OK: Collection with 0 tags
    Collection URI resolution ✅ PASS Collection URIs OK: All actor collection endpoints return valid JSON
    Outbox traversal (first page) ✅ PASS Outbox traversal OK: Contains Create activities with Note objects, proper addressing

    Content

    Test Status Detail
    Post returns AS2 JSON ✅ PASS Content negotiation OK: https://rmendes.net/notes/2026/02/20/f3f0e serves AS2 JSON
    Root URL redirects to actor ✅ PASS Root redirect OK: https://rmendes.net/https://rmendes.net/activitypub/users/rick
    Object dispatcher (dereference) ✅ PASS Object dispatcher OK: Note at https://rmendes.net/notes/2026/02/20/f3f0e

    Inbox

    Test Status Detail
    GET inbox returns 405 ✅ PASS Inbox GET OK: returns 405 Method Not Allowed
    GET shared inbox returns 405 ✅ PASS Shared inbox GET OK: returns 400 (rejected)

    Federation

    Test Status Detail
    Instance actor (Application) ✅ PASS Instance actor OK: Application type with hostname identifier
    WebFinger alias resolution ✅ PASS WebFinger alias OK: profile URL and /@handle both resolve

    HTTP

    Test Status Detail
    HTTP headers compliance ✅ PASS HTTP headers OK: Correct content types on actor, outbox, and WebFinger

    Fedify Feature Compliance Matrix

    Maps implemented Fedify features against the Fedify SDK capabilities.

    Core Federation

    Feature Fedify API Status Notes
    Actor Dispatcher setActorDispatcher() ✅ Implemented Person/Service/Group/Organization via config
    Key Pairs setKeyPairsDispatcher() ✅ Implemented RSA-2048 + Ed25519 dual keys
    Handle Mapping .mapHandle() ✅ Implemented Handle + hostname (instance actor)
    Alias Mapping .mapAlias() ✅ Implemented Profile URL + /@handle resolution
    Inbox Listeners setInboxListeners() ✅ Implemented Follow, Undo, Accept, Reject, Like, Announce, Create, Update, Delete
    Shared Inbox Inbox URL pattern ✅ Implemented /activitypub/inbox
    WebFinger Automatic ✅ Implemented Via Fedify’s built-in handler
    NodeInfo setNodeInfoDispatcher() ✅ Implemented Schema 2.1, dynamic version

    Collections

    Feature Fedify API Status Notes
    Outbox setOutboxDispatcher() ✅ Implemented Paginated, Create activities
    Followers setFollowersDispatcher() ✅ Implemented Paginated, ordered
    Following setFollowingDispatcher() ✅ Implemented Paginated, ordered
    Liked setLikedDispatcher() ✅ Implemented Objects the actor has liked
    Featured setFeaturedDispatcher() ✅ Implemented Pinned posts, admin UI
    Featured Tags setFeaturedTagsDispatcher() ✅ Implemented Hashtag discovery, admin UI

    Content Resolution

    Feature Fedify API Status Notes
    Object Dispatcher setObjectDispatcher() ✅ Implemented Note/Article dereferencing
    Content Negotiation Custom middleware ✅ Implemented AS2 JSON for post URLs

    Delivery & Reliability

    Feature Fedify API Status Notes
    Message Queue RedisMessageQueue ✅ Implemented Redis-backed persistent queue
    Parallel Queue ParallelMessageQueue ✅ Implemented Configurable worker count (default: 5)
    Ordering Keys sendActivity({ orderingKey }) ✅ Implemented Per-follower ordering
    Collection Sync sendActivity({ syncCollection }) ✅ Implemented FEP-8fcf, shared inbox sync
    Permanent Failure Handler setOutboxPermanentFailureHandler() ⏳ Deferred Requires Fedify 2.0+ API changes
    Context Data createFederation({ contextData }) ✅ Implemented Handle + publication URL

    Security & Identity

    Feature Fedify API Status Notes
    HTTP Signatures Automatic (RSA) ✅ Implemented Via key pairs dispatcher
    Object Integrity Proofs Automatic (Ed25519) ✅ Implemented Via assertionMethods multikey
    Instance Actor Application type actor ✅ Implemented Domain-level federation actor
    Authorized Fetch .authorize() predicate ⏳ Deferred Removed — requires authenticated document loader to avoid 401 loops with remote servers
    Configurable Actor Type Constructor selection ✅ Implemented Person/Service/Organization/Group

    Discovery Extensions

    Feature Fedify API Status Notes
    NodeInfo Dynamic Version createRequire() ✅ Implemented Reads from @indiekit/indiekit/package.json
    alsoKnownAs Actor property ✅ Implemented For Mastodon account migration
    Profile Attachments PropertyValue ✅ Implemented Key-value metadata fields

    Generated by activitypub-tests/run-all.sh — 2026-02-20T21:20:48Z