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.
- Clerk-based Employer/Employee authentication with role-aware middleware.
- Document upload pipeline with optional OCR for scanned PDFs.
- PostgreSQL + pgvector semantic retrieval for RAG workflows.
- AI chat and predictive document analysis over uploaded content.
- Agent guardrails with PII filtering, grounding checks, and confidence gating.
- Supervisor agent that validates outputs against domain-specific rubrics.
- Marketing pipeline with content generation for Reddit, X, LinkedIn, and Bluesky.
- Optional web-enriched analysis with Tavily.
- Optional reliability/observability via Inngest and LangSmith.
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
- Open your Notion workspace.
- Click the ... menu on a page, or go to Settings & members > Export for a full workspace export.
- Select Markdown & CSV as the format and check Include subpages if needed.
- Download the ZIP and upload it directly to Launchstack.
Google Docs / Sheets
- Open the document in Google Docs or Sheets.
- Go to File > Download and choose Microsoft Word (.docx) or CSV / Excel (.xlsx).
- Upload the downloaded file. For bulk exports, use Google Takeout to export your Drive as a ZIP.
Slack
- Go to Workspace Settings > Import/Export Data > Export.
- Choose a date range and start the export.
- Download the ZIP and upload it to Launchstack. Each channel's messages will be ingested as a separate document.
GitHub
- Repo docs: Click Code > Download ZIP on any GitHub repository. Upload the ZIP — all Markdown and text files will be ingested.
- Issues: Install the GitHub CLI and run:
Upload the resulting
gh issue list --state all --limit 1000 --json number,title,body,state,labels,author,createdAt,closedAt,comments > issues.jsonissues.jsonfile. - Pull requests: Run:
Upload the resulting
gh pr list --state all --limit 1000 --json number,title,body,state,labels,author,createdAt,mergedAt,comments > prs.jsonprs.jsonfile.
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:
- Services Layer - Vertical business modules (Marketing, Legal, Onboarding, Document Reasoning)
- Tools Layer - Reusable AI capabilities (RAG, Web Search, Document Processing, Entity Extraction)
- Physical Layer - Infrastructure (PostgreSQL + pgvector, Next.js hosting, External services, Knowledge bases)
All services operate within domain-partitioned boundaries enforced by Clerk RBAC. RAG queries are scoped by domain + company_id to ensure data isolation.
- Next.js 15 + TypeScript
- PostgreSQL + Drizzle ORM + pgvector
- Clerk authentication
- OpenAI + LangChain
- UploadThing + optional OCR providers
- Tailwind CSS
- Node.js 18+
- pnpm
- Docker + Docker Compose (recommended for local DB/full stack)
- Git
git clone <repository-url>
cd pdr_ai_v2-2
pnpm installCreate .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 placeholder
Optional integrations:
NODE_ENV=development (for development, otherwise assumed to be production)UPLOADTHING_TOKENTAVILY_API_KEYINNGEST_EVENT_KEY,INNGEST_SIGNING_KEYAZURE_DOC_INTELLIGENCE_ENDPOINT,AZURE_DOC_INTELLIGENCE_KEYLANDING_AI_API_KEY,DATALAB_API_KEYLANGCHAIN_TRACING_V2,LANGCHAIN_API_KEY,LANGCHAIN_PROJECTDEBUG_PERF(1ortrue) to enable dev perf logs for middleware and key auth/dashboard APIsSIDECAR_URLNEO4J_URINEO4J_USERNAMENEO4J_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.
- In the Vercel dashboard, go to Storage → Blob → Create Store.
- Choose either Public or Private access. Both work:
- Public stores produce URLs the browser can load directly (faster for previews).
- Private stores keep files behind authentication; the app proxies content through
/api/documents/[id]/contentand/api/files/[id]so previews still work.
- Generate a Read/Write token for the store and add it as
BLOB_READ_WRITE_TOKENin your environment (.envlocally, or Vercel Project Settings for deploys). - Redeploy so the token is available at build and runtime.
- Verify: sign in to the Employer Upload page, upload a small PDF, and confirm
/api/upload-localreturns avercel-storage.comURL without errors.
pnpm db:pushpnpm run devOpen http://localhost:3000.
Runs db + migrate + app via Compose:
docker compose --env-file .env --profile dev upDetached mode:
docker compose --env-file .env --profile dev up -dUse this when your database is managed externally.
docker build -t pdr-ai-app .
docker run --rm -p 3000:3000 \
-e DATABASE_URL="$DATABASE_URL" \
-e CLERK_SECRET_KEY="$CLERK_SECRET_KEY" \
-e NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="$NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY" \
-e OPENAI_API_KEY="$OPENAI_API_KEY" \
pdr-ai-appdocker compose --env-file .env up -d db
pnpm devFor host DB tools, use localhost:5433.
appservice runs auth, upload, OCR integration, RAG chat, and predictive analysis.dbservice provides pgvector-backed storage/retrieval for embeddings.migrateservice ensures schema readiness before app startup.- Optional providers (Inngest, Tavily, OCR, LangSmith) are enabled by env vars in the same runtime.
- Deployment details (Docker, Vercel, VPS): docs/deployment.md
- Feature workflows and architecture: docs/feature-workflows.md
- Usage and API examples: docs/usage-examples.md
- Observability and metrics: docs/observability.md
- Manual testing (dev, post-PR): docs/manual-testing-guide.md
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 stream
- Employee: view assigned documents, use AI chat/analysis.
- Employer: upload/manage documents, categories, and employee access.
pnpm db:studio
pnpm db:push
pnpm check
pnpm lint
pnpm typecheck
pnpm build
pnpm start- Notion API-key connector: Paste your Notion Internal Integration token in settings, select pages to sync. No OAuth required. Contributions welcome.
- GitHub webhook sync: Automatically ingest new issues and PRs via repository webhooks.
- Google Drive watch: Automatic re-sync when Google Docs are updated, using Drive push notifications.
- Confirm Docker is running before DB startup.
- If build issues occur: remove
.nextand reinstall dependencies. - If OCR UI is missing: verify OCR provider keys are configured.
- If Docker image pull/build is corrupted: remove image and rebuild with
--no-cache.
- Create a feature branch.
- Make changes and run
pnpm check. - Open a pull request with test notes.
Private and proprietary.
Open an issue in this repository or contact the development team.