Skip to main content

Software Sustainability for Small Developers

Let’s face it, open source has largely become a luxury game. It works beautifully for mega-corporations with deep pockets, or the lucky few smaller companies that managed to build massive, hyper-engaged user bases years ago. For the rest of us—the solo creators and small teams actually pushing technology forward—giving away the recipe just isn't a viable business model anymore.

But I also refuse to buy into the cynical narrative that because code is easily replicated, what we produce is "just an asset" and fundamentally worthless. Small-scale innovation is essential, but we need a licensing model that actually lets us survive.

For a long time, I’ve wanted to use a specific model: the customer pays a premium, and in return, they get access to both the executable binaries and the underlying source code.

From a security and long-term maintainability standpoint, it’s the ultimate insurance policy for a buyer. If they are deploying my software onto a critical platform, they need to know they won't be left stranded if my business goes under or if I decide to change careers. They have the code; they can keep the lights on.

But in the past, pitching this always hit a brick wall. Customers would look at the source code and shrug. “That’s great,” they’d say, “but we don't have the engineering skillset to maintain this anyway. If you stop supporting it, the raw code is useless to us.” And they weren't entirely wrong. Digging into someone else’s codebase, auditing it for security, or trying to recompile it against a newer platform used to require a lot of expensive, specialized engineering time.

But modern LLMs completely change this dynamic. The "we don't have the skills" excuse is officially dead.

Today, a company can buy software from a completely unknown indie developer and bridge the technical gap using AI. They don't need a dedicated team on standby to gain peace of mind. With a frontier LLM, they can:

  • Audit the code: Drop the source into an LLM to scan for security vulnerabilities or backdoors before deploying it.

  • Maintain it long-term: If the software needs to be recompiled against a newer OS version five years from now, an LLM can guide a junior IT admin through the refactoring and compilation process step-by-step.

AI turns raw source code from a useless, intimidating liability into a genuine insurance policy for the buyer.

Looks like a standardized legal framework already exists that perfectly fits this model: the PolyForm Internal Use License.

PolyForm is a family of source-available licenses written by legal experts, and their "Internal Use" variant aligns exactly with how independent developers need to monetize right now:

  • What's allowed: The customer pays once and gets full access to the production binaries and un-obfuscated source code. They get an indefinite right to run the software, make internal copies, and modify the code freely for their own internal business operations.

  • The strict boundary: Zero redistribution rights. The customer cannot distribute the software (modified or not) to third parties, sublicense it, or use it to host a competing SaaS product. The code stays strictly within their own walls.

Using a standardized option like PolyForm would be a great idea because it gives both sides instant clarity. The developer gets a rock-solid copyright defense to protect their revenue stream, while the enterprise buyer gets a recognized legal framework that permits their engineers (and their LLMs) to handle internal maintenance without legal ambiguity.

This model moves us away from the unsustainable expectation of "free" open source, without forcing clients to rely on a fragile proprietary black box. It respects the customer's need for autonomy and the developer's need to get paid. LLMs aren't just changing how we write code; they’re changing the economics of how we sell it. And for independent developers, this feels like the path forward.

Linux Desktop Influencers and the Standard Problem

I hate those who always criticize. I appreciate instead those who do, and I consider myself to belong to the latter category. However, recently my posts have been mostly criticisms rather than constructive articles, and for this, I apologize; I promise to release something constructive as well and to keep my promises.

Having made this brief mea culpa, I must clarify nonetheless that it is not easy to remain indifferent to certain events. I feel I can speak about them, having enough experience and a wide-ranging vision to do so. I do it for the good of everyone and, above all, to protect the precious work of many developers who allowed me to witness the evolution of a world that, although exclusively for hobbyists until 25 years ago, has managed to churn out solutions that today constitute the foundations of modern computing and are therefore a fundamental and indispensable asset for humanity.

Read more…

Containerization to run apps in production is about to die

Containerization has become ubiquitous in modern software development, often presented as the default choice for deploying applications. However, after years of working with containerized systems in production, I've come to question whether containers are truly the right solution for production environments—or if we've collectively adopted a technology that excels at prototyping but introduces unnecessary complexity when it comes to running reliable, production-grade systems.

Read more…

Why Linux Desktop Keeps Missing the Mark

For many years, the tech community has been talking about the "year of Linux on the desktop." Every year seems like the perfect moment for Linux to finally capture significant desktop market share. Even famous YouTube celebrities like PewDiePie have tried to sponsor and promote it. However, there's considerable confusion around this topic, and I want to weigh in on the discussion based on my experience as both a system engineer who actively promoted GNU/Linux in business environments and as a software engineer.

Read more…

On the Phenomenology of Coding Agents

Large Language Models have undoubtedly revolutionized how we interact with technology. They are, at their core, supercharged search engines with remarkable encoding and decoding capabilities. You speak to them in natural language, and they respond with perfect written text, flawless speech synthesis, or sophisticated image generation. Their utility is undeniable, yet we must acknowledge a fundamental truth: they cannot think in the human sense of the word.

Read more…

MySQL GTID, Semi-Sync Replication and Partial View Caching: A good compromise to scale easy and cheap

For various reasons, I have often been involved in resolving infrastructural issues and performance gaps in MySQL deployments. I never envisioned my career focusing on database systems, yet it seems there is still a high demand for OLTP technologies in the Italian market, so here I am.

When you deal with a large dataset (over 500GB) with huge tables (more than 100 million rows), it's not hard to face performance issues. While many solutions exist for running analytical queries (OLAP) on large datasets by leveraging distributed systems, they are not typically "real-time" systems and often operate on stale data. When you have numerous, complex analytical queries — or expensive operations like COUNT(DISTINCT) — that must be submitted against a fresh, real-time system, you have no choice: you need to run them on your OLTP engine.

Read more…

Embracing the IPv6 Revolution: A Homelab Story

The other day, I was contacted by a friend of mine asking for help setting up a home NAS (aka Network Attached Storage) based on OpenMediaVault. While he's an enthusiast, he wasn't able to properly configure all the technical aspects of the setup.

The NAS world is increasingly resembling a homelab rather than just file storage. Using Docker, you can get enterprise-grade software and setups running with quite simple steps.

After setting up the Docker containers, we faced the usual issue that most homelabs encounter these days: his internet connection was behind a CGNAT for IPv4 networking. However, I was pleasantly surprised to find an IPv6 public subnet already configured!

Read more…

The Hidden Costs of Static Linking and Containerization: A Critical Analysis

Statically-linked Programs are the evil

The trend toward static linking represents a fundamental regression in software engineering principles. By bundling every dependency directly into the executable, we're not just bloating our binaries - we're actively dismantling decades of progress in software modularization. Each statically linked program becomes an island, disconnected from the ecosystem of shared improvements and security updates.

Consider what happens when a critical vulnerability is discovered in a commonly used library. In a properly designed system using shared libraries, a single system update would protect all applications simultaneously. Instead, with static linking, we must embark on a complex and error-prone process of identifying every affected program, rebuilding each one individually, and ensuring they all get redeployed.

Read more…

Exchanging messages between processes (or even threads within the same program) using ZeroMQ

Inter-Process Communication with ZeroMQ (and Protocol Buffers)

Introduction

Some may certainly say that, when you are writing so called "daemons" under Linux/Unix OSes or "services" under Windows, you might want to use OS primitives/reuse existing libraries to make your programs communicate each other. And I strongly agree with the point: it is always a good idea to use a well-tested and solid library to implement such fundamental features such as message queues.

For example, under Linux you can use D-Bus, which allows IPC at scale within the OS scope. Or, in the microservices space, you can leverage on message brokers like RabbitMQ or Kafka to stream your messages through sophisticated routing logic. However, at times you are just looking for something trivial and simple to send and queue messages where at the same time you look for brokerless setup but still you are willing to leverage on some of the features that message queuing systems offer for free with ease. That's where ZeroMQ comes in.

Read more…

Building a Lightweight Node.js Background Job Scheduler: A Practical Solution for Simple Web Applications

Building a Lightweight Node.js Background Job Scheduler

As developers, we often come across situations where a fully-fledged background job system, with all its bells and whistles, might be overkill for our project needs. This was the case for me when I built a custom background job scheduler in TypeScript and Node.js, designed to handle essential tasks without the overhead of larger, more complex solutions.

Read more…