The rest of it.

Tools that replaced a spreadsheet, a morning of manual checking, or an argument about what the numbers actually said. Unglamorous, and the reason people keep asking.

Internal software for one company

Everything in this first group was built for the same business, a commercial printer, over about a year. None of it is a product — each one replaced a spreadsheet, a morning of manual checking, or an argument about what the numbers actually said. Most of it is still running every day.

Courier Hub dashboard showing 580 shipments to upload for one day, split by courier, with the previous days listed below

In daily use

Courier Hub

23,128

shipments processed to date

Two couriers send their daily manifests as email attachments in two different shapes. Someone opened both, reconciled them by hand and retyped the result into the website, every morning.

A desktop app that reads the mailbox itself, parses both formats, and produces one day's upload. It ships as a Mac and Windows installer, and also as a portable folder with three .bat files — start, open, stop — because the office PC has an antivirus that quarantines installers and nobody there should have to argue with it.

Real data, running. Every consignee name is substituted and the machine's LAN address is masked.

Electron · React · TypeScript · Fastify · Gmail OAuth · Mac and Windows builds

Warnings screen listing 3,560 data-quality issues grouped as invalid, duplicate and missing order IDs, each with the reason stated

Part of the same app

… and what it refuses to hide

3,560

data-quality issues surfaced, none of them blocking

The manifests are dirty. Order IDs are missing, duplicated, or contain a customer's name where a reference should be. The old process silently absorbed all of it.

Every problem is raised with the reason spelled out — which file and which row the duplicate came from — and can be dismissed. Crucially it never blocks an upload: a tool that refuses to run until the data is perfect gets abandoned by lunchtime, and the day's dispatches still have to go out.

The same app · deterministic parsers · 3 issue classes

Mismatch review queue showing 844 wrong-price rows and 110 outside the rate card, each with charged, expected and the difference

In use monthly

Courier bill auditor

The reconstructed rate card only helps if somebody applies it to next month's bill. Doing that by hand is thousands of rows.

A single HTML file — no install, no server. Drop in the courier's PDFs and it parses them in the browser, prices every consignment against the rate card, and sorts what does not match into wrong price and weight outside the slabs, each row showing charged against expected. 8,823 rows audited in one pass, 86% clean.

Driven here with a real month's bills. It found roughly ₹20,000 of difference against the rate card — figures a human still has to check before anything is disputed.

One HTML file · pdf.js · SheetJS · no backend

Reconciliation summary showing 458 payments, 451 matched and 9 needing review

In use, every morning

Settlement reconciliation

Card settlements arrive from the payment gateway. Orders sit in the website. Somebody compared the two by hand to find the payment with no order, and the order with no payment.

A daily pass matches on order number and sorts everything that does not match into named categories: paid but cancelled, ordered but never paid, wallet topped up and abandoned. 458 payments in, 9 that need a human.

A real morning's output. Customer names are substituted, numbers part masked, and the day's takings removed — the counts are what the tool is for.

Python · gateway and Excel exports · self-contained HTML output

A page of the delivered review, listing critical findings with the fix for each

Delivered as a decision document

Storefront QA audit

A live ecommerce site with a slow drip of complaints and no shared view of what was actually broken, only anecdotes.

An automated pass logs in, walks the site, captures every state and audits the product API. Then a written review ranking each finding by what it costs in lost orders. The pipeline reruns after a fix, so a finding without a rerun is just an opinion.

Python · Playwright · authenticated session capture · PDF report

Three reconstructed rate ladders, each with a base rate and a fixed step per half kilo

In use monthly

Courier bill reconciliation

6,763

consignments checked against the bill

A courier bills monthly as a watermarked PDF. Somebody was checking it line by line against the dispatch register and the sales export to find what had been overcharged, billed twice, or never invoiced onward.

The rate card was never supplied. It was worked out from the bills, which is how the base-weight rule and the fuel line turned out to be applied inconsistently. Every discrepancy is listed with its consignment number, so it can be disputed rather than just totalled.

The rate card as reconstructed, and only that. Dimmed rows are slabs the formula predicts but the month never reached. The client's spend figures stay out of a portfolio.

Python · PDF text extraction · openpyxl

Reprint tracker dashboard showing the monthly reprint count, top department and open items

In use

Reprint tracker

380

records, migrated out of five spreadsheets

Print jobs that had to be redone were logged across five separate files by different people. Nobody could answer what reprinting cost last month, or which customer or press it kept happening on.

One tracker, one launcher: it opens, loads the workbook, saves back to it, and needs no installation or training. The history was migrated and reconciled first, so nothing was lost in the change. Deliberately built on the file they already trusted rather than a database they would have to be persuaded into.

The real tracker on real records. Every customer and staff name is substituted; the counts and costs are untouched.

Python · local HTTP server · Excel read and write · one-click launcher

Prototype dialog for changing how an order is dispatched, showing the current method detected and only the valid alternatives

Prototype, to settle an argument

Dispatch change flow

Orders sometimes leave by a different route than planned, and the reason and the cost difference were being remembered rather than recorded. Two people wanted two different screens for it.

Rather than argue, a clickable prototype. Type an order number and it tells you how that order is currently going out, then offers only the routes it could change to — never the one it is already on. Who made the change, the price difference and a reason are all part of the record, not an afterthought.

A prototype with seeded data, built to be disagreed with cheaply. It took an afternoon and ended a fortnight of back-and-forth.

One HTML file · seeded fixtures · no backend

Outside that

Work for other people, and for myself.

Ranked prospect audit table showing score, tier, primary defect, homepage word count and signal chips for each business

Built for my own outreach

Prospect auditor

Cold outreach fails because it is generic. Knowing a company exists is not a reason to call them.

Point it at a city and a trade and it finds the businesses, then fetches every one of their websites and grades it — does it load at all, is the HTTPS real, how many words are actually on the homepage, are there any commercial signals — and ranks them by how fixable the problem is, with the opening line written for each.

The care is in what it refuses to claim. It retries before calling a site dead, judges HTTPS on the final redirected URL rather than the link, and skips content checks entirely on a JavaScript-rendered site instead of accusing it of faults it cannot see. Being wrong out loud in front of a prospect costs more than missing one.

Company names are substituted. These are prospects, not clients — real businesses that never agreed to appear here.

Python · Places API · HTTP auditing · severity-tiered scoring

Classic editorial direction for the Ellow brand

Built

Ellow, classic direction

The fourth of the brand directions, and the most restrained: editorial layout, warm ground, no motion doing the talking. It exists because a client who says "something simpler" needs to see simpler, not hear it described.

Open the live page

React · Vite · single-file static export

Club site hero: oversized type reading Dare, Move, Belong, with a scrolling band beneath

Built

Club site with payments

A small members club taking bookings over WhatsApp and payments by UPI screen shot, with no record of who had actually paid.

A mobile-first site with an admin CMS, weekly activity that the organiser changes themselves, and a manual payment step with an approval action. No gateway, because the club did not want one and the volume never justified the fees. The verification is a human pressing a button, which is honest about what it is.

Node · SQLite · nightly backups to two places

Smaller tools and research

Operations

  • Courier pricing engineRules-based and idempotent across category, courier and zone, so a re-run never double-applies.
  • Consignment processingDesktop app for the daily dispatch run.
  • Address label generationPrint-ready courier labels straight from the order export.

Data and audit

  • Change audit from database logsBinary log parser reconstructing who changed which product field, and when. Built because the question was asked and nobody could answer it.
  • Catalogue bulk updatesAdmin CSV round trip for prices and descriptions across several hundred products.
  • Customer record extraction11,743 records recovered from an admin panel that had no export.
  • Messy data reformattingHundreds of single-cell records parsed into structured columns, with the ambiguous ones flagged for a human rather than guessed.

Research and strategy

  • Siting analysisWhere to put a production unit, what it would cost, and what protects the margin once it is there.
  • Feasibility studiesIncluding one that concluded the business was not worth starting, which was the useful answer.
  • Trade directoryExpos and industry associations worth attending, and the ones that are dealer demos wearing a lanyard.

Back to the selected work

Kannuku, customer analytics, the map data scraper, the WhatsApp assistant and the brand directions.

If something here looks like a problem you have.

I take on build work directly and white-label for agencies. Fifteen minutes on a call beats a pitch, and I would rather understand the problem first.

Get in touch
Karur, Tamil Nadu Available for freelance and white-label work Repositories are private. Most of this holds real customer and financial data.