ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Study and research with your PDFs: chat with sources, then create grounded flashcards, quizzes, mind maps, audio overviews, and reports.
EducationTypeScript · JavaScriptGitHub @samintisarOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
AI-powered research platform with multi-source content ingestion, RAG-based chat, and automated content generation.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
AI-powered research platform for multi-source content ingestion, RAG-based chat, and automated content generation.
SolomindLM is an open-source AI research platform that helps you ingest content from multiple sources, chat with your documents using RAG (Retrieval-Augmented Generation), and automatically generate structured content like reports, flashcards, quizzes, and more.Read the full README ↗AI-powered research platform for multi-source content ingestion, RAG-based chat, and automated content generation.
SolomindLM is an open-source AI research platform that helps you ingest content from multiple sources, chat with your documents using RAG (Retrieval-Augmented Generation), and automatically generate structured content like reports, flashcards, quizzes, and more.
┌─────────────────────────────────────────────────────────────┐
│ Clients │
│ ┌──────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ Web App │ │ Mobile App │ │ E2E Tests │ │
│ │ (React 19) │ │ (Expo 55) │ │ (Playwright) │ │
│ └──────┬───────┘ └──────┬───────┘ └─────────────────┘ │
└─────────┼─────────────────┼──────────────────────────────────┘
│ │
└────────┬────────┘
│
┌──────────────────▼──────────────────────────────────────────┐
│ Convex Backend │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ Auth │ │ API │ │ Scheduler │ │
│ │(Google OAuth)│ │(Queries/Actions)│ │ (Background │ │
│ │(Password+OTP)│ │ │ │ Jobs) │ │
│ └──────────────┘ └──────┬───────┘ └─────────────────┘ │
│ │ │
│ ┌──────────────┐ ┌──────▼───────┐ ┌─────────────────┐ │
│ │ Storage │ │ Agents │ │ Vector DB │ │
│ │ (Documents, │ │ (Phased jobs,│ │ (Document │ │
│ │ Notebooks) │ │ Workflows) │ │ Chunks) │ │
│ └──────────────┘ └──────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
└────────┬────────┬────────┬────────┬────────┐
│ │ │ │ │
┌──────────────────▼──┐ ┌───▼───┐ ┌──▼───┐ ┌─▼────┐
│ Together AI │ │Tavily │ │Mistral│ │Stripe│
│ (LLMs, Embeddings, │ │Search │ │ OCR │ │Billing│
│ TTS, Images) │ │ │ │ │ │ │
└─────────────────────┘ └───────┘ └───────┘ └──────┘
┌──────────────────┐ ┌───────────┐ ┌──────────────────────┐
│ Supadata │ │ Voyage AI │ │ Resend │
│ (Extraction) │ │(Reranking)│ │ (Email OTP) │
└──────────────────┘ └───────────┘ └──────────────────────┘
@convex-dev/workflow durable workflow → User approval of the plan → Retrieval and writing → Result (deep research streams tokens)LangChain supplies the Together AI chat client, message types and text splitting. Earlier versions ran the
studio agents as LangGraph StateGraphs; they were replaced by phased actions to stay inside Convex's action
time limit, and @langchain/langgraph is no longer a dependency.
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 7, TypeScript 5.9, TailwindCSS 4, Streamdown + KaTeX |
| Mobile | Expo 55, React Native 0.83 (WebView shell + native auth/push) |
| Backend | Convex 1.36, TypeScript |
| AI/ML | Together AI, LangChain, @convex-dev/workflow |
| Auth | @convex-dev/auth (Google OAuth + Password/OTP) |
| Payments | Stripe |
| Database | Convex (Document + Vector search) |
| Search | Tavily, Voyage AI reranking |
| OCR | Mistral |
| Extraction | Supadata |
| Audio | Together AI TTS |
| Testing | Vitest, Playwright, convex-test |
Before you begin, ensure you have:
Bun v1.2.2 or higher
curl -fsSL https://bun.sh/install | bash
Node.js v20.0.0 or higher (for compatibility)
A Convex account (free tier available)
API keys for the services you want to use (see Environment Variables)
git clone https://github.com/samintisar/SolomindLM.git
cd SolomindLM
bun install
# Initialize Convex (creates a new project)
bun x convex dev
# This will:
# - Create a Convex project
# - Start the Convex dev server
# - Generate the Convex client code
Backend (Convex):
# Copy the example environment file (dev uses .env.local)
cp .env.example .env.local
# Edit .env.local and add your API keys
# See Environment Variables section below for details
# Pull from Convex: bun run convex:env:pull:dev
Frontend (Web):
# Copy the web environment file
cp apps/web/.env.local.example apps/web/.env.local
# Edit apps/web/.env.local with your Convex URLs
Frontend (Mobile - optional):
# Copy the mobile environment file
cp apps/mobile/.env.local.example apps/mobile/.env.local
bun run convex:env:push
Terminal 1 — Convex backend:
bun run dev:convex
Only one checkout can watch the dev deployment at a time. In other git worktrees, push changes once with bun run dev:convex --once.
Terminal 2 — Web frontend:
bun run dev:web
Terminal 3 — Mobile (optional):
bun run dev:mobile
Open the URL the dev server prints: http://localhost:5173 in the main checkout. Each git worktree gets its own port (5174-5199) so several can run at once.
Create .env.local in the project root for dev (prod uses .env). See .env.example for the template. Use bun run convex:env:pull:dev to sync from your Convex dev deployment.
| Variable | Description | How to Get |
|---|---|---|
CONVEX_DEPLOYMENT | Your Convex deployment name | Created automatically by convex dev |
CONVEX_URL | Your Convex deployment URL | Found in Convex dashboard |
CONVEX_SITE_URL | Your Convex HTTP site URL | Found in Convex dashboard |
SITE_URL | Single canonical site origin (Convex Auth builds email links from it — never comma-joined) | Your domain |
CORS_EXTRA_ORIGINS | Optional. Extra origins allowed for CORS + auth redirects, comma-separated | e.g. apex domain alongside www, staging |
| Variable | Description | How to Get |
|---|---|---|
AUTH_GOOGLE_ID | Google OAuth client ID (Convex) | Google Cloud Console |
AUTH_GOOGLE_SECRET | Google OAuth client secret (Convex) | Google Cloud Console |
JWKS | Public JWKS JSON for session tokens | Convex Auth setup |
JWT_PRIVATE_KEY | Private key matching JWKS | Convex Auth setup |
| Variable | Description | How to Get |
|---|---|---|
TOGETHER_AI_API_KEY | Together AI API key | Together AI |
TAVILY_API_KEY | Tavily search API key | Tavily |
MISTRAL_API_KEY | Mistral OCR API key | Mistral |
SUPADATA_API_KEY | Supadata extraction API key | Supadata |
VOYAGE_API_KEY | Voyage AI reranking API key (rerank-3) | Voyage AI |
SEMANTIC_SCHOLAR_API_KEY | Semantic Scholar (optional) | Semantic Scholar |
PUBMED_EMAIL | PubMed API contact (optional) | Your team email |
OPEN_ACCESS_CONTACT_EMAIL | Unpaywall / OpenAlex lookup contact (optional; defaults to [email protected]) | Your team email |
| Variable | Description | Required For |
|---|---|---|
STRIPE_SECRET_KEY | Stripe secret key | Billing/subscriptions |
STRIPE_WEBHOOK_SECRET | Stripe webhook secret | Billing webhooks |
STRIPE_PRO_MONTHLY_PRICE_ID | Stripe price ID | Pro plan (monthly) |
STRIPE_PRO_YEARLY_PRICE_ID | Stripe price ID | Pro plan (yearly) |
RESEND_API_KEY | Resend email API key | Email OTP/password reset |
AUTH_RESEND_FROM | From email address | Email sending |
LANGCHAIN_API_KEY | LangSmith API key (local only, not pushed) | Tracing when running CLI/tools locally |
LANGCHAIN_PROJECT | LangSmith project name | Tracing organization |
| Variable | Description |
|---|---|
AUDIO_VOICE_HOST_A | Together Kokoro voice ID for host A (default af_sky) |
AUDIO_VOICE_HOST_B | Together Kokoro voice ID for host B (default am_echo) |
| Variable | Where | Description |
|---|---|---|
RAG_EVALS_ENABLED | Convex dev | Set true to enable eval actions |
RAG_EVAL_SECRET | Convex dev + local .env | Shared secret (≥16 chars); see evals/rag/env.eval.example |
RAG_EVAL_CONVEX_URL | Local only | Dev deployment URL for bun run eval:rag (not pushed) |
Run bun run eval:rag:bootstrap-env once to wire dev URL + secret.
You can customize which models are used for different features. Models are hosted on Together AI using their published model identifiers:
FAST_LLM=Qwen/Qwen3.5-9B
SMART_LLM=deepseek-ai/DeepSeek-V4.1-Flash
REPORT_LLM=deepseek-ai/DeepSeek-V4.1-Flash
FLASHCARDS_LLM=deepseek-ai/DeepSeek-V4.1-Flash
QUIZ_LLM=deepseek-ai/DeepSeek-V4.1-Flash
MINDMAP_LLM=deepseek-ai/DeepSeek-V4.1-Flash
SPREADSHEET_LLM=deepseek-ai/DeepSeek-V4.1-Flash
WRITTEN_QUESTIONS_LLM=deepseek-ai/DeepSeek-V4.1-Flash
AUDIO_LLM=deepseek-ai/DeepSeek-V4.1-Flash
Create apps/web/.env.local (see apps/web/.env.local.example):
VITE_CONVEX_URL=https://your-deployment.convex.cloud
VITE_CONVEX_SITE_URL=https://your-deployment.convex.site
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_... # Optional, for billing
# Google Drive picker (optional):
# VITE_GOOGLE_CLIENT_ID=...
# VITE_GOOGLE_BROWSER_API_KEY=...
# VITE_GOOGLE_APP_ID=...
Sync from root after pull: bun run convex:env:pull:dev updates CONVEX_URL → VITE_CONVEX_URL when apps/web/.env.local exists.
Create apps/mobile/.env.local from apps/mobile/.env.local.example:
EXPO_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
EXPO_PUBLIC_WEB_URL=https://your-web-app.com
SolomindLM/
├── apps/
│ ├── web/ # React frontend
│ │ ├── src/
│ │ │ ├── features/ # Domain modules
│ │ │ │ ├── auth/ # Authentication + output language
│ │ │ │ ├── audio/ # Audio playback utilities
│ │ │ │ ├── billing/ # Subscription management
│ │ │ │ ├── chat/ # RAG chat, deep research, literature review
│ │ │ │ ├── landing/ # Marketing pages
│ │ │ │ ├── legal/ # Terms, privacy
│ │ │ │ ├── notebooks/ # Notebook management
│ │ │ │ ├── onboarding/ # First-run onboarding
│ │ │ │ ├── sources/ # Content ingestion + paper import
│ │ │ │ └── studio/ # Content generation views
│ │ │ └── shared/ # UI components, hooks, utils
│ │ └── public/ # Static assets
│ └── mobile/ # Expo WebView shell (native auth, push)
│ └── app/ # File-based routing
├── convex/ # Convex backend
│ ├── _agents/ # Agent prompts, routing, heuristics
│ │ ├── _shared/ # Shared agent utilities
│ │ ├── chat/ # Chat agent
│ │ ├── report/ # Report generation
│ │ ├── flashcard/ # Flashcard generation
│ │ ├── quiz/ # Quiz generation
│ │ ├── mindmap/ # Mind map generation
│ │ ├── spreadsheet/ # Spreadsheet generation
│ │ ├── written_questions/ # Written question generation
│ │ ├── audio_overview/ # Audio overview generation
│ │ ├── research/ # Deep research agent
│ │ └── literature_review/ # Literature review agent
│ ├── _lib/ # Utilities, errors, logging
│ ├── _model/ # Data models
│ ├── _services/ # External integrations
│ │ ├── ai/ # AI/LLM services
│ │ ├── search/ # Search services
│ │ ├── extraction/ # Content extraction
│ │ ├── processing/ # Document processing
│ │ ├── grading/ # Content grading
│ │ └── cache/ # Caching logic
│ ├── auth.ts # Auth configuration (must be at root)
│ ├── chat/ # Conversations, messages, voice
│ ├── documents/ # Ingestion, chunks, bibliography
│ ├── literatureReview/ # Literature review workflows
│ ├── notebooks/ # Notebooks, sharing, fork
│ ├── notes/ # Saved chats + manual notes
│ ├── onboarding/ # User onboarding state
│ ├── push/ # Mobile push tokens
│ ├── research/ # Deep research plans/runs
│ ├── schema.ts # Database schema
│ ├── studio/ # Generation jobs per content type
│ ├── storage/ # Vector store, chat history
│ └── userPreferences/ # Output language, etc.
├── docs/superpowers/ # Internal design specs (not user docs)
├── e2e/ # Playwright E2E tests
├── evals/ # RAG + studio eval suite (rag/, ragas/)
├── flowcharts/ # Diagrams of the original LangGraph agents (historical)
└── PROMPT_LIBRARY.md # Curated studio prompt seeds
Root level:
bun run dev # Start all dev servers
bun run dev:web # Start web dev server only
bun run dev:mobile # Start mobile dev server only
bun run build # Build all apps
bun run build:prod # Production web build
# Type checking
bun run typecheck:web
bun run typecheck:convex
bun run typecheck:mobile
# Code quality
bun run lint
bun run lint:fix
bun run format
bun run format:check
# Testing
bun run test:convex # Run Convex unit tests
bun run test:web # Run web unit tests
bun run test:e2e # Run Playwright E2E tests
# Convex env sync
bun run convex:env:pull # Pull Convex env → local files
bun run convex:env:pull:dev # Dev only → .env.local
bun run convex:env:pull:prod # Prod only → .env
bun run convex:env:push # Push .env.local → Convex dev
bun run convex:env:push:prod # Push .env → Convex prod
bun run convex:env:push:dry # Dry run env push
# E2E cleanup (Convex test data): delete a test user's `e2e-…` notebooks
bunx convex run e2e/cleanupNotebooks:deleteE2eNotebooksByEmail '{"email":"<test user>"}'
Web app:
cd apps/web
bun run dev # Start dev server
bun run build # Build for production
bun run test # Run unit tests
bun run test:coverage # Run tests with coverage
apps/web/src/features/convex/ (or convex/_agents/ for AI features)convex/ (.test.ts files)e2e/ if UI-facingConvex tests (uses vitest + convex-test, ~990+ tests):
bun run test:convex
bun run test:convex:watch # Watch mode
bun run test:integration # Integration tests only
Web tests (uses vitest):
bun run test:web
# Create .env.e2e file first
cp .env.e2e.example .env.e2e
# Edit with test credentials
# Run E2E tests
bun run test:e2e
# Run with UI
bun run test:e2e:ui
# One-shot bootstrap (dev URL + secret)
bun run eval:rag:bootstrap-env
# Full eval suite
bun run eval:rag
# Scoped runs (preferred for iteration)
bun run eval:rag -- --case=chat-basic
bun run eval:rag -- --runner=report
# Studio tools (cross-cutting)
bun run eval:studio
bun run eval:literature-review
# Dry runs (no Convex calls)
bun run eval:rag:dry
bun run eval:studio:dry
# Python RAGAS metrics (requires conda env)
bun run eval:ragas
See evals/rag/env.eval.example, evals/rag/fixtures/, and evals/ragas/README.md for setup and runner details.
apps/webVITE_CONVEX_URLVITE_CONVEX_SITE_URLVITE_STRIPE_PUBLISHABLE_KEY (optional)CONVEX_DEPLOY_KEY for production (from Convex dashboard)The vercel.json in apps/web/ handles:
convex deploy + web build (deploys backend and frontend together)bun install --frozen-lockfile)/api/* → Convex HTTP actions)build script)# Deploy Convex functions
bun x convex deploy
# Build web app
bun run build:prod
# Deploy to your hosting platform
We welcome contributions! Please see CONTRIBUTING.md for details.
git checkout -b feature/amazing-feature)bun run test:convex && bun run test:web)git commit -m 'feat: add amazing feature')git push origin feature/amazing-feature)bun run lint / bun run format)feat:, fix:, docs:, refactor:, chore:)Build fails with "Cannot find module '@convex/...'"
bun run dev:convex --once to regenerate the Convex clientVite cache issues
rm -rf apps/web/node_modules/.vite
Port already in use
dev:web / dev:mobile stop this checkout's own leftover server automatically and otherwise move to the next free port. They never kill another checkout's server. If you pinned a port (WEB_PORT, PORT, METRO_PORT) that another process holds, stop that process by its PID or drop the pin.
Convex environment variables not updating
bun run convex:env:push
Type errors in generated files
# Regenerate Convex types (one push; safe while another worktree runs the watcher)
bun run dev:convex --once
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) — see LICENSE.
What this means:
Commercial License Available:
If you want to use SolomindLM in a proprietary SaaS product without open-sourcing your code, a commercial license is available. See COMMERCIAL-LICENSE.md for details.
| Use Case | License Required |
|---|---|
| Personal/self-hosted | AGPL-3.0 (free) |
| Internal business use | AGPL-3.0 (free) |
| Academic/research | AGPL-3.0 (free) |
| Open-source SaaS | AGPL-3.0 (free) |
| Proprietary SaaS | Commercial License |
| White-label/resale | Commercial License |
Contact: [email protected] for commercial licensing inquiries (see COMMERCIAL-LICENSE.md).