TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Four cooperating AI agents, orchestrated with LangGraph, research any question across the web, news, arXiv and Wikipedia and deliver a cited report.
ProductivityTypeScript · CSSGitHub @skachruOnlineOwner 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
Multi agent AI deep researcher
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Lumen turns a hard question into a cited research report in a few minutes. Four cooperating agents, orchestrated as a
LangGraph state machine and powered by any LLM on OpenRouter, break the question down, search the web, news, arXiv and
Wikipedia in parallel, rank evidence with BM25, cross-check sources for contradictions and credibility, loop back
for targeted follow-up searches when they find important gaps, form calibrated hypotheses, and write a structured
report with inline citations. Every step streams live to a Linear-style workspace, so you can watch the agents work.Read the full README ↗Lumen turns a hard question into a cited research report in a few minutes. Four cooperating agents, orchestrated as a LangGraph state machine and powered by any LLM on OpenRouter, break the question down, search the web, news, arXiv and Wikipedia in parallel, rank evidence with BM25, cross-check sources for contradictions and credibility, loop back for targeted follow-up searches when they find important gaps, form calibrated hypotheses, and write a structured report with inline citations. Every step streams live to a Linear-style workspace, so you can watch the agents work.
Live demo: add your Vercel URL here · Demo video: add link here
flowchart TD
START([Query]) --> R[Contextual Retriever]
R -->|sources + BM25 evidence| A[Critical Analysis]
A -->|important gaps and first pass| R
A -->|otherwise| I[Insight Generation]
I --> B[Report Builder]
B --> END([Cited report])
subgraph Tools["Retriever tools (run in parallel)"]
W[OpenRouter web search]
N[OpenRouter web search — news]
X[arXiv API]
K[Wikipedia API]
end
R -.-> Tools
lib/graph/graph.ts builds a StateGraph over a typed Annotation.Root state (lib/graph/state.ts).
Reducers append retrieval results across passes, replace analysis outputs, and sum token usage.lib/graph/routing.ts — a pure conditional edge after Critical Analysis. It routes back to the
Retriever only when there are high-importance gaps and the follow-up pass has not been used (max two retrieval passes).lib/events/types.ts) through LangGraph's custom stream
(streamMode: "custom"); app/api/research/route.ts forwards them to the browser as Server-Sent Events.withStructuredOutput(schema, { method: "jsonSchema" }) (structured outputs via OpenRouter response_format, with provider.require_parameters so requests only go to providers that support it).| Agent | File | What it does |
|---|---|---|
| Contextual Retriever | lib/agents/retriever.ts | Splits the query into 3–5 sub-questions; runs OpenRouter web search (the openrouter:web_search server tool), a news-focused search, arXiv and Wikipedia in parallel; dedupes, caps sources (~12–15) with a balanced mix, chunks text and ranks chunks per sub-question with LangChain's BM25Retriever. On the follow-up pass it turns gaps into targeted questions. |
| Critical Analysis | lib/agents/analyst.ts | Summarises evidence per sub-question, labels claims Corroborated / Single-source / Disputed, flags contradictions (both claims and source ids), scores credibility (type, domain, recency, model judgement, corroboration) and lists gaps by importance. |
| Insight Generation | lib/agents/insight.ts | Reasons step by step to produce 3–5 hypotheses with High/Medium/Low confidence, the reasoning chain and evidence ids. |
| Report Builder | lib/agents/reporter.ts | Writes Summary, Key Findings, Contradictions & Open Questions, Insights & Hypotheses with [n] citations; Methodology (including failed sources) and References are generated deterministically. |
git clone https://github.com/skachru/AI-Deep-Researcher.git && cd AI-Deep-Researcher
npm install
cp .env.example .env.local # then add your OPENROUTER_API_KEY
npm run dev # http://localhost:3000
Other scripts:
| Command | Purpose |
|---|---|
npm run research -- "question" [--standard] | Run the graph from the terminal and print every event |
npm run record [-- "question"] | Record full runs to public/demo/<slug>.json (all three examples by default) |
npm test | Vitest: routing logic, tool parsers (mocked network), reducer, report helpers, end-to-end graph with mocked LLM |
npm run lint · npm run typecheck · npm run format | Code quality |
| Variable | Required | Description |
|---|---|---|
OPENROUTER_API_KEY | Yes | The only key needed (openrouter.ai/keys). arXiv and Wikipedia are free; web search runs through OpenRouter's web search tool (billed per result by OpenRouter). |
OPENROUTER_MODEL | No | Any OpenRouter model id with structured outputs + tools. Defaults to qwen/qwen3.8-flash (low cost). /setup shows its price and capabilities. |
NEXT_PUBLIC_DEMO_MODE | No | true makes the example chips replay recorded runs instantly. |
DATABASE_URL | For history | Postgres (Neon). Enables per-user history, the admin dashboard and rate limits. Tables are created automatically on first use. |
AUTH_SECRET | For sign-in | 32+ random characters for signing sessions (openssl rand -base64 48). |
GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET | For Google sign-in | OAuth client ("Web application") from Google Cloud. Redirect URI: https://<domain>/api/auth/google/callback. |
OPENROUTER_REASONING | No | auto (default) switches "thinking" off on reasoning models (or keeps it low where mandatory) so runs stay inside the time limit. Set low/medium/high for more depth on a fast model. |
APP_URL | No | Pins the public URL used for the Google redirect (otherwise taken from the request). |
SETUP_LOCKED | No | true makes /setup admin-only permanently (recommended once set up, and needed without a database). |
ADMIN_EMAILS | No | Comma-separated admin emails. Defaults to [email protected]. |
SMTP_HOST SMTP_PORT SMTP_USER SMTP_PASS EMAIL_FROM | For email | Any SMTP provider. Gmail: smtp.gmail.com, port 465, your address and a Google app password. |
Variables are validated with Zod on first use (lib/env.ts), so a missing key produces a clear error instead of a crash.
lib/graph/run.ts streams a short preliminary answer token by token alongside the
LangGraph run (not as a node, so it can never delay the agents). When the report is ready it is replaced by the
source-verified ## Summary./history works without sign-up. Signing in with
Google (OAuth code flow with PKCE; ID token verified against Google's keys) or an emailed one-time link attaches
that history to the account and syncs it across devices./api/og, or the site icon).POST /api/export; the PDF is
rendered server-side with pdfmake). The HTML (lib/report/interactive.ts) is a self-contained page with key takeaways,
an evidence ring, claim filters, citation previews that jump to the source, source filters, dark mode and print; all
report text is sanitised because it derives from web content. Print prints that designed report, not the app.POST /api/email, max 5 recipients, rate-limited), the system share sheet
where the browser can share files, and Email app, which saves an unsent .eml draft with both files for Outlook,
Apple Mail or Thunderbird. WhatsApp, Telegram, Gmail and Outlook web compose links only carry text, so for those the
files are downloaded to attach by hand. Links shared by earlier versions (/share/<id>) still open./admin (only for ADMIN_EMAILS) shows searches, success rate, users, average run time, tokens, emails sent,
searches per day, top questions and recent searches.Each feature switches on when its environment variables are set; without them the app still runs research.
Safety and cost controls. Research, email, export, sign-in and preview-image requests are rate-limited per visitor,
per IP and (for paid operations) site-wide. Limits use an atomic Postgres counter (rate_limits table) and fall back to
an in-memory counter (per server instance) when no database is configured or it is unreachable — they are never switched off. Rules are checked narrowest first and a denied request gives back what it was charged, so one visitor can't use up the site-wide allowance. Report claims
are re-labelled from the validated evidence ("Corroborated" needs two different sites), citations to non-existent
sources are removed, post-sign-in redirects only allow same-site paths, and the preview-image fetcher pins every
connection to an address it has verified is public (no private-network access, including via DNS rebinding).
Setup check: open /setup on your deployment (open until an admin signs in or SETUP_LOCKED=true; if that can't be verified, access is denied). Its speed test times one structured call and one web search with your model, so you can tell at once whether a model is fast enough. It tests the OpenRouter key (and remaining credit), the chosen model's capabilities, the Google OAuth client ID/secret and
redirect URI (against Google itself), the database and SMTP login, and says exactly what to fix. No secrets are shown;
once someone has signed in, the page is admin-only.
npm run record with your API key set. It runs the three example queries and saves the event streams to
public/demo/. Commit those files.NEXT_PUBLIC_DEMO_MODE=true to make the example chips replay recordings with realistic, compressed timing.OPENROUTER_API_KEY (and optionally NEXT_PUBLIC_DEMO_MODE=true) under Settings → Environment Variables.
For history and admin, add a database under Storage → Create Database → Neon (it sets DATABASE_URL), then add
AUTH_SECRET, ADMIN_EMAILS and the SMTP_* variables.maxDuration = 300 seconds, the maximum on the Hobby plan with Fluid compute
(enabled by default). On Pro you can raise it to 800 in app/api/research/route.ts.Quick depth is designed to finish well inside 300 seconds: tools run in parallel with per-call timeouts and retries, sources are capped, every agent has a token cap and a low effort setting, and the server aborts cleanly 15 seconds before the platform limit.
Add screenshots of the home page, live workspace and report here.
RUNS_PER_HOUR RUNS_PER_IP_HOUR RUNS_PER_DAY | No | Research limits: per visitor per hour (10), per IP per hour (20), whole site per day (300). Admins are exempt. |
EMAILS_PER_DAY EMAILS_PER_IP_DAY EMAILS_GLOBAL_DAY | No | Email limits: per visitor (10), per IP (20), whole site (200) per day. |