full-stackLiveFeatured

Trizlink

com.trizlink.app

Trizlink runs short links, a link-in-bio page and social posts out of a single workspace, with the analytics that tie all three together โ€” a full from-scratch rebuild on Supabase, live on the web and built for Android.

2022-11 โ†’ PresentPersonal Project

At a glance

Category
full-stack
Status
Live
Started
Nov 2022
Last updated
2 months ago

Identifier

com.trizlink.app

Preview

Take a look before you go

The still below is painted first, then the running site loads behind it โ€” so the dialog is never an empty rectangle waiting on a network round trip. Where a site allows framing the live app takes over; where it refuses, the still stays and says so. Nothing is requested until you press.

Trizlink, as its brand card renders

About

What this actually is

A short link is a redirect somebody else owns.

That is fine right up until the somebody stops paying for it.

Link shorteners were commoditised years ago. Anybody can build one in an afternoon, which is why so many have appeared and then quietly closed, taking every printed QR code and every business card still in circulation down with them.

So the first constraint here is the one this whole practice works under. Free-tier infrastructure, no paid backend in the critical path: Firebase for auth, data and hosting, with FilesHub for uploads.

A redirect has to stay cheap at any volume, because a redirect that becomes expensive is a redirect that eventually stops resolving.

Analytics is where that gets sharp.

A click is one write and a dashboard is a read of a great many of them, so every list read carries an explicit limit and the database does the counting rather than the browser. Get that wrong and the free tier is exhausted by the product's most popular link.

Shortening comes with custom slugs and branded domains.

A link-in-bio builder handles the ordering by drag and drop, so the page can be rearranged by the person who owns it rather than by whoever has the code open.

Click analytics carries breakdowns. D3 and visx draw them.

Custom domains, workspaces and team invites exist because a link representing a company should not live inside one employee's personal account, and because the day that employee leaves is a bad day to discover it does.

Then a suite of 50+ utilities: QR and barcode generators, colour tools, PDF tools, text tools, SEO tools and code tools.

The same React 19 codebase ships as the web application and as a Capacitor Android build on Google Play. A browser extension that shortens from whatever tab you are already in is planned, not shipped.

149 Vitest unit tests and a Cypress suite hold the shared half of that together. The stack stays current: React 19 with the Compiler, TypeScript 6, Vite 8.

Prerendered FAQPage and SoftwareApplication structured data mean an answer engine reads the product instead of an empty document.

The Radix theme customiser is user-facing rather than a developer setting, so the person using Trizlink chooses how it looks instead of inheriting whatever I happened to prefer on the day.

The costs are all in the long tail.

Custom domains are the feature that turns a product into a support desk. Somebody's DNS is somebody else's system, so when a record is wrong the link is dead and the product looks broken, whichever of the two of us made the mistake.

A 50+ tool suite is 50+ surfaces that all have to keep working. Each one is small. Together they are most of the maintenance.

That customiser only holds if every component reads a token. One hardcoded colour is invisible to it, and it stays invisible until somebody switches theme and finds the single panel that did not follow.

Honest analytics is less flattering than the other kind. Click counts include whatever did the clicking, and telling a person from a crawler is a judgement rather than a fact, so the number is a signal and not a census.

There is no iOS build here. There is no Apple Developer account behind this work, so Android and the web are where it has genuinely shipped.

A short link is worth exactly as much as the promise that it will still resolve next year. Everything above is an argument that this one will.

Worth knowing

  • A from-scratch rebuild that replaced a live product on its own domain. The old app is 141,379 lines of TypeScript; none of them are in this tree. `redevelop-v1` is an orphan branch sharing no history with `main`, and cutover was a default-branch switch on 2026-08-31 rather than a merge.
  • Nothing to migrate was a design input, not an accident. `OD-01` settled that there were no real users, which removed the migration module, the export gate and the data-mapping column in one go and let the schema be designed clean from zero.
  • The candour is the product. *"Attribution is a modelling choice, not a measurement"* is not hedging โ€” it is the sentence a competitor cannot write. Every click number carries "best-effort" and the limit sits in the same breath as the claim.
  • The click dummy is the specification, and it owns the words as well as the layout. 60 approved rows in 68 HTML files; a parity test asserts every block-level sentence in it against what ships, in both directions, and both stand at zero. Decisions amend the dummy first, then the app matches it.
  • Two Workers making opposite trades, on purpose. The edge Worker writes the click row after the response; the `link-resolve` edge function writes it before answering, because that path is already a round trip so the wait costs nothing extra.
  • The schema is TypeScript. Drizzle authors 69 tables across 28 files; every `create table` ships a paired privilege block because Drizzle emits no `revoke`, policies are declared in Postgres's own stored form or a parity test fails, and 82 reviewed rollbacks sit beside the 91 migrations.
  • A tenant list built from read policies is a security defect that reads as a UI bug. A platform admin can read every workspace, so a list built from what RLS returns silently offered him one he was not a member of. The list is the caller's memberships now, held there by a contract test.
  • Three things that stay green while they are wrong, all paid for here: a sign-in page that hid its only button behind a variable that is empty in every environment and does not decide the flow; a twelfth storage key written outside `STORAGE_KEYS`, so a sweep over that constant does not see it; and a React Aria field with no `errorMessage` prop, which renders nothing while `isInvalid` still turns the field red.

Built with

  • React 19
  • TypeScript
  • Vite 8
  • Radix Themes
  • Zustand
  • react-router
  • Firebase
  • CapacitorJS
  • WXT

Key features

What it does, and what that costs to build

Each of these is a capability the stack genuinely provides. None of them is an outcome nobody measured โ€” there is no "cut onboarding by 40%" on this page, because no one measured onboarding.

  • URL shortening with custom slugs & branded links
  • Link-in-bio builder with drag-and-drop ordering
  • Click analytics with breakdowns (D3 + visx)
  • Custom domains, workspaces & team invites
  • 51-page in-app tools suite (8 categories)
  • Chrome/Firefox extension for shortening from any tab
  • App-wide Radix theme customizer

Screenshots

5 slots, 2 of them filled in

These are designed frames, not pictures. Each one records what belongs in the slot and at what width; the capture itself is taken from the running app. Drawing a fake screenshot here would put an image on the site that no build has ever produced.

Timeline

Still being worked on

  1. Nov 2022

    Work started

    The earliest month on record for Trizlink.

  2. Sep 2026

    Last change

    Status is completed โ€” 2 months ago. Ongoing, so this row moves whenever something lands.

Questions

Common questions

The questions that actually arrive, answered in the first sentence.

Who built Trizlink?
Ahsan Mahmood built it alone, and it is live at trizlink.com with an Android build on Google Play. The redirect path, the analytics, the link-in-bio builder, the Android build and the store submission are one person's work, which is also why the architecture avoids anything that would need a second person to keep running.
Can I use my own domain with Trizlink?
Yes, custom domains are supported, along with workspaces and team invites so a company's links do not end up living inside one employee's personal account. Branded slugs sit on top of that, so the link reads as yours rather than as a random string. Pointing a domain is a DNS change on your side, and that is the step that most often goes wrong.
Does Trizlink work on iPhone?
No. Trizlink runs on the web and ships an Android application through Google Play; there is no iOS build, because there is no Apple Developer account behind this work. Short links themselves resolve on any device, an iPhone included โ€” it is the installed app that does not exist.
What is in the Trizlink tools suite?
50+ utilities sit inside the product: QR and barcode generators, colour tools, PDF tools, text tools, SEO tools and code tools. They are there because the people who shorten a link for a campaign are usually the same people who need a QR code for it twenty minutes later. Each runs in the application rather than sending you somewhere else.
Is there a Trizlink browser extension?
Not yet. An extension that shortens the page you are on without leaving the tab is planned; today Trizlink is the web application and the Android app on Google Play, and a short link resolves on any device and in any browser.

Keep looking

More full-stack products

  • CL

    ClearHire

    com.aoneahsan.clearhire

    A hiring platform built around one idea: employment claims should be checkable. Resume builder, candidate and company workflows, a verified-employment system, and 50+ career tools.

    completedFeatured
  • LA

    LabFlow

    com.aoneahsan.labflow

    Multi-tenant laboratory information system across three production surfaces.

    completedFeatured
  • SL

    SlackVault

    com.aoneahsan.slackvault

    Exports and archives Slack history so a workspace outgrowing its retention limit keeps its own record.

    in-progressFeatured
All 23 projects