Skip to content

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.

role: engineer, one of two · aug 2023 – mar 2024 · installable web app
LinkFront
224commits on the app, 218 mine
172commits on the api, 119 mine
8months, aug 2023 to mar 2024

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.

Screenshots

sign in
earnings
top products
products sold
top brands
brands
analytics
trend charts
settings
link generator
date range
brand filter
sign in, dark mode
earnings, dark mode
top products, dark mode
products sold, dark mode
top brands, dark mode
brands, dark mode
analytics, dark mode
trend charts, dark mode
settings, dark mode
link generator, dark mode
date range, dark mode
brand filter, dark mode