Architecture Overview
System Design Philosophy
The MarlinJai ERP Suite follows these principles:
- Modular & Composable - Each component is a standalone package that can be used independently
- Storage Agnostic - Adapter pattern allows swapping databases and file storage
- Type Safe - Full TypeScript across all packages
- Edge Ready - Designed for Cloudflare Workers and edge deployment
Core Components
1. Storage Brain (File Processing Service)
Repository: storage-brain (monorepo with API, SDK, and shared types)
A file upload and processing service with AI capabilities.
graph LR
Upload["Upload Handler"] --> Process["Process Pipeline"] --> Store["Store (R2)"]
Process --> OCR["OCR (Claude)"]
Process --> Thumb["Thumbnail Generate"]
Key Features:
- Multi-context processing (receipt, invoice, document, image)
- AI-powered OCR with structured data extraction
- Automatic thumbnail generation
- Webhook notifications
- R2 storage with signed URLs
SDK Usage:
import { StorageBrain } from '@marlinjai/storage-brain-sdk';
const client = new StorageBrain({ apiKey: 'xxx' });
const result = await client.upload(file, { context: 'receipt' });
// Returns: { id, url, metadata: { ocrData, thumbnails } }2. Data Table (Notion-like Database)
Repository: data-table (monorepo)
A reusable, storage-agnostic Notion-like database component.
graph TD
subgraph Components["React Components"]
TableView
BoardView
CalendarView
end
subgraph Hooks["React Hooks"]
useTable
useRows
useColumns
useViews
end
subgraph Core["Core Package"]
Types
DatabaseAdapter
FileAdapter
end
subgraph Adapters["Adapters"]
D1["D1 Adapter"]
Memory["Memory Adapter"]
Supabase["Supabase Adapter"]
SBFile["Storage Brain File"]
end
Components --> Hooks
Hooks --> Core
Core --> Adapters
Packages:
@marlinjai/data-table-core- Types, interfaces, adapters@marlinjai/data-table-react- React components & hooks@marlinjai/data-table-adapter-d1- Cloudflare D1 adapter@marlinjai/data-table-adapter-memory- In-memory adapter (testing)@marlinjai/data-table-file-adapter-storage-brain- Storage Brain integration
Column Types:
- text, number, date, boolean
- select, multi_select
- url, file
- formula, relation, rollup
3. Email Editor
Repository: email-editor (monorepo)
A visual drag-and-drop email template editor built on MST (MobX State Tree) with MJML export.
graph TB
subgraph "Convenience Layer"
EDITOR["@marlinjai/email-editor"]
end
subgraph "Implementation Layer"
UI["@marlinjai/email-editor-ui<br/>(React)"]
BLOCKS["@marlinjai/email-editor-blocks"]
end
subgraph "Foundation Layer"
CORE["@marlinjai/email-editor-core<br/>(Framework-Agnostic)"]
end
EDITOR --> UI
EDITOR --> BLOCKS
UI --> CORE
BLOCKS --> CORE
Key Architecture Decisions:
- MST for state — fine-grained reactivity, undo/redo via snapshots, type-safe actions
- MJML on export only — no compilation during editing = instant (<16ms) visual feedback
- Framework-agnostic core — core package has zero React dependencies
- Two entry points — client-safe (no MJML) and server-only (with MJML compiler)
4. Framer Clone
Repository: framer-clone
A visual website builder with an infinite canvas, responsive breakpoint system, and Framer-inspired ground wrapper architecture.
graph LR
Canvas["Infinite Canvas<br/>60fps pan/zoom"]
Canvas --> GW["Ground Wrappers<br/>per-element positioning"]
GW --> VP["Viewport Nodes<br/>Desktop/Tablet/Mobile"]
GW --> FE["Floating Elements<br/>images, text, shapes"]
Key Architecture Decisions:
- Ground wrappers — each element has independent
transformpositioning (Framer's approach) - Zero-render transforms — pan/zoom stored in
useRef, updated via direct DOM manipulation - Subscription pattern — overlays subscribe to transform changes for 60fps synchronization
- MST for state —
ProjectStore(domain) +EditorUIStore(UI) split
5. Receipt OCR App
Expense tracking with AI-powered receipt scanning. Integrates Storage Brain (OCR) and Data Table (display).
graph LR
User["User uploads receipt"] --> Next["Next.js App"] --> SB["Storage Brain (OCR)"] --> DT["Data Table (Storage)"]
6. Clearify
Documentation site generator. Zero-config by default, with MDX support, Mermaid diagrams, built-in search, and dark mode. This documentation site is built with Clearify.
Shared Patterns
MobX State Tree (MST)
Both Email Editor and Framer Clone use MST for state management:
- Predictable state with snapshots and patches
- Fine-grained reactivity via MobX observers — only affected components re-render
- Undo/redo via snapshot history
- Type-safe models with runtime validation
Adapter Pattern
Data Table and Storage Brain both use the adapter pattern for storage abstraction:
- Data Table:
DatabaseAdapterinterface (D1, Memory, Supabase) - Data Table:
FileAdapterinterface (Storage Brain integration) - Storage Brain SDK: Consistent API regardless of backend configuration
@marlinjai/ Package Scope
All published packages use the @marlinjai/ npm scope.
Data Flow
graph TD
User["User Action"] --> App
subgraph App["React Application"]
TableView
BoardView
Custom["Custom Components"]
end
App --> Provider
subgraph Provider["DataTableProvider"]
DbAdapter["DatabaseAdapter (D1/Supabase)"]
FileAdapter["FileAdapter (Storage Brain)"]
end
DbAdapter --> D1["Cloudflare D1 (Structured Data)"]
FileAdapter --> SB["Storage Brain (Files + Processing)"]
Deployment Architecture
graph TD
subgraph CF["Cloudflare"]
Pages["Pages (Next.js)"]
Workers["Workers (Storage Brain)"]
R2["R2 (File Storage)"]
D1["D1 (Database)"]
KV["KV (Cache)"]
end
Pages --> Workers
Workers --> R2
Workers --> D1
Workers --> KV
Future Roadmap
- Auth Integration - Clerk for multi-tenant SSO
- Real-time Sync - Durable Objects for live collaboration
- API Gateway - Unified API for all services
- Analytics Dashboard - Business intelligence views
- Email Editor templates marketplace - Shareable email templates
- Framer Clone code export - Generate clean React components from designs