Software engineer · infrastructure generalist
I build and run full products end to end — the app, the database, the server it lives on, and the DNS record that points at it. Most of my work sits at the seam between application code and the infrastructure underneath it, which is the part that usually decides whether a thing actually ships.
Right now that means multi-tenant SaaS on Next.js and Postgres, Python services on FastAPI, and a self-hosted stack I administer myself: LiteSpeed, Docker, self-hosted Supabase, Postfix/Dovecot mail, and the Let's Encrypt plumbing that keeps it all valid.
Add a personal line or two here — where you're based, what you're looking for, what you like working on.
Working with
TypeScriptNext.jsReact PythonFastAPISQLAlchemy PostgreSQLSupabaseRow-Level Security DockerLiteSpeedLinux BashDNS / TLSSMTP
Multi-tenant ITSM SaaS
A ticketing and IT service-management platform built for multiple organisations on one deployment. Each tenant's data is isolated at the database level rather than in application code — Postgres row-level security policies enforce the boundary, so a query that forgets its tenant filter returns nothing instead of returning everyone's tickets.
Notes
Add: what stage it's at, who it's for, anything you want to claim about scale or results.
Python service · backend for Fleaux
A FastAPI service backing the Fleaux product surface, running against a 77-table PostgreSQL schema managed with SQLAlchemy and Alembic migrations. Containerised, bound to localhost, and published through LiteSpeed so the container itself is never directly reachable from the internet.
Notes
Add: what the service does for users, described at the capability level rather than by endpoint.
Photo rating app
A swipe-style photo rating web app — upload a photo, let people vote, watch the tally. Built on the same Next.js and Supabase foundation as the helpdesk platform, which made the shared-auth boundary an interesting problem: two products on one auth server means a signup in one can leak state into the other unless you draw the line deliberately.
Notes
Add: current status, and whether you want this listed publicly at all.
One box, many services
Everything above runs on infrastructure I administer directly rather than renting as a managed service. That is a deliberate choice: it is the fastest way to actually learn where the failure modes live.
Running here
Representative fix: container DNS across the whole box broke because the host's /etc/resolv.conf carried a search directive Docker inherited, which sent one service into a crash loop. Diagnosing it meant reading resolver behaviour rather than application logs — the answer was a dns-search entry in daemon.json.
RANDALL VEAL City, State | randallveal@gmail.com | randallveal.me =============================================================== SUMMARY =============================================================== Software engineer who ships and operates full products: application code, database design, containerisation, and the servers and DNS underneath. Comfortable owning a stack end to end. =============================================================== TECHNICAL SKILLS =============================================================== Languages TypeScript, JavaScript, Python, SQL, Bash Front end Next.js (App Router), React Back end FastAPI, SQLAlchemy, Alembic, PostgREST Data PostgreSQL, Supabase, row-level security, Redis Infra Docker, Docker Compose, LiteSpeed, CyberPanel, Linux Ops Let's Encrypt/ACME, DNS, Postfix/Dovecot, OpenDKIM, SPF/DKIM/DMARC, reverse proxying, systemd =============================================================== PROJECTS =============================================================== HELPDESK ITSM — Multi-tenant IT service management SaaS Next.js + self-hosted Supabase. Tenant isolation enforced by Postgres RLS policies rather than application-layer filtering, with a test suite that runs in a rolled-back transaction so negative cases cannot pass silently. FLEAUX API — Python backend service FastAPI over a 77-table PostgreSQL schema with SQLAlchemy and Alembic. Containerised behind a LiteSpeed reverse proxy. SMASHRPASS — Photo rating web app Next.js + Supabase storage. Shares an auth server with a sibling product; scoping identity per-application was the core problem. SELF-HOSTED INFRASTRUCTURE Administer a multi-tenant LiteSpeed host running a dozen domains, a full self-hosted Supabase stack, and a mail server with DKIM signing and DMARC alignment. =============================================================== EXPERIENCE =============================================================== TITLE — Company 20XX – Present - Replace this block with your real roles. - One line per accomplishment, lead with the outcome. TITLE — Company 20XX – 20XX - =============================================================== EDUCATION =============================================================== Degree / programme — Institution, year (or delete this section)
The reliable route is email. I read it.
| randallveal@gmail.com | |
| Site | randallveal.me |
| GitHub | github.com/your-handle |
| linkedin.com/in/your-handle |
This window has no form on purpose — a contact form needs a server endpoint and a spam story, and a mailto: link has neither problem.
README.WRI — about this site ================================================================= What you are looking at is a portfolio dressed as Windows 3.1. Not a screenshot and not a theme layered over a scrolling page: the windows drag, resize, minimise to desktop icons, stack in z-order, and carry working menus. HOW IT IS BUILT No framework, no build step, no dependencies. Three CSS files and four scripts, served as static files by LiteSpeed. The whole thing is a few hundred kilobytes and works with the network turned off after first load. THE DETAILS THAT MATTER Window captions are centred, because 3.1 centred them — Windows 95 is what moved them left. Inactive title bars go white with black text rather than grey. Dragging a window moves a dotted outline and only commits on mouse-up, which is what 3.1 did on hardware that could not repaint fast enough to drag live. Every colour on screen comes from the 16-colour VGA palette. The icons are hand-drawn SVG on a crisp-edges canvas, so they stay blocky instead of going smooth when the browser scales them. KNOWN LIMITATIONS On a phone this collapses to full-screen windows and drops window dragging, because a 3.1 desktop on a 390-pixel screen is a joke at the visitor's expense. Minesweeper is real. Solitaire is not — try it anyway. ================================================================= Built by Randall Veal. Type HELP in the MS-DOS Prompt for more.