LinkFront
Affiliate app for athletes modeled after Shop LTK, built at Smash Creative as an installable web app. I was one of two engineers: the Expo app was mine, and I wrote most of the Laravel API. It never shipped.

Overview
LinkFront is an affiliate app for athletes, working the way Shop LTK does: pick a product, generate a tracked link, share it, and watch what it earns. Smash Creative built it for a client between August 2023 and March 2024. I was one of two engineers on it: the app was mine, and I wrote most of the API behind it.
It never shipped. The client walked away before launch, so no athlete ever used it, and every number in these screenshots is seeded.
The app
Expo Router in TypeScript, delivered as an installable web app rather than through the stores. gluestack-ui for components, TanStack Query with an AsyncStorage persister so a cold open shows the last data it had, react-hook-form and Zod for forms, Victory for the charts.
An athlete opens on earnings, filters by brand, category and date range, drills into top products and top brands, and generates links without leaving the app. There is a dark theme throughout. 224 commits on it, 218 of them mine.
The API
Laravel 10 on PHP 8.1, Sanctum for tokens, a repository layer over brands, products and transactions. 172 commits, 119 mine, and the other engineer wrote the rest. CI ran Rector and PHPStan on the PHP side and formatting and lint on the app, deployed staging and production through Laravel Forge and DigitalOcean, and posted the result to Slack.
Where the numbers came from
Everything an athlete sees comes out of Awin, the affiliate network. A scheduled Laravel command pulls the product feed, a zipped CSV per advertiser, unpacks and parses it, and maps it into brands, products and transactions, with a pivot table joining a transaction to the products in it. Earnings and payment due are separate columns, so the app can show what has been paid out and what has not.
The Awin credentials and the feed were real. The sales never were. The client left before there was an audience, so the transaction side only ever ran against seeded data.
Shipping it as a web app
It goes out as a PWA. Progressier handles the service worker, the manifest, the install prompt and push, with the signed-in user identified to it. Every list has a skeleton state, an error boundary catches the rest and offers a retry, and a faker-backed toggle swaps the whole app onto fake data for working offline.