
Founding Engineer
The Problem: Building a multi-product SaaS platform? You face a brutal choice: Share everything, duplicate everything, or over-abstract. We needed a better way.

Building a multi-product SaaS platform? You face a brutal choice:
We needed a better way.
At Youkti, we power two distinct product suites—Account Research and Competitive Intelligence—from a single codebase using a hybrid architecture:
Result: 29 shared action files, 26 independent UI components, zero conflicts.
/boards/
├── (actions)/ // 29 files - Single source of truth
│ ├── fetchMoreBoards.ts
│ ├── searchBoards.ts
│ ├── assignActions.ts
│ └── productAnalysis.ts
├── (types)/ // Shared contracts
│ └── Board.d.tsOne API change = Both products updated instantly.
/account-research/boards/ // Sales-focused UX
/competitive-intelligence/boards/ // Marketing-focused UXEach team iterates independently. Zero merge conflicts.
| Metric | Result |
|---|---|
| API Updates | 1-2 hours (both modules) |
| UI Changes | 2-4 hours (zero cross-impact) |
| Bug Reduction | 30-50% fewer API bugs |
| Dev Velocity | 2x faster for UI iterations |
| Code Reuse | 29 shared files vs. 58 duplicates |
Both modules import shared logic:
import { createNewBoard } from "@/boards/(actions)/newBoard";
import { Board } from "@/boards/(types)/Board";But own their UI:
import { NewBoardModal } from "./NewBoardModal"; // Module-specificAccount Research adds list management:
import { fetchLists } from "@/account-research/leads-prospects/actions";Competitive Intelligence adds battle cards—without touching shared code.
Shared TypeScript contracts prevent drift:
export interface Board {
id: string;
category: "comp_intel" | "account_research";
// Enforced across both modules
}Time Investment:
Ongoing Savings:
Best Practices:
Pitfalls to Avoid:
Strategic duplication beats premature abstraction.
By centralizing what matters (APIs, types, business logic) and isolating what changes (UI, UX, domain features), we achieved: