Overview
Nolly solves the problem every growing team hits eventually: someone leaves and takes critical knowledge with them. It gives organizations a single place to capture, organize, and retrieve institutional knowledge through multiple input methods including document uploads, audio transcription, and direct text entry. The platform is built as a TypeScript monorepo with 12 packages spanning three web apps (public marketing site, main product, admin dashboard), a background worker, and an MCP server. The main app uses TanStack Start with TanStack Router for type-safe full-stack routing, Better Auth for authentication with Google OAuth, Drizzle ORM over Postgres with row-level security, and BullMQ with Redis for async job processing. The worker handles heavy lifting like document parsing (PDF, DOCX), image processing with Sharp, audio transcription via Groq, and embedding generation for semantic search. The architecture separates concerns cleanly. Server functions follow a two-file pattern: .functions.ts files define the TanStack createServerFn wrappers while .server.ts files contain the actual database and API logic. Routes never touch the database directly. The UI layer uses a shared component library built on Tailwind and Motion. Real-time collaboration is supported through Hocuspocus with Yjs CRDTs, and the platform includes an MCP server that exposes knowledge operations to AI tools. Deployment targets a single Digital Ocean droplet with Nginx reverse-proxying three Node.js processes. The project also includes a dedicated email package using Postmark, a logging package with Better Stack integration, and a scripts package for operational tasks like backfilling embeddings and summaries.
Built With
Architecture
Key Highlights
RAG Knowledge Pipeline
Multi-stage ingestion pipeline using BullMQ workers that extracts text from PDFs, DOCX, XLSX, images (via vision AI), and audio (via Groq Whisper). Documents are semantically chunked and embedded using MiniLM-L6-v2 (384-dim vectors) for pgvector search.
Real-time Collaboration
Hocuspocus WebSocket server with Yjs CRDTs syncing TipTap editors across users. Includes debounced micro-saves, automatic embedding regeneration after edits, and idle version snapshots queued through BullMQ.
AI Chat with Tool Use
Conversational knowledge assistant powered by Groq (Llama 4 Scout) with function-calling tools for semantic search, metadata filtering, and member lookups. Uses dual-layer retrieval with LLM query rewriting and expanded keyword variants.
Postgres Row-Level Security
Application-level RLS using AsyncLocalStorage to propagate user context. Every query runs inside a transaction that sets Postgres session variables via set_config, scoping all data to the authenticated user's organization.
Google Drive Sync
Background sync that imports files from Google Drive using raw fetch against the v3 REST API (no googleapis SDK, saving ~30MB). Handles Workspace export conversions and memory-aware backpressure with exponential backoff.

