TLTan LeBackend & automation · CalgaryLet’s talk
Open to backend, platform and AI-infrastructure roles · Calgary · remote

I bring AI, cloud and automation to legacy .NET systems.

Backend and automation developer. I build the jobs that run every morning before anyone logs in — email triage, invoice parsing, bank reconciliation, LLM pipelines — and I make them boring enough to trust.

C# / .NETPython · Java · Node.jsSQL Server · PostgreSQL · Oracle · MongoDBAzure · AWS · DockerOpenAI · Gemini · Claude · MCPReact · Angular · Blazor
automation-hub / scheduler06:30 MDT
05:30email-triage214 messages classified · 3 departments notified✓ done
05:45vendor-invoices17 PDFs from 11 vendors · 412 line items → SQL✓ done
06:00bank-reconcile2 banking APIs matched against POS✓ done
06:10domain-keywords2,000 roots split by agent · validated · written back✓ done
06:20pos-to-sheetsovernight sales → Google Sheets✓ done
06:30daily-summaryreport posted to Slack · 1 person reads it✓ done
25 scheduled jobs · 10+ integrationsa person checks the summary
AI multi-agent for business

Meet your new AI workforce.

A team of agents, each owning one bounded job: they run on a schedule, read your real systems through read-only connectors, and hand a person something to approve. Every agent below is running in production today.

AG-01Fine-tuned LLM

Inbox Agent

Triage & extraction

Classifies hundreds of emails a day; pulls out event, venue, date, promo codes and refund details.

Reads
IMAP mailboxes — body, PDFs, inline images
Hands off
Digests to each department · refund rows to finance
See it in production →
AG-02Claude / ChatGPT + MCP

Customer Service Agent

Order look-up & reply drafts

Looks up every order mentioned in ~50 morning emails and drafts the reply.

Reads
Customer emails · order and case data through a read-only MCP server
Hands off
Drafts for Operations to approve before anything is sent
See it in production →
AG-03Configurable parser

Accounts Payable Agent

Invoice intake

Extracts line items, reconciles them against purchase orders, quarantines anything that does not match.

Reads
Vendor invoices from a shared mailbox — 60+ PDF/XPS layouts
Hands off
Invoices ready for approval · exceptions for review
See it in production →
AG-04Scheduled job

Finance Agent

Reconciliation & cash

Matches settlements to sales and runs bank sweeps — idempotent, every transaction audit-logged.

Reads
Banking APIs · POS · marketplaces
Hands off
Reconciliation summary in Slack
See it in production →
AG-05LLM + validation

Research Agent

Data enrichment

Splits and labels thousands of keyword roots a night; output is validated in code before it is written back.

Reads
Keyword roots and third-party company data
Hands off
Enriched rows behind the domain research platform
See it in production →
AG-06Scheduled job

Operations Lead

Daily summary

Collects what ran, what changed and what needs a decision.

Reads
Results of every other job
Hands off
One report in Slack · one person reads it
See it in production →
Control

Read-only by default

Agents reach data through connectors with writes disabled in configuration, behind IP allowlists. Anything that changes money or customers goes through a person.

Oversight

A human approves

Agents draft, flag and quarantine. Uncertain fields are left blank for people, not guessed. Every run ends in a summary someone reads.

Models

Any model, one contract

OpenAI, Gemini and Claude sit behind the same JSON contract, so providers can be swapped or compared on cost and accuracy without touching the jobs.

Integration

Fits the stack you have

.NET, SQL Server, Azure or AWS, Gmail and IMAP, Slack, Google Sheets, POS and banking APIs. Agents are added beside legacy systems, not instead of them.

Real-world example

A late-order email, handled before the team logs in.

Two agents hand work to each other, and a person makes the only decision that matters. The same pattern fits HR requests, vendor questions or anything else that starts in an inbox and ends in a database look-up.

  1. 01
    Customer emails"Where are my tickets?" lands in the support inbox
  2. 02
    Inbox Agentclassifies it as a delivery question, extracts the order number
  3. 03
    Customer Service Agentreads order, case and notes through MCP — never guesses
  4. 04
    Draftreply written with the real delivery status
  5. 05
    Operationsapproves or edits, then sends — no manual look-up in Access
Selected work

Systems in daily production.

Each one runs today, unattended, for a real business. Each has a case study with the technical detail.

All featured projects
Ticket resale · Ticket Shine

AI email-triage pipeline

Classifies hundreds of ticketing emails a day with a fine-tuned multimodal LLM and routes summaries to the right departments. OpenAI and Gemini sit behind one interchangeable JSON contract; a defensive C# parsing layer means one malformed response never breaks the batch.

100semails classified per day
2LLM providers, one contract
0batches broken by bad JSON
C#/.NETOpenAI fine-tuningGeminiIMAPSQL Server
Read the case study →
  1. 01
    MailboxIMAP pulls new ticketing mail
  2. 02
    Classifyfine-tuned model, PDF + body, JSON out
  3. 03
    Defendbalanced-brace extraction · tolerant converters · invariants
  4. 04
    StoreSQL Server, idempotent writes
  5. 05
    Reportsummaries routed to each department
Ticket resale · Ticket Shine

.NET automation hub

10+ systems — POS, marketplaces, banking APIs, Gmail, Slack, Google Sheets — wired into ~25 scheduled jobs. Includes idempotent financial reconciliation and bank sweeps, every transaction audit-logged and reported to Slack.

.NETEntity FrameworkHangfiren8nAWS EC2Azure
Read the case study →
Customer service · Ticket Shine

MCP server and daily AI order routines

A read-only MCP server in C#/.NET exposes order and case data to AI agents. Daily routines read ~50 customer emails, look up the order through MCP and pre-draft a reply for Operations to approve. Human in the loop, far fewer manual lookups.

C#/.NETMCPClaude · ChatGPTAzure App Service
Read the case study →
Retail · GMD Stores, 2021–2023

IProcessor: invoice to store shelf

Operations platform for a multi-store retailer: an always-on Azure WebJob reads vendor invoices from the mailbox, parses 60+ PDF/XPS layouts and quarantines anything that doesn't reconcile; the web app carries goods through approval, receiving and RFID pick-and-pack with Zebra label printing. Zero-downtime deploys via GitLab slot swaps.

ASP.NET MVC 5EF 6Azure WebJobsAzure SQLEWS / OAuth 2.0RFIDGitLab CI
Read the case study →
SaaS · domain intelligence

Domain research platform

Multi-tenant SaaS with subscription-tier entitlements down to the field level, event-driven auction auto-bidding, third-party data pipelines and Stripe billing. The hard part was SQL: a 13 GB index scan over 130M+ row tables, cut about 10× with covering and filtered indexes.

React.NET Core 8HangfireAzure SQLStripeSpec Kit · Claude Code
Read the case study →
Wealth management · contract

Portfolio analytics API and dashboard

Serverless Python API that pulls Refinitiv market data and runs Monte Carlo simulations, efficient-frontier optimization and time-series forecasts, with a Dash dashboard and OpenAI-written commentary. Dockerized, deployed through GitHub Actions.

PythonAzure Functionspandas · SciPyProphet · ARIMADash · PlotlyMongoDBOpenAI API
Read the case study →
Staffing · Staffpoint (DeloLogic)

Workforce scheduling platform

Ongoing backend work on a staffing and scheduling platform — most recently the Google Calendar sync for personnel assignments and a responsive retrofit of a legacy WebForms app.

C#BlazorASP.NET WebFormsSQL ServerGoogle Calendar API
Read the case study →
Banking · HSBC, 2014–2020

Core-card repayment gateway

Built in eight months, scaled from 100K to 1M daily transactions through database tuning and horizontal scaling — CEO Recognition Award, 2017. Six years running 24/7 statutory payment channels in a regulated bank is where my reliability habits come from.

Java Spring BootVue.jsOracleJenkins
Read the case study →
How I work

Impressive in a demo is easy. Trustworthy at 6 a.m. is the job.

Shape

Start with the shape of the job, not the agent

Define inputs, outputs and what "right" means before any model is involved. The agent gets one bounded step, not the whole task.

Defend

Treat the model as an untrusted input

Validate, parse defensively, enforce business invariants in code. One bad response should cost one record, never the batch.

Spec

Write the spec, let the agent write the code

Spec-driven development with Spec Kit and Claude Code: the agent does most of the writing, a human owns the decisions.

Operate

Make it boring

Schedules, logs, retries, a summary someone actually reads. The lessons that matter come from making it dull in production.

Experience

Twenty-plus years, four chapters.

  1. Apr 2022 — present

    Software Developer · Ticket Shine Inc.

    Backend, data and automation for a ticket-resale business: automation hub, AI email triage, MCP server and AI routines, the domain research SaaS.

  2. Jan 2021 — present

    Independent Software Developer · contract clients

    IProcessor for GMD Stores, Staffpoint workforce scheduling, a wealth-management analytics API, on-prem-to-Azure migrations.

  3. Apr 2014 — Sep 2020

    Software Delivery Officer · HSBC Bank

    24/7 statutory payment channels, the core-card repayment gateway (CEO Recognition Award), a payment data warehouse that cut reconciliation time 80%.

  4. Sep 2003 — Mar 2014

    Software Developer · FPT Information System

    iHRP payroll and HR management system in .NET and SQL Server — $100M in revenue across 50+ clients.

About

Legacy systems are where the business already lives.

I'm a software engineer in Calgary with twenty-plus years across enterprise HR software, banking and, since 2021, automation and AI for small and mid-size businesses. Most of what I build today is backend, data and automation work for companies that already run on established systems — ticket resale, retail, staffing, wealth management — and want AI and cloud added without a rewrite.

I'm language-agnostic by habit: the .NET stack is where I'm deepest, but I ship Python, Java and Node.js in production and work across SQL Server, PostgreSQL, Oracle, MySQL, MongoDB and Cosmos DB. Six years at HSBC on 24/7 payment systems taught me that a system is only as good as its worst morning. I work on-site in Calgary or remotely, and take selected contracts through Upwork.

What I work with

LanguagesC#, Python, Java, JavaScript / TypeScript, Node.js, SQL — and whatever a codebase already uses
.NET.NET 8 / Core and Framework, ASP.NET Core / MVC / WebForms, Blazor, WPF, Entity Framework, Hangfire
FrontendReact, Angular, Vue.js, Blazor, jQuery, Bootstrap, Dash / Plotly
DatabasesSQL Server, Azure SQL, PostgreSQL, Oracle, MySQL, MongoDB, Cosmos DB — indexing, partitioning and tuning at 100M+ rows; ETL, data warehousing, Synapse, Data Factory
AI & dataOpenAI fine-tuning, Gemini, Claude Code, MCP servers, LLM pipelines in daily production; pandas, SciPy, scikit-learn, Prophet, ARIMA
Cloud & DevOpsAzure (App Service, WebJobs, Functions, Static Web Apps, Key Vault, App Insights), AWS (EC2, Lambda, S3), GCP; Docker, Kubernetes, Linux; GitHub Actions, GitLab CI, Jenkins
IntegrationREST APIs, OAuth 2.0, Exchange / IMAP, Stripe, Google Workspace, Slack, Power Automate, n8n, PDF parsing, RFID, Zebra printing
Testing & practiceSelenium, Playwright, unit and integration tests, code review; Agile/Scrum, event-driven architecture
  • Base
    Calgary, Alberta, Canada
  • Time zone
    Mountain Time (GMT−7 / −6)
  • Mode
    On-site in Calgary, or remote
  • Credentials
    Google Cloud Professional Cloud Architect · PMP (PMI) · ECBA (IIBA)
  • Education
    BBA, Ho Chi Minh University of Economics · Diploma in Software Engineering, Aptech
  • Recognition
    CEO Recognition Award, HSBC 2017 — payment gateway scaled to 1M transactions/day
  • Languages
    English · Vietnamese
  • Open to
    Backend, platform and AI-infrastructure roles; selected contracts
Contact · Let’s talk

Have a system that should run itself by now?

Tell me what people still do by hand every morning, or what breaks when nobody is watching. I'll map the shortest path to a job that just runs.

Project brief