English · 简体中文
A self-hosted, single-user paper-discovery-and-trends tool with reading aids. Point
it at a topic and it fetches papers from multiple sources, writes bilingual summaries,
analyzes research trends, and keeps everything in one local library you can chat with and
sync to Zotero — all on your own machine, and fully usable with no API keys and no
external services. No idea generation and no claude-CLI agent — just discovery,
trends, and reading aids.
This edition is discovery and trends only, with reading aids. The hosted, advanced edition at autoresearches.com adds multi-user accounts, AI idea generation with baseline ranking, agentic (Channel B)
claude-CLI steps, the experiment training-brief handoff (idea →PROJECT_BRIEF.mdyou run on your own GPU), and end-to-end LaTeX paper writing. If you want the whole discover → idea → experiment → write loop as a managed service, start there.
Auto-Researches Lite is the literature-discovery core of the Auto-Researches product, repackaged to run locally for one researcher. There is no sign-up, no billing, and no tenancy — the app boots as a single local user and every request acts as that user. It is built to do one job well: help you find, read, organize, and think about papers.
- Multi-source paper discovery — arXiv, Semantic Scholar, and a semantic AI Paper Finder over a curated conference corpus. Papers accumulate across runs into a per-project library.
- Bilingual summaries — every paper gets an English and a 中文 summary, plus an optional code-repository analysis.
- Research-trend analysis — TF-IDF keyword trends and a word cloud over what you've collected.
- Paper & project chat — ask questions of a single paper or of the whole project, with the project context in scope.
- Per-project context document — auto-maintained after each step so later steps stay grounded in what came before.
- Zotero sync — push discovered papers into your Zotero library.
- MinerU PDF parsing — convert PDFs to clean Markdown for grounding (with an offline
pypdffallback).
Everything runs with graceful degradation: with zero configuration it uses a local SQLite file, an in-process job queue, and a deterministic mock LLM, so the whole app works offline. Add real provider keys later in the Settings page to upgrade the output — no code changes, no restarts required.
| Capability | In this edition |
|---|---|
| Projects | ✅ |
| Multi-source discovery (arXiv · Semantic Scholar · AI Paper Finder) | ✅ |
| Bilingual (EN / 中文) paper summaries | ✅ |
| Code-repository analysis per paper | ✅ |
| Research-trend analysis (TF-IDF + word cloud) | ✅ |
| Paper library that accumulates across runs | ✅ |
| Paper chat & project chat | ✅ |
| Per-project context document | ✅ |
| Zotero sync | ✅ |
MinerU PDF parsing (offline pypdf fallback) |
✅ |
| Background jobs + scheduler + workers | ✅ |
| Channel A LLM service (provider API + mock fallback) | ✅ |
| Per-model reasoning-effort levels for Channel A | ✅ |
| Fernet-encrypted stored credentials | ✅ |
| Offline mock-LLM mode | ✅ |
| AI idea generation with baseline ranking | ❌ → autoresearches.com |
Agentic (Channel B) claude-CLI steps |
❌ → autoresearches.com |
| Multi-user accounts, login, roles | ❌ → autoresearches.com |
| Billing, subscription tiers, quotas | ❌ → autoresearches.com |
Experiment stage (training-brief PROJECT_BRIEF.md handoff) |
❌ → autoresearches.com |
| Paper writing stage (LaTeX drafts + figures) | ❌ → autoresearches.com |
| Remote-GPU SSH handoff | ❌ → autoresearches.com |
The removed stages are not stubbed placeholders — this edition is deliberately scoped to discovery, trends, and reading aids so it stays small, private, and easy to self-host. The full pipeline — idea generation, agentic steps, experiments, and writing — lives at autoresearches.com.
A layered FastAPI backend, a background job system with an in-process fallback, and a React SPA. Every external dependency has a local default, which is what makes the zero-config boot possible.
flowchart LR
U[Browser] --> FE[React SPA<br/>Vite / nginx]
FE -->|/api| BE[FastAPI backend<br/>app.main:app]
BE --> DB[(SQLite _data/<br/>or Postgres)]
BE -->|enqueue| Q{{Job queue}}
Q -->|in-process thread<br/>default| W1[Worker]
Q -->|Redis + RQ<br/>if REDIS_URL set| W2[RQ Worker]
SCH[APScheduler<br/>scheduler] -->|daily fetch| Q
W1 & W2 --> EXT[arXiv · Semantic Scholar ·<br/>AI Paper Finder · LLM · Zotero · MinerU]
BE -.semantic search.-> PF[AI Paper Finder<br/>sidecar :8100]
| Layer | Tech |
|---|---|
| Backend | FastAPI + SQLAlchemy 2 — SQLite locally, optional Postgres |
| Jobs | In-process thread queue by default; optional Redis + RQ worker |
| Scheduler | APScheduler poller for per-project daily paper fetch |
| Frontend | React + Vite + TypeScript + Tailwind (served by nginx in Docker) |
| LLM — Channel A | Provider API (Anthropic / OpenAI …) for summaries, chat, and Zotero routing |
One LLM path: Channel A (services/llm.py) is the standard provider API used for
summaries, paper/project chat, and Zotero collection routing. It supports per-model
reasoning-effort levels and always falls back to a deterministic mock LLM on any
error, so a request never hard-fails. This edition ships no Channel B — the
non-interactive claude-CLI agent has been removed along with idea generation.
Runs the full stack (Postgres, Redis, backend, worker, scheduler, the AI Paper Finder sidecar, and the nginx-served SPA) on your local machine.
cd deploy
cp .env.example ../.env # then set JWT_SECRET once (see below)
docker compose up --build -dOpen http://localhost:8080. Every service is bound to 127.0.0.1 — nothing is
exposed to other machines.
The only thing to set in ../.env is a stable secret:
# JWT_SECRET is the credential-encryption root. A key derived from it encrypts
# every secret you later enter in Settings. Set it ONCE and keep it stable —
# changing it makes previously stored secrets undecryptable.
JWT_SECRET=change-me-to-a-long-random-string # openssl rand -hex 32Everything else in .env.example (database URL, Redis URL, data path, frontend port,
worker concurrency, offline mode) has a working default and is only for advanced
overrides. Provider API keys, MinerU, Zotero, and paper sources are configured in the
in-app Settings page, never in this file.
The AI Paper Finder sidecar ships without its corpus. To enable semantic conference search, populate its data volume once:
docker compose run --rm paperfinder bash download_data.shCustom host port: FRONTEND_PORT=8088 docker compose up --build -d, then open
http://localhost:8088.
No Docker, no database, no keys. This runs the app fully offline with SQLite, the in-process thread queue, and the deterministic mock LLM.
Backend (Python 3.11):
cd backend
uv venv --python 3.11 .venv && source .venv/bin/activate
uv pip install -e ".[dev]"
uvicorn app.main:app --reload # API on http://localhost:8000, OpenAPI at /docsFrontend (in a second shell):
cd frontend
npm install
npm run dev # http://localhost:5173, proxies /api → :8000Open http://localhost:5173, create a project, and run discovery. There is no login —
the app auto-creates a single local user (local@auto-researches.local) and every request
acts as that user.
Run the test suite:
cd backend
pytest app/tests -q # full suite
pytest app/tests -m "not network" -q # skip the one test that hits the live arXiv APIpytest is the only automated backend check; the frontend is verified by tsc -b during
npm run build.
There are no API keys in env files. After first boot, open Settings in the app and
configure everything there. Stored secrets are encrypted at rest with a Fernet key derived
from JWT_SECRET (or a separate CREDENTIAL_SECRET if you set one).
| Setting | What it does |
|---|---|
| LLM providers (Channel A) | Provider API keys and the model catalog for summaries, chat, and Zotero routing, plus per-model reasoning-effort levels (low · medium · high · xhigh · max) that are probed per-level by the in-app model Test. |
| MinerU | Endpoint / token for PDF-to-Markdown parsing (falls back to offline pypdf). |
| Zotero | Library ID and API key for syncing discovered papers. |
| Paper sources | Enable/configure arXiv, Semantic Scholar, and the AI Paper Finder. |
| Runtime knobs | worker_concurrency — background-worker pool size (0 = use the WORKER_CONCURRENCY env default). |
With nothing configured, the app still works — it uses the mock LLM and offline fallbacks so you can explore every screen before wiring up real providers.
- One enqueue entrypoint. All background work goes through a single submit call; task
entrypoints take only a
job_idand open their own DB session, which is what makes the in-process, thread, and Redis paths interchangeable. - In-process by default. With no
REDIS_URL, jobs run on a daemon thread inside the API process — no extra services to start. - Redis + RQ when you want scale. Set
REDIS_URLand run the worker (python -m app.workers.run_worker) to process jobs out-of-process; scale withdocker compose up -d --scale worker=N. - Scheduler.
python -m app.scheduler.run_schedulerruns an APScheduler poller for per-project daily paper fetch. In Docker it runs as its ownschedulerservice. - Synchronous mode for tests.
JOB_SYNC=1runs jobs inline for deterministic runs.
Does it really work with no API keys? Yes. With zero configuration the app boots on SQLite, an in-process job queue, and a deterministic mock LLM. Real arXiv fetches and TF-IDF trend analysis work offline; only the quality of LLM-generated summaries and chat improves once you add a provider key in Settings.
SQLite or Postgres?
SQLite (a file under _data/) is the default and is fine for single-user local use. The
Docker Compose stack uses Postgres for durability; point DATABASE_URL at your own
Postgres if you prefer. Schema changes in this project are additive and nullable-safe, so
upgrades don't require destructive migrations.
Is Redis required?
No. Jobs run on an in-process thread by default. Set REDIS_URL only if you want an
out-of-process RQ worker (the Docker stack includes one).
How do I update?
git pull, then rebuild: for Docker, cd deploy && docker compose up --build -d; for the
dev setup, re-run uv pip install -e ".[dev]" and npm install if dependencies changed.
Keep JWT_SECRET stable across updates so stored secrets stay decryptable.
Where's idea generation / the experiment / paper-writing stage?
Not in this edition. This build is scoped to discovery, trends, and reading aids, so it
has no idea generation and no claude-CLI agent (Channel B). Use the hosted, advanced
edition at autoresearches.com for AI idea generation
with baseline ranking, agentic steps, the experiment training-brief handoff, and full
LaTeX paper writing.
Contributions are welcome. A few conventions:
- Verify before you PR. Backend:
pytest app/tests -q. Frontend:npm run build(which runstsc -b). These are the only automated checks. - Keep the zero-config boot working. The app must always boot with no environment variables (SQLite, in-process queue, mock LLM). Don't add a hard dependency on any external service.
- New DB columns must be nullable-safe, and output schemas must coerce
None, so existing databases keep working after a pull. - UI strings are bilingual. User-facing text uses the
t('English', '中文')pattern — every new or edited string needs both languages.
Released under the MIT License. Copyright (c) 2026 ycwfs.