Posts

IProcessor for GMD Stores: From Vendor Invoice to Store Shelf in One Web App

Part 1 of 2. This post introduces the product and walks through the web application. Part 2 covers the invoice-parsing engine, the technology stack and the CI/CD pipeline. What is IProcessor? IProcessor is an internal operations platform built for GMD Stores, a multi-store retail business that buys from dozens of import vendors and ships goods through its own warehouse. Every week the business receives a flood of vendor invoices as PDF attachments, has to reconcile them against purchase orders, receive the goods, split them by store, verify pick-and-pack, and account for margins. Before IProcessor, most of this was manual data entry and spreadsheets. IProcessor turns it into a single flow: A vendor emails an invoice PDF to a shared mailbox. A background service picks it up, identifies the vendor, extracts every line item and saves it to the database. No human touches it. Buyers and accounting review and approve the invoice in the web app. Warehouse staff receiv...

Hiding Complex Detail Sections on Phones Without Breaking Deep Links

Hiding Complex Detail Sections on Phones Without Breaking Deep Links A small fix from the Staffpoint project, and the three edge cases that made it bigger than it looked Staffpoint is a staffing and scheduling platform built on ASP.NET WebForms. A recent fix on the Personnel Details page dealt with a problem every responsive retrofit of an old app eventually hits: some screens simply do not work on a phone yet, and hiding a tab is not enough to keep users out of them. This post covers what the issue was, what the fix changed, and the edge cases that turned a one-line CSS change into a small routing policy. The issue The Personnel Details page is a single-page shell. It loads a person's record and shows a row of tabs: Details, Qualifications, Availability, Accreditations, Notes, Rates, and a few more. Each tab loads its content over AJAX into the shell, and the current tab is encoded in the URL hash, so #availability-1234 means "Availability for person 1234." Tha...

Syncing Staff Assignments to Google Calendar in a Legacy ASP.NET WebForms App

Syncing Staff Assignments to Google Calendar in a Legacy ASP.NET WebForms App A case study from the Staffpoint project I recently worked on Staffpoint, a staffing and scheduling platform built by DeloLogic. My main piece was the backend for the Google Calendar integration for personnel (ticket "[SP-4.0] Google calendar integration for Personnel - Backend"). This post covers what Staffpoint is, the stack it runs on, and how the calendar sync works under the hood. What Staffpoint is Staffpoint is a workforce management system for staffing agencies. An agency uses it to manage clients, locations, and job types, then create shifts (called "assignments" in the product) and fill them with qualified personnel. It handles the whole lifecycle: open shifts, offers, confirmations, cancellations, availability, qualifications and accreditations, payroll and billing rates, invoices, KPI reports, and even automated phone calls and SMS through Twilio to offer shifts to s...

I gave my support team an AI that reads our database. It cost $0/month and zero lines of code.

Field notes · Azure · MCP A zero-cost SQL MCP server for Claude and ChatGPT We wanted our customer-service team to ask an AI about ticket orders without anyone writing an API. Microsoft's Data API builder turned out to do the whole job with one JSON file, a two-line Dockerfile and an App Service plan we were already paying for. Here is what worked, what broke, and the eight things I wish I had known on day one. Tan Le , Ticket Shine September 2026 About 12 minutes At a glance Admit one AI Server Data API builder 2.0.12 Microsoft's SQL MCP Server Hosting Existing Linux B2 plan second web app, container Extra cost 0 USD / month memory went from 55% to 63% Code written 0 lines one JSON config, one Dockerfile Exposed 4 read-only entities 3 tools: describe, read, aggregate Clients Claude Code, ChatGPT Business Claude.ai pending admin The problem we actually had ...

Moving a React app on Azure Static Web Apps to a Cloudflare custom

How we moved a React single-page app hosted on Azure Static Web Apps onto a custom domain managed in Cloudflare, without exposing an unfinished site, and what else had to change behind the scenes: CORS, transactional email, and Stripe redirects. Background Our product is a SaaS tool for domain-name research. The frontend is a React app deployed to Azure Static Web Apps through GitHub Actions. The backend is an ASP.NET Core API on Azure App Service . Until recently the frontend lived on the default *.azurestaticapps.net hostname that Azure hands out. The business made two decisions at once: the public domain would be a .ai domain already sitting in a Cloudflare account, and the brand would change to match it. So the job was part DNS, part configuration, and part find-and-replace. What "moving the site" actually touches Pointing DNS at the new host is the easy part. The frontend origin is baked into several other places, and if any of them is missed the app br...

Building a Real-Time Ticket Listings Monitor in Python: From Legacy .NET to a Lean Alerting Pipeline

How I ported a ticket-inventory monitoring workflow to Python, solved a proof-of-work bot challenge in pure code, pushed the heavy lifting into SQL Server, and shipped a tool that alerts the team on Slack within seconds of a new listing appearing. The problem In the secondary ticket market, timing is everything. A well-priced listing for a high-demand show can appear and disappear in under a minute. Our purchasing team needed to know, immediately, when a new listing showed up for the events they were tracking on GoTickets, filtered by price ceiling and section, and with a one-click link to buy. We already had this workflow for another marketplace, running inside a larger C#/.NET application. But that app was heavy, tightly coupled to a desktop environment, and hard to deploy on a fresh machine. For GoTickets, I wanted something different: a small, dependency-light Python service that anyone on the team could stand up in ten minutes and leave running unattended. That projec...

A self-shutting-down Linux VM for a weekly batch job on Azure (.NET 8 + CZDS zone files)

I needed to process DNS zone files for about 1,000 top-level domains, load ~280 million domain names into SQL, and do it on a schedule without paying for a server that sits idle 95% of the time. This is how I set it up, what the stack looks like, and the mistakes I made along the way. The problem ICANN's Centralized Zone Data Service (CZDS) gives approved users a daily snapshot of every gTLD zone file: .biz , .info , .xyz , all the way to .com . Each file lists every registered domain in that TLD. I wanted to turn those into one table: label -> number of TLDs it is registered in , so that for a keyword like cloudapp we can show "registered in 37 TLDs". Requirements: Run once a week for now, nightly later. Big memory for the largest zones, so a real VM, not a serverless function. Cost close to zero when not running. No one logging in to press Start. The stack Layer Choice Why Worker .NET 8 console app, published self-contained for linux-x64 Str...