AmateurGolf.com — Full Platform Modernization
Transformed a 20+ year-old ASP.NET Web Forms application — hosted on an on-prem server in a closet — into a modern Next.js 15 + React 19 frontend with a .NET 9 Clean Architecture backend, fully hosted in Azure. Reduced operating costs by 30% while dramatically improving performance, security, and user experience. Now serving as the sole software engineering partner for 2+ years and counting — supporting ongoing feature development, maintenance, and platform growth.

How We Delivered This Transformation
Engineering
Complete rewrite from .NET 4.7.2 Web Forms to .NET 9 Clean Architecture with Next.js 15 — async/await, dependency injection, repository pattern, and a proper test suite.
Product & Partnership
As a scratch golfer and competitive amateur, I brought real domain expertise to every product decision. Now in my 2+ year as the sole software engineering partner — supporting new features, maintenance, and strategic growth.
Mobile-First UX
With 50%+ of traffic from iPhones, every screen was designed mobile-first: touch-friendly controls, responsive layouts for on-course use, fast cellular load times, and a conversion-focused membership flow with paid registration and trial memberships.
Cloud & DevOps
Replaced manual FTP deployments and an on-prem server in a closet with full Azure cloud infrastructure, automated CI/CD pipelines, a complete dev environment with DB refresh scripts, Docker containers for dev/prod parity, and local setup scripts — cutting operating costs by 30%.
Security Overhaul
Eliminated hardcoded credentials, insecure cookies, and missing CSRF protection. Replaced with JWT auth, Key Vault secrets, security headers middleware, and audit logging.
AI-Accelerated
Agentic AI handled legacy code analysis, test generation, and migration scaffolding — letting one builder deliver a transformation that would typically require a full team.
Before & After





Technologies Used
The Challenge
AmateurGolf.com is a cornerstone of the competitive amateur golf community — home to tournament listings, player rankings, scoreboard tracking, news, and thousands of registered members. But after 20+ years running on ASP.NET Web Forms (.NET Framework 4.7.2), the platform was buckling under the weight of its own technical debt.
The legacy stack was a textbook case of what happens when software outlives its architecture: a monolithic codebase with 70+ Web Forms pages, business logic tangled directly into code-behind files, no dependency injection, no async/await (every database call blocking), and synchronous Entity Framework 6 queries with DbContext instances created and never properly disposed. The UI was built on jQuery 1.10.1 (from 2013), Telerik Ajax controls, and Font Awesome 4.0.3 — all well past end-of-life. With over half of the site's traffic coming from iPhones, the lack of any mobile-responsive design was a critical problem — users were pinching and zooming through desktop-only layouts on the course between rounds.
Security was the most urgent concern. Database credentials and API keys were hardcoded in Web.config and checked into source control. Authentication relied on insecure session cookies without HttpOnly or Secure flags. There was zero CSRF protection across the entire application. ASP.NET trace was enabled and exposed to remote users. Debug mode was left on in production configuration.
The membership and registration flow was another major pain point. The legacy system had a flat, confusing sign-up process with no concept of membership tiers — anyone could register for free with no incentive to convert to a paying subscriber. There was no trial membership option, no streamlined payment integration, and no funnel designed to capture and convert leads into revenue-generating members.
The deployment process was nonexistent. Changes went live via manual FTP file copy to the on-prem server — no version control integration, no build step, no automated testing, and no rollback capability. There was no development environment and no development database that could be refreshed with current production data, so every change was effectively tested directly in production. Onboarding another engineer would have been nearly impossible — there was no local development setup, no documentation, and no way to replicate the production environment locally.
Perhaps most critically, the entire platform was hosted on a managed service provider's on-premises server — literally a server in a closet — with no redundancy, no auto-scaling, no disaster recovery, and operating costs that didn't reflect the value being delivered.
Key Results
- 30% reduction in operating costs after migrating from on-prem to Azure cloud
- Complete security overhaul: JWT auth, CSRF protection, security headers, Key Vault secrets management
- Modern frontend: Next.js 15 + React 19 replacing 70+ legacy Web Forms pages
- Clean Architecture backend: .NET 9 with proper async/await, DI, and repository pattern
The Solution
As a scratch golfer and competitive amateur myself, this was a passion project from day one. I didn't just understand the technical requirements — I understood the product from the perspective of someone who actually uses it on tournament day. That combination of engineering depth, product instinct, and domain knowledge is exactly what made this transformation possible as a single builder.
I owned the entire product lifecycle end-to-end: auditing the legacy codebase, defining the migration strategy, designing the new UX, architecting the modern system, and engineering the full stack — engineering, product management, and UX all under one roof.
Architecture & Engineering: The backend was completely rewritten in .NET 9 with Clean Architecture — strict separation into Domain, Data, Infrastructure, and API layers. Repository pattern for data access, domain services for business logic, and full dependency injection throughout. Every I/O operation is async/await. Entity Framework Core 9 replaced EF6, with proper DbContext lifecycle management and connection pooling. A comprehensive test suite (xUnit) was built alongside the code.
Frontend & UX: The frontend was rebuilt from scratch in Next.js 15 with React 19 Server Components — replacing 70+ Web Forms pages and Telerik controls with a modern, component-based architecture. Material UI provides a polished, accessible design system. With over 50% of traffic coming from iPhones, the entire UX was designed mobile-first from day one — every screen, every flow, every interaction optimized for on-course access during tournaments. Touch-friendly controls, responsive layouts, and fast load times on cellular connections mean golfers can check scoreboards, register for events, and manage their profiles without ever reaching for a laptop. Sanity CMS powers the content management layer for news and articles.
Membership & Revenue: The registration flow was completely redesigned to drive paid conversions. The modern system requires payment to become a member, replacing the legacy free-for-all registration. I introduced trial memberships that give new users a taste of premium features before committing — a product decision that creates a real conversion funnel where none existed before. The streamlined mobile-first join flow walks users through account creation, plan selection, and secure payment in a single frictionless experience.
Security Overhaul: JWT authentication with refresh tokens replaced insecure session cookies. Custom middleware enforces CSRF protection, security headers (CSP, HSTS, X-Frame-Options), rate limiting, and audit logging. All secrets moved to Azure Key Vault — zero credentials in source code. Account lockout prevents brute force attacks with exponential backoff.
DevOps & Deployment: The legacy manual FTP deployment was replaced with a fully automated CI/CD pipeline. Azure Pipelines handles build, test, and deployment with intelligent change detection — only affected services are built and deployed. A complete development environment was stood up with automatic database refresh scripts that pull current production data into the dev database on demand. A local development setup script ensures any engineer can clone the repo and be running locally in minutes. Docker containers guarantee bit-for-bit consistency between local development, the dev environment, and production — eliminating "works on my machine" issues entirely. Every change now flows through the same consistent, repeatable deployment process.
Cloud Migration: The entire platform was migrated from an on-prem managed server to Azure — App Service for compute, Azure SQL for the database, Blob Storage for media, Key Vault for secrets, and Application Insights for monitoring. The result: auto-scaling, geo-redundancy, health checks, and a 30% reduction in operating costs.
AI-Accelerated Delivery: Agentic AI tooling handled code analysis of the legacy codebase, test generation, boilerplate scaffolding, and migration patterns — letting me focus on architecture decisions, UX design, and the product details that matter to golfers.
Ongoing Partnership: This wasn't a build-and-disappear engagement. I've been AmateurGolf.com's sole software engineering partner for over 2 years — and the relationship continues to this day. Beyond the initial modernization, I provide ongoing feature development, bug fixes, performance tuning, infrastructure management, and strategic technical guidance. The client gets a dedicated technology partner who understands every layer of the system, not a revolving door of contractors.
Technology Stack Comparison
| Category | Before (Legacy) | After (Modern) |
|---|---|---|
| Frontend Framework | ASP.NET Web Forms + jQuery 1.10.1 (2013) | Next.js 15 + React 19 Server Components |
| Backend Framework | .NET Framework 4.7.2 (EOL) | .NET 9 with Clean Architecture |
| Database Access | Entity Framework 6 (EDMX, no async, no disposal) | Entity Framework Core 9 (async, DI, proper lifecycle) |
| UI Components | Telerik Ajax Controls + Font Awesome 4.0.3 | Material UI 6 + modern React components |
| Authentication | Session cookies (no HttpOnly, no Secure flags) | JWT + refresh tokens + account lockout + rate limiting |
| Security | No CSRF, credentials in source, trace exposed | CSRF middleware, CSP, HSTS, Key Vault, audit logging |
| Hosting | On-prem MSP server (no redundancy) | Azure cloud (auto-scaling, geo-redundancy, health checks) |
| Deployment | Manual FTP file copy to on-prem server (no build, no tests) | Azure Pipelines CI/CD with automated build, test, and multi-stage deploy |
| Dev Environment | None — no dev DB, no local setup, changes tested in production | Full dev environment, DB refresh scripts, local setup scripts, Docker containers |
| Monitoring | Serilog to SQL (errors only) | Application Insights + structured logging + custom events |
| Content Management | Hardcoded in Web Forms pages | Sanity CMS with visual editing |
| Mobile Experience | Desktop-only layout, no responsive design (50%+ iPhone traffic) | Mobile-first responsive design, touch-optimized, fast on cellular |
| SEO | Basic meta tags, some structured data | Dynamic metadata, JSON-LD, OG tags, sitemap generation, 301 redirects |
| Membership & Registration | Free registration, no payment flow, no tiers | Paid membership with trial option, streamlined mobile payment flow |
| Code Architecture | Monolithic code-behind (70+ pages, no DI) | Clean Architecture: Domain → Data → Infrastructure → API |
Results & Impact
- 30% reduction in operating costs after migrating from on-prem to Azure cloud
- Complete security overhaul: JWT auth, CSRF protection, security headers, Key Vault secrets management
- Modern frontend: Next.js 15 + React 19 replacing 70+ legacy Web Forms pages
- Clean Architecture backend: .NET 9 with proper async/await, DI, and repository pattern
- Mobile-first redesign for 50%+ iPhone user base — every screen optimized for on-course tournament access
- Full CI/CD pipeline replacing manual FTP deployments — automated build, test, and deploy with change detection
- Complete dev environment with DB refresh scripts, local setup scripts, and Docker for bit-for-bit dev/prod consistency
- Application Insights monitoring replacing blind-spot logging
- Preserved 20+ years of tournament data, player rankings, and member accounts
- Auto-scaling and geo-redundancy replacing single on-prem server
- Sanity CMS for content management — editors no longer need developer involvement
- Overhauled registration into a paid membership model with trial memberships to drive subscriber conversions
- 2+ year ongoing partnership as sole software engineering partner — new features, maintenance, and growth
Want similar results for your project?
Whether you need to modernize a legacy application, migrate to the cloud, or find a lasting technology partner — let's talk about how I can make it happen.
Start Your Project