Portfolio iconElysCom
✍ Blog

Articles & Thoughts

Exploring ideas in web development, design systems, and software engineering.

Two editors, one diary

How to stop a receptionist and a doctor from silently deleting each other's work — the bug, the two-step fix, the race the first fix didn't close, and the checklist to steal.

·15 min read

Connecting pgAdmin through an SSH tunnel — and landing in the wrong database

pgAdmin connected on the first try and showed me a server with no tables in it. Nothing was broken: on a Coolify VPS every application brings its own PostgreSQL, they all answer to the user postgres, and a successful login tells you almost nothing about which one you reached.

·12 min read

Deploying a multi-tenant booking SaaS: what a real customer actually needs

A customer said yes, and asked what they need to install. Nothing — which turns one question into two: deploy the platform once, then onboard them through the product. This is the whole path, including the three failed deploys and the CERT-Bund report that reordered the steps.

·28 min read

Hardening a Hetzner VPS: SSH keys, a cloud firewall, and four traps

A port scan of my own server came back with PostgreSQL and the Coolify dashboard open to the internet. Closing them took an afternoon; the SSH key that was supposed to be the easy part took considerably longer, and cost me a lesson about a single hyphen.

·16 min read

The queue is disposable: what a Redis worker actually bought us

A background worker and a Redis queue added no visible feature. What they added was the ability to keep promises the system had only been making.

·15 min read

Encrypting Patient Data When the Server Must Not Hold the Key

Field-level AES-256-GCM with clinic-held keys, blind indexes, a canary against wrong keys, age-encrypted backups the server can't read, and what a disaster-recovery fire drill actually taught us.

·13 min read

TurboRepo workflow that leverages both Antigravity/Agent Kit and Claude Code together.

How to create a consistent workflow to develop a Turborepo app with React/NextJS, Fastify, BetterAuth, Prisma, PostgreSQL, Tailwind v4, and Shadcn/ui stack. Be aware that Claude Code has overlapping tools with Antigravity.

·10 min read

Configure Claude Code within Antigravity

With this setup, Claude Code in Antigravity will understand your Next.js 16.2.1, Prisma, PostgreSQL, Tailwind v4, and shadcn/ui stack – and follow your rules consistently across sessions.

·10 min read

Multilingual Voice App

# Crafting the Ultimate Retell System Prompt for Your Multilingual n8n Voice App So, you're building a voice AI agent with **Retell AI** and orchestrating the backend with **n8n**. You've got the webhooks set up, the nodes connected, and the LLM is ready to roll. But there's one piece of text that will make or break your user experience: **The System Prompt.** If you're building a multilingual application, the system prompt isn't just a set of instructions; it's the architectural blueprint for your agent's brain. A weak prompt leads to broken language switches, robotic tone shifts, and confused users. Here is how to structure a comprehensive, production-ready system prompt for a multilingual Retell agent integrated with n8n. ## The Architecture of a Multilingual Prompt A robust prompt for this stack needs four distinct layers: 1. **Core Identity & Immutable Rules** 2. **The Language Matrix** 3. **The Data Injection Layer (The n8n Bridge)** 4. **Retail-Specific Guardrails** Let's break each one down with a concrete example. We'll build a prompt for a fictional "Global Travel Support" AI. --- ### 1. The Core Identity (The "Who") Start by anchoring the AI. This prevents the LLM from drifting into generic assistant territory. ## CORE IDENTITY You are "Nova," a senior customer support specialist for "Global Travel Support." Your tone is professional, empathetic, and efficient. You are not a salesperson; you are a problem solver. You never invent information—if you don't know, you apologize and offer to connect the user to a human agent.

·6 min read