Mohammad Houda
All work
Multi-Tenant AI Fundraising Platform2026

Raise

Raise is a multi-tenant fundraising platform built around six workflows startups actually run during a raise: investor CRM, pipeline tracking, commitments, tasks, secure document sharing, and team collaboration. The engineering weight sits in two places. First, tenant isolation: every query is scoped to a startup, enforced at the database access layer rather than trusted to callers, with fine-grained RBAC on top and a separate restricted authentication path for outside reviewers who should see documents but not the rest of the workspace. Second, the AI copilot: fundraising documents are parsed with LlamaParse, embedded into pgvector, and retrieved to answer contextual questions with citations so an answer can always be traced back to a page. Everything slow runs off the request path through BullMQ and streams back over SSE.

At a glance

6Core workflows
2Isolated auth paths
SSEReal-time delivery

Built with

TypeScript · React · Express · PostgreSQL · Prisma · Redis · BullMQ · OpenAI · pgvector · LlamaParse · Supabase

Interface

03 views

Engineering notes

  1. 01

    Tenant isolation enforced twice: role middleware plus services that select through composite keys like startupId_id, so a stray findUnique({ id }) still can't cross tenants

  2. 02

    External reviewers run on a separate auth path entirely link token, email OTP, separate cookie and table that can only reach /reviewer-portal/*

  3. 03

    AI copilot treats the model as untrusted input: it can never write, only propose actions a human approves, and approval re-checks the permission the manual action needs

  4. 04

    Grounded RAG over pgvector with hnsw.iterative_scan = 'relaxed_order', because the HNSW index is global across tenants and a small corpus would otherwise lose real matches

  5. 05

    Prompt submit and response read are separate requests; a Redis run registry (TTL + 8s heartbeat) makes reconnect, multi-tab, and cross-replica resume work

  6. 06

    API and worker are separate processes from one package; eight BullMQ queues plus six recurring maintenance jobs run as Redis-native repeatable schedules

  7. 07

    Three-phase uploads so the API never proxies file bytes signed target, direct PUT to storage, confirm with private bytes served only through short-lived signed paths

Architecture

Interactive click any node

Loading diagram…

Next project

Distributed RAG Crawler

Web Crawler & Search Engine