[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2782":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":12,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},2782,"loupe","AIScientists-Dev\u002Floupe","AIScientists-Dev","A loupe for your proofs. An open-source AI reviewer for scientific papers.",null,"JavaScript",150,4,110,0,3,122,9,2.1,"Apache License 2.0",false,"main",true,[],"2026-06-12 02:00:43","\u003Cp align=\"center\">\n  \u003Cimg src=\"frontend\u002Fpublic\u002Fbrand\u002Fsocial\u002Freadme-banner-1280x320.png\" alt=\"Loupe — a loupe for your proofs\" width=\"100%\">\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n\n# Loupe\n\n**A loupe for your proofs.**\nAn open-source AI reviewer for scientific papers.\n\n[![Demo](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDemo-→-065F46?style=for-the-badge)](https:\u002F\u002Floupe.morphmind.ai)\n\n[![Apache 2.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache%202.0-blue?style=flat-square)](.\u002FLICENSE) [![Hosted](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FHosted-loupe.morphmind.ai-065F46?style=flat-square)](https:\u002F\u002Floupe.morphmind.ai) [![MorphMind](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fby-MorphMind-124442?style=flat-square)](https:\u002F\u002Fmorphmind.ai) [![Privacy](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flocal%20LLM-supported-2D6A4F?style=flat-square)](#privacy-by-design)\n\n[**What it does**](#what-loupe-does) · [**Quick start**](#quick-start) · [**Privacy**](#privacy-by-design) · [**Model providers**](#model-providers) · [**Architecture**](#architecture)\n\n\u003C\u002Fdiv>\n\n> The hosted demo at **[loupe.morphmind.ai](https:\u002F\u002Floupe.morphmind.ai)** runs the latest release. To join the free-trial waitlist, sign up at **[agentlab.morphmind.ai](https:\u002F\u002Fagentlab.morphmind.ai)** and we'll notify you once Loupe is launched. Everything you see there you can also self-host with the steps below.\n\n---\n\n## What Loupe does\n\nLoupe is an AI review tool for scientific paper authors, reviewers, editors. Upload a paper; Loupe surfaces the handful of proof steps that deserve a second look — arithmetic slips, flipped inequalities, unstated assumptions, wrong constants, quantifier confusion — then lets you agree, dismiss, or push back on each one before generating a draft review you can edit and send.\n\nIt's the opinionated take of a journal reviewer's first pass, compressed from hours into minutes.\n\n**Loupe is not** a proof solver, a plagiarism checker, or a replacement for human judgment. It's a magnifier — you decide what matters.\n\n---\n\n## Why not just paste the paper into ChatGPT?\n\nA 2026 INFORMS study of 6,957 submissions and 10,389 reviews at *Organization Science* — the first journal to report it — found AI-assisted reviews are \"narrower\" and \"lower quality\" than human ones, while submission volume rose 42% since the late-2022 release of ChatGPT.[^1] More research, less rigorous review.\n\nLoupe is built for the other direction. **An AI agent designed by researchers, for researchers** — not a chat window with a paper attached. A 50-page manuscript dropped into a generic chatbot returns one long blob: no citations to lines or pages, no record of what was actually checked, no way to push back on a single claim, and a token bill that grows with every follow-up. Loupe runs a ~$0.03 triage in about fifteen seconds first; the deep dive is opt-in and segment-by-segment, with severity-tagged findings each pinned to a bounding box on the PDF. You agree, dismiss, or investigate each one — quick actions like *re-derive*, *find a counterexample*, *check the citation* open a thread on that specific finding, not the whole paper. Every run logs token usage and dollar cost per segment, and the local-LLM path keeps the manuscript on your laptop end-to-end.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Floupe-flow.gif\" alt=\"Loupe walkthrough — upload, triage, investigate, draft review, dark mode\" width=\"100%\">\n\u003C\u002Fp>\n\nLoupe is opinionated about how AI should help with peer review: progressively, structured, cited, and cheap enough to run on every paper rather than only the ones you already suspect — which is the new experience of human-AI coworking.\n\n[^1]: Gartenberg, C., Hasan, S., Murray, A., & Pierce, L. (2026). *More Versus Better: Artificial Intelligence, Incentives, and the Emerging Crisis in Peer Review.* Organization Science, Articles in Advance. [doi:10.1287\u002Forsc.2026.ed.v37.n3](https:\u002F\u002Fdoi.org\u002F10.1287\u002Forsc.2026.ed.v37.n3). We thank [Prof. De Liu](https:\u002F\u002Fcarlsonschool.umn.edu\u002Ffaculty\u002Fde-liu) (Carlson School of Management, University of Minnesota) who pointed this reference to us.\n\n---\n\n## Key features\n\n- **Two-stage review** — a one-minute triage produces an H\u002FM\u002FL verdict; a deep dive then scores the paper across six dimensions (proof, literature, clarity, numerical, relevance, novelty).\n- **Visual localization** — every finding is pinned to a bounding box on the PDF, verified by a vision pass. Parser-mismatched findings are dropped, never faked.\n- **Issue types grounded in the domain** — arithmetic, logic, unstated assumption, wrong constant, quantifier scope, citation required, definition mismatch, missing step.\n- **Investigate, don't trust blindly** — any finding opens into a back-and-forth thread. Quick actions: re-derive, find a counterexample, check the citation, propose a fix.\n- **Severity + confidence on every finding** — triage in seconds; sort by severity, page, or confidence.\n- **Draft review generator** — produces structured markdown grouped by your verdicts. Edit live; copy or download as `.md` \u002F `.pdf`.\n- **Model-agnostic** — OpenAI, Anthropic, DeepSeek, Moonshot, MiniMax — or your own local Ollama \u002F vLLM \u002F LM Studio server. Pick from the settings panel.\n- **Local-first by default** — your laptop is enough. Bring your own key, or skip the cloud entirely with the local-LLM path.\n\n---\n\n## Built on MorphMind\n\nLoupe is a specialized agent derived from **[MorphMind](https:\u002F\u002Fmorphmind.ai)** — a platform that spawns production-grade AI agents for any deep domain (peer review, literature research, AI for drug discovery, biomedical study, scientific writing, data science, chip design, contract generation, website development, financial trading, business management, VC scouting, …).\n\n---\n\n## Privacy by design\n\nPeer review hands you the most sensitive document an academic produces — an unpublished manuscript under embargo. Loupe is built so you can do the work without that document ever leaving your hardware.\n\n- **Run end-to-end on a local LLM.** Point Loupe at [Ollama](https:\u002F\u002Follama.com), [vLLM](https:\u002F\u002Fgithub.com\u002Fvllm-project\u002Fvllm), [LM Studio](https:\u002F\u002Flmstudio.ai), `llama.cpp`'s server, or any OpenAI-compatible endpoint. Configure two env vars and the model selector picks it up automatically.\n- **Self-host the PDF parser.** [MinerU](https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU) is open-source. Run it on your own GPU and Loupe will use it.\n- **No telemetry.** Self-hosted Loupe does not phone home. The only outbound HTTP is to the LLM and parser endpoints **you** configure.\n- **Hosted is opt-in.** [`loupe.morphmind.ai`](https:\u002F\u002Floupe.morphmind.ai) is a separate convenience deployment by MorphMind for users who don't want to run infra. Self-hosters never touch it.\n\nThe settings panel labels each provider with its privacy posture so you can see at a glance whether your paper text leaves the machine.\n\n## Model providers\n\n| Group | Models | Privacy posture | Key |\n|---|---|---|---|\n| **OpenAI** | GPT-4.1 | Sends paper text to OpenAI | `OPENAI_API_KEY` |\n| **Anthropic** | Claude Opus 4.7 (highest quality), Claude Sonnet 4.6 (default) | Sends paper text to Anthropic | `ANTHROPIC_API_KEY` |\n| **Other LLM Providers** | DeepSeek V3, Moonshot Kimi K2.5, MiniMax M2.7 | Sends paper text to the chosen provider | `DEEPSEEK_API_KEY` \u002F `MOONSHOT_API_KEY` \u002F `MINIMAX_API_KEY` |\n| **Ollama (local)** | any model in your `OLLAMA_MODELS` list | **Your paper never leaves your machine** | `OLLAMA_BASE_URL`, `OLLAMA_MODELS` |\n| **Custom OpenAI-compatible (local)** | any model your endpoint serves | Goes only to the endpoint you configured | `LOCAL_OPENAI_BASE_URL`, `LOCAL_OPENAI_API_KEY`, `LOCAL_OPENAI_MODELS` |\n\nConfigure as many as you like — Loupe queries `GET \u002Fv1\u002Fproviders` at runtime and the settings panel shows only the ones that are reachable. Visual localization works with any vision-capable cloud model (Claude family, GPT-4.1 \u002F GPT-4o, or any OpenAI-compatible local endpoint serving a vision model — set via `VISION_MODEL`); local-only mode keeps text analysis private and skips visual verification when the configured vision model is unreachable.\n\n---\n\n## Quick start\n\n### Frontend-only (mock mode — no backend, no keys)\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\nOpen \u003Chttp:\u002F\u002Flocalhost:3009>. The frontend ships with a 5-bug fixture; you can walk the full upload → analyze → review flow without any backend. Set `NEXT_PUBLIC_USE_MOCK=0` in `frontend\u002F.env.local` later to switch to the real backend.\n\n### Full local stack (backend + frontend + your choice of LLM)\n\n```bash\n# 1. Backend\ncd backend\npython -m venv .venv && source .venv\u002Fbin\u002Factivate\npip install -r requirements.txt\ncp ..\u002F.env.example ..\u002F.env\n# Edit ..\u002F.env — fill in at least ONE of the provider blocks below.\nuvicorn app.main:app --reload --port 8009\n\n# 2. Frontend (separate terminal)\ncd frontend\nnpm install\nnpm run dev   # http:\u002F\u002Flocalhost:3009\n```\n\n#### Cloud setup (one example)\n\n```bash\n# in .env\nANTHROPIC_API_KEY=sk-ant-...\nDEFAULT_MODEL=claude-sonnet-4-6\n```\n\n#### Local setup with Ollama (private path)\n\n```bash\n# in .env\nOLLAMA_BASE_URL=http:\u002F\u002Flocalhost:11434\nOLLAMA_MODELS=qwen2.5:32b,llama3.1:70b\nDEFAULT_MODEL=ollama:qwen2.5:32b\n```\n\n```bash\n# host\nollama pull qwen2.5:32b\nollama serve   # runs on :11434 by default\n```\n\nThat's it — Loupe will route every analysis call to Ollama. Your paper text never leaves localhost.\n\n---\n\n## Architecture\n\n```\n                 ┌──────────────────────┐\n                 │  Next.js 14 frontend │\n                 │   \u002Fpapers · workspace │\n                 └──────────┬───────────┘\n                       \u002Fapi │  mock-able via MSW\n                            ▼\n                 ┌──────────────────────┐\n                 │    FastAPI backend    │\n                 │   JSON-file storage   │\n                 └──────────┬───────────┘\n        ┌───────────────────┼──────────────────────┐\n        ▼                   ▼                      ▼\n ┌─────────────┐   ┌──────────────────┐   ┌──────────────────┐\n │   MinerU    │   │  LLM providers   │   │  Vision model    │\n │  (parse →   │   │  Anthropic \u002F     │   │ (localize bbox + │\n │   markdown) │   │  OpenAI \u002F China \u002F│   │  verify evidence)│\n │  self-host  │   │  Ollama \u002F local  │   │   cloud vision   │\n │  optional   │   │  OpenAI-compat   │   │   model required │\n └─────────────┘   └──────────────────┘   └──────────────────┘\n```\n\nEverything is **raw HTTP** — no SDK dependencies for LLM providers, easy to fork and swap. Storage is flat JSON files in `data\u002F` for clone-and-inspect friendliness.\n\n## Project structure\n\n```\nloupe\u002F\n├── backend\u002F\n│   └── app\u002F\n│       ├── main.py               # FastAPI app, singletons\n│       ├── config.py             # env-driven settings\n│       ├── models.py             # Pydantic shapes (mirror frontend\u002Flib\u002Ftypes.ts)\n│       ├── routes\u002F               # \u002Fpapers, findings, review, providers, folders\n│       ├── services\u002F             # orchestrator, llm_client, storage, mineru_client\n│       └── pipeline\u002F             # 3 steps: parse → extract_proofs → verify_proofs\n│           └── prompts\u002F          # composable prompt builders\n├── frontend\u002F\n│   ├── app\u002F                      # Next.js App Router\n│   │   └── papers\u002F[id]\u002F          # workspace (PDF + findings panel)\n│   ├── components\u002F\n│   │   ├── brand\u002F                # Loupe mark + lockup\n│   │   ├── shell\u002F                # sidebar, theme toggle, MSW boot\n│   │   ├── papers\u002F               # list, card, upload dialog\n│   │   ├── workspace\u002F            # PDF viewer, finding card, progress strip\n│   │   ├── review\u002F               # report card + draft modal\n│   │   └── ui\u002F                   # shadcn primitives\n│   ├── lib\u002F\n│   │   ├── api.ts                # typed fetch wrappers (the API contract)\n│   │   ├── types.ts              # mirrors backend models\n│   │   └── hooks\u002F                # TanStack Query hooks\n│   ├── mocks\u002F                    # MSW handlers + fixtures (5-planted-bug fixture)\n│   └── public\u002F\n│       ├── brand\u002F                # Loupe mark, lockup, decor, social\n│       └── icons\u002Fissue-types\u002F    # 9 finding glyphs\n├── LICENSE                       # Apache 2.0\n├── NOTICE                        # required Apache attribution\n└── README.md\n```\n\n## API contract\n\nFully documented in `frontend\u002Flib\u002Fapi.ts`. Core surface:\n\n```\nGET    \u002Fv1\u002Fpapers                           list papers\nPOST   \u002Fv1\u002Fpapers                           upload (multipart) + kick pipeline\nGET    \u002Fv1\u002Fpapers\u002F{id}                      full paper + findings + exchanges\nDELETE \u002Fv1\u002Fpapers\u002F{id}\nGET    \u002Fv1\u002Fpapers\u002F{id}\u002Fstatus               poll pipeline state\nGET    \u002Fv1\u002Fpapers\u002F{id}\u002Fevents               SSE stream (optional)\nGET    \u002Fv1\u002Fpapers\u002F{id}\u002Fpdf                  binary PDF\n\nPOST   \u002Fv1\u002Fpapers\u002F{id}\u002Ffindings\u002F{fid}\u002Fdecide        agree | dismiss\nPOST   \u002Fv1\u002Fpapers\u002F{id}\u002Ffindings\u002F{fid}\u002Finvestigate   back-and-forth\nPOST   \u002Fv1\u002Fpapers\u002F{id}\u002Ffindings\u002F{fid}\u002Flocalize      on-demand vision-verify\n\nPOST   \u002Fv1\u002Fpapers\u002F{id}\u002Freview\u002Fgenerate      → {draft_id, markdown}\nPATCH  \u002Fv1\u002Fpapers\u002F{id}\u002Freview\u002F{draft_id}    save editor changes\nGET    \u002Fv1\u002Fpapers\u002F{id}\u002Freview\u002F{draft_id}\u002Fexport?format=pdf|md\n\nGET    \u002Fv1\u002Fproviders                        configured LLM providers + reachability\n```\n\nError envelope is uniform: `{ error: { code, message, detail? } }`.\n\n## Design system\n\nLoupe is a sibling product in the MorphMind design family:\n\n- **Primary:** emerald `#065F46` (`oklch(0.432 0.095 166.913)`)\n- **Type:** Noto Sans (UI + wordmark) · Geist Mono (code + formulae)\n- **Mark:** lens + reticle (precision, optical). Distinct from sister projects' marks.\n- **Tokens:** live in `frontend\u002Fapp\u002Fglobals.css` as CSS variables.\n\n## Hosted vs self-hosted\n\n| | Hosted (loupe.morphmind.ai) | Self-hosted |\n|---|---|---|\n| Setup | None — sign in with an invitation code | Clone, install, fill in `.env` |\n| LLM key | MorphMind's | Yours |\n| PDF parsing | MorphMind's MinerU | Yours (or skip) |\n| Privacy | Paper text reaches MorphMind + the chosen LLM | Stays on your hardware (Ollama path) |\n| Cost | Per-paper fee — see pricing page | Provider cost only |\n| Updates | Latest release, automatically | When you `git pull` |\n\n## Contributing\n\nLoupe is in active development. The most useful contributions right now:\n\n1. **Try it on a real paper** and open an issue with a screenshot + the paper's arXiv link. The hardest thing to improve is the verifier prompt; real cases drive that.\n2. **File false-positive and false-negative examples** with the quoted evidence — we use these to tune `verify_proofs`.\n3. **New LLM provider routes** — extend `_ROUTING` in `backend\u002Fapp\u002Fservices\u002Fllm_client.py` and the matching entry in `backend\u002Fapp\u002Froutes\u002Fproviders.py`.\n4. **Frontend polish** — empty states, a11y, keyboard shortcuts, dark-mode audit.\n\nLoupe is licensed under Apache 2.0; by submitting a PR you agree your contribution is licensed under the same terms (no separate CLA required — the Apache 2.0 patent grant in §3 of `LICENSE` covers your contribution automatically). Please open an issue before sending a PR for anything larger than a bug fix.\n\n## Roadmap (not promises)\n\n- SSE streaming for the analysis view\n- Token streaming on investigation replies\n- Local vision model adapter (so the localize step works without a cloud key)\n- Batch mode (queue up 10 papers, walk through them in sequence)\n- Learned-rules personalization (what the editor flagged last time, de-duplicated this time)\n- Venue templates (JASA, Biometrika, NeurIPS, ICML) for the draft review\n- Docker compose one-liner\n\n## License\n\nApache 2.0 — see [`LICENSE`](.\u002FLICENSE) and [`NOTICE`](.\u002FNOTICE). Copyright © 2026 AIScientists, Inc. (dba MorphMind).\n\n---\n\n\u003Cp align=\"center\">\n  \u003Csub>\n    Loupe is an open-source agent derived from the agent-spawning platform \u003Ca href=\"https:\u002F\u002Fmorphmind.ai\">\u003Cstrong>MorphMind\u003C\u002Fstrong>\u003C\u002Fa>.\u003Cbr>\n    Hosted at \u003Ca href=\"https:\u002F\u002Floupe.morphmind.ai\">loupe.morphmind.ai\u003C\u002Fa> · Contact: Jay (jie@morphmind.ai).\n  \u003C\u002Fsub>\n\u003C\u002Fp>\n","Loupe 是一个开源的科学论文AI审查工具，旨在帮助作者、审稿人和编辑提高论文的质量。其核心功能是通过分析上传的论文来识别潜在的问题，如算术错误、不等式反转、未声明的假设等，并提供可交互的审查建议，最终生成一份初步的审查报告供用户编辑和完善。技术上，Loupe 采用JavaScript构建，支持本地部署以保护隐私，同时设计为专注于论文细节而非替代人类判断的角色。适用于学术界中需要快速获得高质量初审反馈的场景，尤其是面对大量投稿时，能够有效提升审查效率而不牺牲质量。",2,"2026-06-11 02:51:12","CREATED_QUERY"]