Launchstack is a Next.js platform for role-based document management, AI-assisted Q&A, and predictive document analysis. It combines document upload, optional OCR, embeddings, and retrieval to help teams find gaps and act faster.
Launchstack runs domain-specific analysis tailored to your document type:
| Type | What It Detects |
|---|---|
| Contract | Missing exhibits, schedules, addendums, and supporting agreements |
| Financial | Missing balance sheets, audit reports, income statements |
| Technical | Missing specifications, manuals, diagrams, deliverables |
| Compliance | Missing regulatory filings, certifications, policy documents |
| Educational | Missing syllabi, handouts, readings, linked resources |
| HR | Missing policies, forms, benefits materials, handbooks |
| Research | Missing cited papers, datasets, supplementary materials |
| General | Any document with cross-references and attachments |
Each analysis type also extracts insights (deadlines, action items, resources, caveats) and runs chain-of-verification on high-priority predictions.
Launchstack can ingest content exported from third-party tools. No API keys or OAuth setup required — export your data, upload the files, and the ingestion pipeline handles the rest.
| Source | Export Method | Resulting Format | Launchstack Adapter |
|---|---|---|---|
| Notion | Settings > Export > Markdown & CSV | .md, .csv (ZIP) |
TextAdapter, SpreadsheetAdapter |
| Notion | Page > Export > HTML | .html |
HtmlAdapter |
| Google Docs | File > Download > Microsoft Word | .docx |
DocxAdapter |
| Google Sheets | File > Download > CSV or Excel | .csv, .xlsx |
SpreadsheetAdapter |
| Google Drive | Google Takeout (takeout.google.com) | .docx (ZIP) |
DocxAdapter |
| Slack | Workspace Settings > Import/Export > Export | .json (ZIP) |
JsonExportAdapter |
| GitHub | Code > Download ZIP | .md, .txt (ZIP) |
TextAdapter |
| GitHub | gh issue list --json ... |
.json |
JsonExportAdapter |
| GitHub | gh pr list --json ... |
.json |
JsonExportAdapter |
Notion 1. Open your Notion workspace. 2. Click the ... menu on a page, or go to Settings & members > Export for a full workspace export. 3. Select Markdown & CSV as the format and check Include subpages if needed. 4. Download the ZIP and upload it directly to Launchstack.
Google Docs / Sheets 1. Open the document in Google Docs or Sheets. 2. Go to File > Download and choose Microsoft Word (.docx) or CSV / Excel (.xlsx). 3. Upload the downloaded file. For bulk exports, use Google Takeout to export your Drive as a ZIP.
Slack 1. Go to Workspace Settings > Import/Export Data > Export. 2. Choose a date range and start the export. 3. Download the ZIP and upload it to Launchstack. Each channel's messages will be ingested as a separate document.
GitHub
1. Repo docs: Click Code > Download ZIP on any GitHub repository. Upload the ZIP — all Markdown and text files will be ingested.
2. Issues: Install the GitHub CLI and run:
bash
gh issue list --state all --limit 1000 --json number,title,body,state,labels,author,createdAt,closedAt,comments > issues.json
Upload the resulting issues.json file.
3. Pull requests: Run:
bash
gh pr list --state all --limit 1000 --json number,title,body,state,labels,author,createdAt,mergedAt,comments > prs.json
Upload the resulting prs.json file.
All uploaded content flows through the standard ingestion pipeline (chunking, embedding, RAG indexing) and becomes searchable alongside your other documents.
Launchstack follows a three-layer modular architecture:
block-beta
columns 9
SLABEL["Services\nLayer"]:1
MKT["Marketing Engine\n─────────────\nTrend Analysis\nContent Generation\nWeb Scraping Jobs"]:2
LEG["Legal Services\n─────────────\nTemplate Library\nAuto-Fill & Clauses\nLegal Vault"]:2
ONB["Employee Onboarding\n─────────────\nOnboarding Agent\nQuizzes & Checks\nProgress Tracking"]:2
DOCR["Document Reasoning\n─────────────\nPage Index & TOC\nRLM Agent\nKnowledge Graph"]:2
space:9
TLABEL["Tools\nLayer"]:1
RAG["RAG Pipeline\n(BM25 + Vector)"]:2
WEB["Web Search\n(Tavily, Firecrawl)"]:2
REW["Doc Rewrite\n(Summarize, Refine)"]:2
TMPL["Template Engine\n(Form → PDF)"]:2
space:1
ING["Doc Ingestion\n(OCR, Chunk, Embed)"]:4
ENT["Entity Extraction\n(NER, Graph RAG)"]:4
space:9
PLABEL["Physical\nLayer"]:1
DB["PostgreSQL + pgvector\n─────────────\nEmbeddings Index\nDocument Structure\nKnowledge Graph\nDomain Tables"]:2
HOST["Hosting & Compute\n─────────────\nNext.js 15\nInngest Jobs\nAgent Hosting\nML Sidecar"]:2
EXT["External Services\n─────────────\nOCR Providers\nFile Storage (S3)\nClerk Auth + RBAC"]:2
KBS["Knowledge Bases\n─────────────\nCompany KB\nLegal Templates\nOnboarding Docs"]:2
%% Service → Tool edges
MKT --> RAG
MKT --> WEB
MKT --> REW
LEG --> RAG
LEG --> REW
LEG --> TMPL
ONB --> RAG
ONB --> REW
DOCR --> RAG
DOCR --> WEB
DOCR --> REW
DOCR --> ING
DOCR --> ENT
%% Tool → Physical edges
RAG --> DB
RAG --> KBS
WEB --> HOST
REW --> HOST
TMPL --> EXT
TMPL --> KBS
ING --> DB
ING --> EXT
ING --> HOST
ENT --> DB
ENT --> HOST
classDef layer fill:#1a1a2e,color:#eee,stroke:none
classDef svc fill:#4A90D9,color:#fff,stroke:#2C5F8A,stroke-width:1px
classDef tool fill:#F5A623,color:#fff,stroke:#C47D0E,stroke-width:1px
classDef phys fill:#27AE60,color:#fff,stroke:#1E8449,stroke-width:1px
class SLABEL,TLABEL,PLABEL layer
class MKT,LEG,ONB,DOCR svc
class RAG,WEB,REW,TMPL,ING,ENT tool
class DB,HOST,EXT,KBS phys
The platform is organized into:
All services operate within domain-partitioned boundaries enforced by Clerk RBAC. RAG queries are scoped by domain + company_id to ensure data isolation.
git clone <repository-url>
cd pdr_ai_v2-2
pnpm install
Create .env from .env.example and fill required values:
DATABASE_URLNEXT_PUBLIC_CLERK_PUBLISHABLE_KEYCLERK_SECRET_KEYBLOB_READ_WRITE_TOKEN (Vercel Blob read/write token)OPENAI_API_KEYINNGEST_EVENT_KEY, as placeholderOptional integrations:
- NODE_ENV=development (for development, otherwise assumed to be production)
- UPLOADTHING_TOKEN
- TAVILY_API_KEY
- INNGEST_EVENT_KEY, INNGEST_SIGNING_KEY
- AZURE_DOC_INTELLIGENCE_ENDPOINT, AZURE_DOC_INTELLIGENCE_KEY
- LANDING_AI_API_KEY, DATALAB_API_KEY
- LANGCHAIN_TRACING_V2, LANGCHAIN_API_KEY, LANGCHAIN_PROJECT
- DEBUG_PERF (1 or true) to enable dev perf logs for middleware and key auth/dashboard APIs
- SIDECAR_URL
- NEO4J_URI
- NEO4J_USERNAME
- NEO4J_PASSWORD
Vercel Blob is used for storing uploaded documents. Both public and private stores are supported -- the upload logic auto-detects which mode the store uses and adapts automatically.
/api/documents/[id]/content and /api/files/[id] so previews still work.BLOB_READ_WRITE_TOKEN in your environment (.env locally, or Vercel Project Settings for deploys)./api/upload-local returns a vercel-storage.com URL without errors.pnpm db:push
pnpm run dev
Open http://localhost:3000.
make up spins up the entire stack behind a Caddy reverse proxy — no external cloud dependencies beyond API keys. Works for both local development and production.
make up # start everything (foreground)
make up-prod # start everything (detached, for servers)
make down # stop containers
make down-clean # stop + wipe volumes (fresh DB)
make logs # tail all container logs
Set DOMAIN in your .env:
| Environment | .env setting |
What happens |
|---|---|---|
| Local dev | DOMAIN=localhost (default) |
HTTPS with self-signed cert |
| Production | DOMAIN=yourdomain.com |
HTTPS with auto-provisioned Let's Encrypt cert |
All routes go through one domain — no port numbers to remember:
| URL | What it serves |
|---|---|
https://yourdomain.com/ |
Application |
https://yourdomain.com/s3/... |
File uploads/downloads (SeaweedFS) |
https://yourdomain.com/inngest/ |
Background job dashboard |
| Container | Image | Role |
|---|---|---|
caddy |
caddy:2-alpine |
Reverse proxy, auto-HTTPS, only exposed service (ports 80/443) |
db |
pgvector/pgvector:pg16 |
PostgreSQL with vector extension |
migrate |
Dockerfile | Pushes Drizzle schema on startup, then exits |
seaweedfs |
chrislusf/seaweedfs |
S3-compatible file storage |
app |
Dockerfile | Production Next.js standalone server |
inngest-dev |
inngest/inngest |
Background job processing + dashboard |
Override defaults in .env before deploying:
DOMAIN=yourdomain.com
POSTGRES_PASSWORD=<strong-password>
S3_ACCESS_KEY=<strong-random-key>
S3_SECRET_KEY=<strong-random-secret>
Ensure ports 80 and 443 are open on your server. Caddy handles everything else — TLS provisioning, HTTP→HTTPS redirect, certificate renewal.
POST /api/uploadDocument - upload and process document (OCR optional)POST /api/LangChain - document-grounded Q&APOST /api/agents/predictive-document-analysis - detect gaps and recommendationsGET /api/metrics - Prometheus metrics streampnpm db:studio
pnpm db:push
pnpm check
pnpm lint
pnpm typecheck
pnpm build
pnpm start
.next and reinstall dependencies.--no-cache.pnpm check.Private and proprietary.
Open an issue in this repository or contact the development team.
$ claude mcp add LaunchStack \
-- python -m otcore.mcp_server <graph>