Search
1000 results for “mapache”
-
I Love Free Software Day 2026
Hardly anybody argues, that saying thank you isn't something nice. Saying thank you can be done in many ways. But no matter how you say it, the important part of this is that a 'Thank you' for the receiving person means being seen in the effort one brings along, being treated in a nice and respectful way. A 'Thank you' can come a long way to keep others motivated and to let them feel part of a community.
I Love Free Software Day
Since 2010 the Free Software Foundation Europe (FSFE) has been celebrating the "I Love Free Software Day". Each year on the 14th of February Free Software enthusiasts reach out to one another, to contributors, to maintainers, developers highlighting their work and thanking them for their commitment to software freedom. With 2022 the FSFE and its local groups started something different for this special day dedicated to Free Software and its contributors. Together they organised small get-togethers, dedicated events all over Europe. It started with one big event and since then there are now over 20 events in over 10 European countries. By now it is not merely the FSFE and the local FSFE groups, but new groups joining the party and taking up the challenge to organise a local event.
Those events are a great opportunity to share and discuss the hot topics around Free Software, to exchange thoughts, work on Free Software projects and to build bridges among each other to strengthen our ever-growing network. However, organising an event, very much like contributing to Free Software, takes time, energy and resources. With some of this, the FSFE tries to help as much as possible, but still the organisation relies upon a small group of dedicated people willing to take up this challenge and to make something truly special for all the Free Software fans in Europe.
Digital 'Thank You'
To highlight the commitment and to say thank you to those who are part of this and who want to let the community around Free Software spire ever more, we have long been thinking about a good way to do this. As for us the question is how we could possibly say thank you in a new and remarkable way. Many ideas floated around, we could be writing a blog post about the effort done by others, we could send postcards, write an email and share the work done by volunteers to bring together a bunch of people. But, we, Bonnie, responsible for the "I Love Free Software Day" at the FSFE and Damian, a dedicated Free Software advocate and volunteer for the FSFE, wanted to have a new and truly unique way of saying 'Thank you' to all the event organisers involved in the "I Love Free Software Day". Then the solution came to us with BadgeFed. A badge, which can be connected to your fediverse account.
The hands-on experience
So we went ahead and started to set up a new issuer on the instance, Damian, has been operating. We made three sets of badges, each issued in a different way. One for event organisers, which we issued manually to people responsible for the „I Love Free Software Day“ event in different cities. One for contributors, which they distributed by a unique URL organisers had, and one for participants which was supposed to be easy to collect and displayed as a QR code between presentations.
Because of how BadgeFed is designed the issuer can be migrated to a new instance, operated by FSFE. This allows us to keep to already issued badges. Only requirement for this is to have the proper set of keys. BadgeFed also supports RBAC, which is great, since you do not have to allow one user to access your other issuers. Smart design choices like this allow you to tinker freely and then the proof of concept works smothly and migrate without much pain.
Conclusion
BadgeFed is very easy to use and it is an amazing option to just let others know how much this person has done for the „I Love Free Software Day“, how much time the person has dedicated into organising something for the community, and to let them know your contribution has not gone by unnoticed. So, we invite you to create different badges yourself. We are still playing around with OpenBadges and will tinker with BadgeFed over the next years...so stay tuned for more badges.
You can read the article "I Love Free Software Day 2026" by @mapache here as well.
#activitypub #badfeded #openbadges #fediverse #fsfe #ngo -
Introducing a Minimalistic ActivityPub Badge System: Decentralized, Verified, and Built for the Fediverse
In the ever-evolving world of digital credentials, we’ve seen centralized platforms like Credly dominate the badge and certification space. But what if we could flip the script? What if badges could be decentralized, self-certified, and issued directly by organizations in the Fediverse?
By reusing the social graph already present in the Fediverse, we can enable a seamless integration of badges into the networks people are already part of. Instead of creating new, siloed systems for certification, we can utilize the trusted connections and relationships within platforms like Mastodon to issue and verify badges. It’s about making the credentialing process as decentralized and open as the social interactions we have online today.
That's exactly what I'm working on with my latest project: a minimalistic ActivityPub implementation for badges, built using #dotnet.
The Problem with Traditional Badge Systems
It’s mind-blowing that major organizations—think Microsoft, Non-Profits, and educational institutions—spend thousands of dollars on badge providers like Pearson just to get a "verified" badge. These badges, while useful, are locked into centralized platforms that limit the potential for genuine, open verification systems.
What if badges could be as decentralized as social media profiles? Imagine organizations running their own badge systems—similar to the way social media instances like Mastodon operate in the Fediverse. Think about a domain-based badge system like
badges.mozilla.com, or a school district offering badges atcertifications.myschooldistrict.com. Even a podcast could issue badges to its guests, with the entire verification happening directly within the domain.Why ActivityPub?
ActivityPub is already a powerful protocol for secure, decentralized communication between actors in the Fediverse. It enables us to create verifiable interactions and sign digital artifacts in a way that was previously the domain of a few centralized certificate authorities. With ActivityPub, we can extend this to badges, allowing people and organizations to interact with verified credentials in the same decentralized way that we share posts, follows, and interactions across Mastodon or any other Fediverse platform.
Think about how LetsEncrypt disrupted the centralized SSL certificate market. Now, with a decentralized badge system, we can enable a similar revolution for verified credentials.
The Project So Far
I’ve made some solid progress, and there’s now a functional proof of concept (PoC) in place. The project is live and can be found here: ActivityPub Badges on GitHub.
This fediverse actor, the badges issuer, isn’t a Mastodon instance, a Pleroma, or a blog—it’s an actor in a badge system. You can follow it on Mastodon, but its badges are not microblogging notes. Instead, think of it as a way to display verified credentials directly from a decentralized source.
Here’s the first badge I’ve issued:
Simply copy and paste the URL and open it in your Mastodon client. The badge will show up as a note, and you can celebrate, comment, or share it within your ActivityPub network. This is how the badge system will work—just like social media, but with credentials!
A Decentralized Future for Badges
The ultimate goal is to create a decentralized badge system where different instances of badge issuers will recognize each other’s certifications. This way, even if a certificate issuer disappears, the credential is still secure and verifiable across the network. Imagine the survivability of certificates in such a system—if your issuer disappears, the credential still exists in a federated, decentralized space.
It’s an exciting future, and I’m just getting started. If you want to learn more about the progress of this project, follow me, or check out the GitHub repo. (Btw, I am not a Mastodon account, or a BadgeFed system, I am a static site).
Let’s create a future where verification is decentralized, secure, and open for everyone.
Early Adopter Badge: Who Wants One?
As with any new project, there’s always room for early adopters. If you’re interested in getting your own badge, let me know! Follow the progress and get involved as we continue to build this decentralized badge system.
Feel free to share your thoughts, questions, and comments. Badge up, own your credentials, and let the Fediverse showcase your achievements.
You can read the article "Introducing a Minimalistic ActivityPub Badge System: Decentralized, Verified, and Built for the Fediverse" by @mapache here as well.
#activitypub #badfeded #fediverse #dotnet -
AI is Making Libraries Obsolete
Summary: AI agents are fundamentally changing the economics of general-purpose libraries. Why build on Bootstrap when an agent can generate exactly what you need? A collection of thoughts on where this is all heading.
The Great Library Unbundling: How AI is Eating the Software Stack
More than a year ago, I told people that ORMs like Entity Framework were going to feel like relics. That LLMs would just generate the SQL you need, making all that object-relational mapping overhead pointless. A few people told me I was crazy and doing things wrong (and to be honest I wasn't good enough at explaining why I thought this).
Well, time seems to have been on my side (Wwo is laughing now hahahaha!!).
Now, this is a hot take, so I will go forward and talk as a hot take. If I put my devil's advocate hat on, I would probably rage against whoever wrote this post. But because I LOVE MYSELF, I won't do it. I certainly see flaws in my arguments. So buckle up—this is not rage bait, it is just a hot take from a Mexican developer who spent the weekend arguing with AI agents instead of sleeping like a normal person.
The ORM Prediction, or How I Accidentally Became Right About Something
Here's the thing about ORMs: they exist because writing SQL is supposedly "hard" and "error-prone." Meanwhile, I've been writing raw SQL since my first job at a tiny shop in Tepic where we didn't have the luxury of Entity Framework or Hibernate or whatever fancy abstraction layer the cool kids were using. We just wrote the queries, crossed ourselves, and hit execute. Catholic upbringing has some unexpected engineering applications.
Now, to be fair—we did end up building our own tailored ORM for the common cases. Because once you've written the same parameterized INSERT fifteen times, even the most stubborn raw-SQL purist starts thinking "maybe I should abstract this." And ORMs do earn their keep in some areas: SQL injection prevention, enforcing parameterized queries, handling connection lifecycle stuff that nobody wants to think about. Security guardrails that your 2 AM brain will absolutely forget to implement on its own. I get it. ORMs aren't stupid—they solved real problems.
But here's the trap: as soon as you start getting into complex queries, you're no longer just maintaining your application logic—you're also maintaining the ORM and the complex queries. You end up fighting the abstraction to make it do what raw SQL does naturally, and now you have two problems instead of one. The thing that was supposed to simplify your life becomes another layer you have to debug, optimize, and keep in your head at the same time. And whoever has run a high-performance application—like an ecommerce site during Black Friday—knows exactly what I'm talking about. That query you spent weeks trying to optimize through the ORM, doing quirky reflection tricks and fighting with expression trees? You ended up raw-dogging the SQL anyway, because that was the only way to get the performance you needed. The ORM was never going to get you there. It was just standing in the way, politely.
Now Claude just writes you the exact SQL you need—parameterized, injection-safe, the whole deal. No mapping, no configuration, no surprises. Just the data access pattern you actually want. It's like having a DBA who never sleeps, never complains about schema changes, and doesn't passive-aggressively CC your manager when you write a bad join. The abstraction layer that was supposed to save us from SQL is now the thing standing between us and the AI that's better at SQL than most of us ever were.
Agentic Development and the Death of One-Size-Fits-None
This isn't just about ORMs. I've been thinking about how agentic development fundamentally changes the whole premise of general-purpose libraries and building blocks.
Platform teams across the industry are going to start questioning their investments in broad, one-size-fits-all libraries. And honestly? Good. Because "one-size-fits-all" always meant "fits nobody perfectly but everyone tolerably." Like those beach ponchos they sell at every tourist shop in Nayarit—technically covers you, technically functions, but you look ridiculous and you know it.
Take CSS frameworks. Bootstrap, Bulma, Fluent UI—they're great for getting started quickly. But you end up learning their specific class naming conventions, carrying tons of CSS you'll never use, fighting against the framework the moment you want something custom, and—my personal favorite—looking like every other Bootstrap site on the internet. Your site ends up with more unused CSS than empty beer bottles after a Sunday carne asada in Nayarit. And that's a lot of bottles, trust me.
With agentic development? You just tell the agent what you want your UI to look like. It generates exactly the CSS you need. No framework lock-in, no unused code, no learning curve. The agent doesn't need to know Bootstrap's grid system (although it probably was trained on such codebases)—it just writes "vanilla" CSS that does what you asked for. I know this because that's exactly what happened with this blog. The CSS you're looking at right now? Generated. By an agent. Who understood what I wanted better than I understood what I wanted (debatable).
MCP is Already Feeling Old
Speaking of things that are aging quickly: the Model Context Protocol. MCP. Remember when everyone was wrapping every CLI tool as an MCP server like it was the new hotness? That was, what, months ago? In AI time that's basically the Paleolithic era.
Here's the thing—CLI tools already come with perfect documentation in the form of man pages. They're basically documented APIs already. Your agent doesn't need a special protocol wrapper to use
gh pr createoraz webapp deploy. It just reads the docs, fumbles the first attempt (like any of us), and then figures it out. Combine Claude Code with existing CLI tools—GitHub CLI, Azure CLI, kubectl, whatever—and you've got everything MCP promised, but without the ceremony.Microsoft's already doing something interesting with their dotnet/skills repo. Skills that are just prompts guiding the agent through repeatable processes. No protocol, no server, no serialization format drama. Just a well-written prompt. Turns out the best API for an AI agent is just... words. Who knew. (Okay, a lot of people knew. But still.)
Hugo Drove Me to Build My Own (Again, Because I Never Learn)
I just finished redoing my entire publishing workflow. Hugo felt limiting and bloated—all these features I'm maintaining, constantly broken by dependency updates, GitHub workflows failing for mysterious reasons. Every time I pushed a new post it was a coin flip whether the build would succeed or I'd spend an hour debugging some Go template issue that made me question my life choices.
So I rewrote it in .NET. Dead simple. I don't expect anyone else to use it—exclusive distribution, zero units available—but damn, it felt liberating. The CSS and HTML of this blog changed completely, and I actually understand every piece of it now. No more cargo-culting Hugo partials I copied from a theme three years ago and was afraid to touch.
This is the pattern I keep seeing: when AI can generate exactly what you need, the appeal of heavyweight, general-purpose solutions just evaporates. Like fog burning off in the morning sun in Tepic. One moment it's there, thick and omnipresent, and then it's just... gone.
The Accountability Problem
Here's something that's been bugging me. I saw a conversation on the fediverse about more and more tools being created with no clear ownership. Developers suspect some might be entirely AI-generated, with humans just shepherding them into existence like zookeepers who can't actually control the animals.
That sucks. Humans should be in charge and taking responsibility for the software they put into the world. There's a difference between using AI as a tool and letting AI be the architect while you nod along pretending you reviewed the blueprints.
When something breaks, when there's a security issue, when users need support—who's accountable? You can't file a bug report against GPT-4. And "the AI did it" is not an incident postmortem. Not yet, anyway. Give it a year (debatable).
Copilot's Infinite Loop of Self-Criticism
Speaking of AI quirks: Copilot keeps finding issues in my PRs, I ask it to fix them, it fixes them, and then when I ask it to review again, it finds more issues. In the code it just wrote. In the code. It. Just. Wrote.
This is like watching someone argue with themselves in the mirror. Except the mirror is burning tokens, the person is burning my budget, and the argument never ends. The AI equivalent of "works on my machine" syndrome, except it doesn't even work on its own machine.
Blog Posts Are Better Than Repos for Teaching AI
Here's something that genuinely surprised me. A friend at Microsoft pointed his AI agent to my blog series to implement ActivityPub. Not to a GitHub repo with code samples. Not to the official W3C spec. To my blog posts. The ones I write at 1 AM like a gremlin-raccoon, full of rambling asides and half-baked metaphors.
Turns out prose explanations with context and reasoning are way more effective for agents than just dumping code at them. Blog posts tell the story of why decisions were made, not just what the final result looks like. The agent needs to understand intent, not just syntax. It needs the narrative—the "I tried this and it broke spectacularly, so I did this other thing instead" part that never makes it into a README.
So all those years of writing meandering blog posts about my projects instead of writing proper documentation? Turns out I was ahead of my time. Or just lazy. Probably both.
Where This Is All Heading
I think we're heading toward a world where general-purpose libraries become luxury items—nice to have, but not essential. Where AI-generated, purpose-built solutions become the norm. Where documentation and prose become more important than code artifacts. And where human accountability becomes the thing that actually differentiates good software from the rest.
This doesn't mean libraries disappear overnight. But the incentives are shifting. Why build and maintain a framework used by millions when everyone can have their own custom solution?
The future might be less about sharing code and more about sharing knowledge, context, and decision-making frameworks. Less "here's my npm package" and more "here's the blog post explaining why I built it this way so your agent can do something better."
Anyway
This post is a collection of half-formed thoughts and observations. I'm not claiming to have all the answers—hell, I'm not even sure these are the right questions. But something is shifting under our feet, and pretending it isn't doesn't make it stop.
Are we heading toward a more fragmented, AI-generated software landscape? Or am I just another old developer yelling at algorithmic clouds from a small corner of the internet?
Honestly, I don't know. But I'd rather be wrong and loud about it than quiet and surprised when the whole toolchain landscape looks unrecognizable in five years.
Also readable in: https://maho.dev/2026/03/ai-is-making-libraries-obsolete/ by @mapache:
#AI #Software Development #Libraries #Agentic Development #ORMs #CSS Frameworks #MCP #Developer Tools #Future of Coding #Hot Takes #LLM #Copilot
-
AI is Making Libraries Obsolete
Summary: AI agents are fundamentally changing the economics of general-purpose libraries. Why build on Bootstrap when an agent can generate exactly what you need? A collection of thoughts on where this is all heading.
The Great Library Unbundling: How AI is Eating the Software Stack
More than a year ago, I told people that ORMs like Entity Framework were going to feel like relics. That LLMs would just generate the SQL you need, making all that object-relational mapping overhead pointless. A few people told me I was crazy and doing things wrong (and to be honest I wasn't good enough at explaining why I thought this).
Well, time seems to have been on my side (Wwo is laughing now hahahaha!!).
Now, this is a hot take, so I will go forward and talk as a hot take. If I put my devil's advocate hat on, I would probably rage against whoever wrote this post. But because I LOVE MYSELF, I won't do it. I certainly see flaws in my arguments. So buckle up—this is not rage bait, it is just a hot take from a Mexican developer who spent the weekend arguing with AI agents instead of sleeping like a normal person.
The ORM Prediction, or How I Accidentally Became Right About Something
Here's the thing about ORMs: they exist because writing SQL is supposedly "hard" and "error-prone." Meanwhile, I've been writing raw SQL since my first job at a tiny shop in Tepic where we didn't have the luxury of Entity Framework or Hibernate or whatever fancy abstraction layer the cool kids were using. We just wrote the queries, crossed ourselves, and hit execute. Catholic upbringing has some unexpected engineering applications.
Now, to be fair—we did end up building our own tailored ORM for the common cases. Because once you've written the same parameterized INSERT fifteen times, even the most stubborn raw-SQL purist starts thinking "maybe I should abstract this." And ORMs do earn their keep in some areas: SQL injection prevention, enforcing parameterized queries, handling connection lifecycle stuff that nobody wants to think about. Security guardrails that your 2 AM brain will absolutely forget to implement on its own. I get it. ORMs aren't stupid—they solved real problems.
But here's the trap: as soon as you start getting into complex queries, you're no longer just maintaining your application logic—you're also maintaining the ORM and the complex queries. You end up fighting the abstraction to make it do what raw SQL does naturally, and now you have two problems instead of one. The thing that was supposed to simplify your life becomes another layer you have to debug, optimize, and keep in your head at the same time. And whoever has run a high-performance application—like an ecommerce site during Black Friday—knows exactly what I'm talking about. That query you spent weeks trying to optimize through the ORM, doing quirky reflection tricks and fighting with expression trees? You ended up raw-dogging the SQL anyway, because that was the only way to get the performance you needed. The ORM was never going to get you there. It was just standing in the way, politely.
Now Claude just writes you the exact SQL you need—parameterized, injection-safe, the whole deal. No mapping, no configuration, no surprises. Just the data access pattern you actually want. It's like having a DBA who never sleeps, never complains about schema changes, and doesn't passive-aggressively CC your manager when you write a bad join. The abstraction layer that was supposed to save us from SQL is now the thing standing between us and the AI that's better at SQL than most of us ever were.
Agentic Development and the Death of One-Size-Fits-None
This isn't just about ORMs. I've been thinking about how agentic development fundamentally changes the whole premise of general-purpose libraries and building blocks.
Platform teams across the industry are going to start questioning their investments in broad, one-size-fits-all libraries. And honestly? Good. Because "one-size-fits-all" always meant "fits nobody perfectly but everyone tolerably." Like those beach ponchos they sell at every tourist shop in Nayarit—technically covers you, technically functions, but you look ridiculous and you know it.
Take CSS frameworks. Bootstrap, Bulma, Fluent UI—they're great for getting started quickly. But you end up learning their specific class naming conventions, carrying tons of CSS you'll never use, fighting against the framework the moment you want something custom, and—my personal favorite—looking like every other Bootstrap site on the internet. Your site ends up with more unused CSS than empty beer bottles after a Sunday carne asada in Nayarit. And that's a lot of bottles, trust me.
With agentic development? You just tell the agent what you want your UI to look like. It generates exactly the CSS you need. No framework lock-in, no unused code, no learning curve. The agent doesn't need to know Bootstrap's grid system (although it probably was trained on such codebases)—it just writes "vanilla" CSS that does what you asked for. I know this because that's exactly what happened with this blog. The CSS you're looking at right now? Generated. By an agent. Who understood what I wanted better than I understood what I wanted (debatable).
MCP is Already Feeling Old
Speaking of things that are aging quickly: the Model Context Protocol. MCP. Remember when everyone was wrapping every CLI tool as an MCP server like it was the new hotness? That was, what, months ago? In AI time that's basically the Paleolithic era.
Here's the thing—CLI tools already come with perfect documentation in the form of man pages. They're basically documented APIs already. Your agent doesn't need a special protocol wrapper to use
gh pr createoraz webapp deploy. It just reads the docs, fumbles the first attempt (like any of us), and then figures it out. Combine Claude Code with existing CLI tools—GitHub CLI, Azure CLI, kubectl, whatever—and you've got everything MCP promised, but without the ceremony.Microsoft's already doing something interesting with their dotnet/skills repo. Skills that are just prompts guiding the agent through repeatable processes. No protocol, no server, no serialization format drama. Just a well-written prompt. Turns out the best API for an AI agent is just... words. Who knew. (Okay, a lot of people knew. But still.)
Hugo Drove Me to Build My Own (Again, Because I Never Learn)
I just finished redoing my entire publishing workflow. Hugo felt limiting and bloated—all these features I'm maintaining, constantly broken by dependency updates, GitHub workflows failing for mysterious reasons. Every time I pushed a new post it was a coin flip whether the build would succeed or I'd spend an hour debugging some Go template issue that made me question my life choices.
So I rewrote it in .NET. Dead simple. I don't expect anyone else to use it—exclusive distribution, zero units available—but damn, it felt liberating. The CSS and HTML of this blog changed completely, and I actually understand every piece of it now. No more cargo-culting Hugo partials I copied from a theme three years ago and was afraid to touch.
This is the pattern I keep seeing: when AI can generate exactly what you need, the appeal of heavyweight, general-purpose solutions just evaporates. Like fog burning off in the morning sun in Tepic. One moment it's there, thick and omnipresent, and then it's just... gone.
The Accountability Problem
Here's something that's been bugging me. I saw a conversation on the fediverse about more and more tools being created with no clear ownership. Developers suspect some might be entirely AI-generated, with humans just shepherding them into existence like zookeepers who can't actually control the animals.
That sucks. Humans should be in charge and taking responsibility for the software they put into the world. There's a difference between using AI as a tool and letting AI be the architect while you nod along pretending you reviewed the blueprints.
When something breaks, when there's a security issue, when users need support—who's accountable? You can't file a bug report against GPT-4. And "the AI did it" is not an incident postmortem. Not yet, anyway. Give it a year (debatable).
Copilot's Infinite Loop of Self-Criticism
Speaking of AI quirks: Copilot keeps finding issues in my PRs, I ask it to fix them, it fixes them, and then when I ask it to review again, it finds more issues. In the code it just wrote. In the code. It. Just. Wrote.
This is like watching someone argue with themselves in the mirror. Except the mirror is burning tokens, the person is burning my budget, and the argument never ends. The AI equivalent of "works on my machine" syndrome, except it doesn't even work on its own machine.
Blog Posts Are Better Than Repos for Teaching AI
Here's something that genuinely surprised me. A friend at Microsoft pointed his AI agent to my blog series to implement ActivityPub. Not to a GitHub repo with code samples. Not to the official W3C spec. To my blog posts. The ones I write at 1 AM like a gremlin-raccoon, full of rambling asides and half-baked metaphors.
Turns out prose explanations with context and reasoning are way more effective for agents than just dumping code at them. Blog posts tell the story of why decisions were made, not just what the final result looks like. The agent needs to understand intent, not just syntax. It needs the narrative—the "I tried this and it broke spectacularly, so I did this other thing instead" part that never makes it into a README.
So all those years of writing meandering blog posts about my projects instead of writing proper documentation? Turns out I was ahead of my time. Or just lazy. Probably both.
Where This Is All Heading
I think we're heading toward a world where general-purpose libraries become luxury items—nice to have, but not essential. Where AI-generated, purpose-built solutions become the norm. Where documentation and prose become more important than code artifacts. And where human accountability becomes the thing that actually differentiates good software from the rest.
This doesn't mean libraries disappear overnight. But the incentives are shifting. Why build and maintain a framework used by millions when everyone can have their own custom solution?
The future might be less about sharing code and more about sharing knowledge, context, and decision-making frameworks. Less "here's my npm package" and more "here's the blog post explaining why I built it this way so your agent can do something better."
Anyway
This post is a collection of half-formed thoughts and observations. I'm not claiming to have all the answers—hell, I'm not even sure these are the right questions. But something is shifting under our feet, and pretending it isn't doesn't make it stop.
Are we heading toward a more fragmented, AI-generated software landscape? Or am I just another old developer yelling at algorithmic clouds from a small corner of the internet?
Honestly, I don't know. But I'd rather be wrong and loud about it than quiet and surprised when the whole toolchain landscape looks unrecognizable in five years.
Also readable in: https://maho.dev/2026/03/ai-is-making-libraries-obsolete/ by @mapache:
#AI #Software Development #Libraries #Agentic Development #ORMs #CSS Frameworks #MCP #Developer Tools #Future of Coding #Hot Takes #LLM #Copilot
-
AI is Making Libraries Obsolete
Summary: AI agents are fundamentally changing the economics of general-purpose libraries. Why build on Bootstrap when an agent can generate exactly what you need? A collection of thoughts on where this is all heading.
The Great Library Unbundling: How AI is Eating the Software Stack
More than a year ago, I told people that ORMs like Entity Framework were going to feel like relics. That LLMs would just generate the SQL you need, making all that object-relational mapping overhead pointless. A few people told me I was crazy and doing things wrong (and to be honest I wasn't good enough at explaining why I thought this).
Well, time seems to have been on my side (Wwo is laughing now hahahaha!!).
Now, this is a hot take, so I will go forward and talk as a hot take. If I put my devil's advocate hat on, I would probably rage against whoever wrote this post. But because I LOVE MYSELF, I won't do it. I certainly see flaws in my arguments. So buckle up—this is not rage bait, it is just a hot take from a Mexican developer who spent the weekend arguing with AI agents instead of sleeping like a normal person.
The ORM Prediction, or How I Accidentally Became Right About Something
Here's the thing about ORMs: they exist because writing SQL is supposedly "hard" and "error-prone." Meanwhile, I've been writing raw SQL since my first job at a tiny shop in Tepic where we didn't have the luxury of Entity Framework or Hibernate or whatever fancy abstraction layer the cool kids were using. We just wrote the queries, crossed ourselves, and hit execute. Catholic upbringing has some unexpected engineering applications.
Now, to be fair—we did end up building our own tailored ORM for the common cases. Because once you've written the same parameterized INSERT fifteen times, even the most stubborn raw-SQL purist starts thinking "maybe I should abstract this." And ORMs do earn their keep in some areas: SQL injection prevention, enforcing parameterized queries, handling connection lifecycle stuff that nobody wants to think about. Security guardrails that your 2 AM brain will absolutely forget to implement on its own. I get it. ORMs aren't stupid—they solved real problems.
But here's the trap: as soon as you start getting into complex queries, you're no longer just maintaining your application logic—you're also maintaining the ORM and the complex queries. You end up fighting the abstraction to make it do what raw SQL does naturally, and now you have two problems instead of one. The thing that was supposed to simplify your life becomes another layer you have to debug, optimize, and keep in your head at the same time. And whoever has run a high-performance application—like an ecommerce site during Black Friday—knows exactly what I'm talking about. That query you spent weeks trying to optimize through the ORM, doing quirky reflection tricks and fighting with expression trees? You ended up raw-dogging the SQL anyway, because that was the only way to get the performance you needed. The ORM was never going to get you there. It was just standing in the way, politely.
Now Claude just writes you the exact SQL you need—parameterized, injection-safe, the whole deal. No mapping, no configuration, no surprises. Just the data access pattern you actually want. It's like having a DBA who never sleeps, never complains about schema changes, and doesn't passive-aggressively CC your manager when you write a bad join. The abstraction layer that was supposed to save us from SQL is now the thing standing between us and the AI that's better at SQL than most of us ever were.
Agentic Development and the Death of One-Size-Fits-None
This isn't just about ORMs. I've been thinking about how agentic development fundamentally changes the whole premise of general-purpose libraries and building blocks.
Platform teams across the industry are going to start questioning their investments in broad, one-size-fits-all libraries. And honestly? Good. Because "one-size-fits-all" always meant "fits nobody perfectly but everyone tolerably." Like those beach ponchos they sell at every tourist shop in Nayarit—technically covers you, technically functions, but you look ridiculous and you know it.
Take CSS frameworks. Bootstrap, Bulma, Fluent UI—they're great for getting started quickly. But you end up learning their specific class naming conventions, carrying tons of CSS you'll never use, fighting against the framework the moment you want something custom, and—my personal favorite—looking like every other Bootstrap site on the internet. Your site ends up with more unused CSS than empty beer bottles after a Sunday carne asada in Nayarit. And that's a lot of bottles, trust me.
With agentic development? You just tell the agent what you want your UI to look like. It generates exactly the CSS you need. No framework lock-in, no unused code, no learning curve. The agent doesn't need to know Bootstrap's grid system (although it probably was trained on such codebases)—it just writes "vanilla" CSS that does what you asked for. I know this because that's exactly what happened with this blog. The CSS you're looking at right now? Generated. By an agent. Who understood what I wanted better than I understood what I wanted (debatable).
MCP is Already Feeling Old
Speaking of things that are aging quickly: the Model Context Protocol. MCP. Remember when everyone was wrapping every CLI tool as an MCP server like it was the new hotness? That was, what, months ago? In AI time that's basically the Paleolithic era.
Here's the thing—CLI tools already come with perfect documentation in the form of man pages. They're basically documented APIs already. Your agent doesn't need a special protocol wrapper to use
gh pr createoraz webapp deploy. It just reads the docs, fumbles the first attempt (like any of us), and then figures it out. Combine Claude Code with existing CLI tools—GitHub CLI, Azure CLI, kubectl, whatever—and you've got everything MCP promised, but without the ceremony.Microsoft's already doing something interesting with their dotnet/skills repo. Skills that are just prompts guiding the agent through repeatable processes. No protocol, no server, no serialization format drama. Just a well-written prompt. Turns out the best API for an AI agent is just... words. Who knew. (Okay, a lot of people knew. But still.)
Hugo Drove Me to Build My Own (Again, Because I Never Learn)
I just finished redoing my entire publishing workflow. Hugo felt limiting and bloated—all these features I'm maintaining, constantly broken by dependency updates, GitHub workflows failing for mysterious reasons. Every time I pushed a new post it was a coin flip whether the build would succeed or I'd spend an hour debugging some Go template issue that made me question my life choices.
So I rewrote it in .NET. Dead simple. I don't expect anyone else to use it—exclusive distribution, zero units available—but damn, it felt liberating. The CSS and HTML of this blog changed completely, and I actually understand every piece of it now. No more cargo-culting Hugo partials I copied from a theme three years ago and was afraid to touch.
This is the pattern I keep seeing: when AI can generate exactly what you need, the appeal of heavyweight, general-purpose solutions just evaporates. Like fog burning off in the morning sun in Tepic. One moment it's there, thick and omnipresent, and then it's just... gone.
The Accountability Problem
Here's something that's been bugging me. I saw a conversation on the fediverse about more and more tools being created with no clear ownership. Developers suspect some might be entirely AI-generated, with humans just shepherding them into existence like zookeepers who can't actually control the animals.
That sucks. Humans should be in charge and taking responsibility for the software they put into the world. There's a difference between using AI as a tool and letting AI be the architect while you nod along pretending you reviewed the blueprints.
When something breaks, when there's a security issue, when users need support—who's accountable? You can't file a bug report against GPT-4. And "the AI did it" is not an incident postmortem. Not yet, anyway. Give it a year (debatable).
Copilot's Infinite Loop of Self-Criticism
Speaking of AI quirks: Copilot keeps finding issues in my PRs, I ask it to fix them, it fixes them, and then when I ask it to review again, it finds more issues. In the code it just wrote. In the code. It. Just. Wrote.
This is like watching someone argue with themselves in the mirror. Except the mirror is burning tokens, the person is burning my budget, and the argument never ends. The AI equivalent of "works on my machine" syndrome, except it doesn't even work on its own machine.
Blog Posts Are Better Than Repos for Teaching AI
Here's something that genuinely surprised me. A friend at Microsoft pointed his AI agent to my blog series to implement ActivityPub. Not to a GitHub repo with code samples. Not to the official W3C spec. To my blog posts. The ones I write at 1 AM like a gremlin-raccoon, full of rambling asides and half-baked metaphors.
Turns out prose explanations with context and reasoning are way more effective for agents than just dumping code at them. Blog posts tell the story of why decisions were made, not just what the final result looks like. The agent needs to understand intent, not just syntax. It needs the narrative—the "I tried this and it broke spectacularly, so I did this other thing instead" part that never makes it into a README.
So all those years of writing meandering blog posts about my projects instead of writing proper documentation? Turns out I was ahead of my time. Or just lazy. Probably both.
Where This Is All Heading
I think we're heading toward a world where general-purpose libraries become luxury items—nice to have, but not essential. Where AI-generated, purpose-built solutions become the norm. Where documentation and prose become more important than code artifacts. And where human accountability becomes the thing that actually differentiates good software from the rest.
This doesn't mean libraries disappear overnight. But the incentives are shifting. Why build and maintain a framework used by millions when everyone can have their own custom solution?
The future might be less about sharing code and more about sharing knowledge, context, and decision-making frameworks. Less "here's my npm package" and more "here's the blog post explaining why I built it this way so your agent can do something better."
Anyway
This post is a collection of half-formed thoughts and observations. I'm not claiming to have all the answers—hell, I'm not even sure these are the right questions. But something is shifting under our feet, and pretending it isn't doesn't make it stop.
Are we heading toward a more fragmented, AI-generated software landscape? Or am I just another old developer yelling at algorithmic clouds from a small corner of the internet?
Honestly, I don't know. But I'd rather be wrong and loud about it than quiet and surprised when the whole toolchain landscape looks unrecognizable in five years.
Also readable in: https://maho.dev/2026/03/ai-is-making-libraries-obsolete/ by @mapache:
#AI #Software Development #Libraries #Agentic Development #ORMs #CSS Frameworks #MCP #Developer Tools #Future of Coding #Hot Takes #LLM #Copilot
-
AI is Making Libraries Obsolete
Summary: AI agents are fundamentally changing the economics of general-purpose libraries. Why build on Bootstrap when an agent can generate exactly what you need? A collection of thoughts on where this is all heading.
The Great Library Unbundling: How AI is Eating the Software Stack
More than a year ago, I told people that ORMs like Entity Framework were going to feel like relics. That LLMs would just generate the SQL you need, making all that object-relational mapping overhead pointless. A few people told me I was crazy and doing things wrong (and to be honest I wasn't good enough at explaining why I thought this).
Well, time seems to have been on my side (Wwo is laughing now hahahaha!!).
Now, this is a hot take, so I will go forward and talk as a hot take. If I put my devil's advocate hat on, I would probably rage against whoever wrote this post. But because I LOVE MYSELF, I won't do it. I certainly see flaws in my arguments. So buckle up—this is not rage bait, it is just a hot take from a Mexican developer who spent the weekend arguing with AI agents instead of sleeping like a normal person.
The ORM Prediction, or How I Accidentally Became Right About Something
Here's the thing about ORMs: they exist because writing SQL is supposedly "hard" and "error-prone." Meanwhile, I've been writing raw SQL since my first job at a tiny shop in Tepic where we didn't have the luxury of Entity Framework or Hibernate or whatever fancy abstraction layer the cool kids were using. We just wrote the queries, crossed ourselves, and hit execute. Catholic upbringing has some unexpected engineering applications.
Now, to be fair—we did end up building our own tailored ORM for the common cases. Because once you've written the same parameterized INSERT fifteen times, even the most stubborn raw-SQL purist starts thinking "maybe I should abstract this." And ORMs do earn their keep in some areas: SQL injection prevention, enforcing parameterized queries, handling connection lifecycle stuff that nobody wants to think about. Security guardrails that your 2 AM brain will absolutely forget to implement on its own. I get it. ORMs aren't stupid—they solved real problems.
But here's the trap: as soon as you start getting into complex queries, you're no longer just maintaining your application logic—you're also maintaining the ORM and the complex queries. You end up fighting the abstraction to make it do what raw SQL does naturally, and now you have two problems instead of one. The thing that was supposed to simplify your life becomes another layer you have to debug, optimize, and keep in your head at the same time. And whoever has run a high-performance application—like an ecommerce site during Black Friday—knows exactly what I'm talking about. That query you spent weeks trying to optimize through the ORM, doing quirky reflection tricks and fighting with expression trees? You ended up raw-dogging the SQL anyway, because that was the only way to get the performance you needed. The ORM was never going to get you there. It was just standing in the way, politely.
Now Claude just writes you the exact SQL you need—parameterized, injection-safe, the whole deal. No mapping, no configuration, no surprises. Just the data access pattern you actually want. It's like having a DBA who never sleeps, never complains about schema changes, and doesn't passive-aggressively CC your manager when you write a bad join. The abstraction layer that was supposed to save us from SQL is now the thing standing between us and the AI that's better at SQL than most of us ever were.
Agentic Development and the Death of One-Size-Fits-None
This isn't just about ORMs. I've been thinking about how agentic development fundamentally changes the whole premise of general-purpose libraries and building blocks.
Platform teams across the industry are going to start questioning their investments in broad, one-size-fits-all libraries. And honestly? Good. Because "one-size-fits-all" always meant "fits nobody perfectly but everyone tolerably." Like those beach ponchos they sell at every tourist shop in Nayarit—technically covers you, technically functions, but you look ridiculous and you know it.
Take CSS frameworks. Bootstrap, Bulma, Fluent UI—they're great for getting started quickly. But you end up learning their specific class naming conventions, carrying tons of CSS you'll never use, fighting against the framework the moment you want something custom, and—my personal favorite—looking like every other Bootstrap site on the internet. Your site ends up with more unused CSS than empty beer bottles after a Sunday carne asada in Nayarit. And that's a lot of bottles, trust me.
With agentic development? You just tell the agent what you want your UI to look like. It generates exactly the CSS you need. No framework lock-in, no unused code, no learning curve. The agent doesn't need to know Bootstrap's grid system (although it probably was trained on such codebases)—it just writes "vanilla" CSS that does what you asked for. I know this because that's exactly what happened with this blog. The CSS you're looking at right now? Generated. By an agent. Who understood what I wanted better than I understood what I wanted (debatable).
MCP is Already Feeling Old
Speaking of things that are aging quickly: the Model Context Protocol. MCP. Remember when everyone was wrapping every CLI tool as an MCP server like it was the new hotness? That was, what, months ago? In AI time that's basically the Paleolithic era.
Here's the thing—CLI tools already come with perfect documentation in the form of man pages. They're basically documented APIs already. Your agent doesn't need a special protocol wrapper to use
gh pr createoraz webapp deploy. It just reads the docs, fumbles the first attempt (like any of us), and then figures it out. Combine Claude Code with existing CLI tools—GitHub CLI, Azure CLI, kubectl, whatever—and you've got everything MCP promised, but without the ceremony.Microsoft's already doing something interesting with their dotnet/skills repo. Skills that are just prompts guiding the agent through repeatable processes. No protocol, no server, no serialization format drama. Just a well-written prompt. Turns out the best API for an AI agent is just... words. Who knew. (Okay, a lot of people knew. But still.)
Hugo Drove Me to Build My Own (Again, Because I Never Learn)
I just finished redoing my entire publishing workflow. Hugo felt limiting and bloated—all these features I'm maintaining, constantly broken by dependency updates, GitHub workflows failing for mysterious reasons. Every time I pushed a new post it was a coin flip whether the build would succeed or I'd spend an hour debugging some Go template issue that made me question my life choices.
So I rewrote it in .NET. Dead simple. I don't expect anyone else to use it—exclusive distribution, zero units available—but damn, it felt liberating. The CSS and HTML of this blog changed completely, and I actually understand every piece of it now. No more cargo-culting Hugo partials I copied from a theme three years ago and was afraid to touch.
This is the pattern I keep seeing: when AI can generate exactly what you need, the appeal of heavyweight, general-purpose solutions just evaporates. Like fog burning off in the morning sun in Tepic. One moment it's there, thick and omnipresent, and then it's just... gone.
The Accountability Problem
Here's something that's been bugging me. I saw a conversation on the fediverse about more and more tools being created with no clear ownership. Developers suspect some might be entirely AI-generated, with humans just shepherding them into existence like zookeepers who can't actually control the animals.
That sucks. Humans should be in charge and taking responsibility for the software they put into the world. There's a difference between using AI as a tool and letting AI be the architect while you nod along pretending you reviewed the blueprints.
When something breaks, when there's a security issue, when users need support—who's accountable? You can't file a bug report against GPT-4. And "the AI did it" is not an incident postmortem. Not yet, anyway. Give it a year (debatable).
Copilot's Infinite Loop of Self-Criticism
Speaking of AI quirks: Copilot keeps finding issues in my PRs, I ask it to fix them, it fixes them, and then when I ask it to review again, it finds more issues. In the code it just wrote. In the code. It. Just. Wrote.
This is like watching someone argue with themselves in the mirror. Except the mirror is burning tokens, the person is burning my budget, and the argument never ends. The AI equivalent of "works on my machine" syndrome, except it doesn't even work on its own machine.
Blog Posts Are Better Than Repos for Teaching AI
Here's something that genuinely surprised me. A friend at Microsoft pointed his AI agent to my blog series to implement ActivityPub. Not to a GitHub repo with code samples. Not to the official W3C spec. To my blog posts. The ones I write at 1 AM like a gremlin-raccoon, full of rambling asides and half-baked metaphors.
Turns out prose explanations with context and reasoning are way more effective for agents than just dumping code at them. Blog posts tell the story of why decisions were made, not just what the final result looks like. The agent needs to understand intent, not just syntax. It needs the narrative—the "I tried this and it broke spectacularly, so I did this other thing instead" part that never makes it into a README.
So all those years of writing meandering blog posts about my projects instead of writing proper documentation? Turns out I was ahead of my time. Or just lazy. Probably both.
Where This Is All Heading
I think we're heading toward a world where general-purpose libraries become luxury items—nice to have, but not essential. Where AI-generated, purpose-built solutions become the norm. Where documentation and prose become more important than code artifacts. And where human accountability becomes the thing that actually differentiates good software from the rest.
This doesn't mean libraries disappear overnight. But the incentives are shifting. Why build and maintain a framework used by millions when everyone can have their own custom solution?
The future might be less about sharing code and more about sharing knowledge, context, and decision-making frameworks. Less "here's my npm package" and more "here's the blog post explaining why I built it this way so your agent can do something better."
Anyway
This post is a collection of half-formed thoughts and observations. I'm not claiming to have all the answers—hell, I'm not even sure these are the right questions. But something is shifting under our feet, and pretending it isn't doesn't make it stop.
Are we heading toward a more fragmented, AI-generated software landscape? Or am I just another old developer yelling at algorithmic clouds from a small corner of the internet?
Honestly, I don't know. But I'd rather be wrong and loud about it than quiet and surprised when the whole toolchain landscape looks unrecognizable in five years.
Also readable in: https://maho.dev/2026/03/ai-is-making-libraries-obsolete/ by @mapache:
#AI #Software Development #Libraries #Agentic Development #ORMs #CSS Frameworks #MCP #Developer Tools #Future of Coding #Hot Takes #LLM #Copilot
-
AI is Making Libraries Obsolete
Summary: AI agents are fundamentally changing the economics of general-purpose libraries. Why build on Bootstrap when an agent can generate exactly what you need? A collection of thoughts on where this is all heading.
The Great Library Unbundling: How AI is Eating the Software Stack
More than a year ago, I told people that ORMs like Entity Framework were going to feel like relics. That LLMs would just generate the SQL you need, making all that object-relational mapping overhead pointless. A few people told me I was crazy and doing things wrong (and to be honest I wasn't good enough at explaining why I thought this).
Well, time seems to have been on my side (Wwo is laughing now hahahaha!!).
Now, this is a hot take, so I will go forward and talk as a hot take. If I put my devil's advocate hat on, I would probably rage against whoever wrote this post. But because I LOVE MYSELF, I won't do it. I certainly see flaws in my arguments. So buckle up—this is not rage bait, it is just a hot take from a Mexican developer who spent the weekend arguing with AI agents instead of sleeping like a normal person.
The ORM Prediction, or How I Accidentally Became Right About Something
Here's the thing about ORMs: they exist because writing SQL is supposedly "hard" and "error-prone." Meanwhile, I've been writing raw SQL since my first job at a tiny shop in Tepic where we didn't have the luxury of Entity Framework or Hibernate or whatever fancy abstraction layer the cool kids were using. We just wrote the queries, crossed ourselves, and hit execute. Catholic upbringing has some unexpected engineering applications.
Now, to be fair—we did end up building our own tailored ORM for the common cases. Because once you've written the same parameterized INSERT fifteen times, even the most stubborn raw-SQL purist starts thinking "maybe I should abstract this." And ORMs do earn their keep in some areas: SQL injection prevention, enforcing parameterized queries, handling connection lifecycle stuff that nobody wants to think about. Security guardrails that your 2 AM brain will absolutely forget to implement on its own. I get it. ORMs aren't stupid—they solved real problems.
But here's the trap: as soon as you start getting into complex queries, you're no longer just maintaining your application logic—you're also maintaining the ORM and the complex queries. You end up fighting the abstraction to make it do what raw SQL does naturally, and now you have two problems instead of one. The thing that was supposed to simplify your life becomes another layer you have to debug, optimize, and keep in your head at the same time. And whoever has run a high-performance application—like an ecommerce site during Black Friday—knows exactly what I'm talking about. That query you spent weeks trying to optimize through the ORM, doing quirky reflection tricks and fighting with expression trees? You ended up raw-dogging the SQL anyway, because that was the only way to get the performance you needed. The ORM was never going to get you there. It was just standing in the way, politely.
Now Claude just writes you the exact SQL you need—parameterized, injection-safe, the whole deal. No mapping, no configuration, no surprises. Just the data access pattern you actually want. It's like having a DBA who never sleeps, never complains about schema changes, and doesn't passive-aggressively CC your manager when you write a bad join. The abstraction layer that was supposed to save us from SQL is now the thing standing between us and the AI that's better at SQL than most of us ever were.
Agentic Development and the Death of One-Size-Fits-None
This isn't just about ORMs. I've been thinking about how agentic development fundamentally changes the whole premise of general-purpose libraries and building blocks.
Platform teams across the industry are going to start questioning their investments in broad, one-size-fits-all libraries. And honestly? Good. Because "one-size-fits-all" always meant "fits nobody perfectly but everyone tolerably." Like those beach ponchos they sell at every tourist shop in Nayarit—technically covers you, technically functions, but you look ridiculous and you know it.
Take CSS frameworks. Bootstrap, Bulma, Fluent UI—they're great for getting started quickly. But you end up learning their specific class naming conventions, carrying tons of CSS you'll never use, fighting against the framework the moment you want something custom, and—my personal favorite—looking like every other Bootstrap site on the internet. Your site ends up with more unused CSS than empty beer bottles after a Sunday carne asada in Nayarit. And that's a lot of bottles, trust me.
With agentic development? You just tell the agent what you want your UI to look like. It generates exactly the CSS you need. No framework lock-in, no unused code, no learning curve. The agent doesn't need to know Bootstrap's grid system (although it probably was trained on such codebases)—it just writes "vanilla" CSS that does what you asked for. I know this because that's exactly what happened with this blog. The CSS you're looking at right now? Generated. By an agent. Who understood what I wanted better than I understood what I wanted (debatable).
MCP is Already Feeling Old
Speaking of things that are aging quickly: the Model Context Protocol. MCP. Remember when everyone was wrapping every CLI tool as an MCP server like it was the new hotness? That was, what, months ago? In AI time that's basically the Paleolithic era.
Here's the thing—CLI tools already come with perfect documentation in the form of man pages. They're basically documented APIs already. Your agent doesn't need a special protocol wrapper to use
gh pr createoraz webapp deploy. It just reads the docs, fumbles the first attempt (like any of us), and then figures it out. Combine Claude Code with existing CLI tools—GitHub CLI, Azure CLI, kubectl, whatever—and you've got everything MCP promised, but without the ceremony.Microsoft's already doing something interesting with their dotnet/skills repo. Skills that are just prompts guiding the agent through repeatable processes. No protocol, no server, no serialization format drama. Just a well-written prompt. Turns out the best API for an AI agent is just... words. Who knew. (Okay, a lot of people knew. But still.)
Hugo Drove Me to Build My Own (Again, Because I Never Learn)
I just finished redoing my entire publishing workflow. Hugo felt limiting and bloated—all these features I'm maintaining, constantly broken by dependency updates, GitHub workflows failing for mysterious reasons. Every time I pushed a new post it was a coin flip whether the build would succeed or I'd spend an hour debugging some Go template issue that made me question my life choices.
So I rewrote it in .NET. Dead simple. I don't expect anyone else to use it—exclusive distribution, zero units available—but damn, it felt liberating. The CSS and HTML of this blog changed completely, and I actually understand every piece of it now. No more cargo-culting Hugo partials I copied from a theme three years ago and was afraid to touch.
This is the pattern I keep seeing: when AI can generate exactly what you need, the appeal of heavyweight, general-purpose solutions just evaporates. Like fog burning off in the morning sun in Tepic. One moment it's there, thick and omnipresent, and then it's just... gone.
The Accountability Problem
Here's something that's been bugging me. I saw a conversation on the fediverse about more and more tools being created with no clear ownership. Developers suspect some might be entirely AI-generated, with humans just shepherding them into existence like zookeepers who can't actually control the animals.
That sucks. Humans should be in charge and taking responsibility for the software they put into the world. There's a difference between using AI as a tool and letting AI be the architect while you nod along pretending you reviewed the blueprints.
When something breaks, when there's a security issue, when users need support—who's accountable? You can't file a bug report against GPT-4. And "the AI did it" is not an incident postmortem. Not yet, anyway. Give it a year (debatable).
Copilot's Infinite Loop of Self-Criticism
Speaking of AI quirks: Copilot keeps finding issues in my PRs, I ask it to fix them, it fixes them, and then when I ask it to review again, it finds more issues. In the code it just wrote. In the code. It. Just. Wrote.
This is like watching someone argue with themselves in the mirror. Except the mirror is burning tokens, the person is burning my budget, and the argument never ends. The AI equivalent of "works on my machine" syndrome, except it doesn't even work on its own machine.
Blog Posts Are Better Than Repos for Teaching AI
Here's something that genuinely surprised me. A friend at Microsoft pointed his AI agent to my blog series to implement ActivityPub. Not to a GitHub repo with code samples. Not to the official W3C spec. To my blog posts. The ones I write at 1 AM like a gremlin-raccoon, full of rambling asides and half-baked metaphors.
Turns out prose explanations with context and reasoning are way more effective for agents than just dumping code at them. Blog posts tell the story of why decisions were made, not just what the final result looks like. The agent needs to understand intent, not just syntax. It needs the narrative—the "I tried this and it broke spectacularly, so I did this other thing instead" part that never makes it into a README.
So all those years of writing meandering blog posts about my projects instead of writing proper documentation? Turns out I was ahead of my time. Or just lazy. Probably both.
Where This Is All Heading
I think we're heading toward a world where general-purpose libraries become luxury items—nice to have, but not essential. Where AI-generated, purpose-built solutions become the norm. Where documentation and prose become more important than code artifacts. And where human accountability becomes the thing that actually differentiates good software from the rest.
This doesn't mean libraries disappear overnight. But the incentives are shifting. Why build and maintain a framework used by millions when everyone can have their own custom solution?
The future might be less about sharing code and more about sharing knowledge, context, and decision-making frameworks. Less "here's my npm package" and more "here's the blog post explaining why I built it this way so your agent can do something better."
Anyway
This post is a collection of half-formed thoughts and observations. I'm not claiming to have all the answers—hell, I'm not even sure these are the right questions. But something is shifting under our feet, and pretending it isn't doesn't make it stop.
Are we heading toward a more fragmented, AI-generated software landscape? Or am I just another old developer yelling at algorithmic clouds from a small corner of the internet?
Honestly, I don't know. But I'd rather be wrong and loud about it than quiet and surprised when the whole toolchain landscape looks unrecognizable in five years.
Also readable in: https://maho.dev/2026/03/ai-is-making-libraries-obsolete/ by @mapache:
#AI #Software Development #Libraries #Agentic Development #ORMs #CSS Frameworks #MCP #Developer Tools #Future of Coding #Hot Takes #LLM #Copilot
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary\
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to include that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back.
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - Updated
GetOutbox,GetNote, andGetCreateNotemethods.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
“By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.”
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Also readable in: https://maho.dev/2025/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary\
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to include that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back.
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - Updated
GetOutbox,GetNote, andGetCreateNotemethods.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
“By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.”
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Also readable in: https://maho.dev/2025/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary (or reply)
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to assert that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back (blanket approval).
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - in the
GetNotemethod.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Next Steps: The Quote Visualization Challenge
Now that we’ve successfully implemented the backend infrastructure for consent-respecting quote posts, we face an equally important question: How should we display these quotes on our website?
Treat quoted posts as special reply types? Quotes have different semantic meaning than replies - they’re more like “shared with commentary” So maybe create a separate “Quoted By” section similar to how we handle likes and shares?
Any ideas?
Also readable in: https://maho.dev/2026/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary (or reply)
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to assert that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back (blanket approval).
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - in the
GetNotemethod.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Next Steps: The Quote Visualization Challenge
Now that we’ve successfully implemented the backend infrastructure for consent-respecting quote posts, we face an equally important question: How should we display these quotes on our website?
Treat quoted posts as special reply types? Quotes have different semantic meaning than replies - they’re more like “shared with commentary” So maybe create a separate “Quoted By” section similar to how we handle likes and shares?
Any ideas?
Also readable in: https://maho.dev/2026/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary (or reply)
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to assert that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back (blanket approval).
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - in the
GetNotemethod.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Next Steps: The Quote Visualization Challenge
Now that we’ve successfully implemented the backend infrastructure for consent-respecting quote posts, we face an equally important question: How should we display these quotes on our website?
Treat quoted posts as special reply types? Quotes have different semantic meaning than replies - they’re more like “shared with commentary” So maybe create a separate “Quoted By” section similar to how we handle likes and shares?
Any ideas?
Also readable in: https://maho.dev/2026/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary (or reply)
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to assert that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back (blanket approval).
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - in the
GetNotemethod.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Next Steps: The Quote Visualization Challenge
Now that we’ve successfully implemented the backend infrastructure for consent-respecting quote posts, we face an equally important question: How should we display these quotes on our website?
Treat quoted posts as special reply types? Quotes have different semantic meaning than replies - they’re more like “shared with commentary” So maybe create a separate “Quoted By” section similar to how we handle likes and shares?
Any ideas?
Also readable in: https://maho.dev/2026/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
A Guide to Implementing ActivityPub in a Static Site (or Any Website) - Part 9: Quote Posts
Summary:
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Quote Posts for Static Sites: A Practical Guide to FEP-044f Implementation
Transform your static blog into a consent-respecting quote-enabled node in the fediverse. This guide shows you how to implement quote post support that works with Mastodon, GoToSocial, and other ActivityPub servers while respecting author preferences.
In this guide: You’ll learn to build quote-enabled blog posts that can be responsibly shared across the fediverse
Why Quote Posts Matter (And Why They’re Controversial)
The User Experience Problem
Picture this: Someone finds your blog post fascinating and wants to share it with their followers, but they also want to add their own perspective or why is important. Without quote posts, they have two unsatisfying options:
- Simple share: Just boost with no commentary (or reply)
- Link sharing: Add a link to the blog post in their note
Neither option creates the rich, attributed conversations that make social media engaging.
The Solution: Consent-First Quote Implementation
We’re implementing FEP-044f: Consent-respecting quote posts in our federated blog.
What this means for your readers:
- They can quote your posts with confidence that you’ve opted in
- Their quotes include proper attribution and linking
What this means for you:
- Automatic handling of quote requests
- Future-ready for advanced moderation features (like in the fuuutuuure)
Implementation Overview
We are going to:
- Modify the Notes JSON to assert that the notes are quotable.
- Modify our Index function (the only dynamic POST endpoint) to handle quote requests and send the appropriate approval back (blanket approval).
1. Modifying the Notes: Enhanced ActivityPub Context
What We Changed: Extended the
@contextfrom a simple string to a rich object array supporting the GoToSocial namespace.Before:
"@context": "https://www.w3.org/ns/activitystreams"After:
"@context": [ "https://www.w3.org/ns/activitystreams", { "gts": "https://gotosocial.org/ns#", "interactionPolicy": {"@id": "gts:interactionPolicy", "@type": "@id"}, "canQuote": {"@id": "gts:canQuote", "@type": "@id"}, "automaticApproval": {"@id": "gts:automaticApproval", "@type": "@id"} } ]We are also adding this section at the end of the Note:
"interactionPolicy": { "canQuote": { "automaticApproval": "https://www.w3.org/ns/activitystreams#Public" } }If you want to be specific about who can quote your post, this is where you do it, read more in here.
You can see an example of the implementation in RssUtils.cs - in the
GetNotemethod.2: Quote Request Processing
Now we need to add the quote request handling system that processes incoming quote requests and automatically approves them based on our interaction policy.
New Components:
- QuoteRequestService: Processes incoming quote requests from the fediverse
- Auto-Approval Logic: Automatically approves public quote requests as defined in our interaction policy
- Quote Authorization: Issues authorization tokens (stamps) for approved quotes
The Quote Request Flow:
sequenceDiagram participant Requester as Fediverse User participant Inbox as Our Inbox participant QRS as QuoteRequestService participant Target as Target Instance Requester->>Inbox: QuoteRequest for our post Inbox->>QRS: Process quote request QRS->>QRS: Check interaction policy QRS->>QRS: Generate authorization stamp QRS->>Target: Send Accept + Authorization Target->>Requester: Quote approvedCheckout the implementation in the QuoteRequestService.cs.
Key Takeaways
By implementing FEP-044f, we’re not just adding quote functionality - we’re building consent-respecting social interactions into the protocol level.
Why This Matters:
This implementation shows how static sites can participate in modern social web standards while keeping their simplicity and performance benefits. Right now, we’re automatically allowing all public quotes, but this foundation sets us up for more granular consent controls in the future - like requiring approval for specific users or implementing follower-only quoting.
The consent-respecting approach means our content can be shared thoughtfully across the fediverse, with the infrastructure already in place to handle more sophisticated permission systems as they evolve.
Next Steps: The Quote Visualization Challenge
Now that we’ve successfully implemented the backend infrastructure for consent-respecting quote posts, we face an equally important question: How should we display these quotes on our website?
Treat quoted posts as special reply types? Quotes have different semantic meaning than replies - they’re more like “shared with commentary” So maybe create a separate “Quoted By” section similar to how we handle likes and shares?
Any ideas?
Also readable in: https://maho.dev/2026/02/a-guide-to-implementing-activitypub-in-a-static-site-or-any-website-part-9-quote-posts/ by @mapache:
#fediverse #activitypub #static-sites #hugo #azure #mastodon #web-development #social-web #webfinger #http #quote-posts #fep-044f
-
Opinión escrita.
Nos hemos encajado demasiado en el Cyberpunk es la distopía cuando en realidad lo importante es la resistencia, el punk. Con todo eso de los cyberdecks, fediverso, la resistencia a la IA y la democratización del conocimiento tecnológico, ese es el verdadero Cyberpunk.
#cyberpunk #solarpunk #tech #fediverse -
Opinión escrita.
Nos hemos encajado demasiado en el Cyberpunk es la distopía cuando en realidad lo importante es la resistencia, el punk. Con todo eso de los cyberdecks, fediverso, la resistencia a la IA y la democratización del conocimiento tecnológico, ese es el verdadero Cyberpunk.
#cyberpunk #solarpunk #tech #fediverse -
#presentacion
Hola Mastodon me presento oficialmente como nuevo en este fediverso, soy ingeniero agrónomo mexicano y me dedico a la ganadería regenerativa, soy fiel impulsor del #solarpunk y apasionado de la biología.También soy dungeon master de calabozos y dragones los fines de semana.
-
#presentacion
Hola Mastodon me presento oficialmente como nuevo en este fediverso, soy ingeniero agrónomo mexicano y me dedico a la ganadería regenerativa, soy fiel impulsor del #solarpunk y apasionado de la biología.También soy dungeon master de calabozos y dragones los fines de semana.
-
#presentacion
Hola Mastodon me presento oficialmente como nuevo en este fediverso, soy ingeniero agrónomo mexicano y me dedico a la ganadería regenerativa, soy fiel impulsor del #solarpunk y apasionado de la biología.También soy dungeon master de calabozos y dragones los fines de semana.
-
#presentacion
Hola Mastodon me presento oficialmente como nuevo en este fediverso, soy ingeniero agrónomo mexicano y me dedico a la ganadería regenerativa, soy fiel impulsor del #solarpunk y apasionado de la biología.También soy dungeon master de calabozos y dragones los fines de semana.
-
#presentacion
Hola Mastodon me presento oficialmente como nuevo en este fediverso, soy ingeniero agrónomo mexicano y me dedico a la ganadería regenerativa, soy fiel impulsor del #solarpunk y apasionado de la biología.También soy dungeon master de calabozos y dragones los fines de semana.
-
Dónde está mi gente latino para seguirnos? #mastodon 🦣 #Argentina 🇦🇷 #LGTBQI 🏳️🌈🏳️⚧️
-
Dónde está mi gente latino para seguirnos? #mastodon 🦣 #Argentina 🇦🇷 #LGTBQI 🏳️🌈🏳️⚧️
-
Dónde está mi gente latino para seguirnos? #mastodon 🦣 #Argentina 🇦🇷 #LGTBQI 🏳️🌈🏳️⚧️
-
Dónde está mi gente latino para seguirnos? #mastodon 🦣 #Argentina 🇦🇷 #LGTBQI 🏳️🌈🏳️⚧️
-
Dónde está mi gente latino para seguirnos? #mastodon 🦣 #Argentina 🇦🇷 #LGTBQI 🏳️🌈🏳️⚧️
-
Die Übertragung der#wm bei #magentasport ist gerade katastrophal. Was ist da los #telekom?
-
Die Übertragung der#wm bei #magentasport ist gerade katastrophal. Was ist da los #telekom?
-
Die Übertragung der#wm bei #magentasport ist gerade katastrophal. Was ist da los #telekom?
-
Hear me out, if we can integrate these 4, in a seamless frictionless integrated experience for both, companies and users, we could have a nice alternative to #LinkedIn that is actually not crap.
Any interest?