Features
Turning a Side Project Into Something People Pay For
The gap between a working project and a product, and the parts nobody warns you about.
19 October 2026
Ask AI about this story

The journey from a side project to product is defined by the gap between code that runs and a system that sustains itself. It is the moment you stop building features and start managing infrastructure, billing, and support as a single, interdependent organism.
The Infrastructure Compromise
Running multiple products alone forces you to accept that perfection is expensive. Our current setup relies on a single VPS with 12GB of RAM and a 193GB disk. This is not an ideal architecture for scale, but it is an honest one for maintenance. When you are the only engineer, the cost of debugging a distributed system outweighs the cost of a shared resource. You learn to design for the constraints you have, not the ones you wish you had.
Next.js serves four distinct sites through host-based routing, handling everything from the film publication to the admin dashboard. This consolidation reduces the number of moving parts. However, it means that a memory leak in one service can throttle another. You must monitor aggregate usage, not just individual app health, because the machine is the shared bottleneck.
Static vs Dynamic Trade-offs
Not every product needs a server process. GamingCap and Invoiceful are static builds served directly from disk by Caddy. They have no database and no backend logic. This is the most reliable form of software you can run. If the disk is readable, the product works. There are no connection pools to manage and no state to corrupt.
In contrast, Instalaz runs as a separate Node process on port 3050, proxied by Caddy. It shares a single PostgreSQL 16 database with the main Next.js application. This shared database is a point of contention. You must carefully manage connection limits to ensure that a spike in invoice generation does not starve the scheduling queries. The architecture is simpler than a microservices setup, but it requires constant attention to resource allocation.

Automation and Maintenance
Scheduled tasks are where side projects usually fail. We use systemd oneshot services with timers rather than cron. This provides better logging and dependency management. When a job fails, the system records the exit code and output. You can see exactly why a task did not run, which is critical when you are maintaining the system alone.
Network configuration is handled by Caddy, which terminates TLS and obtains certificates from Let's Encrypt automatically. DNS is managed at Spaceship. This removes a significant layer of manual toil. You do not need to renew certificates or configure reverse proxies by hand. The system handles the boring parts, allowing you to focus on the code that actually generates value.
The Reality of Shipping
Turning a project into a product is less about writing complex algorithms and more about ensuring that the system behaves predictably under load. It is about accepting that your infrastructure is a product in itself. If the database is slow, the product is slow. If the TLS certificate expires, the product is down.
You must build systems that are easy to observe and easy to fix. This means choosing tools that integrate well with your existing stack. It means accepting that a single machine is a valid choice if it keeps the operational overhead low. The goal is not to build the most advanced architecture, but to build the one that you can maintain without burning out. For more on how we manage our content pipeline, see the PracandyFlix stories.


