Skip to content

Skills & Stack

An honest overview of my current technical skills, tools, and areas of focus. Every item below is grounded in a working project on the Projects page — what I haven't shipped yet, I won't claim.

Frontend

HTML Semantic markup, accessibility, structured content
CSS Custom styling, responsive layouts, Bootstrap customisation, CSS custom properties for theming
JavaScript Vanilla DOM patterns, AJAX, form handling, dynamic UI without frameworks
React Component-driven UIs with hooks and state — used in BarcodeLabelGen's label designer
Bootstrap 5 Component customisation, utility classes, dark-mode patterns
TailwindCSS Utility-first CSS with config-driven theming — used in BarcodeLabelGen's React frontend
Konva Canvas-based 2D graphics — powers BarcodeLabelGen's label designer with pixel-to-millimetre coordinate bridging
Vite Modern frontend build tool with HMR and ES-module-native dev server
Responsive Design Mobile-first development with grid and breakpoints

Backend

Python / Flask Web applications, blueprints, Jinja templating, CLI tooling
Node.js / Fastify ES modules, async/await, plugin architecture, zero-build setup — production use in MiniCMS
PHP Server-side logic, form handling, page routing
CodeIgniter 4 MVC routing, controllers, model layer — used in FlyingPlan
REST APIs JSON endpoints, route design, structured error handling
Static Site Generation Atomic regeneration of HTML from a database on publish — MiniCMS swaps a fresh tree into place

Data & Storage

MySQL / MariaDB Relational design, indices, joins, multi-tenant patterns
PostgreSQL Schema design and query work — used in BarcodeLabelGen
SQLite Production use with WAL mode, online-backup API, and atomic operations — MiniCMS runs entirely on a single file
SQL Data modelling, joins, reporting queries
SQLAlchemy Declarative models, relationships, query layer — used in CMMS and FlyingPlan
Schema Migrations Idempotent column adds, no-downtime evolution of live tables — Alembic for SQLAlchemy projects, custom ensureColumn helpers for raw SQLite
Redis Session storage and background job queue — used in BarcodeLabelGen's deployment stack

Operations & DevOps

Apache VirtualHost configuration, mod_proxy, Alias / Rewrite rules, directory-level access control
systemd Timers + oneshot services for scheduled backups, auto-publish, and reminder jobs
Tailscale Path-based Serve routing for tailnet-only previews and dev environments
Reverse Proxy ProxyPass with prefix preservation, header injection, per-location cache rules
Atomic Deploys Stage-then-rename swap so the live site never serves a half-published tree
Backups & Retention SQLite online-backup API, rsync mirrors, automated retention pruning via systemd timer
Docker / Docker Compose Containerised application deployment with multi-service orchestration — BarcodeLabelGen ships as a single Compose stack
Nginx Reverse proxy and static asset serving — used inside the Docker stack for BarcodeLabelGen alongside Apache on other deployments
Git / GitHub Version control, branching, atomic commits, collaboration

Engineering Patterns

Authentication & Security bcrypt password hashing, CSRF tokens, signed session cookies, rate limiting
Role-Based Access Control Granular module-level permissions with per-user overrides — 13 modules × 5 roles in CMMS
Input Sanitisation Server-side HTML sanitisation, magic-byte file validation, allowlist URL schemes
Multi-tenant Architecture Shared data with per-site scoping, shared parts inventory across locations — used in CMMS
Bilingual UX (i18n) Database-driven translation keys with a runtime switcher — CMMS ships ~850 keys per language
Scheduled Automation Three-tier reminder workflows, auto-publish on time triggers, idempotent runners
PDF / Document Generation Branded reports, paginated outputs, EAN-128 / GS1-128 barcode pages — xhtml2pdf, reportlab, fpdf2, WeasyPrint depending on the rendering needs
Image Processing sharp pipeline: WebP variants, EXIF strip, magic-byte verification on every upload
Rich-Text Editing TipTap / ProseMirror with a server-side sanitisation layer storing JSON + safe HTML
CRUD & Admin Dashboards Management interfaces with sidebar navigation, stat cards, and dark-mode patterns
Testing Native test runners with high coverage — pytest (BarcodeLabelGen 172+, Northwind 172+), node --test (MiniCMS 90+), targeted regression suites
OAuth2 & Third-Party APIs Google Calendar and Gmail integration with full OAuth flow, token refresh, and per-user scopes — used in NextStep CRM
Desktop GUI (Tkinter) Cross-platform desktop tools with Tkinter and CustomTkinter — visual field-mapping in xml-to-pdf, GUI wrapper around the CLI in civicoscr
Terminal UI (Textual) Multi-panel terminal interfaces with full CRUD workflows — Northwind runs the entire warehouse system in the terminal
Drag-and-Drop Editors Multi-select, align / distribute, duplicate, snap-to-grid on a canvas — BarcodeLabelGen's label designer

Domain Knowledge

To solve a problem properly, you have to understand the living process — the forms that flow through it, the data captured and transformed at each step, the reports that come out the other end. When a business doesn't yet have a computer database, or runs on a fragmented one, the decision to build an integrated system is the perfect moment to look closely at how the process actually works in practice — and to improve it where it can be improved.

Half of the database work happens on the floor: interviewing the people responsible for each step, gathering their information first-hand, and watching others do their job. It is the hardest part — and the most fascinating and instructive one — and it asks for tact, understanding, and a careful touch in human contact.

Industrial Maintenance Operations End-to-end CMMS lifecycle — reactive and preventive workflows, certifications, multi-site coordination

Reactive: problem reported (QR-scan on equipment or manual form) → supervisor triage → work order with technician assignment → parts pulled with stock validation, time logged, photos and files attached → sign-off. Preventive: scheduled tasks on a visual calendar with fixed and floating cadences plus counter-based triggers, generated automatically as due dates approach. Certifications: three-tier email reminder system (30 / 14 / 3 days before expiry) with automated renewal workflows. Multi-site asset registers with shared parts inventory and per-site custom fields.

CMMS
Warehouse Order Management Order-to-cash and purchase-to-pay — sales orders, picking and packing, invoicing, AR/AP reconciliation

Order-to-cash: sales order → picking and packing against stock availability → despatch → branded PDF invoice → AR collection with aged-balance reporting. Purchase-to-pay: purchase order → goods-in receiving → supplier invoice → AP payment scheduling. A dedicated reconciliation panel matches payments against invoices and surfaces outstanding balances by counterparty.

Northwind
UAV / Drone Flight Operations Mission planning, risk assessments, pilot tracking, weather integration, regulatory compliance

Operational dashboards for drone fleets — mission and grid/route planning, risk-assessment forms aligned with CAA operational categories, real-time weather feeds, pilot and equipment currency tracking, and certifications monitoring so a job is never assigned to a non-current pilot.

FlyingPlan
Logistics Labelling & Barcode Standards GS1-128 / EAN-128 / EAN-13 encoding, application identifiers, label template patterns

Working knowledge of the GS1 standards used across warehouse and shipping operations — application identifiers (batch, expiry, weight, SSCC), check-digit math, paper and roll formats. Label templates that batch-generate from CSV, Excel, or SQLite sources with dynamic placeholders, barcodes, and QR codes baked into the design.

BarcodeLabelGen GS1-128 Generator xml-to-pdf
CRM & Sales Pipeline Contact records, lead lifecycle, interaction history, calendar / email touchpoints

Contact and company records with lead-stage progression, interaction logging (calls, emails, meetings, notes), task and follow-up scheduling, and Google Calendar / Gmail integration so a lead's full conversation history lives in one place.

NextStep CRM

This list reflects where I am now. Every project I ship sharpens what's here — and shows me what to learn next.