Ash Street

Ash Street Senior frontend developer in Toronto

Ten years of building for the web, mostly React and TypeScript. I led the frontend on the airmiles.ca redesign and built core parts of MyTELUS. Most recently I built the CI/CD platform that around 250 engineers at AMIGGI ship through.

The handheld is the same portfolio, just more fun to build. Play it, or scroll for the normal one.

See my work

Playable handheld menu

A handheld console in translucent smoky-purple plastic. Its screen is this site’s menu.
Ash.StreetLV 10+
↑↓ Move▼ Touch belowA Open

Touch a file

Toronto · Files 0/7

    Case files 07

    Work

    Seven things I’ve built or fixed, including the one where I cancelled a $2 million project by reading some brackets carefully. Four have a small demo, rebuilt from scratch with made-up data, but the approach is the one I shipped.

    File 01

    Pipelines from ten minutes to under three

    AMIGGI · 2024–2026 · Two-person platform team

    <3 min per build, down from about 10

    About 250 engineers across 500+ repositories shipped through the GitLab CI/CD platform I designed.

    Builds were taking around ten minutes, which is a long time to sit and watch when 250 people are doing it all day. The problem turned out to be memory: the runners just weren’t big enough for the jobs. Giving them more made an immediate difference, and refactoring our Dockerfiles to cache properly took it the rest of the way. Under three minutes.

    The point of that wasn’t really the time saved. Teams could deploy whenever they wanted instead of batching work up for a big release, and when a build did fail it failed early, so it got fixed faster too.

    I also set up the React/Next.js and TypeScript templates new apps start from, so a new project arrived with the structure, testing and build config already in place.

    GitLab CI/CD, Docker, Kubernetes/EKS, AWS, React, Next.js, TypeScript

    Press run to put the same commit through the old pipeline and the new one, side by side.

    Same commit · sped up 80×
    Before
    CheckoutDocker buildInstallTestDeploy
    0:00
    After
    CheckoutBuild (cached)InstallTestDeploy
    0:00

    Before: undersized runners, no layer cache. After: more memory, cached Docker layers.

    Stage timings are illustrative. The fixes and the result are real: pipelines went from about 10 minutes to under 3.

    File 02

    Repodex

    AMIGGI · GitLab migration tooling

    457 repositories migrated by a team of two

    Moving an entire enterprise GitLab instance to another one, 457 repositories, without breaking the pipelines, permissions and branch rules attached to them. Two of us did it.

    The migration, and the management of the whole instance, ran on scripts I wrote. Repodex is the GUI for running those scripts: transfers, audits, drift checks and reports in one place instead of a folder of commands. It also worked out the permissions each repo needed in the right shape, which is the part that does not survive being done by hand.

    Python, Flask, GitLab · Source on GitHub (opens in a new tab)

    File 03

    MyTELUS billing

    TELUS · 2022–2024 · Eight-person team

    ~$17 saved each time someone sorts it out in the app instead of calling

    MyTELUS is where TELUS customers manage their own accounts, and billing is one of the main reasons they sign in. Internally the figure was about $17 saved every time someone sorted something out in the app instead of phoning in, which is the whole argument for self-serve.

    Billing wasn’t easy to find, and it wasn’t as accessible as the rest of the site. I refactored our BFF so it returned the billing data in one reusable shape, then built a new, accessible billing card on top of it. One component covers every state a customer can be in: paid, due, overdue, on autopay, or looking at a first bill with a part-month on it.

    React, TypeScript, Node.js BFF, GraphQL

    Pick an account state and watch one component handle every case from the same shape of data. The account is made up. The component is the one I built.

    Due in 6 daysMobile ··· 4821

    $84.20

    Due Mar 14

    Pay any time before Mar 14.

    {status: "due",balance: 84.2,dueDate: "2026-03-14",daysLeft: 6,autopay: false,firstBill: false,}

    The BFF returns one reusable data shape (right) and one accessible card renders every state from it. Illustrative, not the production MyTELUS UI.

    File 04

    The $2M project that never started

    TELUS · Production debugging

    $2M+ initiative cancelled before it kicked off

    A business initiative was being scoped at more than $2 million, and the case for it rested on analytics coming out of the app I worked on.

    Our product manager couldn’t work out why one value was so high and wanted a developer to dig into it. I traced it back through the app and the data flow and found the value was hard-coded in brackets, data['value'], instead of the parameter being passed in, data[value]. Every call returned the same field, whichever metric you asked for.

    I fixed it and stayed on it with the analytics team until they confirmed the corrected numbers in production. With the real numbers in front of them, the business cancelled the initiative before it kicked off.

    Analytics, production debugging

    This is roughly how I tracked it down. Step through the app a layer at a time until you find the line that’s wrong.

    Upgrades this week

    1,204

    Finance counted 1,587. Someone’s wrong.

      A reenactment. The bug is real (a quoted key instead of the parameter); names and numbers are illustrative. The fix corrected reporting for an initiative funded at more than $2 million.

      File 05

      The airmiles.ca redesign

      AIR MILES · 2021–2022 · Lead software engineer

      AAA WCAG, reached before the compliance deadline

      A rebuild of the public site for a loyalty programme most Canadians have a card for. Six of us, six months, with a compliance deadline for accessibility on the end of it.

      I was the hands-on tech lead: the React component strategy and library, the Node.js backend-for-frontend, and the OAuth login end to end. Accessibility went into the components themselves, so nobody had to audit it back in at the end. That’s how we hit WCAG AAA before the deadline.

      I pushed back a lot on colour contrast. Getting design to accept that half the brand palette stops working once you’re at AAA was the longest argument of the project.

      React, component library, Node.js BFF, OAuth, WCAG AAA

      Here’s that argument as a toggle. Same card at AA and at AAA, with the ratios worked out live, so you can see what the higher bar costs you in colour.

      Offer

      Earn 2× points on groceries

      Ends Sunday. Some exclusions apply.

      Click here
      • Text contrast 1.4.64.7:1, needs 7:1, fails AAA
      • Target size 2.5.532px, needs 44px, fails AAA
      • Link purpose 2.4.9“Click here”, fails AAA
      • Focus appearance 2.4.131px dotted ring, fails AAA

      Tab through the card to see focus. The contrast ratios are calculated live; the card itself is illustrative, not the AIR MILES UI.

      File 06

      Nissan Kicks configurator

      Critical Mass · 2018–2019 · Frontend developer

      Nissan’s car configurators were moving off a legacy CQ5.5 setup onto newer AEM with React, while staying live for people picking a car.

      I owned the frontend of the Kicks configurator, including the vehicle-data APIs behind the options people click through. It shipped to WCAG AA and was tested with Jest.

      React, styled-components, AEM, AWS Lambda

      File 07

      TUFF Stats

      Side project · Ongoing

      172 players tracked this season

      I play centre in Toronto United Flag Football. The league kept its stats in a 20-column table that nobody could read on a phone.

      I built player cards you can search and sort instead, backed by a small Node API that normalises each league’s stat names into one shape. It’s tracking 172 players this season. It’s grown into Afterwhistle, so adding another league is a config change instead of a whole new fork.

      Every player, ranked. 172 in the league this season, sort by any stat, filter by team. A phone showing the TUFF league board: player cards with receptions, touchdowns, interceptions and sacks.One tap to a full career. Season by season, this season in detail, and every game played. A phone showing a player profile: career points, teams, a career-by-season table and a game log.Print the whole league. 172 trading cards, nine to a letter page, cut along the gold border. A phone showing printable player trading cards.Open tuff.afterwhistle.ca (opens in a new tab)

      React, TypeScript, Node · tuff.afterwhistle.ca (opens in a new tab)

      History

      Experience

      I started at agencies in London, moved to product teams in Toronto, and most recently worked on the platform side.

      1. Toronto 2018–2026

        1. 2024–2026AMIGGILead DevOps / Platform Engineer · Consolidated Communications / Fidium

          I set up the frontend architecture for new React/Next.js apps and built the CI/CD platform, templates and standards they run on.

        2. 2022–2024TELUSSenior Full Stack Developer · MyTELUS

          I built core React features for the MyTELUS redesign, worked on authenticated journeys and accessibility, and mentored junior and intermediate engineers.

        3. 2021–2022AIR MILESLead Software Engineer · LoyaltyOne

          I led frontend on the airmiles.ca redesign, ran Scrum, and covered product management during a parental leave.

        4. 2019–2021Canopy GrowthFrontend / Web Engineer · Tokyo Smoke

          I owned the Tokyo Smoke Shopify storefront in a regulated market, including the age gate.

        5. 2018–2019Critical MassFrontend Developer

          I rebuilt Nissan vehicle configurators in React on AEM.

      2. London 2014–2018

        1. 2017–2018AmazeFrontend Developer

          I built Lexus and Toyota sites on Sitecore, and wrote my first professional React on Toyota’s Takumi Cats.

        2. 2014–2017DigitasLBiFrontend Developer

          I built components for Project Helios, one platform for Nissan, Renault and Infiniti across Europe, all the way down to IE8.

      3. Swansea 2011–2015

        1. 2011–2015Swansea UniversityB.A. (Hons) Creative Digital Media · 2:1

      Capabilities

      Skills

      Frontend is the specialty. The platform side is what I picked up making sure the frontend actually ships.

      Frontend

      • React
      • TypeScript
      • Next.js
      • Component libraries
      • Design systems
      • State management
      • Accessibility, WCAG AA–AAA
      • Responsive
      • Cross-browser

      Backend and platform

      • Node.js
      • GraphQL
      • REST
      • Backend-for-frontend
      • OAuth
      • GitLab CI/CD
      • GitHub Actions
      • AWS and EKS
      • Docker
      • Terraform

      Testing

      • Jest
      • React Testing Library
      • Cypress

      Leading

      • Hands-on tech lead
      • Mentoring junior and intermediate engineers
      • Working closely with product and design

      I use AI tools like Claude Code and Cursor day to day, with the same review and CI checks as any other code.

      Profile

      About

      I’m British. I studied Creative Digital Media at Swansea University, worked at agencies in London, and moved to Toronto in 2018.

      Outside work I play centre for Toronto United Flag Football, collect Magic: The Gathering cards, and spend a lot of time with Freya, my Rottweiler.

      At work I’m direct. I’d rather put a rough prototype in front of people than argue about a document, and I’d rather be told straight when I’ve got it wrong.

      Contact

      Get in touch

      A message on LinkedIn is the quickest way to reach me. My code is on GitHub.