Eric Savage Senior Software Developer

For contact information, or other inquiries, enter your email below

14+ years of experience building custom web applications end-to-end with an eye to accessibility, performance, and stability. Communicates fluently across all levels of stakeholders, translating requirements into solutions. Has a strong background in frontend (CSS, JS, frameworks), backend (PHP, Node.js), and Linux server management. Past experience ranges from small business to Fortune 500 company websites, and SaaS LMS platforms.

14+ years of experience translating design into accessible, high-performance code, building component-driven JavaScript/TypeScript applications with hand-tuned CSS/Sass and rigorous WCAG accessibility auditing. Communicates fluently across all levels of stakeholders, translating designs and requirements into interfaces. Has a strong background in frontend development (Angular, TypeScript, Sass/CSS, accessibility), also versed in backend (PHP, Node.js) and Linux server management. Past experience ranges from small business to Fortune 500 company websites, and SaaS LMS platforms — including custom component libraries and site-wide accessibility remediation.

14+ years of experience translating requirements into reliable, well-architected backend systems, from multi-tenant data models through REST APIs, third-party integrations, and production incident response. Communicates fluently across all levels of stakeholders, translating requirements into solutions. Has a strong background in backend development (PHP, Node.js, MySQL, MongoDB), also versed in frontend (JavaScript, Angular) and Linux server management. Past experience ranges from small business to Fortune 500 corporate websites, and SaaS LMS platforms. This includes diagnosing and eliminating bugs such as a recurring production race condition, architecting SSO/identity integrations for a multi-tenant SaaS platform, and building Node.js tooling for third-party data reconciliation.

14+ years of experience owning production infrastructure end-to-end, from cloud architecture and cost optimization through Linux system administration and incident response. Communicates fluently across all levels of stakeholders, translating requirements into solutions. Has a strong background in infrastructure (AWS, Linux, CI/CD), also versed in backend (PHP, Node.js) and frontend (JavaScript, Angular) development. Past experience ranges from small business to Fortune 500 corporate websites, and SaaS LMS platforms. This includes leading a full AWS infrastructure audit that cut monthly cloud spend ~36%, standardizing process management across a 12-server fleet, and designing an encrypted, off-machine backup system with automated restore verification.

Certifications

Experience

Apti (Digitec) Orlando, FL (remote)

Senior Software Developer Jan 2023 - present

  • Audited the AWS account line by line, removing a spare production stack and 19 TB of stale snapshots, cutting the bill ~36% (~$4,900 to ~$3,100/month) and holding it since 2023.
  • Eliminated a recurring production crash (100–130 failures/day) by tracing it to a race condition in the template cache, fixed with atomic writes and automatic cache warm-up.
  • Drove server uptime to near-perfect by normalizing services and clearing legacy cruft across the server fleet: average weekly downtime fell from 0.86s in 2023 to 0s in 2026.
  • Cut average ticket resolution time company-wide: helpdesk from ~31 to ~10 hours (67%) and bugs from ~50 to ~29 hours (42%), consistently beating internal SLA targets.
  • Found and cleaned up four separate compromises on a production WordPress site, including malware in 1,300+ files and stolen credentials used to publish 230+ spam posts over months.
  • Converted hiapti.com from a hardcoded single-page app to a custom WordPress theme, keeping every interaction and animation, with perfect 100 PageSpeed scores on desktop and mobile.
  • Led a fleet-wide infrastructure cleanup across 12 servers (production, staging, dev), standardizing inconsistent process management and writing the team's infrastructure reference.
  • Built a 16-block custom Gutenberg library and editor extensions for the hiapti.com WordPress theme, turning it into a design system non-developers can maintain.
  • Cut average weekly bug-ticket volume by over 50% (~1.0 to ~0.45 per week) from 2023 to 2025, before the metric was broadened in 2026 to include feature requests.
  • Maintains and extends a custom multi-tenant Learning Management System (LMS) platform serving dozens of independently configured enterprise clients.
  • Ships new features to production monthly across a PHP/Phalcon backend and AngularJS frontend.
  • Uses Claude daily to accelerate bug diagnosis, tooling, and feature development, while retaining full ownership of code review, testing, and quality.
  • Maintains living architecture, API and infrastructure docs for the KD7 learning platform, capturing undocumented systems and tribal knowledge that now ground AI-assisted work on the codebase.
  • Owns the agency's WordPress marketing sites (hiapti.com, kdplatform.com, digitecinteractive.com, fastcompliance.com) on WP Engine, with git deploys and DDEV local environments.
  • Manages DNS for the company's domains in AWS Route 53 and GoDaddy, including moving sites between hosts and setting up redirects between domains.
  • Manages email authentication (SPF, DKIM, DMARC) for the company's domains, keeping transactional and marketing email deliverable.
  • Ran security audits across the full multi-site WordPress fleet, identifying and remediating a compromised ex-employee admin account present on multiple production sites.
  • Built reusable DDEV/WP Engine tooling (a custom production-sync command, local environment shims) standardizing local development across the agency's WordPress site portfolio.
  • Reverse-engineered and patched Avada/Fusion Builder license checks on 3 production sites after the vendor license was lost, ending update nags without changing functionality.
  • Applied security hardening (CSRF nonces, timing-safe credential checks researched against a disclosed CVE) and PHP 8.2 compatibility fixes across legacy WordPress code.
  • Hand-rolled a nonce-based Content-Security-Policy and HSTS header for hiapti.com covering 15+ third-party integrations, and resolved a caching plugin's conflicting headers.
  • Cut ~2.7 seconds of main-thread blocking on the hiapti.com homepage by loading a heavy third-party SDK on demand, part of a broader conditional asset-loading setup.
  • Built an automatic WebP image-conversion pipeline with per-component responsive image sizing to reduce page payload.
  • Built a custom blog subscription system integrating the Mailchimp Marketing and Transactional APIs, including a Composer-level patch to the vendor SDK for PHP 8.x compatibility.
  • Built and integrated a suite of marketing/ABM tracking tools (6sense, ZoomInfo, RB2B, LinkedIn Insight Tag) as custom WordPress plugins with environment-aware activation logic.
  • Replaced an unlicensed, heavy third-party 3D scene with a custom Three.js/WebGL animation, improving load time, keeping the look, and adding reduced-motion support.
  • Manages front-end build tooling (Grunt/Sass) and ongoing Google PageSpeed/Lighthouse performance tuning for the hiapti.com corporate marketing site.
  • Administers Jenkins CI/CD pipelines across a multi-repository codebase (API, application, shared frontend package).
  • Serves as primary incident responder for the production server fleet, resolving server, database, and deployment issues independently.
  • Reused and extended an aXe-based, sitemap-driven accessibility auditing tool (originally built at Sandstorm) to audit and iteratively remediate WordPress and Framer client sites.
  • Recovered a staging server after a roughly 24-hour freeze, traced its failed reboot to 11 stale fstab entries for deleted volumes, then audited the rest of the fleet for the same hazard and fixed 5 more on production.
  • Fixed certificate-renewal scripts on three app servers that restarted Apache and nginx outside supervisord's control, which had split the production web stack when run by hand, replacing them with one supervisor-aware restart.
  • Found that all six worker-fleet repositories depended on a dead Composer repository host that resolved only on the Jenkins server through a stale hosts entry, and repointed them to the live host without disturbing any locked dependency version.
  • Traced a WP Engine account sitting at 99% of its 15 GB storage pool to a theme cache hiding under the uploads directory (7.8 GB across 22,000 files) and cleared it, bringing usage down to about 7 GB.
  • Built a third-party service inventory across 26 tenant config files and 29 tenant databases, classifying every dependency as required, optional, or dead so unused subscriptions can be cancelled without breaking customers.
  • Fixed a tenant-deletion bug in the LMS platform's queue worker where an unguarded MongoDB connection threw before the tenant's on-disk directory was cleaned up, leaving an orphaned directory whenever a delete hit a Mongo failure.

Sandstorm Design Chicago, IL (remote)

Senior Full Stack (LAMP) Developer Jan 2021 - Dec 2022

Full Stack (LAMP) Developer Jan 2017 - Jan 2021

  • Led a team of ~10 developers and designers across 20–30 concurrent client engagements.
  • Built an accessibility auditing tool that crawled a site's sitemap, scanned every page with aXe, and grouped violations by issue type for repeated sweeps until none remained.
  • Delivered multiple Drupal front ends achieving perfect 100 Google PageSpeed scores (performance, accessibility, best practices, SEO).
  • Contributed to planning data architecture, site structure, and technology selection for current and future projects.
  • Oversaw small-team web projects, including sprint planning, development guidance, and code reviews/pull requests.
  • Spearheaded development of automated front-end testing using Nightmare JS.
  • Built and maintained Drupal (and other CMS) sites for large-scale organizations.
  • Planned and built URL redirect strategies for site rebuilds and CMS migrations, including NOW Foods, Crown Holdings and WordPress-to-Drupal moves, to carry existing links and search traffic over to the new sites.

Artistic Digital Services Evanston, IL

Designer, Developer, Administrator Apr 2012 - Jan 2017

  • Progressed from administrative assistant into the agency's sole developer, self-teaching CSS, JavaScript, and PHP on the job as prior developers left.
  • Built and maintained custom websites and web apps in PHP/MySQL and JavaScript, across CMSs including WordPress, Joomla, Magento and Wolf CMS.
  • Created custom CMS and E-Commerce solutions for small to mid-sized businesses and design firms/ad agencies.
  • Audited, cleaned up, and in some cases fully rebuilt poorly-constructed, low-cost WordPress sites inherited from other vendors.
  • Automated a multi-day manual image upload and tagging workflow (hundreds of files) by self-teaching AppleScript to drive the UI, running it unattended overnight.
  • Built and launched small-business websites for design and hospitality clients, including an interior designer's portfolio and several restaurant sites with online menus.
  • Full LAMP stack web development, including server management.
  • Managed hosting and server administration for client sites via Plesk, including uptime monitoring and access control.
  • Managed client domains and DNS, including moving sites between hosts and setting up redirects between domains.
  • Experienced in UI design and development.

Languages & Frameworks

Infrastructure & DevOps

Education

University of Illinois Urbana-Champaign, IL

Bachelor of Science: Psychology, Minor: English 2008

Selected Projects

Knowledge Direct (KD7) — Multi-Tenant LMS Platform

URL ariksavage.com/development/portfolio/kd7

Role Full-Stack Developer / Platform EngineerDate Ongoing

  • Built per-tenant, per-course visual theming for the platform's SCORM/TinCan course player, with publish-time CSS variable injection and a themeable UI component library.
  • Owns AWS infrastructure and cost optimization for a fleet of 12+ servers supporting dozens of independently configured enterprise tenants.
  • Cut recurring platform costs in a 2023 spending review: AWS by ~36%, Algolia from $284 to $121/month, and a major client's CDN from $8,138 to $4,590/month, saving $60K+/year in total.
  • Broke down hosting cost per client ($24.74/month in production, $48.99 across all tiers) and proposed per-GB storage overage pricing to cover storage in every environment.
  • Led a ground-up UI/UX redesign of the platform's learner theme (navigation, dashboard, account, storefront): roughly 700 files and a new shared component architecture.
  • Rebuilt bulk course enrollment in eight phases (per-user error isolation, live progress bar, dedicated queue, batched writes), turning an opaque, fragile job into a resilient one.
  • Integrated a third-party SSO/identity provider into the platform's authentication layer, reconciling and backfilling member identity records.
  • Rolled out uniform created/updated timestamps and created-by/updated-by tracking across 20+ entity types, exposing full audit history to admins in both the API and admin UI.
  • Added a tenant-level default palette and a course-level style UI to per-tenant course theming, so authors get a consistent branded look without restyling each course.
  • Built a bulk course-content export API for a client migrating off the platform, providing a complete, portable copy of their course library rather than locking in their data.
  • Built a fully custom reporting system for an education client, replacing a manual monthly Airtable workflow with configurable columns, saved filtered views, and a new report type.
  • Built (not yet deployed) a file-based help-content system: articles as HTML/CSS/Markdown files in the repo, auto-synced to Algolia and opt-in across the multi-tenant fleet.
  • Fixed a production-breaking TLS failure in the Algolia integration caused by the aging OpenSSL/PHP stack; with no upgrade path, vendored and patched the library, documenting why.
  • Works within a two-tier service architecture separating the public-facing application from an internal API/business-logic layer, communicating over an internal HTTP API.
  • Maintains a real-time notification pipeline (ZMQ message queue → Socket.io → WebSocket) delivering live in-app notifications to browser clients.
  • Streamlined course authoring with one-click admin tools: marking all of a course's sections ready to publish at once, and mapping a course directly to a sellable product.
  • Built one-click duplication for assessments, surveys and a course's resource library (questions, response data, repaired cross-references), replacing manual re-creation.
  • Closed a gap where deactivated users could reactivate themselves via password reset, adding activation checks, token revocation and forced session closure across the API and app.
  • Hardened self-registration against abuse with domain-based blocking, reCAPTCHA/Cloudflare Turnstile verification, and required email confirmation before activation.
  • Added custom axis labels and color schemes to the platform's charts and reports, carried through to PDF exports and saved with each report's configuration.
  • Eliminated a stale, disk-consuming PDF certificate cache by rearchitecting certificate delivery to stream freshly rendered, up-to-date certificates directly to users on request.
  • Extracted a reusable AngularJS component library (link lists, user menu, empty states, stat items and more) from duplicated, page-specific storefront and dashboard markup.
  • Migrated the platform's icon system to Phosphor Icons across 100+ files, standardizing the visual language platform-wide.
  • Rebuilt the learner theme's Webpack config (chunk splitting, vendor bundles, trimmed locale data) for better caching and smaller bundles, keeping AngularJS DI working for ES6 classes.
  • Replaced hardcoded UI strings with translation keys across dozens of templates, then built tooling to backfill missing keys directly from the production database.
  • Normalized colors, spacing, shadows, and typography into a consistent design system across the learner theme.
  • Built a standalone Node.js CLI tool to import and reconcile third-party member data into the platform, later extended with credit-transaction reconciliation and cleanup tooling.
  • Redesigned the enrollment-codes report end to end (query layer and admin UI), replacing a slow, unfilterable report with a paginated, filterable, sortable, CSV-exportable tool.
  • Built the in-app Zoom webinar integration from scratch (Meeting SDK client and player), then moved it off Zoom's legacy JWT auth ahead of the September 2023 deprecation.
  • Built asset-usage tracking that shows exactly where each asset is used, down to the course, with links into the editor, so admins can finally tell which assets are safe to remove.
  • Resolved Node.js/npm version drift across Jenkins CI, production servers and developer machines, standardizing the build environment so everyone builds from the same code.
  • Finished the never-functional theme manager (selector, installer, uploader), adding live refresh, theme deletion and cache-busting to turn dead code into a working feature.
  • Replaced naive translation-key pruning with per-locale reconciliation of old vs. new theme defaults, preserving admin customizations while still applying new defaults elsewhere.
  • Redesigned self-registration to drop the password field in favor of a server-generated password and guided reset flow, simplifying sign-up while maintaining security.
  • Built an in-app video upload flow integrated with Vimeo, including a new upload UI and backend service extensions.
  • Added conditional visibility logic to the course player's navigation menu based on enrollment state, coordinated across the admin course-builder and the learner-facing player.
  • Extended streamed, always-current PDF certificates to learning-path enrollments and the user transcript page.
  • Redesigned certificate selection for course authors, replacing a list of full-size previews with a filterable, sortable compact list that previews only the selected certificate.
  • Built a document-link content block for the course builder at a client's request, with asset-picker integration and click tracking that records who clicked what, where and when.
  • Added file-type icons (PDF, Word, Excel and more) to the course builder's document-link block, with 10 reusable icon components so authors can tell link types apart at a glance.
  • Spotted a recurring support burden (the same questions answered one-off by email) and proposed git-tracked, developer-editable support articles to replace overly complex tooling.
  • Built a hierarchical CSV export (district → school → course → module → user, with per-level headers and counts) matching a client's spreadsheet and ending monthly hand-compiling.
  • Built scheduled, per-recipient report delivery for a multi-district client: each district representative or principal gets a monthly email scoped to their own district or school.
  • Extended the billing report at a client's request to show each user's group, behind a per-tenant flag so other clients were unaffected, plus a CSV export beside the PDF.
  • Fixed a browser permissions-policy gap in the embedded Zoom integration after nested iframes stopped inheriting camera/mic/screen-share access, allowing them on the player iframe.
  • Diagnosed and patched an SSL compatibility issue in the Braintree payment SDK that was blocking production payments, applying a vendor-provided patch under time pressure.
  • Traced a course falsely blocked from archiving to Learning Path deletes that never cascaded to course links; fixed the cascade, closing the whole class of bug, not just one report.
  • Moved the course-archiving check for “is this course in an active Learning Path” from an async call to initial page load, making the answer synchronous and removing a round-trip.
  • Delivered a regex fix for glossary auto-linking that silently corrupted resource links whose text overlapped a glossary term, following a teammate's initial investigation.
  • Fixed Learning Paths that never auto-completed when courses were added after enrollment, with a self-healing check on page load that costs almost nothing in the common case.
  • Fixed “message all users in a course” silently messaging everyone, caused by a missing message-criteria condition and a reference to an undefined property.
  • Fixed an intermittent bug where learners met a course's SCO-completion threshold without it being marked complete, adding a defensive check of completed vs. required SCO counts.
  • Fixed deactivated users still showing as “active” in the admin UI (two status fields out of sync, dozens of users) with a self-healing check on page load, no migration needed.
  • Fixed purchased access codes missing from the admin screen: two assignment flows set different ownership fields, and the admin and learner views each checked a different one.
  • Fixed users with apostrophes or accents in their names (e.g. “D'Andrea”) being unsearchable, caused by undecoded HTML entities, once in a shared search trait used across the API.
  • Fixed an AngularJS digest-loop bug in the code-report filters, where filter rows rebuilt arrays on every digest cycle and caused runaway re-renders.
  • Fixed a recurring course-player crash found in Bugsnag, traced to stale learner state surviving a content republish, with defensive guards in the player.
  • Fixed a data-completeness bug where CSV export of code reports silently only included the currently loaded page rather than the full result set.

KD8 — LMS Platform Modernization

URL ariksavage.com/development/portfolio/kd8

Role OwnerDate Ongoing

  • Independently architecting a ground-up rebuild of a legacy multi-tenant LMS, replacing PHP 5.6 / AngularJS 1.7 with Laravel 11 (PHP 8.3) and an Angular 19+ Nx monorepo.
  • Has produced 86 database migrations and 58 API controllers in 5+ months of an independent LMS rebuild (as of Sept 2026).
  • Uses Claude to analyze legacy LMS behavior and scaffold new features, keeping a fast, consistent delivery pace within an independently architected modernization plan.
  • Designed a per-tenant infrastructure model with Terraform-provisioned, isolated EC2 instances and zero-touch cloud-init bootstrapping, plus a phased data-isolation strategy.
  • Designed a role-based user lifecycle (pending, active, deactivated, gated by email activation) with one-to-one user categories and many-to-many groups for course assignment.
  • Built a full GitLab CI/CD pipeline (test/build/deploy) and custom legacy-to-modern data migration and transformation tooling.

Self-Hosted LAMP Server

URL ariksavage.com/development/portfolio/self-hosted-server

Role OwnerDate Ongoing

  • Administers a self-hosted LAMP server for personal and freelance projects: ariksavage.com, a recipe and nutrition manager, an audiobook player, and a client exam app.
  • Migrated the observability stack (Prometheus, Grafana, exporters) from Docker Compose to Kubernetes in zero-downtime phases, keeping Compose running as a live fallback.
  • Self-taught Kubernetes by running k3s alongside an existing Docker Compose monitoring stack, disabling its bundled Traefik ingress to avoid a port conflict with the server's Apache reverse proxy.
  • Built encrypted off-machine backups (restic over SFTP to a second machine) for databases and app data, using an SSH key restricted to SFTP-only access in case it's compromised.
  • Deployed a Docker Compose observability stack (Prometheus, Grafana, node_exporter, mysqld_exporter) for live system and database monitoring, with persistent volumes.
  • Added Grafana alerting for backup health and uncovered two hidden live issues: a broken SMTP credential blocking alert emails, and a stale network config breaking DB monitoring.
  • Built restore verification beyond “the job succeeded”: a monthly job restores dumps into throwaway databases and reconciles file counts against live data to catch real corruption.
  • Designed Grafana alert rules across the infrastructure and database layers, tuning thresholds and evaluation windows to balance responsiveness against false positives.
  • Migrated the server from a Raspberry Pi to a dedicated Mac mini (Debian) with zero downtime across all hosted sites.
  • Secured public access to the monitoring dashboard with an Apache reverse proxy, Let's Encrypt TLS, and HTTP Basic Auth layered in front of Grafana's own login.
  • Hardened database access for monitoring by limiting MariaDB's exposure to one isolated Docker subnet (bind-address plus a UFW rule) and a read-only, minimal-privilege user.
  • Scoped MariaDB access for the Kubernetes monitoring stack to its pod subnet alone, with a matching UFW firewall rule and a dedicated database grant, as defense in depth.
  • Migrated Grafana's live database (dashboards, alert rules, contact points, policies) from Docker to Kubernetes storage with a coordinated stop/copy/restart and zero data loss.
  • Cut Apache's reverse proxy over to the Kubernetes-hosted Grafana via a NodePort Service, then decommissioned the old Docker Compose stack once the migration was verified end to end.
  • Provisioned Grafana's data sources declaratively from mounted config files instead of manual UI setup, keeping the monitoring setup reproducible and version-controllable.
  • Fixed a false-positive alert caused by PromQL filter semantics interacting with “no data” handling, correcting the query design rather than suppressing the symptom.
  • Built a safe way to test each Grafana alert end to end against real production data (temporary thresholds, CPU pinning with taskset) without risking service disruption.
  • Connected email alerting through an existing Gmail SMTP relay, pulling credentials from a privileged config file without exposing them in shell history or version control.
  • Established a secrets-handling pattern (restrictive file permissions, environment-file-based credentials) to keep passwords out of version-controlled configuration.
  • Centralized backup and restore-test scope in one config (a short list of databases and paths shared by every script), so adding a project to the backups takes a single edit.
  • Automated backups with systemd timers (nightly backups, weekly integrity checks, monthly restore tests) and tiered daily/weekly/monthly retention to cap storage growth.

ABSA Certification Exam Question Bank

URL ariksavage.com/development/portfolio/absa

Role Full-Stack DeveloperDate May 2025

  • Reverse-engineered a legacy exam-content update process whose only artifact was a non-functional compiled binary left by a departed developer, with no source code or documentation.
  • Reconstructed the business logic of the legacy exam-content update process by working backward from known inputs and outputs with the client.
  • Replaced a developer-dependent, single-point-of-failure workflow with a stable self-service platform for managing exam questions and blueprints, year over year.
  • Designed a 'blueprint' data model defining question distribution across exam topics, letting admins validate ongoing topic coverage.

Thyme — Recipe & Nutrition Manager

URL ariksavage.com/development/portfolio/thyme

Role OwnerDate Ongoing

  • Built a full-stack recipe and nutrition app: an Angular 22 front end with TinyMCE editing and a custom PHP backend modeling recipes, ingredients, steps, tags and nutrition.
  • Built a free-text ingredient parser turning varied notation (“2c flour,” “2 cups of flour”) into structured data via multi-pass normalization and regex, adapted from earlier nutrition-table parsing work for NOW Foods.
  • Designed a role-based access control system (roles, groups, granular permissions) for multi-user recipe collaboration and management.
  • Built a PHP/MySQL framework with a chainable query builder that prints readable SQL and a matching Angular service for API calls.

NOW Foods — Drupal 7→9 Rebuild

URL ariksavage.com/development/portfolio/now

Role Lead Front End DeveloperDate Dec 2021

  • Led front-end development of nowfoods.com's ground-up rebuild (begun as a Drupal 7→8 migration, launched on Drupal 9 in December 2021), including color-coded site sections.
  • Built a set of custom Layout Builder blocks (Mailchimp integration, related-content carousels, customizable WYSIWYG content) so most pages could be assembled by editors.
  • Used Drupal entity queries to generate related content for products and articles, based on shared multi-level taxonomies and client business logic.
  • Wrote the templates, jQuery and SCSS for a single unified menu with distinct behavior based on screen size and scroll position, maintaining WCAG accessibility standards.
  • Resolved an ADA risk (malformed nutrition tables that drew a lawsuit threat) with a PHP pipeline parsing them into structured Drupal fields, gated by admin sign-off per product.
  • Architected a multi-section product catalog (Supplements, Natural Foods, Beauty & Health and more), each with parallel listing, on-sale, and category navigation.
  • Built one Views-powered product search for ~1,000 products across many pages: a full version with search, sorting and sale/stock/category filters, plus pre-filtered URL variants.
  • Built guided, multi-page product-finder quizzes as Drupal webforms (e.g. Probiotic & Gut Health) that work as a recommendation engine, suggesting products from shoppers' answers.
  • Built a Smoothie Builder with CMS-managed ingredient carousels; results save under a random token to share or email (doubling as a newsletter signup) and link to the NOW products.
  • Built interactive product-detail image slideshows that jump to the relevant image when a customer selects a product variant (e.g., dosage or size).
  • Built a custom session-based PHP cart and multi-page checkout with Braintree Hosted Fields for PCI-compliant payments, including styled HTML receipt emails.
  • The structured nutrition data model built to fix malformed nutrition tables incidentally enabled nutrition-based product filtering, though that feature was never built out.
  • Implemented schema.org Product and BreadcrumbList JSON-LD across the catalog from Commerce fields (price, SKU, brand, availability) for rich results and a third-party crawler.
  • Built a custom Drupal hero block system with multiple pre-configured layouts, letting admins add their own imagery, headlines, and CTAs, then stack 2–3 instances into a rotating homepage hero slider without developer involvement.
  • Triaged an ADA audit's findings into content fixes (alt text, heading hierarchy) handed back to NOW Foods' editors and template and code fixes handled in-house.

Crown Holdings — Global Corporate Website

URL ariksavage.com/development/portfolio/crowncork

Role Lead DeveloperDate Oct 2022

  • Led a Drupal 7-to-8 rebuild of a Fortune 500 packaging manufacturer's global corporate site, launched October 2022.
  • Delivered an integrated news/press-release publishing system with video and infographic content.
  • Built extensive scroll-driven animation sequences (a hero transition and a continuous top-to-bottom scroll) while keeping a perfect 100 Google PageSpeed score in every category.
  • Designed an interactive product showcase (5 can designs per page) where selecting a can animates it forward at a larger scale with extra detail.
  • Implemented full prefers-reduced-motion support alongside an explicit user-facing motion toggle, providing an equivalent static experience for users who opt out of animation.
  • Adapted an open-source cookie-consent library for Drupal (one of Sandstorm's first cookie-consent setups) without disrupting SEO or analytics.
  • Audited 700+ URLs against WCAG 2.1 AA two weeks after launch, then turned the raw scanner output into an action list (severity, fix, effort, hours, owner) that split the work between developers and the client's content team.

Synapti Health — Value-Based Care Consulting

URL ariksavage.com/development/portfolio/synapti

Role Maintaining DeveloperDate Ongoing

  • Took over a single-page Framer site and grew it into a full site with distinct pages and blog infrastructure, auditing every page for accessibility and PageSpeed along the way.
  • Implemented an interactive 2×2 quadrant assessment in Framer, built to another party's design, sorting visitors into VBC-readiness personas with personalized content journeys.

Custom Audiobook Player

URL ariksavage.com/development/portfolio/audiobook-player

Role OwnerDate Ongoing

  • Built a custom Angular web-based audiobook player with playback controls, resume-from-last-position, and a sleep timer.
  • Built a Node.js/Express backend for asset management and a custom SSH/SFTP automation module for remote deployment.
  • Built a reusable, collapsible info-panel component as part of a small custom Angular component library for the audiobook player UI.

Lead Heat Map & Reporting

URL ariksavage.com/development/portfolio/lead-heat-map

Role DeveloperDate Apr 2024

  • Built an interactive SVG heat map of all 3,142 U.S. counties for a data broker, coloring counties by live lead counts and matching data to shapes by each county's own title text.
  • Added sales-floor features to the heat map: click-to-highlight counties that persist across filters, a city overlay, a legend that filters, and per-state totals by lead age.
  • Noticed county-matching errors caused by misspelled data, then built an unrequested correction tool that lists each state's invalid counties and fixes every matching lead at once; offered it to the client as an enhancement.
  • Built a monthly aging report forecasting how many leads per state move into each age bracket, by matching the month and year encoded in each lead's ID instead of date math.
  • Built a custom report builder that had to match the client's own search tool, reconciling totals and tracing mismatches to mixed boolean formats, NULLs, and comma-separated IDs.
  • Generated state and county reports as PDF and Excel, and moved hard-coded database credentials into environment config so every report reads from the right database.

Personal Portfolio Site

URL ariksavage.com/development/portfolio/ariksavage

Role OwnerDate Ongoing

  • Built a PHP-driven portfolio and resume site with a project archive and an art gallery that reveals paintings with custom scroll-triggered animations.
  • Built a dynamic, JSON-driven personal resume system, decoupling content from presentation to support tailoring displayed content per target role.
  • Implemented a client-side relevance-filtering feature: clicking skill tags scores and reorders resume bullets and project entries by relevance in real time.
  • Self-hosted and preloaded the site's web fonts with size-matched fallback faces to prevent layout shift on load, without any front-end framework.

American College of Foot and Ankle Surgeons (ACFAS)

URL ariksavage.com/development/portfolio/acfas

Role Lead Front End DeveloperDate Jun 2022

  • Built a documented Handlebars pattern library and templates for a new site on another team's .NET framework, aiming for minimal CSS and broadly reusable selectors.
  • Designed a responsive homepage banner with an overlapping accent-color callout and separate desktop/mobile images, keeping the overlap and text readable at every size.
  • Built a Grunt front-end pipeline (Sass/JS linting, minification, testing) for a documented Handlebars component library handed off to a separate .NET/Kentico team.
  • Built multi-level, access-based navigation menus reflecting membership/permission tiers.
  • Implemented cookie consent with page performance in mind, so adding it wouldn’t come at the cost of the site’s PageSpeed work.

National Association of State Boards of Education (NASBE)

URL ariksavage.com/development/portfolio/nasbe

Role Lead DeveloperDate Apr 2021

  • Built a Drupal cross-reference of state education and health laws, searchable by state and category, using views, relationships and contextual filters across 10,000+ combinations.
  • Built a custom feeds architecture supporting bulk CSV import of up to 18,000 rows of policy data.
  • Built parallel category and state 'index' views, each showing aggregate policy counts across the other dimension (e.g., every state with policies in a given category, with counts).
  • Built cross-referenced state × category pages with related-content suggestions (other categories for that state, other states for that category) beside the filtered policy list.

Tech Policy Hub: Kentico to Drupal 8

URL ariksavage.com/development/portfolio/tech-policy-hub

Role Senior Full Stack DeveloperDate Feb 2021

  • Built the theme, custom modules and configuration for a Drupal 8 rebuild of a global tech company's academic policy site from content migrated off Kentico (paused before launch).
  • Kept the homepage from repeating an article across blocks by excluding already-shown items through Views contextual filters and reloading each block over AJAX.
  • Wrote a module that adapts Views to topic pages: passing the topic into contextual filters, retitling views with the topic's short name, and adding topic-aware “view all” links.
  • Built custom Layout Builder blocks, including a “latest item” block editors can pin to specific content (falling back to an automatic entity query) and a scholar Twitter embed.
  • Split front-end assets into per-content-type Drupal libraries built by Webpack, sharing a zero-output Sass globals file, so each page loads only the CSS and JS it actually uses.
  • Wrote the handoff docs when the project paused: every helper and block, the migration run order, drush import and rollback commands, and known risks for whoever came next.

ATI First

URL ariksavage.com/development/portfolio/ati

Role Lead Front End DeveloperDate Dec 2019

  • Built a Drupal 8 site for a new company service line, using Layout Builder so editors compose pages from reusable layout and content-block combinations.
  • Developed the Drupal 8 front end in accordance with WCAG accessibility guidelines, using pattern-based Sass for flexibility and performance.
  • Built a library of complex Drupal 8 Layout Builder blocks (violators, irregularly shaped sections) to match in-house design comps beyond Layout Builder's defaults.
  • Built animated statistic counters (icon plus count-up number) that run as multiple instances per page, with JavaScript scoped per instance to prevent timer conflicts.
  • Built a login-gated, interactive annual report as Layout Builder content, with a parallel static, printable/downloadable PDF version of the same content.

Oriental Institute Centennial — University of Chicago

URL ariksavage.com/development/portfolio/oi100

Role Lead Front End DeveloperDate Aug 2019

  • Built a Drupal 8 micro-site to draw traffic to and inform the public about the University of Chicago's Oriental Institute, using Paragraphs for modular layouts.
  • Built an interactive regional map: hand-traced, clickable SVG regions over a topographical map, each with proper ARIA labels, linking to per-region discovery content.
  • Built distinct per-country PHP/Twig templates and Sass/JS front ends for each region's detail page.
  • Worked with a QA analyst to build automated browser testing (Nightmare JS, headless Chromium) for interactive sequences and content.

Wolf CMS — PHP 8 Compatibility Fork

URL ariksavage.com/development/portfolio/wolfcms

Role OwnerDate May 2023

  • Built a personal fork of Wolf CMS (an open-source CMS that lost official support) updated for PHP 8.3 compatibility, documented as version 9.0.0 in the project's own changelog.
  • Fixed installer, login, and admin-panel regressions and added a DDEV setup with one config for local and live, getting the legacy codebase running on current infrastructure.

Signode

URL ariksavage.com/development/portfolio/signode

Role Lead Front End DeveloperDate Aug 2019

  • Built the front end (Handlebars, pattern-based Sass) for a new Kentico site supporting an existing client's subsidiary rebrand, working with a separate back-end Kentico team.
  • Developed the front end with an accessibility-first (a11y) approach.

CLR Brands: Where to Buy

URL ariksavage.com/development/portfolio/clr-where-to-buy

Role DeveloperDate Feb 2018

  • Built a “Where to Buy” store locator (C#/ASP.NET on Kentico) for a cleaning-products brand: pick a product, zip code and radius to map nearby retailers that carry it.
  • Calculated great-circle distances (spherical law of cosines) in the database query, so one query measured every retailer, filtered by radius and product, and returned the 25 nearest.
  • Integrated Google's Geocoding and Maps JavaScript APIs: zip-to-coordinate lookup, branded lettered pins with hover details, and a map that auto-fits the farthest result.
  • Made the store locator reachable from any page: product links pre-select the product (falling back to online retailers), and results page five at a time, lettered to match the map pins.

Elisco Design Architects

URL ariksavage.com/development/portfolio/elisco

Role Designer / DeveloperDate Dec 2015

  • Designed and built a custom marketing and portfolio website for a Chicago-area architecture and construction management firm, including a project portfolio gallery.
  • Replaced a Flash-based gallery (SlideShowPro) with a custom PHP/MySQL Wolf CMS plugin, reverse-engineering its database to reuse existing images and albums with no data loss.

Self-Hosted Emby Media Server

Role OwnerDate Ongoing

  • Deploys and maintains a self-hosted Emby media server, independently diagnosing and resolving HTTPS and process-management issues.

Frontend & UI

Backend & Data

Tooling & Practices