Selected work

Both halves, real builds.

Sites and stores out front; the systems and automations behind them. Paid client work only — every live link on this page opens the real thing.

01 / Case studies

Four in depth

What the business was actually struggling with, what got built, and where each one honestly stands today.

SDS Spices — screenshot of the build
01Live

SDS Spices

Spice growing, processing & export · B2B

A Sri Lankan spice exporter whose entire website was invisible to the search engines its overseas buyers use. Diagnosed first, rebuilt server-rendered, then moved across without dropping a single email.

The problem
The old site rendered all of its content in the browser, behind a full-screen preloader. A crawler got an empty shell — across every route there was effectively no head-level SEO at all. For an exporter whose buyers search from abroad, that is the whole marketing channel, closed.
What we built
A server-rendered rebuild: Next.js App Router with React Server Components, strict TypeScript, self-hosted fonts, genuine per-route metadata, and a request-for-quote form gated by Cloudflare Turnstile with server-side verification. Content moved to a CMS the client controls. Separate rate limiters sit in front of the admin, the RFQ and the newsletter.
Where it stands
Live since September, on the client's own domain. Twenty-one indexable pages and twenty-one sitemap entries — against a previous count of effectively zero. The cutover carried a nineteen-record DNS export and an inter-account registrar transfer, with the mail records preserved through it and a rollback anchor at each step, so the business never lost an inbox. Signed off and paid in full.
  • Next.js (RSC)
  • TypeScript (strict)
  • Tailwind v4
  • Supabase CMS
  • Cloudflare Workers (OpenNext)
  • Turnstile
View live site: SDS Spices (opens in a new tab)
02Deployed

Axis CRM

B2B sales & procurement · Sri Lanka

A quote-to-procure CRM for Sri Lankan B2B teams, deployed as a separate isolated instance for every client — their own database, domain, users, secrets and backups.

The problem
Distributors quoting imported goods rebuild the same landed-cost arithmetic in a spreadsheet for every enquiry, then re-key the approved quote into a purchase order. Numbers drift between the two, and when a price is questioned months later nobody can say who changed what.
What we built
Pipeline and contacts; configurable LKR/USD quotation with landed-cost logic and approvals; vendor purchase-order generation with PDF output and email dispatch; approved-quote-through-to-delivery order tracking; payroll operations; calendar; a CRM-linked email inbox; and a knowledge-grounded assistant scoped to the team. Thirty tables, row-level security on every one of them, and an append-only audit log.
Where it stands
Deployed, with a searchable in-app help centre and contextual workflow hints on every route. One Supabase project, one domain and one set of Auth users per client — related operating companies can share a single instance while keeping company-level data boundaries. Unrelated clients never share a database, by design.
  • React
  • TypeScript (strict)
  • Vite
  • Supabase RLS + edge functions
  • Vercel
  • Playwright e2e
Ganga Recruitment — screenshot of the build
03Live

Ganga Recruitment

Licensed overseas employment agency · Moratuwa

An SLBFE-licensed recruitment agency placing Sri Lankans in work abroad — a sector where families are handing over their savings, so the site has to read as credible before it reads as designed.

The problem
An agency operating since 2018 under a state licence, with nothing online that said so. In a category crowded with unlicensed operators, the licence number is the product — and there was nowhere to show it, and no way for a family to check the agency was real before walking in.
What we built
A one-page site built around the licence and the process: who the agency is, what it is permitted to do, and what a candidate should expect at each stage. The visual system was sampled from the client's own logo and carried across to a rebuilt PDF company profile, so the site and the document that gets handed across a desk look like the same organisation.
Where it stands
Live on the client's domain — and deployed into their own Cloudflare account rather than ours, so the hosting, the DNS and the billing are theirs from day one. Nothing about the site depends on us still being here. Every factual claim on the page traces back to the licence or the company profile; where a detail was unconfirmed it was left off rather than filled in.
  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind v4
  • Static export
  • Cloudflare Workers
View live site: Ganga Recruitment (opens in a new tab)
04In progress

Melchiah Linen

Luxury linen house · Colombo

A Colombo linen house that sells on touch and drape — translated into a digital showroom that has to do the same job through a screen.

The problem
Linen is bought by feel. Photographs flatten it, and a conventional product grid turns a considered purchase into a commodity scroll — which is exactly the wrong register for a house selling at the top of the market.
What we built
An editorial showroom rather than a catalogue: each piece gets its own page carrying the story, the material, the care and the personalisation options, with the layout built to hold up to four approved images per product across a catalogue heading toward fifty. Alongside it, a brochure pipeline that renders the same source content to a twelve-page print-ready PDF, so the website and the thing handed to a client in the showroom never drift apart.
Where it stands
An active engagement. The domain is registered and its nameservers are live, but deliberately not connected — nothing goes to the public address until the client has accepted production. The brochure is in use now, ahead of the site.
  • React 19
  • Vite
  • Drizzle ORM
  • Cloudflare
  • HTML→PDF render pipeline
02 / AI Systems & Automation

The systems we run ourselves

The studio runs on its own tooling. These are internal — no client data — but they are the same parts we assemble for client automations.

Internal system

Control Panel / CMS

An operations cockpit: semantic search across every document, transcript and note the studio has produced, a Telegram assistant on top of it, push notifications and automated daily briefs.

  • Supabase + vector search
  • Cloudflare Pages behind Access
  • Telegram bot
  • Scheduled briefs
Internal system

Publishing pipeline

A control panel for the studio's posting workflow — ideas move through queued, drafted and posted, backed by the same database as the cockpit. Installable as a phone app.

  • Cloudflare Pages + Functions
  • Supabase-backed
  • Installable PWA
Internal system

Prospecting pipeline

Scripted lead discovery against a written ideal-customer profile — find candidates, enrich them, and route what survives into a prioritised call list rather than a spreadsheet graveyard.

  • Python + ScrapeGraphAI
  • Scored against a written ICP
  • CSV call lists

Want something like one of these?

Point at the one that’s closest to what you need — we’ll take it from there.