RU EN
← ALL PROJECTS

CASE 07 · WEB

Mosaic A venture fund management system (InvestOps)

Product screens

Investment class card: shares, value, fees and commitments
Investment class card: shares, cost basis and commitments
Investor and UBO registry: types, tax residency, share classes and KYC
Investor and UBO register with KYC statuses
Secondary share sales log (MPA): amounts, price per share, carry and statuses
Secondary share sales (MPA) in the transaction journal
1 / 3

A full-cycle web platform for a venture fund management company: SPV, investor and deal accounting, automated fee and carried interest calculations, legal document generation, bank statement import and reporting — all in one system instead of dozens of spreadsheets.

TYPE
Web platform
DOMAIN
Venture fund · SPVs
STACK
React · Node.js · TypeScript · MySQL
ENVIRONMENTS
dev / production

THE CHALLENGE

Manual accounting stopped scaling

The client is a venture fund management company that structures deals through SPVs — special-purpose vehicles set up for each investment. Before the system, all accounting was done by hand in Excel and Google Sheets:

As deals and investors multiplied, the manual process stopped scaling: an error in a stake or fee calculation is a direct financial and reputational risk in front of investors.

KEY ENGINEERING

The hardest parts of the domain

01

Event sourcing for financial data

Transactions are immutable — they can't be edited or deleted. All current holdings are computed from the full event history. This guarantees an audit trail and rules out silent backdated edits of financial data — a critical requirement when handling investor money.

02

Carried interest: FIFO layers + High-Water Mark

The hardest part of the domain: each investor has individual terms (carry rate, setup fee, management fee), and carry is computed over FIFO investment layers with a high-water mark. Non-trivial scenarios are supported: partial exits, mixed exits, conversion into sub-classes with layer inheritance, and secondary sales of stakes between investors (MPA).

03

Corporate actions

Stock splits and reverse splits of portfolio companies with correct recalculation of every position across all related classes.

04

Document generation engine

A custom templating engine on top of DOCX: the client's lawyers edit templates in Word with placeholders, the system fills in the data (with business rules like “carry = 0 → empty field”, “no setup fee → ‘not charged’”) and converts to PDF via Gotenberg/LibreOffice. Documents are generated as streams and never stored on the server.

05

Statement import, including PDF scans

Parsers for banks' CSV/XLSX formats plus PDF statement parsing (pdfjs) with an OCR fallback (Tesseract) for scanned documents, an import preview and duplicate protection.

06

Role-based access

Four roles (admin, owner, CFO, limited partner) enforced at both API and UI level: an investor sees only their own investments, the CFO sees operational data, the administrator sees everything.

07

KYC/UBO compliance

KYC document tracking and ultimate beneficial owner (UBO) structures for every investor.

BEFORE → AFTER

What the system automates

BEFORE

Investor stakes recalculated in Excel after every deal

AFTER

Stakes and positions are computed automatically from an immutable transaction journal

BEFORE

Fees and carry calculated individually per investor

AFTER

Automated management fee and carried interest calculation (FIFO layers + High-Water Mark), with recalculation when terms change

BEFORE

Agreements assembled by copy-pasting Word templates

AFTER

One-click document packages: the system fills investor, class and deal data into DOCX templates and returns a ready PDF

BEFORE

Manual reconciliation of incoming bank payments

AFTER

Bank statement import (CSV/XLSX/PDF, including scanned documents) with automatic payment matching and deduplication

BEFORE

Investor reports “on request, when we get to it”

AFTER

Ready-made reports with period filters and PDF/XLSX export

BEFORE

Exchange rates copied from the internet by hand

AFTER

Scheduled background rate updates via API

BEFORE

“Who changed this and when?” — unknown

AFTER

Full audit: every change to any entity is logged with the author, date, old and new values

OUTCOME

Value for the client

THE PROJECT IN NUMBERS

Scale

76K+
lines of TypeScript
50
data models
26
interface pages
50+
reusable UI components
33
business-logic test files
9
domain specifications

Plus 20 REST endpoint groups, 32 controllers, 25 services and 90+ database migrations over the project's lifetime.

STACK

Technologies

Frontend
React 18 TypeScript Vite TanStack Query Zustand React Router v6 Tailwind CSS React Hook Form + Zod
Backend
Node.js Express TypeScript Prisma ORM MySQL JWT node-cron Vitest
Documents & integrations
docxtemplater Gotenberg pdfjs Tesseract OCR Alpha Vantage API Resend
Infrastructure
VPS dev / production Prisma Migrate

A monorepo (npm workspaces) with a shared package of Zod schemas: the same data validation on client and server, so types never drift apart.

SEE ALSO

CONTACT

Need a system like this?

I'll automate accounting and operational workflows around your specifics — from audit to production. Message me on Telegram — we'll scope the task, timeline and budget.

Message on Telegram dnovoselov@bk.ru

I reply within 3 hours on weekdays

A project's budget and commercial terms belong to the client, and I don't publish them. Your project will be treated the same way. My own price ranges are in the Pricing section.