Case study · Sole designer and developer

Organization-owned infrastructure, not agency dependency.

A Houston nonprofit run club was running on agency-managed WordPress hosting that had already gone down and was hard to maintain — the technical lead had to wait on the agency whenever something broke, and analytics installation was unreliable. The fix was replacing a fragile, externally dependent website with lightweight, measurable infrastructure the organization actually owns.

OrganizationNonprofit run club (unnamed by request) RoleSole designer and developer ScopeMigration, performance, analytics, SEO, content ops

Short answerA Houston nonprofit run club had to wait on an agency every time its website broke. Rebuilding on hosting the organization controls cut ongoing cost to near zero, moved mobile Lighthouse performance from 65 to 94, reduced image payload from about 14MB to about 1MB, and left content controls plus documentation a volunteer can actually run.

The problem

The real pain point was dependency, not design.

The organization didn't need a prettier site. It needed to stop being at the mercy of a third party for uptime and basic changes, and it needed analytics that actually worked. Any fix had to solve that root cause, not just redecorate the surface.

Architecture

Domain → org-owned GitHub repo → GitHub Pages → established services.

OWNERSHIP

The organization controls the domain

Ismael controls the domain on the organization's behalf, and the source lives in a version-controlled, organization-owned GitHub repository — not an agency's private system.

COST & MAINTENANCE

Rebuilt from scratch on GitHub Pages

Near-zero ongoing hosting cost, no server to maintain, and no downtime risk of the kind that motivated the migration. The old WordPress markup was left behind entirely rather than ported.

SUCCESSION

Built to survive without a technical volunteer

A written README, a short screen recording, and one supervised practice update mean the organization can lose its technical volunteer without losing its website.

Performance

Real Lighthouse testing, not assumptions.

65 → 94
Mobile Lighthouse performance score
~14MB → ~1MB
Total image payload

Desktop was already scoring 99, but mobile — where most visitors land — was stuck at 65. Root cause: a 5.9MB unoptimized hero image and render-blocking font loading. Both were fixed and the site was re-tested against the live result, not assumed fixed.

Adding width/height attributes to images without also setting height: auto in CSS caused visible stretching on some mobile browsers — a regression that's invisible in review and only shows up on a real phone.

Analytics

A tracking pattern built to survive without the builder.

PATTERN

One event, every button, forever

A single GTM trigger plus one GA4 event (cta_click with a cta_name parameter) covers every call-to-action, present and future — a new button just needs a data-cta attribute, no new GTM configuration.

CAUGHT LIVE

A double-counting bug, found and fixed

Publishing the GTM container auto-added its own pageview tag alongside an existing hardcoded gtag.js snippet, silently doubling every pageview count. Caught before it distorted a single report.

SEO

Targeted, connected, and measured within 24 hours.

Titles and meta descriptions rewritten against the phrase people actually search locally, plus a previously-nonexistent sitemap.xml and robots.txt, with Search Console connected immediately so results were observable instead of assumed. The target local phrase was generating real clicks within 24 hours — measurable, rather than a "give it six months" promise.

What this proves

A resource-constrained nonprofit doesn't need to choose between "no website support" and "locked into an agency." Lightweight, organization-owned infrastructure — built with established external services rather than custom systems — can cost less to run and be more reliable at the same time, and can survive a change in who's volunteering.