Skills

Background & Info

Backend developer specializing in business process automation and self-hosted infrastructure. I focus on resolving human bottlenecks where automation can eliminate repetitive work.

I build open-source projects, commercial SaaS applications, and help clients with automation and infrastructure consulting. I've led small development teams and worked directly with clients on technical requirements.

Check out the Projects page to see what I've built, or follow along on the Blog for updates.

Alternatively, if you're interested in what I can work with, check out the technology list bellow.


Live long and prosper. 🖖👽

Programming Languages

Go

backend systems concurrency api

I picked up Go at the end of 2022, and despite its quirks, it quickly became a go-to (pun intended) language for building quick-to-deploy, low-overhead web services and CLI tools.

While Go's error handling is not its strongest aspect, the language excels at filling the gap between ecosystems like Python, Java, and C++. It significantly reduces boilerplate while producing fast, easily configurable, single-binary builds - making it ideal for rapid testing and deployment across different environments.

With its pragmatic approach to problem-solving and a steadily expanding package ecosystem, Go is often among my first considerations when starting a new project, depending on the project's requirements and scope.

Used in: This website, nullGuard

Bash 💖

automation shell linux

Bash is my favorite technology to work with. I enjoy writing complex scripts manually - it's like a puzzle game that happens to solve real problems. Native on any Linux environment, minimal dependencies, and a syntax I've internalized enough to think in.

The most significant Bash project I've shipped was a full reimplementation of JCL batch logic for migrating off Control-M. Enterprise-grade automation, written entirely in shell.

Java

backend enterprise oop

Throughout the bulk of my career, I've worked with Java as a production language for building large-scale backend systems, long-running services, and enterprise-grade applications where stability, tooling, and ecosystem maturity are critical.

Using Spring Boot and Java EE, I've built REST APIs, authentication gateways, invoice and payment systems, and high-performance bulk email dispatch backed by RabbitMQ.

Java's verbosity can be a drawback in smaller projects, but it excels in scenarios that benefit from strong typing, robust concurrency models, and battle-tested frameworks. For financial and revenue-critical systems, Java remains my go-to choice - prioritizing function, correctness, and predictability over form.

Used in: nullInvoice

JavaScript & TypeScript

frontend web

I use JavaScript for frontend development - DOM behavior, UX interactions, progressive enhancement. Depending on the problem, I reach for Angular, htmx and plain JS, or even jQuery when working with legacy codebases.

I don't use JavaScript for backend or business-critical logic. It's supposed to be in the presentation layer, and I treat it that way.

Used in: This website, nullInvoice

Python

backend scripting automation ai

I use Python for backend services, scripting, automation, and AI-adjacent tooling. My experience includes an agentic OCR application, a local LLM code assistant, ETL pipelines, and REST services built with Flask and FastAPI.

Python excels at prototyping and rapid delivery, but I find larger codebases harder to maintain due to its implicit object models and whitespace-delimited syntax. I treat it as a pragmatic productivity tool rather than a long-term foundation for large systems.

Used in: webui-manager, llamaman

SQL

database query data

SQL is a core, non-optional part of every system that requires structured data persistence.

My experience spans MySQL, MariaDB, PostgreSQL, SQLite, Microsoft SQL Server, and IBM Db2.

Databases are a first-class component of the architecture - favoring explicit schemas, constraints, and well-defined queries over implicit or application-level guarantees. Regardless of the surrounding language or framework, S-Q-L (not "sequel" 🙂) remains the foundation for correctness, performance, and long-term maintainability.

AI & LLM

Llamaman

ai llm self-hosted local

I used Ollama for local LLM experimentation and development - RAG projects, tool-calling agents, OCR applications, data analytics, and chat interfaces. Then I created Llamaman - a self-hosted web UI for managing llama.cpp instances.

Llamaman expands on the ideas of Ollama but without the extra overhead. Much faster inference - straight from HuggingFace. Bridges the end-user self hosted LLM setup and production server features.

vLLM

ai llm inference production

vLLM is a preferential tool when an application using a local LLM deployment needs to move into production on self-hosted infrastructure. I prefer it for optimized inference and better throughput, the things that matter once experimentation is over and the model needs to run reliably at scale.

LiteLLM

ai llm proxy rate-limiting

LiteLLM sits in front of paid LLM APIs in both development and production. I use it for rate limiting, budget enforcement, usage statistics, and caching to manage throughput. The main convenience is its OpenAI-compatible proxy interface - I can swap LLM providers without rewriting application code - one integration, multiple backends.

MCP (Model Context Protocol)

ai tooling integration

I've built a few custom MCP services that expose complex workflows to LLMs as callable tools. It's a clean way to give models access to external systems and knowledge.

Prompt Engineering

ai optimization

My experience is tuning prompts across various models to get consistent, predictable behavior for specific use cases. Different models respond differently - what works for one often needs adjustments for another.

Enterprise & Mainframe

IBM & MicroFocus COBOL

mainframe legacy banking

During the longest project I've worked on, COBOL was central to production administration systems, batch processing, accounting, reporting, and spedition. While the IBM and MicroFocus enterprise distributions have some semantic differences, unlike most modern developers I like COBOL, due to its procedural approach to data driven systems. While debugging Java in production is the modern approach, there's a reason why banks, insurance and aviation companies, large scale manufacturing, retail and governments still use it and many of them are not looking to move away. It's legacy but it's reliable.

IBM JCL

mainframe legacy batch

I know JCL a little too well. I developed a system to migrate away from Control-M managed JCL, which meant reverse-engineering the bulk of the primary JCL logic through behavior observation, documentation, and reimplementation. Not glamorous work, but the kind that teaches you a system inside out in painful detail.

IBI WebFocus

bi reporting analytics dsl

IBI WebFocus is an enterprise reporting platform that supports its own procedural DSL for complex data extraction and parsing.

IBM DB2 (HADR, Clustering, Federation)

mainframe clustering ha

I've done the full range of DB2 administration - setup, clustering, federation, point-in-time and full backups, TSM (Spectrum) integration, restores in production, IXF table extraction and imports, and advanced configuration.

IBM AIX

unix mainframe

AIX is IBM's Unix operating system, mostly found in enterprise environments running on Power systems hardware. I've worked with high availability setups, LVM management, installation, and SMITTY configuration - the usual admin work.

IBM WebSphere, TXSeries, CICS

middleware transactions

I've installed and configured WebSphere, TXSeries, and CICS environments, including resource definitions - programs, transactions, files, queues, mapsets, DB2 access, web services, security profiles. The usual setup work for getting CICS regions running and connected. On the side, I built an experimental program to translate BMS screen definitions to HTML - a small project to see how far mainframe UI logic could be modernized without a full rewrite.

Broadcom DollarUniverse Workload Automation

scheduling automation enterprise

Think cron on steroids - complex dependencies, batch logic, scheduled tasks, sessions, JCL and EJB integration, cross-node dependencies, service orchestration. It handles 24/7 real-time complex modular workloads with full observability.

Extremely useful, not widely known outside enterprise environments.

Databases

PostgreSQL

relational open-source

PostgreSQL is my go-to for high-performance database work, especially when I need extended datatype support or plugins like pgvector for LLM vector search.

It works really well-until high availability becomes a priority. Tools like Patroni, pgAutoFailover, and EDB solutions are designed to help, but I’ve run into issues more than once. Since Postgres, its plugins, and HA layers are maintained separately, the environment can feel a bit fragmented. I still use Postgres where it's a strong fit, but I'm more cautious when HA is a critical requirement.

MariaDB Galera Clusters

clustering ha database replication

I specialized in MariaDB Galera clusters while looking for a High Availability solution that actually works, since most enterprise products don't seem to. 🙂 What I found was genuinely impressive: stable multi-master replication with HA that actually holds up in practice. I've set up multiple geographically distributed clusters for clients and easily resolved every problem I've encountered with them.

Eventually I took over maintenance of a FOSS container project that inherited Bitnami's mariadb-galera work, since I knew the system well enough to keep it going.

Used in: containers

Redis

cache nosql in-memory

In-memory caching, server-side session and authorization persistence, high-performance atomic values storage engine for real-time systems. The usual.

Infrastructure & DevOps

Docker / Docker Swarm

containers orchestration

Everything runs in containers.

Used in: containers, nullInvoice, nullGuard, webui-manager

VPN (WireGuard, OpenVPN)

networking privacy remote-access

I've set up my own VPN infrastructure using both WireGuard and OpenVPN. I also run a WireGuard UI application, called nullGuard, to make configuration and management less painful.

Used in: nullGuard

Ansible

automation iac configuration

Automated remote server and environment orchestration.

Let's Encrypt

ssl certificates automation

It's mandatory to be able to work with Let's Encrypt in self-hosting scenarios. Auto cert renewal with Certbot and pre and post hook event hooks.

Cloudflare

ssl cdn dns

The gift that keeps on giving. WAF, DNS, SSL/TLS with origin certificates for serious deployments, caching, bot management, rate limiting, load balancing, and health checks. When I'm putting something on the public internet and want it to stay up and not get abused - Cloudflare sits in front of it.

Fail2Ban

firewall intrusion-prevention

Advanced rules, third-party security list lookups, service monitoring and custom actions with Cloudflare's WAF API.

Nginx

proxy load-balancer web-server

Ingress, cert resolution, and reverse proxying.

HAProxy

load-balancer proxy traffic-router

High Availability load balancing proxy for SaaS applications, stores and multi-master Galera clusters.

RabbitMQ

messaging queue async microservices

Reliable async messaging. I've used RabbitMQ in a high-performance bulk email dispatch marketing system and a smaller service pushing notifications to hundreds of client consumers.

Cloud & Hosting

Self-Hosted / On-Premise Infrastructure

Throughout my career I've primarily worked with on-prem systems. They've survived every outage that would've taken us down if we'd been renting someone else's infrastructure. More work, more control, fewer surprises.

AWS

AWS is fine when a project requires it - mostly EC2 and S3.