Skip to content
Alp Yalay
HomeWorkCase StudiesAboutResumeContact

Alp Yalay

Portfolio of products, websites, and bilingual systems from Istanbul.

Pages

HomeWorkCase StudiesResumeAboutContactPrivacyDevelopers & API

Developers & Agents

Developer Portal (/developers)OpenAPI 3.0.3 SpecLLMs Context (/llms.txt)MCP Server Endpoint (/api/mcp)Agent Skills Catalog

© 2026 Alp Yalay. All rights reserved

Back to Case Studies
Product Development
3D Web
Multi-Platform

Money Visualiser: One Product Idea, Three Codebases

January 2026 - Present
14 min
Alp Yalay
XLinkedIn
Role
Founder, designer and sole developer
Tech Stack
Next.js, React Three Fiber, Cloudflare Workers, Expo/React Native, Vite
Platforms
Web, Chrome extension, iOS/Android app (pre-release)
Scale
1,532 commits across 3 repositories

Money Visualiser renders any amount of money as physically accurate 3D stacks of bills, so you can see what a salary, a house or a billionaire actually looks like. It started as a web toy in January 2026 and grew into three codebases: a site, a Chrome extension and a mobile app. This is the honest account of how that expansion actually went, including the two months where almost nothing happened.

1. Numbers Past A Million Are Just Noise

Nobody has an intuition for large amounts of money. You know what a hundred dollars looks like; you have no idea what a hundred million looks like, and neither did I. Money Visualiser exists to fix that: type an amount, pick a currency, and it renders the actual stacks — real bill dimensions, real denominations, strapped and bricked the way banks actually bundle cash — in a 3D scene you can walk around. A human figure stands next to the pile for scale. The moment that sold me on building it was seeing that a middle-class lifetime of earnings fits on a single pallet.

The first commit landed on 13 January 2026 and the web version at moneyvisualiser.com came together in a three-month sprint. Then the same idea started leaking into other surfaces: a Chrome extension that meets you where prices already are, and a native mobile app that had to reproduce the whole 3D pipeline on a phone GPU. Three repositories, 1,532 commits between them as of mid-August 2026, all of it one person.

2. What Made It Hard

The concept is a toy. The implementation is three genuinely different engineering problems wearing the same brand:

Physical Accuracy Is A Data Problem First

For a stack to mean anything, the bills have to be right. The catalog models 82 fiat currencies with each note's real length, width, thickness and denomination set, plus precious metals as ingots and a large crypto catalog, organised into straps of 100, bricks of 1,000 and bigger bundles the way banks actually do it. Getting that data assembled and keeping it consistent was slower than any of the rendering work, and it became the most valuable asset in the project — which is exactly why the mobile app later generates its catalog from the web repo instead of maintaining its own copy.

Rendering Billions Without Melting The GPU

A billion dollars in hundreds is ten million bills. You cannot draw ten million meshes in a browser, so everything renders as instanced straps — about a hundred bills per strap — with caps around 1,000 straps on WebGL and 5,000 on the opt-in WebGPU path. Above that, the scene switches representation rather than lying: towers and aggregate tiers take over. Live rates come through a five-layer fallback chain (edge cache, ECB, Frankfurter, Twelve Data, static snapshot), because a visualiser that dies when a rate API hiccups is a visualiser nobody trusts.

Three Platforms, One Source Of Truth

The web app runs Next.js on Cloudflare Workers with R2 and D1 behind it. The extension is a Vite build with content scripts and a service worker. The app is Expo/React Native drawing through expo-gl and Skia. Almost no rendering code is shared — what is shared is the data and the behaviour: the mobile repo generates its asset catalog from the website's source files and runs parity tests against it, so a bill dimension fixed once is fixed everywhere. That decision, made when the app port started, is the reason three codebases have not drifted into three products.

3. How The Expansion Actually Ran

The commit history tells it more honestly than a roadmap would:

01. The Web Sprint, January To March

765 commits in three months: catalog, 3D scene, six environments from gold vault to aircraft carrier, comparison mode with shareable URL state, historical charts, seven interface languages, a D1-backed blog, and the move onto Cloudflare Workers. By late March the site did what the idea promised. April and May show 7 and 0 web commits — partly exhaustion, partly the correct realisation that the next win was not another web feature.

02. The Extension, A Wedge Not A Port

The extension repo is 19 commits and about 9,400 lines, and that smallness is deliberate. It does not re-render 3D in a popup; it detects prices on the pages you already read and hands off to the site with the right parameters. Version 1.3.0, in one focused day in July, added a Google Search widget: search a currency conversion, get an inline card and a one-click jump into a full comparison scene. Distribution surface, not a second engine.

03. The Mobile App, Parked Then Rebuilt

The app repo's first commit is 2 May 2026 — then one commit sits alone for two months. In July the real port happened: 516 commits in a month, rebuilding the website's scene maths as a shared visual core, porting all six environments to expo-gl with Skia-drawn textures, and gating every step behind screenshot parity against the website. August has been release QA — device evidence, Maestro flows, store checklists. It is a 1.0.0 approaching the stores, not in them, and I would rather say that plainly.

4. Where It Stands

The Shape Of The Work

About 199,000 lines of TypeScript across the three source trees: roughly 135,000 web, 55,000 mobile, 9,000 extension. The web app is live at moneyvisualiser.com in seven languages. The extension is at 1.3.0 with price detection and the search widget. The app has all six environments rendering natively and is grinding through release checklists. None of these numbers are usage metrics, because I am not going to dress repo statistics up as users.

1,532
Commits, 3 Repos
82
Currencies Modelled

What The Cadence Chart Really Shows

"The monthly commit chart below is the most honest artefact on this page. It shows a product built in bursts: a three-month web sprint, a near-silent spring, and a July where the mobile port outproduced the original sprint's best month. Solo products do not progress linearly, and I have stopped pretending mine do. The gaps are where the thinking happened."

5. The Numbers From The Repos

Everything below is read directly from the three local git repositories and their source trees on 13 August 2026. Commit counts come from git log; line counts exclude node_modules and build output; the August bucket only covers the first thirteen days of the month.

What the repos say

0
Commits across three repos

865 web, 648 mobile, 19 extension — January to August 2026.

0
Platforms, one catalog

Web, Chrome extension and mobile app all read the same asset data.

0
Fiat currencies modelled

Each with real bill dimensions and denominations, plus metals and crypto.

0
Interface languages

English, German, Spanish, French, Japanese, Turkish, Chinese.

Read from the three local git repositories and their source trees on 2026-08-13.

Three repositories, one person, eight months. The commit totals are not effort-adjusted — a docs commit counts the same as a week of scene maths — but across 1,532 of them the shape is real: the web repo carries the product, the app repo carries the port, and the extension stays small on purpose.

Compare mode in the Gold Vault environment: $1,000,000 in $50 bills against its euro equivalent — 200 straps versus 172, weight includedCompare mode in the Gold Vault environment: $1,000,000 in $50 bills against its euro equivalent — 200 straps versus 172, weight included

The rhythm of a solo product

Two things in that chart are worth saying out loud. The April–May trough is not a mystery: the web version had reached the point where the idea worked, and the honest next move was deciding where it should exist next rather than adding features. And the July spike is what a planned port looks like when the groundwork holds — the parity harness was set up in the first days of July, and everything after that was execution against it.

The same compare mode running natively on Android: $5,000,000 against its euro equivalent on live rates, dollar and euro notes rendered with their own dimensionsThe same compare mode running natively on Android: $5,000,000 against its euro equivalent on live rates, dollar and euro notes rendered with their own dimensions

Where the code actually lives

Line counts measure size, not value — the most important file in the whole system is the currency catalog, and it is a fraction of those lines. But the split is a fair picture of the strategy: one heavy centre, one faithful port, one thin wedge.

What each surface is for

The web app is the product: the 3D scene with six environments, single and compare modes with shareable URL state, historical rate charts, an embeddable widget, standalone tool pages and a blog, in seven languages, running on Cloudflare Workers with a separate worker for market data. The five-tier rate fallback means the scene renders even when half the rate providers are down.

The web app's input screen: amount, currency pair, and the visualisation panel with surfaces, environments and per-currency denominationsThe web app's input screen: amount, currency pair, and the visualisation panel with surfaces, environments and per-currency denominations

The extension is distribution. It watches for prices in the pages you already read — including an inline widget on Google currency searches as of 1.3.0 — and turns them into one-click jumps into the visualiser with the comparison pre-configured. Nineteen commits, because its job is to be small.

The mobile app is the bet that this belongs in your pocket. It reproduces the scene natively — expo-gl, Skia textures, instanced rendering, all six environments — against screenshot parity with the website, and generates its entire asset catalog from the web repo's source so the two can never disagree about a bill's dimensions. As of mid-August 2026 it is in release QA, not in the stores, and this page will be updated when that changes.

$5,000,000 in strapped bills on a pedestal in the Parking Lot environment, city skyline behind it — the same scene the website renders, drawn on a phone GPU$5,000,000 in strapped bills on a pedestal in the Parking Lot environment, city skyline behind it — the same scene the website renders, drawn on a phone GPU

Past a certain size the scenic environments stop being an option: the app locks to Minimal Grid and says so, because a parking lot full of pallets is neither renderable nor readable. It is the same instinct as the strap caps on the web — decide what the scene degrades into before the GPU decides for you.

$500,000,000 rendered as bricked pallets on the Minimal Grid, the fallback the app locks to for very large amounts$500,000,000 rendered as bricked pallets on the Minimal Grid, the fallback the app locks to for very large amounts

Key Lessons

The Catalog Is The Moat

The 3D rendering is the demo, but the thing that took longest and matters most is the asset catalog: 82 currencies with real physical dimensions, denominations, metals and crypto, all consistent with each other. Rendering code gets rewritten per platform; the catalog gets generated from one source. If I lost every renderer tomorrow I could rebuild them. Rebuilding the catalog would be the real cost.

Expand Into Surfaces, Not Rewrites

The extension works because it refuses to be a second product. Nineteen commits bought a presence in search results and on shopping pages, because it delegates everything hard to the site. The mobile app is the opposite bet — a full native port — and it cost 648 commits and is still not shipped. Both were right for what they are, but the ratio is a lesson I will carry: meet users where they are cheaply before rebuilding the engine for a new platform.

Parity Tests Made The Port Possible

The mobile rebuild only worked because every step was measured against the website: a generated catalog with parity tests, and screenshot baselines for every environment and money tier. Without that harness, a solo port of a 3D pipeline to a different GL stack would have drifted into a lookalike. With it, 516 commits landed in a month without the two products disagreeing about what a million dollars looks like.

Summary

Money Visualiser is one idea — make amounts of money physically legible — carried across three platforms in eight months: a web app built in a 765-commit sprint on Next.js and Cloudflare, a deliberately tiny Chrome extension that turns search results and price tags into entry points, and a native mobile port that reproduces the whole 3D pipeline against parity tests, now in release QA.

The pattern I would defend from all of it: put the irreplaceable work in data, not code, and let every new platform generate from it. The renderers are all different. The money is the same everywhere — which, for this product, is the entire point.

Previous case studyFour Sim Racing Surveys, 2,364 Responses: What the Data Actually SaysCommunity ResearchNext case studyFive Years on One Spreadsheet Column: Localizing Battle Talent into TurkishGame Localization

Contents

  1. 1. Numbers Past A Million Are Just Noise
  2. 2. What Made It Hard
  3. 3. How The Expansion Actually Ran
  4. 4. Where It Stands
  5. 5. The Numbers From The Repos
  6. What the repos say
  7. The rhythm of a solo product
  8. Where the code actually lives
  9. What each surface is for
  10. Key Lessons
  11. Summary