Back to Projects
Live Project
2025
Independent Product
Full-Stack

AssetLane

My own SaaS product, live at assetlanehq.com — multi-tenant asset tracking with QR code lookup, recurring maintenance scheduling, warranty alerts, role-based team access, CSV import, and a complete audit trail. A companion Android app is now in pilot distribution, backed by separate staging and production environments. Designed, built, deployed, and taken to market solo.

AssetLane

Project Gallery

AssetLane screenshot 1
AssetLane screenshot 2
AssetLane screenshot 3
AssetLane screenshot 4

Mobile Experience

AssetLane mobile view 1
AssetLane mobile view 2

Video Walkthrough

About the Project

AssetLane is my own SaaS product, launched independently at assetlanehq.com and currently open for early access. It helps organizations track, manage, and audit their physical assets—from laptops and monitors to office equipment and machinery. Companies maintain a centralized inventory, assign assets to employees with a full activity history, define custom asset categories with flexible field schemas, schedule recurring maintenance with due-soon and overdue alerts, track warranty expiry, control access by role, and migrate off spreadsheets through CSV import. Assets carry printable QR labels that resolve in any phone browser, with no app required. A companion Android app, built with React Native and Expo against that same hosted API, is now in pilot distribution. It covers camera-based QR scanning, a searchable asset list, a workspace dashboard with live counts and recent activity, and a full asset detail view—photo, condition, location, warranty dates, custom fields, and maintenance history. A manager can change an asset's status from the floor without opening a laptop, and the workspace switcher lets one account move between organizations. It ships as a direct-download APK rather than through the Play Store, which puts a pilot one link away from any Android phone. iOS is a deliberate hold until a pilot converts, because it costs an annual developer fee to publish at all. Behind both clients run two matched environments. Staging carries its own database, its own authentication instance, and its own installable build; production carries a separate set. Pilot testers get the staging build and real customers get production, so test records and customer records can never meet. That separation exists because the first pilot build did not have it: it paired the test sign-in key with the production server, and every tester reached a spinner that never resolved. I own every layer of it: product design, backend, frontend, mobile, infrastructure, release engineering, and the go-to-market work now underway.

Problem Statement

Organizations of all sizes struggle with asset management. Many companies track assets in Excel files that become outdated and impossible to audit. Without proper assignment tracking, assets get lost and no one knows who had them last. Generic tools don't accommodate different asset types, and there's no audit trail when something goes wrong.

My Solution

I built a flexible, multi-tenant asset management system with row-level tenant isolation, a dynamic field schema system where each category defines its own custom fields, a complete audit trail that survives user deletion, bulk operations for CSV import/export, recurring maintenance schedules that surface due-soon and overdue work, warranty expiry alerts, role-based access for admins, managers, and users, and QR code integration for quick asset lookup. The storage layer uses a provider pattern supporting both local filesystem and Vercel Blob. Choosing row-level isolation here was deliberate: it is the simplest model that meets the requirement, and for a product I intend to sell to small and mid-sized teams it keeps operational overhead low without giving up separation between tenants. The Android app is a thin client on the same hosted API, not a second backend. Every rule that governs the web app—tenant scoping, role checks, audit writes—already lives on the server, so the phone inherits them instead of re-implementing them. Releases run on two build profiles, staging and production, each pinned to its own server, its own sign-in key, and its own Android package name, so both builds install side by side on one phone and a tester never signs in against customer data.

Challenges & Learnings

Next.js 16 App Router Patterns

Established clear patterns: Server Components for data fetching, Client Components only for interactivity, Server Actions for mutations. RSC dramatically simplifies data fetching and reduces client bundle size.

Multi-Tenancy Without Leaks

Every database query includes tenantId filter with authorization check before every operation. Defense in depth at middleware, page, and query level.

Dynamic Custom Fields

Store field schema as JSON in AssetCategory, field values as JSON in Asset, with dynamic form components that render based on schema and validate on import.

Audit Trail That Survives

Store userId as plain string (no FK) and performedBy name in JSON details field, so history remains readable even after user deletion.

The First Pilot Build Signed In, Then Hung Forever

Testers reached the login screen, entered valid credentials, and landed on a spinner that never resolved. The build paired the test sign-in key with the production server. Those keys belong to different authentication instances, so the login succeeded against one and the server rejected the session from the other—and the app had no branch for a rejected session, so it waited. The fix was structural, not a patch: two build profiles that each bind one server to its matching sign-in key, separate Android package names so staging and production install side by side instead of overwriting each other, and a real error screen that names the server it is talking to. A configuration mismatch is now visible on the phone instead of silent.

The App Was Slow Because of Geography, Not Code

Pages took several seconds to paint, and the easy story was to blame free-tier hosting. One response header disproved it: requests entered the network in Mumbai and executed in Washington DC, while the database sat in Singapore. Every query crossed the Pacific twice, and each page ran several of them in sequence. Three fixes followed—pin the serverless functions to the database's region, deduplicate the repeated authorization lookups that every page was running twice per request, and add loading skeletons so the browser paints structure instead of white while data arrives. The lesson I keep: put the function next to the database when a page makes several sequential queries, and read the evidence before theorizing about the cause.

Technology Stack

Next.js 16

Full-stack React framework with App Router, Server Components, and Server Actions for simpler data fetching and reduced client bundle size.

React 19

Latest React with Server Components paradigm for rendering data-fetching components on the server.

TypeScript

Type-safe development from database to UI, ensuring reliability across the full stack.

PostgreSQL

Relational database with JSON column support for flexible custom field schemas while maintaining query performance.

Prisma

Type-safe ORM with excellent migrations and Prisma Studio for database management.

Clerk

Managed authentication service with webhook support for user syncing.

TailwindCSS 4

Utility-first CSS framework with shadcn/ui components for rapid, accessible UI development.

React Native + Expo

Companion Android app built as a thin client against the same hosted API, so web and mobile share one backend and one source of truth. Expo's build service produces an installable Android package without maintaining a native toolchain.

Expo Camera + TanStack Query

Camera-based QR scanning on the phone, with cached, request-deduplicated data fetching so scan results stay fast and consistent with the web app.

EAS Build

Cloud build service that signs and packages the Android app per environment profile. Each profile carries its own server address, sign-in key, and package name, and produces a download link a pilot user can install from directly—no Play Store review cycle between a fix and the tester's phone.

Technologies Used

Next.js 16React 19TypeScriptPostgreSQLPrismaTailwindCSS 4React NativeExpoEAS Build