As Lead Frontend Engineer, the only developer on NCR's CXD team: I partnered with the Lead Designer to deliver the National Bank of Canada ATM: interactive prototype, production-ready code, and on-site implementation support. I used this project to redesign the team's delivery process at the system level: replacing static measurement guidelines with live frontend code. It was adopted as the team standard on every subsequent project I worked on at NCR.
A single project changed how NCR's CXD team delivers. Here's the before and after.
NCR's existing handoff process (static measurement guidelines) consistently produced implementations that diverged from approved designs. The problem was structural: guidelines required interpretation, interpretation introduced error, error required rework. It happened on every project.
I proposed and drove a new model: production-ready frontend code as the primary handoff artifact. No guidelines. No interpretation layer. The first time CXD delivered working code to a backend team, and it eliminated the gap between design intent and final implementation entirely.
Knowing the delivery environment before designing for it is the difference between a clean handoff and a broken implementation.
The ATM ran on IE11. Every design and engineering decision was made with that constraint as the starting point. I worked with the Lead Designer to ensure the visual system was IE11-compatible from the beginning, not patched at the end. Environmental constraints drive system-level decisions.
Animation in IE11 is an engineering constraint problem, not a creative one. The design has to work within what the environment supports.
Approach: HTML and CSS only, no JavaScript, to protect backend integrations. SVG failed in IE11. I pivoted to static image assets with CSS frame-by-frame animation, decomposing each motion into discrete composable pieces. The result: fast load, reliable rendering, zero integration conflicts.
Multilingual support must be solved at the system level: layout, typography, and component structure, not retrofitted to existing screens.
English to French can mean 30–40% more characters for the same content. I designed the ATM UI to accommodate both English and French: layout, typography, and component structure held without degradation across either language.
On a small ATM screen, every character has cost. I designed a compact typographic system with defined rules for character density, text alignment, and word wrapping, flexible enough to hold across both languages without breaking layout or compromising readability.
Things we took into consideration
Prepare (written material) for publication by correcting, condensing, or otherwise modifying it.
Préparer (matériel écrit) pour la publication en le corrigeant, en le condensant ou en le modifiant de toute autre manière.
Accessibility was a defined requirement, designed in from the start rather than reviewed at the end.
I defined the voice guidance interaction model for blind and low-vision users: a progressive step-by-step system where only the active state is fully visible and all others are dimmed. The visual focus state mirrors the audio guidance, reinforcing rather than conflicting with the voice output.
Design objectives:
Handoff is not the end of delivery. Delivery ends when the product is live and stable in production.
I embedded with a team of approximately 20 backend engineers through Angular integration, monitoring visual output in real time, catching layout regressions, and ensuring approved designs translated faithfully to the deployed ATM software.
I was flown to Montreal to be on-site through final development sprints. That decision by leadership reflects the level of delivery ownership I held on this project, my presence was necessary for a clean launch.
As the sole Frontend Engineer from kickoff to launch, I carried the full delivery risk for the visual system. High-stakes, high-ownership, delivered on time.
The whole project turned on one question: what does the design team actually hand the backend team? NCR had an answer already, and it was the wrong one.
I wrote the ATM's real HTML and CSS and gave the backend team the thing itself. There was no interpretation step between the approved design and what got deployed, because there was nothing left to interpret.
The safe option was to carry on issuing static specs and catch the drift later with more design QA. It was cheaper for me, it kept the roles clean, and every project that had done it that way had shipped, just with rework budgeted in.
I took on the delivery risk for the entire visual system personally. When the build broke there was no spec to point at and no shared blame: it was my code, so it was my problem, including the parts that broke during Angular integration in a codebase I did not own. It also meant I had to be in Montreal for the final sprints rather than reachable over email. And it quietly made the team's new delivery model depend on someone being able to write production frontend code, which, on that team, meant me.
I do not have access to NCR's or the bank's analytics, and I will not invent a percentage. Here is what I can defend.
Nobody instrumented the deployed interface, and as a vendor I would not have had access to the fleet data anyway. If I ran this today I would ask for four things before launch: task completion time by transaction type, error and retry rate at PIN and amount entry, voice-guidance sessions that reach a completed transaction, and completion rates split by language so the French expansion problem shows up as a number instead of a layout review.
I made the team's delivery model depend on a skill only I had on it. The handoff change was the right call and it held, but I never wrote the CSS architecture down as something another designer could extend, and I never paired anyone through a second project on it. That made me the single point of failure for the thing I had just made standard. If I did it again I would treat teaching it as part of shipping it.
Impact: The NBC ATM project produced two lasting outputs, a shipped product and a new system-level delivery process. Production-ready frontend code replaced static guidelines as the team standard. On every subsequent project I worked on, the implementation-drift rework that used to be budgeted for simply was not needed. The code was the spec. The cross-team delivery model (designer, frontend engineer, and backend team in continuous alignment) became the template for how CXD ships.