ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證AI-powered research platform with multi-source content ingestion, RAG-based chat, and automated content generation.
翻譯準備中
取自儲存庫 README
正在載入完整 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.檢視完整 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).