AI deep-research agent that turns any question into a cited report: plans searches, reads real sources, verifies evidence. Self-hosted, multi-provider, Docker-ready.
See the code[English | 中文]
Deep Research Web UI turns a research question into a cited report: it plans searches, browses the web, verifies findings against real source pages, and lets you inspect and follow up on every citation — all from your browser, or self-hosted with your own API keys.
Features:
Currently available providers:
Please give a 🌟 Star if you like this project!
Sponsors
MangoProxy provides Residential, ISP, Mobile, and Datacenter proxies in 200+ locations for web scraping, automation, SEO, and multi-account management. Promo code: GITHUBISP - 8% off Static ISP proxies.
ApiSmart.ai provides unified access to leading AI models through a single API. Use one API key to connect with LLM, image, and video models through an OpenAI-compatible interface, without managing multiple providers separately. Switch models easily, simplify billing, and improve reliability with intelligent routing and automatic failover. Build and scale AI applications faster with one streamlined API platform.
Helodata provides global proxy infrastructure covering 195+ countries and regions, with 80M+ ethically sourced residential IPs. We offer Residential, ISP, Unlimited Residential, Mobile, and Datacenter proxies for reliable data access across AI, web scraping, and automation workflows. Sign up using the promo code DRWEB to enjoy an exclusive 10% discount!
[1]-style citation in the report, or click Inspect evidence and follow up.This works in both Client Mode and Server Mode. Older history entries still load; findings without a saved excerpt are labeled accordingly. History is stored in your browser — export research you want to keep.
Live demo: https://deep-research.ataw.top
pnpm generate.Deploy with environment variables - users don't need to configure API keys. Use this mode when you can run the Nuxt server:
Using Docker with environment variables:
docker run -p 3000:3000 \
-e NUXT_PUBLIC_SERVER_MODE=true \
-e NUXT_AI_API_KEY=your-ai-api-key \
-e NUXT_WEB_SEARCH_API_KEY=your-search-api-key \
-e NUXT_PUBLIC_AI_PROVIDER=openai-compatible \
-e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini \
-e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=tavily \
anotia/deep-research-web:latest
Using Docker with .env file:
# Copy .env.example and update it with your configuration
cp .env.example .env
docker run -p 3000:3000 --env-file .env anotia/deep-research-web:latest
Users configure their own API keys in the browser. Use this mode for static deployments:
One-click deploy with EdgeOne Pages:
Use pre-built Docker image:
docker run -p 3000:3000 --name deep-research-web -d anotia/deep-research-web:latest
Use self-built Docker image:
git clone https://github.com/AnotiaWang/deep-research-web-ui
cd deep-research-web-ui
docker build -t deep-research-web .
docker run -p 3000:3000 --name deep-research-web -d deep-research-web
| Variable | Description | Default |
|---|---|---|
NUXT_PUBLIC_SERVER_MODE | Enable server mode | false |
NUXT_ACCESS_PASSWORD | Optional password required to call the /api routes | - |
NUXT_AI_API_KEY | AI provider API key | - |
NUXT_AI_API_BASE | AI provider base URL | - |
NUXT_WEB_SEARCH_API_KEY | Web search API key | - |
NUXT_WEB_SEARCH_API_BASE | Web search base URL | - |
NUXT_PROXY_URL | Outbound proxy URL (http/https/socks5/socks5h) | - |
NUXT_NO_PROXY | Hosts bypassing the proxy | localhost,127.0.0.1,::1 |
| Variable | Description | Default |
|---|---|---|
NUXT_PUBLIC_AI_PROVIDER | AI provider type | openai-compatible |
NUXT_PUBLIC_AI_MODEL | AI model name | gpt-4o-mini |
NUXT_PUBLIC_AI_CONTEXT_SIZE | Context size | 256000 |
NUXT_PUBLIC_AI_MAX_OUTPUT_TOKENS | Max output tokens per call, including reasoning. Unset lets the provider decide | - |
NUXT_PUBLIC_WEB_SEARCH_PROVIDER | Search provider | tavily |
NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT | Max concurrency | 2 |
NUXT_PUBLIC_WEB_SEARCH_SEARCH_LANGUAGE | Search language | en |
NUXT_PUBLIC_TAVILY_ADVANCED_SEARCH | Use Tavily advanced search | false |
NUXT_PUBLIC_TAVILY_SEARCH_TOPIC | Tavily search topic | general |
NUXT_PUBLIC_GOOGLE_PSE_ID | Google PSE ID | - |
| Type | Supported values |
|---|---|
| AI provider | openai-compatible, siliconflow, 302-ai, openrouter, requesty, deepseek, ollama, litellm |
| Web search provider | tavily, firecrawl, crw, google-pse, youcom, serply, parallel (Server Mode only) |
Notes:
NUXT_ACCESS_PASSWORD is set, visitors must enter it before running research. Strongly recommended for publicly reachable server-mode deployments, since the server's API keys are otherwise usable by anyone.NUXT_WEB_SEARCH_API_KEY supports comma-separated keys for Tavily, Google PSE and Serply, for example key1,key2,key3.NUXT_WEB_SEARCH_API_KEY and NUXT_PUBLIC_GOOGLE_PSE_ID.NUXT_WEB_SEARCH_API_BASE.crw) is a Firecrawl-compatible web scraper (single binary; self-host or cloud). It defaults to the cloud base https://fastcrw.com/api and reads the key from NUXT_WEB_SEARCH_API_KEY (document as CRW_API_KEY); self-hosted deployments can set NUXT_WEB_SEARCH_API_BASE.youcom) reads its key from NUXT_WEB_SEARCH_API_KEY (optional, comma-separated keys supported for rotation). Without a key it uses the keyless endpoint with a limited daily quota; get a key at https://you.com/platform/api-keys.serply) returns Google web and news results through the Serply API and reads its key from NUXT_WEB_SEARCH_API_KEY (comma-separated keys supported for rotation). Time range, news intent, language and domain filters are applied natively; explicit publication-date windows are not.http://localhost:11434/v1 as the default API base. When running the app inside Docker, localhost refers to the container itself, so set NUXT_AI_API_BASE to a reachable host or Docker network address if Ollama runs outside the container.http://localhost:4000/v1 as the default API base. Its API key is optional when the proxy does not require authentication; set NUXT_AI_API_BASE when the proxy is not reachable at the default local address.https://router.requesty.ai/v1 as the default API base and expects model IDs in provider/model format, such as openai/gpt-4o.Set these variables in your server deployment:
NUXT_PUBLIC_SERVER_MODE=true
NUXT_PUBLIC_WEB_SEARCH_PROVIDER=parallel
Keep your AI provider configured as usual. Parallel search needs no Parallel account or API key and does not use NUXT_WEB_SEARCH_API_KEY or NUXT_WEB_SEARCH_API_BASE. Tavily remains the default when no search provider is selected.
This provider uses the free, rate-limited Parallel Search MCP at https://search.parallel.ai/mcp. Searches send queries and objectives to Parallel; on-demand page reading sends source URLs. Related calls share a random research session ID. Requests include deep-research-web-ui/<app version> as their User-Agent so Parallel can measure aggregate project usage. See Parallel's Customer Terms and Privacy Policy.
Public Server Mode deployments share one outbound IP, so users share the anonymous free-tier rate limits. Reduce concurrency if requests are rate-limited.
Search excerpts retain their URLs, titles and publication dates. The app can also request full source pages when excerpts are insufficient. News, time, domain and language filters are unsupported and appear through the app's existing limitation notices. The result count is capped locally. Service errors are surfaced without switching providers.
Parallel is available only in Server Mode, including follow-ups. Static deployments and the Client Mode provider picker do not support it because browsers cannot reliably send the project User-Agent. Server requests honor the outbound proxy settings below.
Set NUXT_PROXY_URL to route server-side requests through a proxy:
NUXT_PROXY_URL=socks5h://user:[email protected]:7777
NUXT_NO_PROXY=localhost,127.0.0.1,::1
http, https, socks5, socks5h, socks.http(s) proxies cover everything: AI providers, Google PSE, you.com, Serply, Parallel, and the Tavily / Firecrawl / CRW SDKs.socks* proxies cover AI providers, Google PSE, you.com, Serply and Parallel; the Tavily / Firecrawl / CRW SDKs (axios-based) cannot speak SOCKS and will connect directly. Use the http:// endpoint of the same proxy (same credentials on most providers) for full coverage.NUXT_NO_PROXY accepts *, exact hosts and parent domains (example.com also matches api.example.com). Local AI gateways (Ollama, LiteLLM) and self-hosted scrapers stay direct via the default list.HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars are honored as fallback when NUXT_PROXY_URL is unset.% as %25, @ as %40, : as %3A).NUXT_PROXY_URL fails server startup (fail-fast) instead of silently going direct.If your server needs geo-targeted or rotating egress IPs, run the deployment behind a standard HTTP/SOCKS5 proxy. Example with Helodata:
# Full coverage: AI + Google PSE + you.com + Tavily/Firecrawl SDKs
NUXT_PROXY_URL="http://YOUR_HELODATA_USERNAME:[email protected]:7777"
# Or SOCKS5: AI + Google PSE + you.com
# (Tavily/Firecrawl SDKs can't speak SOCKS and will connect directly)
NUXT_PROXY_URL="socks5h://YOUR_HELODATA_USERNAME:[email protected]:7777"
docker run -p 3000:3000 \
-e NUXT_PUBLIC_SERVER_MODE=true \
-e NUXT_AI_API_KEY=your-ai-api-key \
-e NUXT_WEB_SEARCH_API_KEY=your-search-api-key \
-e NUXT_PROXY_URL="$NUXT_PROXY_URL" \
anotia/deep-research-web-ui:latest
Get credentials from your Helodata dashboard. See Helodata docs for region / city / sticky-session username format. For proxy behavior details, see Outbound proxy (Server Mode only).
Make sure to install dependencies:
pnpm install
Start the development server on http://localhost:3000:
pnpm dev
Build the application for production:
If you want to deploy a SSR application:
pnpm build
If you want to deploy a static, SSG application:
pnpm generate
Locally preview production build:
pnpm preview
Check out the deployment documentation for more information.
MIT
The project is also hosted on AtomGit, which is more accessible from mainland China. Thanks to AtomGit for the hosting.
1,283 followers · starred Feb 2025
233 followers · starred Sep 2026
16 followers · starred Mar 2025
179 followers · starred Feb 2025
AI deep-research agent that turns any question into a cited report: plans searches, reads real sources, verifies evidence. Self-hosted, multi-provider, Docker-ready.
See the code[English | 中文]
Deep Research Web UI turns a research question into a cited report: it plans searches, browses the web, verifies findings against real source pages, and lets you inspect and follow up on every citation — all from your browser, or self-hosted with your own API keys.
Features:
Currently available providers:
Please give a 🌟 Star if you like this project!
Sponsors
MangoProxy provides Residential, ISP, Mobile, and Datacenter proxies in 200+ locations for web scraping, automation, SEO, and multi-account management. Promo code: GITHUBISP - 8% off Static ISP proxies.
ApiSmart.ai provides unified access to leading AI models through a single API. Use one API key to connect with LLM, image, and video models through an OpenAI-compatible interface, without managing multiple providers separately. Switch models easily, simplify billing, and improve reliability with intelligent routing and automatic failover. Build and scale AI applications faster with one streamlined API platform.
Helodata provides global proxy infrastructure covering 195+ countries and regions, with 80M+ ethically sourced residential IPs. We offer Residential, ISP, Unlimited Residential, Mobile, and Datacenter proxies for reliable data access across AI, web scraping, and automation workflows. Sign up using the promo code DRWEB to enjoy an exclusive 10% discount!
[1]-style citation in the report, or click Inspect evidence and follow up.This works in both Client Mode and Server Mode. Older history entries still load; findings without a saved excerpt are labeled accordingly. History is stored in your browser — export research you want to keep.
Live demo: https://deep-research.ataw.top
pnpm generate.Deploy with environment variables - users don't need to configure API keys. Use this mode when you can run the Nuxt server:
Using Docker with environment variables:
docker run -p 3000:3000 \
-e NUXT_PUBLIC_SERVER_MODE=true \
-e NUXT_AI_API_KEY=your-ai-api-key \
-e NUXT_WEB_SEARCH_API_KEY=your-search-api-key \
-e NUXT_PUBLIC_AI_PROVIDER=openai-compatible \
-e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini \
-e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=tavily \
anotia/deep-research-web:latest
Using Docker with .env file:
# Copy .env.example and update it with your configuration
cp .env.example .env
docker run -p 3000:3000 --env-file .env anotia/deep-research-web:latest
Users configure their own API keys in the browser. Use this mode for static deployments:
One-click deploy with EdgeOne Pages:
Use pre-built Docker image:
docker run -p 3000:3000 --name deep-research-web -d anotia/deep-research-web:latest
Use self-built Docker image:
git clone https://github.com/AnotiaWang/deep-research-web-ui
cd deep-research-web-ui
docker build -t deep-research-web .
docker run -p 3000:3000 --name deep-research-web -d deep-research-web
| Variable | Description | Default |
|---|---|---|
NUXT_PUBLIC_SERVER_MODE | Enable server mode | false |
NUXT_ACCESS_PASSWORD | Optional password required to call the /api routes | - |
NUXT_AI_API_KEY | AI provider API key | - |
NUXT_AI_API_BASE | AI provider base URL | - |
NUXT_WEB_SEARCH_API_KEY | Web search API key | - |
NUXT_WEB_SEARCH_API_BASE | Web search base URL | - |
NUXT_PROXY_URL | Outbound proxy URL (http/https/socks5/socks5h) | - |
NUXT_NO_PROXY | Hosts bypassing the proxy | localhost,127.0.0.1,::1 |
| Variable | Description | Default |
|---|---|---|
NUXT_PUBLIC_AI_PROVIDER | AI provider type | openai-compatible |
NUXT_PUBLIC_AI_MODEL | AI model name | gpt-4o-mini |
NUXT_PUBLIC_AI_CONTEXT_SIZE | Context size | 256000 |
NUXT_PUBLIC_AI_MAX_OUTPUT_TOKENS | Max output tokens per call, including reasoning. Unset lets the provider decide | - |
NUXT_PUBLIC_WEB_SEARCH_PROVIDER | Search provider | tavily |
NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT | Max concurrency | 2 |
NUXT_PUBLIC_WEB_SEARCH_SEARCH_LANGUAGE | Search language | en |
NUXT_PUBLIC_TAVILY_ADVANCED_SEARCH | Use Tavily advanced search | false |
NUXT_PUBLIC_TAVILY_SEARCH_TOPIC | Tavily search topic | general |
NUXT_PUBLIC_GOOGLE_PSE_ID | Google PSE ID | - |
| Type | Supported values |
|---|---|
| AI provider | openai-compatible, siliconflow, 302-ai, openrouter, requesty, deepseek, ollama, litellm |
| Web search provider | tavily, firecrawl, crw, google-pse, youcom, serply, parallel (Server Mode only) |
Notes:
NUXT_ACCESS_PASSWORD is set, visitors must enter it before running research. Strongly recommended for publicly reachable server-mode deployments, since the server's API keys are otherwise usable by anyone.NUXT_WEB_SEARCH_API_KEY supports comma-separated keys for Tavily, Google PSE and Serply, for example key1,key2,key3.NUXT_WEB_SEARCH_API_KEY and NUXT_PUBLIC_GOOGLE_PSE_ID.NUXT_WEB_SEARCH_API_BASE.crw) is a Firecrawl-compatible web scraper (single binary; self-host or cloud). It defaults to the cloud base https://fastcrw.com/api and reads the key from NUXT_WEB_SEARCH_API_KEY (document as CRW_API_KEY); self-hosted deployments can set NUXT_WEB_SEARCH_API_BASE.youcom) reads its key from NUXT_WEB_SEARCH_API_KEY (optional, comma-separated keys supported for rotation). Without a key it uses the keyless endpoint with a limited daily quota; get a key at https://you.com/platform/api-keys.serply) returns Google web and news results through the Serply API and reads its key from NUXT_WEB_SEARCH_API_KEY (comma-separated keys supported for rotation). Time range, news intent, language and domain filters are applied natively; explicit publication-date windows are not.http://localhost:11434/v1 as the default API base. When running the app inside Docker, localhost refers to the container itself, so set NUXT_AI_API_BASE to a reachable host or Docker network address if Ollama runs outside the container.http://localhost:4000/v1 as the default API base. Its API key is optional when the proxy does not require authentication; set NUXT_AI_API_BASE when the proxy is not reachable at the default local address.https://router.requesty.ai/v1 as the default API base and expects model IDs in provider/model format, such as openai/gpt-4o.Set these variables in your server deployment:
NUXT_PUBLIC_SERVER_MODE=true
NUXT_PUBLIC_WEB_SEARCH_PROVIDER=parallel
Keep your AI provider configured as usual. Parallel search needs no Parallel account or API key and does not use NUXT_WEB_SEARCH_API_KEY or NUXT_WEB_SEARCH_API_BASE. Tavily remains the default when no search provider is selected.
This provider uses the free, rate-limited Parallel Search MCP at https://search.parallel.ai/mcp. Searches send queries and objectives to Parallel; on-demand page reading sends source URLs. Related calls share a random research session ID. Requests include deep-research-web-ui/<app version> as their User-Agent so Parallel can measure aggregate project usage. See Parallel's Customer Terms and Privacy Policy.
Public Server Mode deployments share one outbound IP, so users share the anonymous free-tier rate limits. Reduce concurrency if requests are rate-limited.
Search excerpts retain their URLs, titles and publication dates. The app can also request full source pages when excerpts are insufficient. News, time, domain and language filters are unsupported and appear through the app's existing limitation notices. The result count is capped locally. Service errors are surfaced without switching providers.
Parallel is available only in Server Mode, including follow-ups. Static deployments and the Client Mode provider picker do not support it because browsers cannot reliably send the project User-Agent. Server requests honor the outbound proxy settings below.
Set NUXT_PROXY_URL to route server-side requests through a proxy:
NUXT_PROXY_URL=socks5h://user:[email protected]:7777
NUXT_NO_PROXY=localhost,127.0.0.1,::1
http, https, socks5, socks5h, socks.http(s) proxies cover everything: AI providers, Google PSE, you.com, Serply, Parallel, and the Tavily / Firecrawl / CRW SDKs.socks* proxies cover AI providers, Google PSE, you.com, Serply and Parallel; the Tavily / Firecrawl / CRW SDKs (axios-based) cannot speak SOCKS and will connect directly. Use the http:// endpoint of the same proxy (same credentials on most providers) for full coverage.NUXT_NO_PROXY accepts *, exact hosts and parent domains (example.com also matches api.example.com). Local AI gateways (Ollama, LiteLLM) and self-hosted scrapers stay direct via the default list.HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars are honored as fallback when NUXT_PROXY_URL is unset.% as %25, @ as %40, : as %3A).NUXT_PROXY_URL fails server startup (fail-fast) instead of silently going direct.If your server needs geo-targeted or rotating egress IPs, run the deployment behind a standard HTTP/SOCKS5 proxy. Example with Helodata:
# Full coverage: AI + Google PSE + you.com + Tavily/Firecrawl SDKs
NUXT_PROXY_URL="http://YOUR_HELODATA_USERNAME:[email protected]:7777"
# Or SOCKS5: AI + Google PSE + you.com
# (Tavily/Firecrawl SDKs can't speak SOCKS and will connect directly)
NUXT_PROXY_URL="socks5h://YOUR_HELODATA_USERNAME:[email protected]:7777"
docker run -p 3000:3000 \
-e NUXT_PUBLIC_SERVER_MODE=true \
-e NUXT_AI_API_KEY=your-ai-api-key \
-e NUXT_WEB_SEARCH_API_KEY=your-search-api-key \
-e NUXT_PROXY_URL="$NUXT_PROXY_URL" \
anotia/deep-research-web-ui:latest
Get credentials from your Helodata dashboard. See Helodata docs for region / city / sticky-session username format. For proxy behavior details, see Outbound proxy (Server Mode only).
Make sure to install dependencies:
pnpm install
Start the development server on http://localhost:3000:
pnpm dev
Build the application for production:
If you want to deploy a SSR application:
pnpm build
If you want to deploy a static, SSG application:
pnpm generate
Locally preview production build:
pnpm preview
Check out the deployment documentation for more information.
MIT
The project is also hosted on AtomGit, which is more accessible from mainland China. Thanks to AtomGit for the hosting.
1,283 followers · starred Feb 2025
233 followers · starred Sep 2026
16 followers · starred Mar 2025
179 followers · starred Feb 2025