I come from a chemical engineering background, and for years my research looked the same every time: a folder of PDFs, a document full of half-remembered findings, and no real way to see how any of it fit together. When two papers disagreed on a number, I'd usually notice weeks later — if at all. And once I reached a conclusion, I couldn't retrace the steps that got me there.
I didn't want another chatbot that summarizes papers and asks me to trust it. I wanted the opposite: a workspace where the evidence, the reasoning, and the history all stay together and show their work. That became ResearchOS.
What it does
ResearchOS turns a research question into a connected, verifiable record across five surfaces:
- Literature — GPT-5.6 reads uploaded papers and extracts claims, each pinned to an exact quoted span from the source.
- Knowledge Graph — verified claims become an evidence graph of materials and properties. Numeric disagreements surface as red dashed contradiction edges.
- Hypotheses — drafted only from verified evidence, and required to be measurable by an experiment the system can actually run.
- Experiment Planner — runs real physics: an ASE + MACE-MP-0 substitution-energy screen on CPU, not a mock.
- Research Replay — because every action is an event, the entire project replays from the first question, with provenance behind each step.
The core rule everywhere: AI proposes (amber), the human verifies (green), and only verified evidence counts. There is deliberately no free-text chat window — the model produces bounded, structured proposals that a researcher accepts, edits, or rejects.
How I built it
ResearchOS was built by Codex (GPT-5.6-Terra) as the implementer, with me driving product direction, scientific constraints, prompt intent, and verification design.
The product itself is powered by the GPT-5.6 API across tiers: gpt-5.6-terra for parallel structured claim extraction, gpt-5.6-sol for hypothesis drafting, constrained plan-filling, and result interpretation, and gpt-5.6-luna for fast entailment checks, with text-embedding-3-large for retrieval.
Stack: FastAPI (async SQLAlchemy) + Postgres 16 + pgvector, arq on Redis with a separate CPU compute worker for MACE, and a Next.js frontend with a sigma.js graph and an SSE event stream. A hydrogen-storage domain pack encodes the property registry, unit aliases, comparability transforms, and conflict rules.
Challenges I ran into
Grounding the model. Early extraction "quotes" often didn't literally appear in the papers — only about 7% of spans validated. I moved grounding enforcement to the server: a quoted span must occur in the referenced chunk after whitespace normalization, numeric values are re-parsed from the quote, and unverified claims can never become hypothesis evidence. Validity jumped to ~93%. Grounding has to be enforced in code, not requested in a prompt.
Making conflicts real, not noise. A naive matcher found zero conflicts (vocabulary fragmentation), then found dozens of false ones. The fix was a domain-aware conflict model: strict condition identity (catalyst, dopant, loading), per-property noise floors, and property comparability transforms — for example, desorption and formation enthalpy are the same physics with opposite sign,
$$\Delta H_{\text{des}} = -\,\Delta H_{\text{form}}$$
so a claim is only flagged as a contradiction when, after transformation, the relative difference exceeds 15% or 2σ above the noise floor. This is what surfaces the signature conflict in the demo: a calculated formation enthalpy of −52.77 kJ/mol H₂ disagreeing with experimental desorption values of 77.4–78.45 kJ/mol H₂.
Real physics on a CPU. The planner runs a MACE-MP-0 substitution-energy screen — computing whether Ti doping destabilizes MgH₂ — and returned $+0.102\ \text{eV}$ in the demo. Getting this to run reliably meant warming the model, caching the relaxed host energy, and baking chemical potentials into the compute image.
Speed and API quirks. Extraction started at 154s per paper; parallelizing windowed calls brought it down to ~30s. I also learned GPT-5.6 rejects the temperature parameter, and that strict structured outputs require additionalProperties: false on every schema node.
What I learned
- Trust in an AI research tool comes from provenance and verification, not fluency. Amber-to-green with a human in the loop is the whole product.
- Domain knowledge belongs in data (the pack), not hardcoded — it's what makes conflict detection meaningful.
- Every model call should be a persisted, replayable trace. If you can't retrace the reasoning, it isn't research.
What's next
More experiment templates (formation-enthalpy screens as conflict arbitration), more domain packs beyond hydrogen storage, and higher-fidelity validation paths above the screening-grade MACE runs.
Built With
- alembic
- asyncpg
- codex
- docker
- docker-compose
- fastapi
- gpt-5.6
- graphology
- next.js
- openai
- pgvector
- postgresql
- python
- pytorch
- react
- sqlalchemy
- typescript

Log in or sign up for Devpost to join the conversation.