THE WORK

Twenty-eight systems, described honestly.

Written from the source code, not from memory - what each one does, what it is built on, what it talks to, and which part was genuinely hard.

28
systems described here in detail
90+
platforms delivered end to end
60+
third-party integrations across them
17
languages shipped on one platform
No client is named anywhere on this site. Each system below is described by sector, size and function, which is enough to judge the architecture of the platforms. On a call I can go a great deal deeper and show you much of it directly.
HEALTHCARE AND CLINICAL
012026 - PRESENT
PROJECT 01

Operating system for a fifteen-clinic medical group

One Django project replacing eight disconnected tools across fifteen clinics: the bilingual public site, a services and subscriptions shop, patient and lead CRM, a laboratory order tracker with courier waybills, fiscal accounting driving cash-register hardware, staff time tracking fed by a desktop client, internal chat, and advertising reporting - all behind one admin with clinic-scoped permissions across ten roles.

BUILT WITH
DjangoPythonPostgreSQLMariaDBRedisDockerNGINXUbuntu
INTEGRATED WITH
StripeDatecs fiscal printersTrustedFormSMSAPIAnthropicMeta PixelMeta Conversions APITikTok PixelGoogle Tag ManagerGoogle AnalyticsFrankfurterreCAPTCHAParsliCourierManagerSMTPGoogle Sheetsip-apiPlausibleOutbrainTaboolaMeta Marketing APISoftOne / Integra ERP
STACK
Django 5.2, PostgreSQL and MariaDB, server-rendered, no SPA. Around 120 models across fourteen apps and 170 templates. Deployed to shared hosting under Passenger, with cron rather than Celery because no background process survives there.
THE HARD PART
Server-side Conversions API with browser-Pixel deduplication on a shared event id, hashed PII, fired on a background thread and failing open. Fiscal-printer drivers with a null-driver degraded mode, so an unreachable device marks a receipt pending instead of blocking the sale. A bearer-token API for an out-of-repo Windows time-tracking client uploading per-minute activity snapshots. A priority-resolved role system - superuser, then group, then clinic-staff record - driving ten different dashboards off one codebase.
Read the full case study
022026
PROJECT 02

AI x-ray reading platform

Patients upload a panoramic x-ray and get back AI findings with confidence scores, a priced treatment plan and an optional second opinion; clinics get a subscription-gated portal and a directory listing. Four separate surfaces - public site, patient app, clinic portal and admin - on one Django install.

BUILT WITH
DjangoPythonPostgreSQL
INTEGRATED WITH
StripeMeta PixelMeta Conversions APIGoogle Tag ManagerGoogle Placesip-apiOpenAI-compatible vision APIOpenStreetMap
STACK
Django 5.2, PostgreSQL, Stripe, GrapesJS page builder in the admin. Twenty-five models across four model-bearing apps.
THE HARD PART
The AI backend sits behind a single normalised result type with three interchangeable implementations - mock, hosted API and self-hosted - selected by one environment variable, so the entire product runs end to end with no AI vendor attached and no code changes. A clinical output pipeline of upload → analysis → findings → treatment plan → line items, each finding carrying its own confidence band. First-touch attribution middleware capturing four ad-platform click ids into a lead-to-paying funnel report.
032025
PROJECT 03

Medical-tourism clinic site and patient portal

Marketing site, public appointment calendar and patient self-service portal for a clinic selling to international patients, in eight languages. The calendar shows real availability while leaking nothing - booked slots render only as unavailable.

BUILT WITH
DjangoPythonMySQLNGINX
INTEGRATED WITH
Meta PixelreCAPTCHASMTPip-api
STACK
Django 5.2, MySQL, modeltranslation across three apps, CKEditor 5, GrapesJS landing builder.
THE HARD PART
An appointment request-to-approval state machine: a visitor request stays pending until staff approve, at which point a patient record is created or matched and a real appointment materialised. Every lead stores its answers twice - as JSON and as individual rows - alongside IP, user agent, referrer, geography and the full UTM and Meta click-id set. Campaign landing pages are mounted outside the language-prefix routing, so paid traffic never lands on a locale redirect.
BOOKING, HOSPITALITY AND RENTAL
042026 - PRESENT
PROJECT 04

Burnout prevention and recovery platform

A free burnout-risk quiz and daily check-ins funnel into a three-tier subscription pairing an AI coach with stress-science courses, guided audio, journaling, community circles and paid one-to-one coaching over embedded video. A parallel B2B track sells seats to employers with a coaching budget, and a multi-level ambassador programme pays commission on referrals. Django API, React web app, static marketing site and a Flutter client, in one repository.

BUILT WITH
DjangoPythonPostgreSQLCeleryRedisReactViteTailwind CSSFlutterDartDocker
INTEGRATED WITH
StripeSmartBillSMSAPIFirebase Cloud MessagingOpenAIAnthropicMeta PixelMeta Conversions APITikTok PixelGoogle Tag ManagerGoogle AnalyticsZoom Video SDKGoogle OAuthreCAPTCHAFacebook LoginLinkedIn OAuthSMTPGoogle Sheetsip-apiSentryPlausibleMicrosoft ClarityAmazon LoginApple Sign InCookiebotExchangeRate-APIGoogle PerspectiveMyMemoryTikTok Login
STACK
Django 5.2 with DRF and JWT, PostgreSQL, Celery and Redis, Argon2 hashing, forty-nine local apps. React with Vite and Tailwind on the front, Flutter for mobile. Sentry, gunicorn with gevent.
THE HARD PART
A recommendation engine that grades seven nervous-system states from a check-in, applies hard eligibility gates, compresses priority into a six-point band so context beats popularity, and then samples by softmax rather than taking the argmax - so the whole catalogue stays reachable instead of collapsing onto the same twenty items. A fourth slot is reserved for discovery and sampled by recency. It runs on raw driver queries rather than the ORM because it executes on every screen. Retrieval is grounded in roughly thirty thousand structured solutions extracted from about ninety-five books, with a prompt that forbids the model from answering out of its own general knowledge and an explicit crisis branch. A Monte Carlo harness runs the real engine over synthetic sessions - fifty thousand check-ins in one run, seventy thousand balanced sessions in another - asserting that no crisis state receives an inappropriate card and that no card is unreachable. It also surfaced a genuine detection gap, which is what a harness is for. Provider choice and every API key resolve from an admin-editable table before falling back to environment, so vendors and keys rotate without a deploy.
Read the full case study
052026
PROJECT 05

Villa and retreat booking, synced across four OTA channels

Direct booking and payment for three properties in Tenerife, kept in sync with Airbnb, Booking.com, Vrbo and Agoda through a channel manager, with deposit logic, tokenised online check-in, a retreat seat-purchase flow and a lead-ingest API fed by a scraper.

BUILT WITH
DjangoPythonMySQLPostgreSQLCeleryRedisDocker
INTEGRATED WITH
StripeSmoobuSMSAPIMeta PixelMeta Conversions APIGoogle Tag ManagerGoogle AnalyticsreCAPTCHASMTPGoogle SheetsPlausibleMaxMind GeoLite2ipapi.co
STACK
Django 5.1, MySQL in production with PostgreSQL and SQLite fallbacks for development, Celery and Redis with an eager fallback, django-axes lockout, Silk profiling, GrapesJS builder. Forty models across six apps.
THE HARD PART
Payment finalisation is deliberately doubled and idempotent - the same routine runs from the Stripe webhook and from the return page, returning early if the booking is already paid, so a missed webhook cannot lose a paid booking. The channel manager offers no webhook signature scheme, so the endpoint is authenticated by a secret in the URL path, with a test that sets it empty to prove it fails closed. A booking state machine routes confirmed stays onto the direct channel and blocks onto a separate one; the property with no channel id is matched locally by slug instead. Every outbound email is persisted before delivery by a custom mail backend.
062025
PROJECT 06

Apartment-hotel booking with full Romanian fiscal compliance

Direct Stripe booking, OTA sync, and the complete set of Romanian fiscal documents - invoice, proforma, receipt, collection, fiscal receipt and payment order - issued through an accounting provider. The Django backend is the finished part; separate staff and guest mobile apps were built against an API the backend does not yet expose, and are unfinished.

BUILT WITH
DjangoPythonMySQLCeleryRedisFlutterDarthtmxAlpine.jsTailwind CSS
INTEGRATED WITH
StripeSmartBillSmoobuFirebase Cloud MessagingBrevoSendGridGoogle Tag ManagerGoogle AnalyticsreCAPTCHAPlausible
STACK
Django 5.1, MySQL, Celery with a Redis-optional eager fallback, Unfold admin with a vendored studio, HTMX and Alpine over Tailwind. Around forty models across ten apps. Flutter for both mobile clients, JWT in secure storage.
THE HARD PART
An in-progress checkout is held as a temporary booking and only promoted to a real one when Stripe confirms the session, so abandoned checkouts never hold inventory. Six distinct fiscal document types share common party and line mixins rather than being one invoice model with a type flag. Guest records reconcile across channels through a canonical-guest layer, with separate individual and company registries, so the same person arriving from an OTA and from a direct booking is one record. Every integration secret resolves from the database first with a sixty-second cache, so keys rotate live.
072025
PROJECT 07

Car rental booking with email-code confirmation

A fleet filterable by brand, type, transmission, fuel, seats, price and location, with standard rentals and fixed-price packages. Payment is taken at pickup rather than online, so the whole confirmation problem is solved with a verification code instead of a payment gateway.

BUILT WITH
DjangoPythonMySQLTailwind CSSAlpine.js
INTEGRATED WITH
Google AnalyticsFrankfurterreCAPTCHASMTPWhatsApp click-to-chatexchangerate.host
STACK
Django 5.0, MySQL, modeltranslation across eight languages, Tailwind and Alpine from CDN with no build step. Thirty-eight models.
THE HARD PART
Booking confirmation by six-digit email code, rate-limited per IP with a five-attempt cap, fifteen-minute expiry and a resend cooldown. Signed time-limited tokens give an anonymous guest access to their own booking page for twenty-four hours without an account. Pricing is recomputed server-side on every save from a five-band day-tier table crossed with insurance level, with discount applied to the rental subtotal only - never trusted from the client.
LEAD GENERATION, TELEPHONY AND TRADING
082026
PROJECT 08

Multi-tenant SaaS selling software subscriptions, with marketing services on top

One Django install serving the platform's own site, every client's subdomain and every client's custom domain. Each tenant gets the slice of back office the platform admin grants them: a page builder, a multi-step form builder with SMS verification, a shop with payments and fiscal invoicing, courier waybills and fulfilment, a CRM covering orders, consultations, tickets, loyalty and invoice OCR, first-touch attribution and a client dashboard. Lead generation is one of the modules, not the product.

BUILT WITH
DjangoPythonMySQLRedisCeleryReactViteTypeScriptDocker
INTEGRATED WITH
StripeEuPlătescSmartBillFGOFAN CourierSamedayCargusGLSDPDDHLSinapseriaFulfiloHelpshipTrustedFormTCPA & DNC scrubbingSMSAPITwilioWhatsApp Business APIAnthropicAzure OCRMeta PixelMeta Conversions APITikTok PixelGoogle Tag ManagerGoogle AnalyticsreCAPTCHAcPanel and WHMRRDBliveCallManagerTurnstileCaddyZoom
STACK
Django 5.1, MySQL, Redis and Celery, DRF with JWT and OpenAPI, Unfold admin, modeltranslation and parler. A React 19 application built with Vite and shipped pre-built. Fourteen apps, seven languages with full translation catalogues.
THE HARD PART
Lead scoring by language model with web search: form answers, UTMs, click ids, authentication result and do-not-call status are assembled into a dossier and scored into a band with a rationale and a recommended action, using a per-client key. A three-part compliance stack - full scrub with line-type and wireless detection, litigator check, and reassigned-number lookup against a consent date. Tenancy is resolved from the Host header with a five-minute cache, and every form submission is re-checked against the host's client, so a cross-tenant lead is structurally impossible. The form builder stores an HMAC of each verification code rather than the code, and every consent checkbox writes an immutable record of the exact wording, IP and URL.
092026
PROJECT 09

US lead marketplace with a thirty-vendor scoring pipeline

Paid traffic lands on a quiz; the resulting lead is scored against roughly thirty fraud, compliance and intent vendors, routed to a buyer by capacity and geography, pushed into a dialler for live transfer, delivered into the buyer's CRM, and billed. Buyers self-serve through a portal with a wallet; media buyers get cost-per-lead dashboards.

BUILT WITH
DjangoPythonPostgreSQLClickHouseRedisCeleryWagtailDocker
INTEGRATED WITH
StripeConvosoGoHighLevelHubSpotPipedrivemonday.comZapierTrustedFormMaxMind minFraudFingerprintJSTwilioBrevoOpenAIAnthropicMeta PixelMeta Conversions APITikTok PixelGoogle Tag ManagerGoogle AnalyticsGoogle OAuthreCAPTCHAFacebook LoginMicrosoft OAuthip-apiPlausibleOutbrainTaboolaRRDBliveGoogle AdsDialRight (CallerID Reputation)Disposable-email blocklistGravatarMaxMind GeoIP2Meta Marketing APIMicrosoft UETSalesforceipapi.coipify
STACK
Django 5.2 with Wagtail, two datastores - PostgreSQL for operational state and ClickHouse as the tracking firehose - Redis, Celery with beat and Flower, DRF plus a hand-rolled JWT layer for mobile. Forty-six models in the core app alone.
THE HARD PART
Each vendor maps to one of three sub-scores - reachability, authenticity, intent - run in parallel through a thread pool and averaged into a composite grade with admin-tunable weights. Adapters that error or skip drop out of the denominator rather than scoring zero, and any blocking adapter forces the lowest grade outright. The signal set includes behavioural biometrics, TLS fingerprinting, scroll depth and form cadence alongside three language-model sub-signals. Buyer routing filters on credit, working hours, daily and weekly capacity, vertical and geography, then breaks ties on twenty-four-hour load before priority. Every outbound vendor call writes a log row with endpoint, status and response summary, specifically so per-lead vendor cost can be reconciled.
Read the full case study
102026
PROJECT 10

A staff mobile client that builds its own screens

A Flutter admin app for the lead marketplace that renders list, detail and edit screens for any model in the Django admin without a single Flutter change - it reads the admin registry over REST and generates the forms from the schema.

BUILT WITH
FlutterDartDjangoPython
STACK
Flutter with Riverpod, Dio and go-router, secure storage for tokens. A companion Django app exposing the admin registry as REST.
THE HARD PART
Permissions are not reimplemented: the API maps HTTP verbs onto Django's own view, add, change and delete permissions, and list search, paging and ordering come straight from each admin class's own configuration. Adding a model to the Django admin adds it to the mobile app. A sibling buyer app mirrors the web application's fourteen per-client theme sets, reading the active one at sign-in and caching it so there is no cold-start flash of the wrong brand.
112026
PROJECT 11

Trading-signal platform with an in-house confluence engine

A subscription service publishing trade ideas across five desks with enforced position sizing, generated by a technical-confluence engine with model-scored news sentiment, delivered through a web app and three Flutter clients - mobile, macOS and Windows - sharing one codebase. New members cannot reach the dashboard until they have verified email and completed a risk questionnaire.

BUILT WITH
DjangoPythonMySQLRedisCeleryWagtailFlutterDartWeb3.js
INTEGRATED WITH
StripePayPalPaddleTwilioFirebase Cloud MessagingAnthropicGoogle Tag ManagerGoogle AnalyticsTwelve DataSMTPPlausibleBNB ChainAlpha VantageCoinGeckoMarketauxNewsAPIexchangerate.host
STACK
Django 5.2 with Wagtail, MySQL, Redis, Celery with beat, Channels and Daphne for WebSockets, DRF with JWT, pandas and numpy, web3 for the crypto rail. Flutter and Dart for the mobile and desktop clients, one lib/ shared across all three. Seventeen configured languages.
THE HARD PART
Seven independent indicator reads per timeframe, and a timeframe only agrees when at least five of the seven concur - then multi-timeframe confirmation on top, with optional candlestick and news gates and ATR-derived stops and targets. Every pass writes an audit row whether or not it produced a signal, and dry-run is the default. The crypto payment rail holds no private key on the server: a scheduled task watches the chain for transfers to a receiving address, matches pending deposits by amount and confirms after twelve confirmations. Two stacked middlewares make the product unreachable until onboarding is genuinely complete.
COMMERCE, ERP AND INTERNAL TOOLS
122025
PROJECT 12

Fashion e-commerce with fulfilment and fiscal invoicing

A clothing and footwear store with brands, nested categories, per-variant sizes and stock with QR codes, cart and checkout - and a back office that generates courier waybills and issues fiscal invoices, so an order becomes a shipment and an invoice without leaving the admin.

BUILT WITH
DjangoPythonMySQLTailwind CSSAlpine.js
INTEGRATED WITH
PayPalSmartBillFAN CourierFrankfurterreCAPTCHA
STACK
Django 4.2, MySQL, Unfold admin with a Chart.js dashboard, modeltranslation across eight languages, Tailwind and Alpine from CDN. Sixty-two models across nine apps, sixty-three tables.
THE HARD PART
The fulfilment chain is real rather than declarative: waybill generation logs the full request, response and error against the order, and invoicing issues documents and reversals against it. Dual-currency pricing stores a native and a display amount as a pair rather than one amount and a rate, so a historical order does not silently reprice when the exchange rate moves.
132025
PROJECT 13

Offer-to-contract-to-invoice ERP for an interior design studio

The public portfolio is the small half. The back office turns a project into a room-by-room priced offer, the offer into a Romanian legal contract, and the contract into proformas, invoices, payments and receipts - generating the client-facing offer and contract PDFs in-house.

BUILT WITH
DjangoPythonMySQL
INTEGRATED WITH
SmartBillGoogle AnalyticsFrankfurterlista-firme.inforeCAPTCHASMTP
STACK
Django 4.2, MySQL, Unfold admin, ReportLab with a custom registered typeface for PDF composition. Fifty-five models.
THE HARD PART
The contract body is a structured legal template that auto-numbers, snapshots the beneficiary's details at signature, and validates that a contract links to a natural person or a company but never both. Offer PDFs are composed room by room - eight room types, each with its own description, price and photographs - as a laid-out document rather than a template fill. Every monetary figure is stored in both currencies as parallel columns.
142025
PROJECT 14

Time tracking with a native Windows desktop client

Clock in and out, breaks, per-weekday schedules, transfer requests between offices, timesheets and Excel reporting - delivered as a Django application plus a native desktop client, white-labelled and deployed for a clinic group. Employees have no passwords; a single access code authenticates both surfaces.

BUILT WITH
DjangoPythonMySQL
INTEGRATED WITH
SMTP
STACK
Django 5.2, MySQL, Unfold admin with custom calendar and timesheet templates. The desktop client is Tkinter - roughly 1,600 lines - packaged with PyInstaller into a single executable and shipped through an installer.
THE HARD PART
The auto clock-out logic is the interesting part: a session closes at its last heartbeat only once both the scheduled end of day has passed and no heartbeat has arrived for ten minutes - and a later heartbeat carrying an app-alive timestamp can revive a session that a genuine outage closed. That is a distributed-state problem handled properly rather than a nightly cron that guesses.
152024
PROJECT 15

Sales CRM for a design studio

A focused internal tool: prospects tracked by property attributes - space type, use, size band, rooms, budget - with per-channel contact logs, meeting scheduling, proforma invoices as PDFs, and a pipeline dashboard.

BUILT WITH
LaravelPHPMySQLViteTailwind CSSAlpine.js
INTEGRATED WITH
SMTP
STACK
Laravel 11 with Breeze, MySQL, Blade with Vite, Tailwind and Alpine, DomPDF. Eleven models, eighteen migrations.
THE HARD PART
Nothing architecturally unusual, and it should not pretend otherwise: it is a small, correct internal tool. The pipeline dashboard aggregating counts by space type and use, size-band distribution and average budget against total and paid proforma value is the substantive piece.
162025
PROJECT 16

Agency client portal with a code-to-diagram tool

A marketing site with a client area where clients follow the projects being built for them - milestones, tasks, comments, attachments - plus a staff-only tool that turns a project's models and routes into architecture diagrams and a layout specification.

BUILT WITH
DjangoPythonMySQLTailwind CSSAlpine.js
INTEGRATED WITH
OpenAIGoogle AnalyticsFigmareCAPTCHASMTPWordPress.com mShots
STACK
Django 4.2, MySQL, Unfold admin, modeltranslation across ten languages, Tailwind and Alpine. Around thirty models. A companion design-tool plugin outside the Django runtime.
THE HARD PART
The pipeline takes pasted source, generates architecture and flow diagrams from it, then builds a screens-and-palette specification that a design-tool plugin fetches and draws as real editable frames. It is a small tool, but it removes the least enjoyable hour of starting any project.
172026
PROJECT 17

Generative audio tool, standard library only

An internal tool for generating ambient and relaxation audio through a music generation API - a client with a nine-command interface, a local server and a browser UI - built for a wellness product's audio library.

BUILT WITH
Python
INTEGRATED WITH
Mubert
STACK
Python standard library only. No framework, no dependencies, no build step, around 920 lines. The server is the standard library's own HTTP server with a threaded job queue.
THE HARD PART
It handles the provider's two-tier authentication correctly - service credentials to mint customer credentials, then customer credentials for generation, cached and reused - and treats generation as genuinely asynchronous, polling each job on its own thread with a timeout. With no credentials configured the UI disables generation and says so, rather than failing at the point of use.
182021 - 2024
PROJECT 18

A personal trainer's brand site, where the training programmes are the products

Training programmes are content objects that double as sellable items: each one carries a price, a duration in days, a supplement note, a downloadable PDF and a video. Around them sit a merch and session shop, a coach gallery, testimonials, a booking enquiry form and PayPal checkout, in four content languages on shared hosting.

BUILT WITH
LaravelPHPMySQLLivewireTailwind CSSBootstrapjQueryJavaScriptApache
INTEGRATED WITH
PayPalGoogle AnalyticsSMTPElfsight
STACK
PHP and Laravel 8 with Jetstream and Livewire, MySQL, Blade templates, Laravel Mix building Tailwind, Bootstrap, jQuery, Alpine and Sass. Thirteen models, twenty-nine migrations, thirty-two controllers, Apache on cPanel.
THE HARD PART
Translation lives in the schema rather than in a package: the post, shop, gallery and menu models each carry four parallel column sets, one per language, and Romanian arrived five years after launch through migrations that widen every one of them. It is a blunter design than a translations table, and it has one real virtue - reading a translated row is the same query as reading an untranslated one, with no join and no fallback logic to get wrong. Worth saying plainly: this is a conventional CRUD monolith on a stack that has aged. What it demonstrates is not cleverness but that it has been quietly maintained for years after handover.
INDUSTRIAL, ENERGY AND NON-PROFIT
192025
PROJECT 19

Multilingual catalogue and mailing engine for a road-safety manufacturer

Corporate site and product catalogue for a signage and road-equipment manufacturer, admin-editable in nine languages - built around an in-house scheduled bulk-email engine with bounce reconciliation, because the client's mailing list is the commercial asset.

BUILT WITH
DjangoPythonMariaDBBootstrapDockerNGINX
INTEGRATED WITH
Google AnalyticsreCAPTCHASMTPIMAP
STACK
Django 4.2, MariaDB, Jazzmin admin with nested inlines, modeltranslation and Rosetta for in-browser translation editing, Bootstrap and AOS. Thirty models. Four containers: nginx, web, database and a scheduler.
THE HARD PART
The campaign sender computes how many intervals have elapsed since the start time and sends the next batch of ten recipients, tracking progress and writing a delivery log with a generated message id per recipient - throttling designed to survive a shared mail host rather than assume a delivery provider. An hourly job then polls IMAP, parses bounce notifications and reconciles them back to those delivery logs by message id. Layered anti-abuse underneath: honeypot URL traps that ban a source IP for thirty days, a bad-bot blocklist and per-view rate limits.
202025
PROJECT 20

Trilingual energy-trading site, including right-to-left

Marketing site for an energy trading, supply and production company covering trading, brokerage, supply and high-voltage substations, in English, Romanian and Hebrew - three parallel page trees, nine pages each.

BUILT WITH
Tailwind CSSJavaScriptPHPNGINX
INTEGRATED WITH
Google AnalyticsreCAPTCHASMTP
STACK
Static HTML with Tailwind compiled to a single stylesheet, vanilla JavaScript modules, a single PHP endpoint for the contact form. Apache on shared hosting.
THE HARD PART
The mail endpoint speaks SMTP directly - opening a TLS socket and performing the authentication handshake itself, with no mail library - because the host offered no usable alternative. Analytics is genuinely consent-first: the tag is not loaded at all until consent is stored, and it additionally honours Do-Not-Track and refuses to run off the production hostname. Right-to-left is handled in the Tailwind source rather than bolted on as a second stylesheet, and every URL declares its language alternates.
212024
PROJECT 21

Donations and volunteer platform for a children's charity

Public site, fundraising campaigns, events, online donations and volunteer sign-up for a Romanian charity supporting disadvantaged children and children with autism, admin-editable in eight languages.

BUILT WITH
DjangoPythonMySQL
INTEGRATED WITH
PayPalGoogle AnalyticsreCAPTCHASMTP
STACK
Django 4.2, MySQL, Unfold admin, modeltranslation. PayPal called directly over REST rather than through an SDK.
THE HARD PART
A singleton-model CMS pattern where each of about twenty page sections auto-creates its row on migration, so an editor never opens the admin onto an empty screen and never has to know what a fixture is. All third-party keys live in a database-backed vault rather than environment files, which is the right trade for a client who changes providers more often than they deploy.
222024
PROJECT 22

Bilingual catalogue for an industrial gasket manufacturer

Forty-eight pages of products and services - spiral-wound and metallic gaskets, expansion joints, naval outfitting, laser cutting, electroplating - for a manufacturer founded in 1992 and supplying petrochemical, energy and shipbuilding customers, with its certifications published alongside.

BUILT WITH
JavaScript
STACK
Static HTML. No framework, no database, no build step - the correct answer for a catalogue that changes twice a year and must outlive any framework's support window.
THE HARD PART
Nothing, and that is the point. Not every brief is a system, and a static site the client can host anywhere for a decade is a better outcome here than a CMS nobody will log into.
232024
PROJECT 23

A performance-marketing agency's site, where every section is a row in the admin

A site for an agency running paid social and search campaigns. There is no page a client has to ask me to edit: every homepage section - hero, services, process, case grid, testimonials, footer columns - is its own admin-editable model. The only real logic is the contact form, which qualifies rather than merely collects, asking for the site, the monthly ad budget and which platforms they want to run.

BUILT WITH
DjangoPythonMySQLTailwind CSSAlpine.jsJavaScriptApache
INTEGRATED WITH
Google AnalyticsreCAPTCHASMTP
STACK
Django 4.2 with django-unfold, MySQL via PyMySQL, modeltranslation across eight languages, CKEditor for long-form fields, Tailwind and Alpine loaded from a CDN with no build step, Whitenoise, Passenger on cPanel. Thirty-two models across three apps.
THE HARD PART
Nothing here is difficult, and the entry earns its place by demonstrating the opposite skill: a site whose owner never needs a developer to change a word of it. The honest flaw is visible in the schema - the portfolio model still carries a surface-area and a location field inherited from the real-estate template it was forked from, and roughly a third of the dependency list is carried over and never imported. That is what forking a working project to save a week actually costs, and I would rather show it than tidy it out of the story.
242025
PROJECT 24

A digital agency's site as a static single-page app, with the animation written by hand

Nine service lines, a five-step process, an owned-brands showcase and testimonials, with no backend at all: every word of copy lives in one module, and the whole thing deploys as static files behind a single rewrite rule. Each service has its own animation rather than one shared effect applied nine times.

BUILT WITH
Vue.jsViteTailwind CSSJavaScriptGreenSockApache
INTEGRATED WITH
reCAPTCHAGoogle Fonts
STACK
Vue 3 with the Composition API, Vue Router, Vite with manual vendor chunking, Tailwind, GSAP, Lucide icons. Around six thousand three hundred lines across eight routes, one of which is a design-system page. Apache serving the built output.
THE HARD PART
Twelve animation components, one per service, written rather than pulled from a library, with intersection-observer and count-up composables underneath them. It is craft work and that is the whole of its ambition. It also carries the clearest example I have of a dependency outliving its purpose: reCAPTCHA v3 loads on every page and guards nothing, because there is no form on the site - the contact route is a mailto link, and the validation library installed for the form that was never built is still in the manifest. A third-party script that runs on every page load and does nothing is a consent liability rather than a harmless leftover, and it is on the list to remove.
BLOCKCHAIN AND ALGORITHMIC TRADING
252026
PROJECT 25

An EVM sidechain, end to end - network, explorer, bridge, wallet and launchpad

The whole launch, not just the contracts. A six-role node topology - bootnode, validators, public RPC, archive, explorer and faucet - generated per network from one allocation file across devnet, testnet and mainnet, each with its own faucet. On top of it: a Solidity suite covering the native coin, a validator-attested cross-chain bridge, staking, vesting and a pay-per-feature token launchpad; a Node relayer that carries messages between chains; a themed block explorer; and a Chrome wallet extension speaking EIP-1193. To be exact about what is mine - the node client itself is upstream and unmodified. Everything around it is not.

BUILT WITH
SolidityOpenZeppelinGoNode.jsJavaScriptTerraformDockerNGINXPostgreSQLRust
INTEGRATED WITH
Google FontsBNB ChainArbitrumBaseAvalancheBlockscoutUniswap V2SolanaAWSArbiscanBAS node stackBasescanBscScanEthereumEtherscanOptimismOptimistic EtherscanPancakeSwap V2PolygonPolygonScanQuickSwapSepoliaSnowtraceTrader Joe V1
STACK
Solidity 0.8.24 with OpenZeppelin 5.1 pinned exactly, Hardhat and ethers v6, Node 20 for the relayer and the faucet, Terraform and Docker Compose for the validator fleet, a vendored Blockscout stack behind nginx for the explorer, vanilla JavaScript for the dApps and the wallet, Rust and Anchor for the Solana leg. 3,500 lines of original Solidity, 12,000 of JavaScript, 142 contract tests across four suites.
THE HARD PART
One allocation file is the single source of truth for the hundred million supply, and the build generates the genesis, the per-role compose directories and the deploy scripts from it for devnet, testnet and mainnet alike - so the three networks cannot drift apart. A preflight step refuses to build a mainnet genesis while any placeholder address remains. The faucet reimplements the node client's own WebSocket protocol so the page needs no special case for local networks. The relayer advances its block cursor only after every message in a range is persisted, because advancing first loses transfers permanently and nothing rescans. Supply conservation is a design invariant rather than a check: exactly one chain escrows and every other mints, the token cap equals the genesis supply, and the deploy scripts mint nothing. The OpenZeppelin version is pinned because 5.2 emits an opcode the node's EVM predates - a newer library would produce bytecode its own validators could not execute. The bridge is a trusted-quorum bridge and is described as one in three separate places rather than being called trustless.
262026
PROJECT 26

Intraday gold trading bot, with the model kept out of the hot path

An intraday bot trading spot gold and gold ETF options on two parallel tracks - a scalp track on five-second bars built from the raw trade stream, and a swing track on one-minute bars. Nine gates stand between a detected pattern and an order: session, news blackout, volatility regime, pattern quality, trend alignment, higher-timeframe agreement, volume, news sentiment and confidence. It runs against broker simulation accounts, and live trading is deliberately unimplemented and blocked in code.

BUILT WITH
PythonpandasNumPySQLiteMySQLLinux
INTEGRATED WITH
AnthropicGDELTFREDBLSFederal ReserveECBAlpacaMarketauxSaxo Bank
STACK
Python 3.11 with pandas and numpy, deliberately version-bounded so prebuilt wheels install on shared hosting without a compiler. SQLite for the trade journal, MySQL for export, the standard library's own HTTP server for the dashboard. 18,000 lines across 94 modules and 541 tests.
THE HARD PART
The language model runs on its own background clock and writes a cache the trading loop reads instantly, because a one-to-three second round trip on five-second bars means acting on a price that no longer exists - and that failure is silent, since the answer still looks sensible. It can emit a bias and two multipliers; it cannot invent a trade, choose a direction, size a position or move a stop, and it fails open to neutral. The learning layer is hand-written logistic regression precisely so it cannot hide overfitting: in-sample and out-of-sample always reported together, time-ordered splits, and a naive take-every-trade baseline printed alongside. Exits trigger on the underlying price rather than option premium, because premium moves on volatility and time decay. The supervisor uses a file lock after two runs seconds apart slipped past a pidfile check and left two bots trading one account.
PLATFORMS I BUILT FOR MYSELF
272025
PROJECT 27

My own site and client portal, with a Figma bridge built into the admin

The public side is a portfolio. Behind a login it becomes a small client portal - projects, milestones, tasks, comments and attachments - and behind a staff login there is a panel that reads a project's models and URL configuration and turns them into diagrams and a Figma node tree.

BUILT WITH
DjangoPythonMySQLTailwind CSSAlpine.jsJavaScript
INTEGRATED WITH
OpenAIGoogle AnalyticsFigmareCAPTCHASMTPWordPress.com mShots
STACK
Django 4.2, django-unfold, MySQL, modeltranslation across ten languages, CKEditor, Tailwind and Alpine from a CDN, Passenger on cPanel. Thirty models across three apps, plus a companion Figma plugin.
THE HARD PART
The Figma generator builds its node tree deterministically - frames, rectangles and text laid out by code - and only then offers an optional model pass to beautify it. That order is the whole design: the same project always produces the same layout, and the model can improve the result but is never the reason it exists. The plugin fetches its spec through a signed admin URL, so the Figma desktop app can pull a design without holding a session. Two gaps I will not pretend are finished: the push side of the Figma integration is still a stub, and the OpenAI client is imported without being pinned, so a clean install of that panel fails until it is added.
282026
PROJECT 28

The platform this site runs on - one process for the site, the admin, the API and the funnel

A single Django process renders a public site in seven languages and also serves the admin, a GraphQL API, a multi-step lead form with SMS one-time codes and typed consent records, first-party visitor analytics with click heatmaps, a page builder, a booking system with Zoom meetings and reminders, error pages, maintenance mode and server health. The React bundle is built on my machine and uploaded pre-built, because the host's C library is too old to run a current Node.

BUILT WITH
DjangoPythonMySQLRedisCeleryGraphQLReactViteJavaScriptNGINX
INTEGRATED WITH
StripeSMSAPIMeta PixelMeta Conversions APITikTok PixelGoogle Tag ManagerreCAPTCHASMTPZoom
STACK
Python 3.11 and Django 5.2 LTS, django-unfold, MySQL via PyMySQL, Redis, Celery with beat, results and Flower, Strawberry GraphQL with the Django optimizer extension, modeltranslation, Silk in development only, React 18 and Vite for the front-end island. Ten apps, thirty-three models, roughly eight thousand two hundred lines of Python.
THE HARD PART
Conversion tracking fires twice on purpose: the browser pixel and the server-side API send the same event under the same event id, so the platform de-duplicates them, and the events that blockers would otherwise remove - commonly a fifth to two-fifths of them - survive. Personal fields are hashed before they leave, and a tracking failure is swallowed rather than raised, because a lead is worth more than a perfectly reported one. The form engine is nine models and twelve question kinds over a five-state funnel with an event audit trail; its public endpoints are deliberately exempt from CSRF, because the markup is authored in the admin and served verbatim, and an unguessable server-issued session id does the work the token would have done. Every version constraint in the requirements file carries the reason it exists, including the ones I would rather not need. The weak spot is coverage: twenty-three smoke tests against eight thousand lines, which is not enough and I know it.

Something in here look like your problem?

The pattern that repeats across most of these is the same: a business running on tools that do not know about each other. If that is yours, say so and I will tell you what consolidating it would actually take.