Skip to main content
Alvin QuachFull Stack Developer
HomeProjectsExperienceBlog
HomeProjectsExperienceBlog
alvinquach

Full Stack Developer building systems that respect complexity.

Open to opportunities

Projects

  • All Projects
  • Lacoda Capital Holdings
  • Hoop Almanac
  • SculptQL

Knowledge

  • Blog
  • Experience
  • Interview Prep

Connect

  • Contact
  • LinkedIn
  • GitHub
  • X

Resources

  • Resume
© 2026All rights reserved.
Back to Projects

Lacoda Capital Holdings

AI-powered investment platform with intelligent automation

Solo Developer
Team of 1
Next.js
Sanity
TypeScript
TailwindCSS
PostgreSQL
OpenAI
Node.js
Mapbox
Storyblok
Playwright
Live Site

The Problem

Situation

Lacoda Capital Holdings needed a private, full-stack operating system for asset management, advisory, education, and client relationships. The platform needed to match the capabilities of enterprise business dashboards—not startup software, but a professional firm OS with role-based access, client portals, assistant management, and optional crypto visibility.

My Goal

Build a complete business operating system modeled after T Creative Studio's dashboard, but translated for asset management and advisory services. The platform needs a full role hierarchy (Admin, Assistant, Client), core modules (Dashboard, Engagements, Calendar, Messages, CRM, Analytics, Financial, Documents), and an asset management layer with crypto API integration.

My Approach

1

Analyzed T Creative Studio's dashboard architecture to translate each module for asset management context

2

Designed complete role hierarchy: Admin (full access), Assistant (assigned clients, drafting, scheduling), Client (portal access, documents, asset summaries)

3

Built core platform modules: Dashboard with AUM metrics, Engagements booking system, Calendar with availability management

4

Implemented messaging system with AI summaries and follow-up task generation

5

Created CRM with asset-specific fields: status, engagement history, lifetime value, asset category tags, risk tier

6

Developed Documents vault for reports, decks, statements, contracts, and compliance docs

7

Built Financial module for invoices, payments, subscriptions, and retainers

8

Architected asset management layer with client-linked profiles and read-only monitoring

9

Integrated crypto APIs for persisted snapshots, history views, and alerts

The Outcome

Professional firm OS established—not startup software, but enterprise-grade operations

Complete role-based access control with Admin, Assistant, and Client permissions

Assistant portal enables scaling without risk—assigned clients only, read-only portfolios

Crypto monitoring integrated as optional advanced feature, not required for onboarding

Professional intake flow replaces generic sign-up with multi-step engagement process

Project Roadmap

MVP, stretch goals, and future vision

Project Roadmap

Development phases and milestones

100%
13/13 complete
1

Core Platform

MVP

Auth, roles, client management, engagements, and essential business operations

Completed
Auth + Roles + RLS

Complete authentication system with role-based access control

Client Onboarding

Professional intake flow replacing generic sign-up

Engagements + Calendar

Booking system for advisory services with availability management

Messaging System

Inbox for booking requests, inquiries, and client communication

Documents Vault

Secure document management for reports, contracts, and compliance

Payments & Invoices

Financial module for billing and payment tracking

Admin Dashboard

Central command with key business metrics

2

Scale & Intelligence

Stretch

Assistant portal, crypto visibility, offerings catalog, training, and AI copilots

Completed
Assistant Portal

Delegated access for analysts to handle assigned clients

Crypto History + Alerts

Expanded crypto API integration with persistence and monitoring

Offerings Catalog

Marketplace for advisory packages and services

Training Programs

Educational content for investor education

AI Copilots

OpenAI-powered assistants for analysis and automation

Event Mapping

Mapbox-powered event and meeting visualization

Completed
In Progress
Planned

Technical Decisions

Quick answers to 'Why did you choose X?' questions

Q1Why build a custom platform instead of using existing investment software?

Off-the-shelf investment platforms are expensive, inflexible, and don't offer the AI capabilities the client envisions. A custom solution gives full control over features, data ownership, and the ability to integrate cutting-edge AI that differentiates the firm from competitors.

Q2How are you approaching the AI agent integration?

Planning to use OpenAI's API to build an intelligent assistant that can answer investor questions, summarize portfolio performance, generate reports, and potentially automate routine communications. The agent will have access to the firm's data through secure API endpoints.

Q3Why PostgreSQL for the database?

Investment data requires ACID compliance, complex queries for reporting, and strong data integrity. PostgreSQL handles financial data reliably and scales well. Combined with Prisma ORM, it provides type-safe database access.

Q4How did you evaluate analytics platforms (Amplitude vs Mixpanel vs PostHog)?

Evaluated all three for tracking user behavior in the client portal. Amplitude: powerful cohort analysis but expensive at scale, best for product teams with dedicated analysts. Mixpanel: strong event tracking and funnels, good pricing, but vendor lock-in. PostHog: open-source, self-hostable, EU hosting available, includes session replay and feature flags. For a financial firm with data sensitivity concerns, PostHog won—we can self-host to keep client behavior data on our own infrastructure, and the all-in-one platform (analytics + session replay + feature flags) reduces vendor complexity.

Q5Why model this after T Creative Studio's dashboard?

The founder's sister built a comprehensive business OS for her creative agency. Rather than reinvent the wheel, we translated her proven module structure (Dashboard, Engagements, Calendar, Messages, CRM, Analytics, Financial, Documents) into asset management context. Same architecture, different domain—this accelerated design decisions and provided a tested UX pattern.

Q6Why Storyblok over other headless CMS options (Sanity, Contentful, Strapi)?

For a client who needs to manage marketing content without developer intervention, Storyblok's visual editor is unmatched. Unlike Sanity (code-heavy content modeling) or Contentful (JSON-focused), Storyblok lets non-technical users drag and drop components visually. The real-time preview shows exactly how content will appear. For a financial firm where the founder needs to update investor materials quickly, this WYSIWYG approach reduces friction. Plus, Storyblok's built-in asset management handles PDFs and images for investor decks. The tradeoff: less flexible than Sanity for complex data modeling, but for marketing pages and blog content, visual editing wins.

Q7GraphQL vs Server Actions vs REST API - which data fetching pattern?

Chose Server Actions with Supabase client for most operations. GraphQL adds complexity (schema definitions, resolvers, client setup) that's overkill for a single-client app where I control both frontend and backend. Server Actions give type-safe, co-located data fetching with zero API boilerplate. For complex queries like portfolio aggregations, Supabase's query builder handles joins and aggregations directly. GraphQL would shine if multiple clients consumed the API differently, but here, Server Actions are simpler and faster to iterate on.

Q8Should you use an ORM like Prisma or Drizzle with Supabase?

Decided against adding Prisma/Drizzle on top of Supabase. Supabase already provides a typed client generated from the database schema (via CLI), giving type-safe queries without the ORM abstraction layer. Adding Prisma would mean: (1) duplicate type definitions, (2) two migration systems to manage, (3) losing Supabase's real-time subscriptions and RLS integration. Drizzle is lighter but still adds complexity. The Supabase JS client with generated types gives 90% of ORM benefits without the overhead. For raw SQL needs, Supabase's postgres.js connection handles it.

Key Trade-offs

Every decision has costs — here's how I thought through them

PostHog over Amplitude/Mixpanel for analytics

Gained

  • +Self-hostable - client data stays on our infrastructure
  • +EU hosting option for GDPR compliance
  • +All-in-one: analytics, session replay, feature flags in one tool
  • +Open-source with transparent pricing
  • +No per-seat costs for the team

Gave Up

  • −Smaller community than Amplitude/Mixpanel
  • −Fewer pre-built integrations
  • −Self-hosting requires DevOps overhead
  • −Less mature cohort analysis than Amplitude

Why Worth It

For a financial firm handling sensitive client data, controlling where analytics data lives is critical. PostHog's self-hosting option means client portal behavior never leaves our infrastructure. The all-in-one platform also reduces vendor sprawl.

Custom platform over off-the-shelf investment software

Gained

  • +Full control over features and roadmap
  • +AI integration not possible with legacy platforms
  • +No per-user licensing fees at scale
  • +Data ownership and portability
  • +Differentiates firm from competitors using same tools

Gave Up

  • −Higher upfront development cost
  • −Ongoing maintenance responsibility
  • −No built-in compliance certifications
  • −Longer time to initial launch

Why Worth It

Off-the-shelf platforms charge $500-2000/month and can't do AI. A custom build costs more upfront but provides unlimited flexibility and becomes a competitive advantage. The firm owns the IP.

Role-based access with Assistant tier over simple Admin/Client model

Gained

  • +Founder can delegate without giving full access
  • +Assistants see only assigned clients
  • +Scales the business without security risk
  • +Clear audit trail of who did what

Gave Up

  • −More complex permission system to build
  • −More edge cases to test
  • −UI complexity for role management
  • −RLS policies are harder to debug

Why Worth It

The founder explicitly asked: 'Do I have assistants?' This role enables hiring analysts who can draft reports and handle scheduling without seeing firm financials or other clients. It's how professional firms scale.

Crypto visibility as optional advanced feature, not core requirement

Gained

  • +Onboarding doesn't require wallet connection
  • +Non-crypto clients can use the full platform
  • +Reduces friction in client acquisition
  • +Crypto features can evolve independently

Gave Up

  • −Two paths through the product to maintain
  • −Crypto clients may want deeper integration
  • −Feature parity questions between client types

Why Worth It

Not all advisory clients have crypto. Making wallet connect optional means the platform serves traditional asset management clients while offering crypto monitoring for those who want it. Business-correct positioning.

Supabase over custom auth + separate database

Gained

  • +Auth, database, and realtime in one platform
  • +Row Level Security built into Postgres
  • +Generous free tier for development
  • +Fast iteration without DevOps

Gave Up

  • −Vendor dependency on Supabase
  • −Less control over infrastructure
  • −Migration complexity if we outgrow it
  • −Some features require Pro plan

Why Worth It

For a solo developer building a complex platform, Supabase eliminates weeks of auth and infrastructure work. RLS means security is enforced at the database level—even if I make a mistake in API code, unauthorized data access is blocked.

Storyblok over Sanity/Contentful for marketing CMS

Gained

  • +Visual drag-and-drop editor for non-technical users
  • +Real-time preview shows exact content appearance
  • +Built-in asset management for PDFs and images
  • +Component-based architecture matches Next.js patterns
  • +Excellent developer experience with TypeScript SDK

Gave Up

  • −Less flexible than Sanity for complex data modeling
  • −Higher cost at scale than self-hosted Strapi
  • −Visual editor can constrain design freedom
  • −Learning curve for component-based thinking

Why Worth It

The founder needs to update investor materials and marketing pages without calling me. Storyblok's visual editor means he can make changes in real-time with live preview. For a busy firm, this self-service capability is worth the tradeoff in flexibility.

Server Actions over GraphQL for data layer

Gained

  • +Zero API boilerplate - functions are co-located with components
  • +Full type safety from database to UI
  • +No schema/resolver maintenance
  • +Progressive enhancement works out of the box
  • +Simpler mental model for solo developer

Gave Up

  • −Can't easily expose API to third parties later
  • −Less flexibility if multiple clients need different data shapes
  • −Tighter coupling between frontend and backend
  • −Harder to cache than REST/GraphQL responses

Why Worth It

For a single-client application where I control both ends, Server Actions eliminate entire categories of work (API routes, schema definitions, client setup). If Lacoda ever needs a public API, we can add GraphQL endpoints for specific use cases without rewriting the core app.

Supabase typed client over adding Prisma/Drizzle ORM

Gained

  • +Single source of truth for types (database schema)
  • +Native RLS and real-time support preserved
  • +One migration system (Supabase migrations)
  • +Lighter dependency footprint
  • +Direct access to Postgres features

Gave Up

  • −Less abstraction for complex queries
  • −No automatic relation loading like Prisma's include
  • −Manual join queries for nested data
  • −Less portable if switching databases

Why Worth It

Supabase's typed client (generated via `supabase gen types`) provides 90% of what an ORM offers. The remaining 10% (relation loading, query building) isn't worth adding another abstraction layer and maintaining duplicate type systems. When I need complex queries, raw SQL with Supabase's postgres.js is more powerful than ORM abstractions.

Playwright for web scraping and data extraction

Gained

  • +Full browser automation with Chromium, Firefox, or WebKit
  • +Handles JavaScript-rendered content and SPAs
  • +Complete control over navigation, authentication, and interactions
  • +No external API costs - runs locally or on your infrastructure
  • +Excellent for scraping behind login walls
  • +Same tool works for E2E testing and scraping

Gave Up

  • −More code to write than API-based scrapers
  • −Need to handle browser lifecycle and memory
  • −Slower than direct HTTP requests for simple pages
  • −Maintenance overhead when sites change

Why Worth It

Playwright powers the AI research features—extracting content from investment news, SEC filings, and market reports. Unlike API-based scrapers, we control the entire browser session, can authenticate with any site, and handle complex JavaScript-heavy pages. The clean text output feeds directly into OpenAI for analysis. Since we already use Playwright for testing, the scraping logic shares infrastructure.

Challenges & Solutions

The hardest problems I solved on this project

1Balancing current needs with future AI capabilities

Approach

Designed the architecture to be modular - the current marketing site and CMS work standalone, while the database and API layer are built to support the upcoming investor portal and AI features.

Solution

Created a clear separation between the public-facing site (Next.js + Sanity) and the application layer (API routes + PostgreSQL), making it easy to add AI capabilities without disrupting existing functionality.

Lesson: When building for evolving requirements, invest in clean architecture early - it pays off when adding complex features later.

2Defining scope for AI agent capabilities

Approach

Working closely with the client to understand what tasks are most valuable to automate and what investor interactions could benefit from AI assistance.

Solution

Starting with clearly defined use cases: portfolio summaries, Q&A about investment opportunities, and report generation. Will expand based on what provides the most value.

Lesson: AI features should solve real problems, not just be impressive demos. Start with high-value use cases.

What I Learned

  • →Investment platforms have strict requirements around data accuracy and audit trails
  • →AI integration requires careful consideration of what data the agent can access
  • →Building for a regulated industry means thinking about compliance from day one

Want to discuss this project?

Get in TouchView More Projects