Project Info
[Perplexity] Best Use of Perplexity's Sonar API ($500 per team member and trip to Perplexity office)
Tonguekeeper
Inspiration
Here's the thing that keeps me up at night: a language dies every two weeks. I've self-studied over 10 languages — from Korean to Portuguese, Mandarin to Arabic. Language learning isn't just a hobby for me, it's how I understand other people's worlds. UNESCO estimates that half of the world's ~7,000 languages will be extinct by 2100. When a language dies, it doesn't just take words with it — it takes entire ways of thinking, centuries of oral history, indigenous knowledge systems, and irreplaceable cultural identity. The data to preserve these languages exists — scattered across obscure academic papers, government archives, YouTube videos of elderly speakers, community-built dictionaries, and linguistic databases behind paywalls and anti-bot protections. But it's fragmented, hard to find, and disappearing alongside the languages themselves. I asked myself: what if AI agents could do in minutes what would take a linguist months? What if I could point an autonomous system at any of the 5,000+ endangered languages on Earth and have it discover, extract, cross-reference, and archive every fragment of linguistic data it can find — before it's too late? That's TongueKeeper.
What it does
TongueKeeper is an AI-powered platform that autonomously preserves endangered languages from across the internet. Select any of 5,352 endangered languages from the Glottolog database, hit "Preserve," and watch as AI agents go to work — discovering resources, crawling pages, extracting vocabulary and grammar, cross-referencing entries across sources, and building a searchable, interactive archive. All in real-time. Core features: Autonomous Multi-Agent Pipeline — Discovery, Extraction, and Cross-Reference agents work in concert, streaming results as they find them. A real-time activity feed lets you watch every agent action as it happens. 5,352+ Endangered Language Browser — Interactive world map and filterable table of every endangered language on Earth (Glottolog CLDF), with endangerment levels, speaker counts, geographic coordinates, and language family classification. Interactive Knowledge Graph — Force-directed visualization of linguistic relationships: related terms, semantic clusters, and embedding-based similarity edges. Explore how words connect across a language. Hybrid Search Archive — BM25 + kNN vector search with cross-encoder reranking. Search vocabulary in any language — English, the target language, or even a contact language like Korean or Spanish. AI Pronunciation Videos — HeyGen AI avatars that pronounce vocabulary entries, bringing endangered words to life. Conversational AI — Ask questions about the preserved archive in natural language. The system generates Elasticsearch queries on the fly and streams answers back. Grammar Pattern Extraction — Beyond vocabulary, the system identifies and catalogs grammar rules across 9 categories (verb conjugation, particle usage, sentence structure, honorifics, and more). Command Palette — Cmd+K unified search across languages, vocabulary, and grammar simultaneously.
How we built it
TongueKeeper is a multi-service architecture — a Next.js 16 frontend on Vercel, a standalone Express 5 + Socket.io backend on Railway, and an ecosystem of sponsor APIs that each solve a critical piece of the puzzle. The Agent Pipeline The core of TongueKeeper is a multi-agent pipeline orchestrated by a streaming worker pool. When you click "Preserve," here's what happens: 1. Discovery (Perplexity Sonar + BrightData SERP API) The Discovery Agent generates up to 24 search queries across 6 tiers — core queries, native name queries, alternate name queries, contact language queries (in 13 languages including Korean, Japanese, Mandarin, Spanish, and French), country-specific queries, and language family queries. Each query hits Perplexity Sonar for real-time web search with academic domain filtering. Simultaneously, BrightData's SERP API runs geo-targeted searches with CAPTCHA bypass to surface region-locked resources that standard search engines miss. Sources stream in as they're found — no waiting for the full discovery phase to finish. 2. Crawling (Cheerio → BrightData Web Unlocker → Browserbase/Stagehand) Every discovered URL goes through a three-tier crawling cascade, ordered by cost: Cheerio — Fast, lightweight HTML parsing for simple pages BrightData Web Unlocker — When Cheerio fails or the domain is known to be protected (.edu, .gov, JSTOR, ResearchGate, Forvo, Glosbe), BrightData's MCP integration strips anti-bot protections and returns clean markdown Browserbase + Stagehand — For JavaScript-heavy single-page apps, a cloud headless Chrome session spins up with AI observability. Stagehand classifies the page structure (paginated? searchable? scrollable?) and executes the right strategy — clicking through pages, typing into search bars, or scrolling to load content. Live debug URLs stream to the activity feed so I can watch the browser work in real-time. For PDFs, the system tries pdf-parse, falls back to pdfjs-dist, and if the text is too sparse (scanned documents), sends the PDF as Base64 to Claude's Vision API for OCR extraction. 3. Extraction (Anthropic Claude — Haiku 4.5 / Sonnet 4.5) The Extraction Agent runs a manual Claude tool_use loop — calling Claude with the crawled content, processing tool calls (save_entries for vocabulary, save_grammar_patterns for grammar), building tool results, and repeating until the agent signals "done." Each vocabulary entry captures 35+ fields: headword (native + romanized), IPA, part of speech, multi-language definitions, example sentences, conjugations, morphology, usage register, cultural notes, semantic domain, and more. Claude Haiku 4.5 handles text sources for speed and cost efficiency. Claude Sonnet 4.5 steps in for degraded scans and vision tasks. Content is chunked at 50K characters with 3 concurrent extraction workers, and a Semaphore limits total Claude API calls to prevent rate limiting. A contamination filter drops entries where language_confidence: "low" — preventing contact language words from polluting the archive. 4. Cross-Reference (Anthropic Claude — Haiku 4.5) The Cross-Reference Agent searches Elasticsearch for potential duplicates by headword, then uses Claude to intelligently merge entries — unioning definitions, combining example sentences, and merging metadata. Conservative bias: a false merge is worse than a missed duplicate. 5. Search & Retrieval (Elasticsearch + JINA AI) All data lands in Elasticsearch Serverless across 4 indexes (language_resources, grammar_patterns, languages, source_outcomes). Search uses a hybrid pipeline: $$\text{Score} = \text{RRF}(\text{BM25}(q), \text{kNN}(\text{JINA}{embed}(q))) \rightarrow \text{JINA}{rerank}(\text{top-50})$$ JINA Embeddings v3 (1024 dimensions) powers the kNN leg — crucially, these are multilingual embeddings, so searching "grandmother" in English finds "할머니" in Korean and the Jeju equivalent. JINA Reranker v2 (multilingual cross-encoder) does a second pass on the top 50 results for final ordering. This two-stage retrieval is what makes cross-lingual search actually work. 6. Post-Pipeline (HeyGen + Cloudflare + Perplexity Sonar) After the main pipeline: HeyGen generates AI avatar pronunciation videos for the top 5 vocabulary entries, with language-aware voice selection and audio lip-sync Cloudflare R2 stores pipeline artifacts (run logs, audio files) with edge-cached delivery across 150+ countries Cloudflare KV caches HeyGen videos (6-day TTL), Perplexity responses (24h TTL), and search results (30min TTL) at the edge Perplexity Sonar enriches high-priority entries with cultural context and scores source reliability Frontend The UI is built with Next.js 16 (App Router, React Server Components), React 19, and Tailwind CSS 4. The design language is warm and archival — cream backgrounds, DM Serif Display headings, burnt amber accents — evoking the feeling of preserving something precious. Framer Motion handles stagger animations, scroll-triggered counters, and the splash page logo reveal. The knowledge graph uses react-force-graph-2d (Canvas-based) with D3 utilities, and the world map uses React Leaflet with heatmap and choropleth layers. Real-time updates flow through Socket.io — the frontend connects to the WebSocket server and receives agent events as they happen, populating the activity feed and auto-refreshing search results mid-pipeline. Deployment Vercel — Frontend (Next.js 16, edge functions, API routes) Railway — WebSocket server (Express 5 + Socket.io, persistent process) Cloudflare Workers — R2 storage + KV cache + language detection API
Challenges we ran into
Anti-bot protection on linguistic resources. The most valuable endangered language data lives behind anti-bot walls — university archives, government language databases, academic publishers. A basic HTTP client gets blocked instantly. This is where BrightData's Web Unlocker was essential — without it, roughly 40% of discovered sources would have been inaccessible. For the remaining JavaScript-heavy sites, Browserbase/Stagehand provided cloud headless Chrome with AI-powered navigation. Cross-lingual search is hard. When someone searches "water" in English, they expect to find the Jeju word "물" and the Ainu word "ワッカ." Traditional keyword search fails here completely. The combination of JINA's multilingual embeddings for vector similarity and JINA's cross-encoder reranker for precision scoring was the breakthrough — it made search work across scripts and language families. Rate limiting and cost control. With 3 AI APIs (Claude, Perplexity, JINA), a cloud browser service, and a web unlocking proxy, costs compound fast. I implemented a semaphore for concurrent Claude calls, KV caching for Perplexity and HeyGen responses via Cloudflare KV, content-hash deduplication (SHA-256) to skip identical pages, and a 25-source cap per pipeline run. Scanned PDFs. Many endangered language resources are scanned academic papers from the 1970s–90s. pdf-parse returns gibberish, pdfjs-dist returns nothing. The solution: detect sparse text (< 500 chars), classify scan quality, and route degraded scans to Claude Sonnet 4.5's Vision API as Base64 images. Contamination filtering. When extracting vocabulary from a source about Jeju (a Korean language), the agent would sometimes extract Korean words instead of Jeju words. I added a language_confidence field and a contamination filter that drops low-confidence entries — better to miss a word than to pollute the archive with the wrong language.
Accomplishments we're proud of
Built a fully autonomous language preservation system — solo, in 36 hours — that can process any of 5,352+ endangered languages Achieved real-time, end-to-end pipeline execution: from zero data to a searchable, browsable, pronounceable vocabulary archive in under 10 minutes per language Integrated 8 sponsor/partner APIs into a cohesive pipeline where each service solves a distinct, critical problem Cross-lingual hybrid search that actually works — finding words across scripts and language families using JINA's multilingual embeddings and reranker An interactive world map of every endangered language on Earth, built from Glottolog CLDF data (5,352 languages with coordinates, endangerment levels, and family classification) Real-time agent activity feed with live Browserbase session thumbnails — you can literally watch the AI browse the web
What we learned
The MCP protocol is powerful. BrightData's MCP integration made web scraping feel like calling a function — no proxy configuration, no CAPTCHA solving, no IP rotation. Just scrape_as_markdown(url) and get clean content back. This is the future of tool integrations for AI agents. Multilingual embeddings change everything. Before JINA, search was language-locked. After JINA, a single query retrieves results across all languages the embedding model has seen. For endangered language work — where resources exist in multiple contact languages — this is transformative. Claude's tool_use loop is incredibly flexible. The manual loop pattern (call → process tool blocks → build results → append → repeat) let me build agents that stream results mid-extraction, save in batches, and gracefully handle failures without crashing the pipeline. Edge caching matters. Moving HeyGen video URLs and Perplexity responses to Cloudflare KV eliminated redundant API calls and made the UI feel instant on repeat visits. The 6-day TTL for pronunciation videos alone saved dozens of HeyGen API calls during development. Real-time feedback changes how you build. Watching the agent activity feed during development — seeing exactly which sources succeed, which fail, and why — made debugging 10x faster than reading logs. Give yourself more time than you think you will need. Self-evident. Plan for delays.
What's next
for TongueKeeper Community contributions — Allow native speakers to verify, correct, and add entries to the archive. The AI gets us 80% of the way; human speakers complete the last 20%. Audio preservation at scale — Automatically download and archive audio recordings of endangered language speakers before they disappear from the web. Comparative linguistics — Use the knowledge graph to surface cross-language patterns: shared roots, borrowed words, and grammatical similarities across language families. Offline-first mobile app — Many endangered language communities lack reliable internet. A downloadable, offline-capable archive would bring the data to where it's needed most. Educational material generation — Use the preserved vocabulary, grammar patterns, and pronunciation videos to automatically construct lesson plans, flashcard decks, and phrasebooks — turning raw linguistic data into tools that help communities teach and revitalize their languages. Each language contains centuries of history and culture. TongueKeeper keeps them alive.
TongueKeeper
Every language is a universe of thought. We keep them alive.
An AI-powered platform that autonomously discovers, aggregates, and cross-references endangered language content scattered across the internet — transforming fragments into a unified, searchable, living linguistic archive.
The Problem
A language dies every two weeks. By 2100, UNESCO estimates half of the world's ~7,000 languages will be extinct — each taking with it centuries of irreplaceable knowledge, oral history, and cultural identity.
The resources to preserve these languages exist, but they're scattered across obscure PDFs, YouTube videos, academic papers, dictionary websites, and government archives in dozens of disconnected sources. A linguist would need months to even find them all, let alone cross-reference and synthesize them.
TongueKeeper deploys a swarm of AI agents that autonomously crawl the web, discover these scattered fragments, extract linguistic data — vocabulary, grammar, audio, cultural context — and synthesize everything into a unified, searchable archive. In minutes, not months.
How It Works
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ ┌─────────────┐
│ Discovery │───▶│ Crawl │───▶│ Extraction │───▶│ Cross-Reference │───▶│ Archive │
│ │ │ │ │ │ │ │ │ │
│ Perplexity │ │ Cheerio │ │ Claude AI │ │ Claude AI │ │ Elastic │
│ BrightData │ │ Stagehand │ │ Vision API │ │ Merge & verify │ │ Jina embed │
│ SERP API │ │ BrightData │ │ PDF parsing │ │ Deduplication │ │ Semantic │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────────┘ └─────────────┘
-
Discovery — AI agents search across Perplexity Sonar and BrightData SERP API with 6-tier dynamic queries (core terms, native names, alternate names, contact languages, country-specific, language family), generating up to 24 targeted queries per language
-
Crawl — Each discovered source is fetched through a 3-tier cascade: specialized crawlers (YouTube, Wikipedia, ELAR, dictionaries) → BrightData Web Unlocker (CAPTCHA bypass) → Cheerio/Stagehand (headless browser). PDFs are parsed with text extraction or Claude Vision for scanned documents
-
Extraction — Claude processes each source in a manual tool-use loop, extracting structured vocabulary entries (headword, definitions, IPA, conjugations, morphology, examples) and grammar patterns (9 categories) into Elasticsearch
-
Cross-Reference — A second Claude agent searches for duplicate entries across sources, merging definitions, examples, and cross-references while calculating reliability scores based on source count
-
Archive — All data flows into Elasticsearch with Jina v3 embeddings (1024-dim) for semantic search, reranking, and knowledge graph generation
Features
- Multi-Agent Pipeline — Orchestrated Discovery, Extraction, and Cross-Reference agents with real-time event streaming via Socket.io
- Real-Time Dashboard — Split-panel UI with live agent activity feed and a 200-event ring buffer for late-joining clients
- Semantic Search — Elasticsearch multi-match queries with Jina AI embeddings and reranking for vocabulary and grammar patterns
- Knowledge Graph — Force-directed graph visualization (react-force-graph-2d) with 3 edge types: related terms, semantic clusters, and embedding similarity
- Grammar Reference — Browsable grammar patterns across 9 categories (verb conjugation, particles, sentence structure, honorifics, negation, questions, phonological rules, morphological rules)
- Language Browser — 5,352 endangered languages from Glottolog CLDF with filtering by endangerment status, macroarea, language family, and speaker count
- Interactive Maps — Leaflet maps with marker, heatmap, and choropleth modes showing global language endangerment
- Audio Pipeline — YouTube audio extraction with Whisper transcription (RunPod serverless), word-level timestamps, and pronunciation avatar generation (HeyGen)
- PDF & Scan Extraction — Text extraction via pdf-parse with automatic Vision API fallback for scanned/degraded documents
- Adaptive Web Crawling — Domain-specific crawlers with BrightData Web Unlocker for geo-blocked and CAPTCHA-protected sources
Tech Stack
| Layer | Technologies |
|---|---|
| Frontend | Next.js 16, React 19, Tailwind CSS 4, shadcn/ui, Framer Motion, socket.io-client |
| Visualization | react-force-graph-2d, Leaflet + react-leaflet, Recharts, D3.js |
| Backend | Express 5, Socket.io, Node.js (tsx runtime) |
| AI Agents | Anthropic Claude (Haiku 4.5 + Sonnet 4.5), manual tool-use loops |
| Search & Discovery | Perplexity Sonar API, BrightData SERP API + Web Unlocker |
| Embeddings | Jina AI v3 (embeddings) + v2 (reranking) |
| Data Store | Elasticsearch 9 (serverless) — vocabulary, grammar, languages, pipeline runs |
| Web Crawling | Cheerio, Browserbase + Stagehand, pdf-parse, pdfjs-dist |
| Audio/ML | Python FastAPI, RunPod (Whisper transcription), HeyGen (avatar videos) |
| Infrastructure | Vercel (frontend), Cloudflare Workers (R2 storage + KV cache) |
| Validation | TypeScript 5 (strict), Zod 4 |
Architecture
┌──────────────────────────────────────────────────────────────┐
│ Browser (:3000) │
│ Next.js 16 App Router · React 19 · Socket.io Client │
└────────────┬──────────────────────────────┬──────────────────┘
│ HTTP (API Routes) │ WebSocket
▼ ▼
┌────────────────────────┐ ┌────────────────────────────────┐
│ Next.js API Routes │ │ Express + Socket.io (:3001) │
│ │ │ │
│ /api/search │ │ Pipeline Orchestrator │
│ /api/grammar │ │ Discovery Agent │
│ /api/languages │ │ Extraction Agent │
│ /api/graph │ │ Cross-Reference Agent │
│ /api/preserve ────────┼───▶│ Enrichment Agent │
│ │ │ Event Emitter (ring buffer) │
└────────┬───────────────┘ └──────┬─────────────────────────┘
│ │
▼ ▼
┌────────────────────┐ ┌────────────────────────────────────┐
│ Elasticsearch 9 │ │ Python FastAPI (:3003) │
│ (Serverless) │ │ │
│ │ │ YouTube audio extraction │
│ vocabulary │ │ Whisper transcription (RunPod) │
│ grammar_patterns │ │ Word-level timestamps │
│ languages (5,352) │ └────────────────────────────────────┘
│ language_resources│
│ pipeline_runs │
└────────────────────┘
Getting Started
Prerequisites
- Node.js 18+
- Python 3.10+ (for ML service)
- npm
Install
git clone https://github.com/lourdrickvalsote/tonguekeeper.git
cd tonguekeeper
npm install --legacy-peer-deps
Environment Variables
Create a .env.local file in the project root:
| Variable | Required | Description |
|---|---|---|
ELASTIC_URL | Yes | Elasticsearch cluster URL |
ELASTIC_API_KEY | Yes | Elasticsearch API key |
ANTHROPIC_API_KEY | Yes | Claude API key (agents) |
PERPLEXITY_API_KEY | Yes | Perplexity Sonar API key (discovery search) |
JINA_API_KEY | Yes | Jina AI key (embeddings + reranking) |
NEXT_PUBLIC_WS_URL | No | WebSocket server URL (default: http://localhost:3001) |
BROWSERBASE_API_KEY | No | Browserbase API key (headless browsing) |
BROWSERBASE_PROJECT_ID | No | Browserbase project ID |
BRIGHTDATA_API_TOKEN | No | BrightData API token (SERP + Web Unlocker) |
CLOUDFLARE_WORKER_URL | No | Cloudflare Worker URL (R2 storage + KV cache) |
HEYGEN_API_KEY | No | HeyGen API key (pronunciation avatar videos) |
ML_SERVICE_URL | No | Python ML service URL (default: http://localhost:3003) |
RUNPOD_API_KEY | No | RunPod API key (Whisper GPU transcription) |
RUNPOD_ENDPOINT_ID | No | RunPod endpoint ID |
Data Setup
Ingest the Glottolog CLDF dataset (5,352 endangered languages) and generate map data:
npm run setup:data
Run
# Start all services (Next.js + WebSocket server + ML service)
npm run dev:all
# Or start individually:
npm run dev # Next.js frontend on :3000
npm run server # WebSocket server on :3001
npm run ml # Python ML service on :3003
Open http://localhost:3000 to see the dashboard.
Scripts
| Script | Description |
|---|---|
npm run dev | Start Next.js dev server (port 3000) |
npm run server | Start WebSocket server (port 3001) |
npm run ml | Start Python ML service (port 3003) |
npm run dev:all | Start all 3 services concurrently |
npm run build | Build Next.js for production |
npm run setup:data | Full data setup: ingest Glottolog + generate maps + prescan |
npm run ingest:glottolog | Import Glottolog CLDF into Elasticsearch |
npm run generate:map | Generate map visualization data |
npm run prescan | Pre-compute language statistics |
npm run backup | Backup Elasticsearch indices |
npm run restore | Restore Elasticsearch from backup |
npm run reindex | Reindex with custom analyzers |
npm run lint | Run ESLint |
Project Structure
tonguekeeper/
├── app/ # Next.js App Router
│ ├── (main)/dashboard/ # Preservation dashboard
│ ├── (main)/languages/ # Language browser + detail pages
│ ├── (splash)/ # Landing page
│ └── api/ # 22 API routes
├── components/ # React components
│ ├── agent-feed/ # Real-time agent event stream
│ ├── search/ # Archive search interface
│ ├── graph/ # Knowledge graph (force-directed)
│ ├── grammar/ # Grammar pattern reference
│ ├── languages/ # Language browser, map, filters
│ ├── results/ # Vocabulary & grammar cards
│ ├── dashboard/ # Stats bar, welcome view
│ └── ui/ # shadcn/ui primitives
├── lib/ # Core business logic
│ ├── agents/ # AI agent implementations
│ ├── crawlers/ # Site-specific crawlers
│ ├── apis/ # External API clients
│ ├── elastic.ts # Elasticsearch client
│ ├── types.ts # Shared TypeScript types
│ └── graph.ts # Knowledge graph generation
├── server/ # Express + Socket.io server
│ ├── ws-server.ts # Server entry point
│ ├── orchestrator.ts # Pipeline coordinator
│ ├── agents/ # Server-side agent wrappers
│ └── utils/ # Event emitter, semaphore, schemas
├── ml/ # Python FastAPI (audio processing)
├── scripts/ # CLI scripts (setup, backup, ingest)
├── infra/ # Cloudflare Workers (R2 + KV)
└── docs/ # Project documentation
Built With
| Sponsor | Integration |
|---|---|
| Anthropic | Claude Haiku 4.5 + Sonnet 4.5 power the extraction, cross-reference, and enrichment agents |
| BrightData | SERP API for geo-targeted search from inside countries; Web Unlocker for CAPTCHA-protected archives |
| Browserbase | Stagehand headless browser for JavaScript-heavy dictionary sites |
| Jina AI | v3 embeddings (1024-dim) for semantic search; v2 reranker for result quality |
| Elastic | Serverless Elasticsearch for vocabulary, grammar, languages, and pipeline data |
| HeyGen | Avatar video generation for pronunciation demonstrations |
| Cloudflare | R2 object storage for pipeline artifacts; KV for query caching |
| RunPod | Serverless GPU for Whisper audio transcription |
Deployment
The app runs across three services:
| Service | Platform | Purpose |
|---|---|---|
| Next.js frontend + API routes | Vercel | Dashboard, search, language browser |
| WS server + orchestrator + agents | Railway | Pipeline execution, real-time events |
| ML service (optional) | Railway | YouTube audio transcription |
See docs/DEPLOYMENT.md for the full deployment guide.
License
MIT
Built for TreeHacks 2026 at Stanford University.
Analysis
View
Metric
- 4
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- ExpressIn code
- FastAPIIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
- Node.jsClaimed
- VercelClaimed
9 of 11 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.3 MB
Source files
186
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
lourdrickvalsote/tonguekeeper
211 files · 2.1 MB · @ 069a7c9
Structure
Interface
77 files · 36%Screens, components and styles rendered to the user.
+12 moreAPI & routing
44 files · 21%Request entry points: routes, handlers and controllers.
Application logic
47 files · 22%Domain rules, services and shared utilities.
+4 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript94%
- Python5%
- Markdown1%
- CSS0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 51- @anthropic-ai/sdk
- @browserbasehq/stagehand
- @elastic/elasticsearch
- @modelcontextprotocol/sdk
- @react-leaflet/core
- @tanstack/react-table
- @tanstack/react-virtual
- @types/d3
- cheerio
- class-variance-authority
- clsx
- cmdk
- csv-parse
- d3
- dotenv
- express
- express-rate-limit
- framer-motion
- +33 more
ml/requirements.txt
pypi · 9- anthropic
- fastapi
- faster-whisper
- pydub
- python-dotenv
- requests
- runpod
- uvicorn[standard]
- yt-dlp
ml/fetchai/requirements.txt
pypi · 4- python-dotenv
- requests
- uagents
- uagents-core
infra/package.json
npm · 33 development-only dependencies.
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.