Harry Nguyen
four of six are reachable

Built, deployed, and still running.

Selected work across revenue cycle analytics, dashboard and reporting workflows, deep learning and computer vision, and infrastructure. Where something is running, its address sits on the entry, because reachability is the argument.

01pythonpandasnumpyexcelpower query

Revenue cycle by design

rcm case study

Built a claims adjudication engine in Python that generates a 157,750-line ledger: a charge master and contracted fee schedule priced by payer and plan, CARC and RARC assignment from a 71-entry code dictionary, and provider performance tiers that set how often each provider’s claims come back clean. Normalized the output into a star schema with Power Query, five dimension tables and three fact tables counted per claim and per service line, then modeled it in Power Pivot to analyze reimbursement, denials, efficiency, and profitability.

Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Total
Claims5,4355,5205,5905,3905,5055,6355,6555,3305,6555,6805,1005,32065,815
Billed$2.26M$2.20M$2.22M$2.40M$2.30M$2.31M$2.34M$2.35M$2.47M$2.29M$2.06M$2.23M$27.44M
Collected$1.29M$1.28M$1.25M$1.38M$1.30M$1.32M$1.33M$1.32M$1.40M$1.28M$1.19M$1.25M$15.61M
Write-off$30K$27K$27K$20K$29K$31K$32K$34K$29K$32K$30K$33K$356K
Collected %57%58%57%57%57%57%57%56%57%56%58%56%56.9%
Monthly summary. Rendered from the same figures the dashboard reads, not screenshotted, so the two cannot fall out of agreement. Twelve months of dates of service, April 2025 through March 2026, across five facilities and eight payers.
carc_desc = { ("CO","109"): "Claim not covered by this payer/contractor; send to correct payer/contractor.", ("CO","129"): "Payment denied - Prior processing information appears incorrect.", ("CO","131"): "Claim specific negotiated discount.", ("CO","150"): "Info submitted does not support this level of service.", ("CO","16") : "Claim/service lacks info needed for adjudication. Remark Code required when appropriate.", ("CO","184"): "Prescribing/ordering provider not eligible to prescribe/order service billed.", ("CO","193"): "Original payment decision is being maintained; processed properly the first time.", ("CO","197"): "Payment denied/reduced for absence of precertification/authorization.", ("CO","210"): "Pre-cert/authorization not received in a timely fashion.", ("CO","222"): "Exceeds contracted maximum hours/days/units by provider for this period.", ("CO","226"): "Information requested from Billing/Rendering Provider not provided or insufficient/incomplete.", ("CO","231"): "Mutually exclusive procedures cannot be done in the same day/setting.", ("CO","234"): "This procedure is not paid separately. At least one Remark Code must be provided.", ("CO","236"): "Procedure/procedure-modifier combo not compatible with another per NCCI.", ("CO","250"): "Incorrect attachment/document received; expected attachment/document still missing.", ("CO","251"): "Attachment/documentation received did not contain required content to process service.", ("CO","252"): "Attachment/documentation is required to adjudicate this service. Remark Code required.", ("CO","253"): "Reduction in Federal Spending Due to Sequestration.", ("CO","26") : "Expenses incurred prior to coverage.", ("CO","272"): "Coverage/program guidelines were not met.", ("CO","288"): "Referral absent.", ("CO","29") : "Time limit for filing has expired.", ("CO","299"): "Billing provider not eligible to receive payment for service billed.", ("CO","4") : "Procedure code inconsistent with modifier used or required modifier missing.", ("CO","45") : "Charges exceed your contracted fee arrangement.", ("CO","5") : "Procedure code/bill type inconsistent with place of service.", ("CO","55") : "Denied: experimental/investigational by payer.", ("CO","56") : "Denied: procedure/treatment not deemed proven effective by payer.", ("CO","59") : "Charges are adjusted based on multiple surgery rules or concurrent anesthesia rules.", ("CO","97") : "Benefit included in payment/allowance for another service/procedure already adjudicated.", ("CO","B9") : "Services not covered because patient is enrolled in a Hospice.", ("CO","B13"): "Previously paid. Payment may have been provided in a previous payment.", ("CO","B15"): "Payment adjusted: qualifying service/procedure not received/adjudicated.", ("CO","P12"): "Workers' compensation jurisdictional fee schedule adjustment.", ("OA","18") : "Duplicate claim/service.", ("OA","23") : "Payment adjusted due to impact of prior payer(s) adjudication (COB).", ("OA","94") : "Processed in Excess of charges.", ("OA","A1") : "Denied. At least one Remark Code must be provided.", ("PI","15") : "Authorization number missing/invalid/does not apply.", ("PI","16") : "Claim/service lacks information needed for adjudication. Remark Code required when appropriate.", ("PI","27") : "Expenses incurred after coverage terminated.", ("PI","167"): "Diagnosis(es) not covered.", ("PI","204"): "Service/equipment/drug not covered under patient's current benefit plan.", ("PI","59") : "Charges adjusted based on multiple surgery rules/concurrent anesthesia rules.", ("PI","P12"): "Workers' compensation jurisdictional fee schedule adjustment.", ("PR","119"): "Benefit maximum for this time period or occurrence has been reached.", ("PR","151"): "Payer deems the info submitted does not support this many services.", ("PR","187"): "Health Savings Account payments.", ("PR","200"): "Expenses incurred during lapse in coverage.", ("PR","204"): "Service/equipment/drug not covered under patient's current benefit plan.", ("PR","243"): "Service not authorized by network/primary care provider.", ("PR","222"): "Exceeds contracted maximum hours/days/units by provider for this period.", ("PR","227"): "Info requested from patient/insured/responsible party not provided or insufficient/incomplete.", ("PR","242"): "Services not provided by network/primary care providers.", ("PR","272"): "Coverage/program guidelines were not met.", ("PR","275"): "Prior payer(s) patient responsibility not covered.", ("PR","40") : "Charges do not meet qualifications for emergent/urgent care.", ("PR","50") : "Non-covered: not deemed a medical necessity by payer.", ("PR","55") : "Denied: experimental/investigational by payer.", ("PR","96") : "Non-covered charge(s).", ("PR","A1") : "Denied. At least one Remark Code must be provided.", }
Adjustment codes. The dictionary the engine assigns from: 71 CARC entries keyed on the group and code as a pair, not on the number alone. PR-50 bills the patient for a service the payer called not medically necessary, and CO-50 would make it the practice’s loss. The full engine is in the case study.
business questions
  • How are A/R loads and collection rates tracking month over month?
  • Which payers generate the highest write-off burden per encounter?
  • Where are denial rates concentrated, by provider, CPT, or payer?
  • How does reimbursement compare to allowed revenue across encounter types?
approach
  • Cleaned and transformed raw billing data in Python and Power Query
  • Applied MPPR reductions and standardized adjustment coding
  • Univariate and multivariate analysis across payer and encounter
  • Interactive dashboard with slicers for payer, month, and provider
02javascriptechartsedadataviz

Claude Code: a data analytics console

the console

The console I actually use, rendered here from a captured snapshot. It reads my own Claude Code session history and answers four questions: what the work cost, when it happened, which tools carried it, and which skills the output is attributable to.

The Claude usage console: health metrics and the intelligence thermodynamics chart
Views. Intelligence thermodynamics; cadence and output by weekday and hour; models by reliability and cost; resource utilization and the tool matrix.
03pythontensorflowkerasanncnncomputer vision

Facial emotion recognition

Built and compared multiple deep learning models to classify facial expressions across four categories: happy, sad, surprised, and neutral. Progressed from a baseline artificial neural network through increasingly refined convolutional architectures.

Confusion matrix and accuracy curves for the final convolutional model
baseline ann56%
model 1, simple cnn59%
model 2, refined cnn69%
model 3, optimized cnn91%

Depth, dropout tuning, and epoch scaling outperformed the simpler architectures, reaching 91 percent accuracy across the four categories. Matching input format to what the model expected, grayscale rather than RGB, improved alignment and removed preprocessing artifacts.

04djangodrfpostgresqlnuxt 3channelscelerydocker

carbon: one database for projects, tasks, and goals

carbon.huy.gg

A project, a to-do list, and a goal held side by side on one database, running on hardware I own rather than rented infrastructure and reorganizing as the work changes. Every table is a real PostgreSQL table with typed columns, so a filter runs as a query inside the database instead of JavaScript sifting rows the browser already downloaded. Data arrives as CSV, JSON, or Excel and leaves the same way, whole.

The carbon project table: column headers badged with their PostgreSQL types
The grid on carbon.huy.gg. Each column header carries a badge naming that field's actual PostgreSQL type, and the summary strip underneath aggregates in SQL rather than in the browser. Access stays invite-only while the build continues.
architecture
  • Types and constraints enforced by Postgres, not simulated in app code
  • One Page model under tables, dashboards, and notes, so a new view is a presentation choice
  • Row and schema changes broadcast to every open session
  • Imports and exports run on a background queue with live progress
engineering practice
  • Every slice ships as a written plan of test-driven tasks, closed only after browser verification
  • Over 2,300 automated tests, green before any merge
  • Defects recorded as Symptom, Cause, Fix, Prevention, so a fix generalizes past the one bug
  • Restores drilled against real backups
05pythonsqlitetypescriptrusttree-sitter

codemap: a dependency index

query surface

A code index that answers where a function lives, what calls it, and what breaks if it changes, across a whole repository, without opening a file and without a language model in the loop. Built after the tool I was using kept returning the entire neighborhood around whatever I asked about instead of an answer.

harry@huy.gg ~/carbon • zsh
harry@huy.gg ~/carbon $ codemap stats
symbols indexed   6050
relationships     11609
  import-backed  11055
  inferred        554
harry@huy.gg ~/carbon $ codemap callers formula_index
react   func   backend/core/dynamic/reactions.py:38
harry@huy.gg ~/carbon
tip: try help, check, callees formula_index, def FieldSerializer
symbols indexed6,050
relationships11,609
import-backed11,055
inferred554

Search finds where a name appears. This finds what depends on it. Before changing anything, that is what you need to know.

06dockernginxcloudflarelinuxmariadbwireguardpi-hole

Self-hosted home server infrastructure

Private file storage, media streaming, and carbon all run on hardware in my apartment, under one domain. Containerized behind a reverse proxy, with automated certificates, VPN-only access to anything private, and DNS filtering at the network level.

harry@huy.gg ~ • zsh
harry@huy.gg ~ $ tail -f /var/log/services.log
harry@huy.gg ~
tip: try help, whoami, ls services, cat motd, ping huy.gg, uptime
  • Docker containers behind nginx, routed by subdomain
  • Cloudflare DNS and proxying, Let's Encrypt renewing unattended
  • WireGuard for remote access, Pi-hole filtering DNS network-wide
  • MariaDB backing the services that need persistence

Running continuously. Carbon, ownCloud, Jellyfin, and Pi-hole are all served off it, certificates renew unattended, and private services are reachable only over WireGuard.

Are you hiring?

Read the resume

Or do you want to talk through a project? Either is welcome.