raphaelmansuy / edgextract
git clone https://github.com/raphaelmansuy/edgextract.git
Turn markdown into a knowledge graph with an ontology you write and a cutoff you own. Closed yes/no decisions, not free-form JSON.
+0
stars, 24h · #34,198
+~0
stars, 7 days · #34,673
+131
stars, 30 days · #3,829
132
★ total
12
forks · 2 open issues
Star history (as recorded here)
LanguageTypeScript
LicenseApache-2.0
Created2026-10-03 (19d ago)
Last push1d ago
Watchers1
OwnerUser
Links
- GitHub: github.com/raphaelmansuy/edgextract
- Homepage: https://raphaelmansuy.github.io/edgextract/
- Releases · Issues · Hacker News mentions
README excerpt
# edgextract
**Turn markdown into a knowledge graph with an ontology you write and a cutoff you own.**
Your code proposes names. Your ontology says which kinds and links are legal. A small local decision model answers one closed yes-or-no question at a time. Anything it is unsure about waits for a person instead of silently entering your graph.
Real output from a local `tev1` run on `13_northwind.md`: open the interactive page · full report · read the article (PDF). One of the five links in that graph is wrong (`Acme ACQUIRED Northwind`; the text says "invested in"). We left it in. That is what the review queue and your cutoff are for.
## 60-second start
Rust (native): `cargo add edgextract` or `cargo install edgextract`.
Browser WASM: `npm i @raphael.mansuy/edgextract` (demo: GitHub Pages · Hugging Face Space).
[code]
No model yet? Everything below runs offline against a stand-in model:
[code]
Or from Python, in five lines:
[code]
## Try it in your browser
**Hosted demo:** GitHub Pages · Hugging Face Space (direct app) — Chromium with WebGPU; first **Load Tev1** downloads ~1 GB from Hugging Face into the browser cache (no server of ours sees your text). The hosted page **does not call `127.0.0.1:11434`**. Optional Ollama: `?backend=ollama&host=https://your-host` plus `OLLAMA_ORIGINS` (HTTPS required; the browser blocks mixed-content `http://`). Open the Space on `*.hf.space`, not only the Hub iframe.
The Rust crate compiles to WebAssembly, and a small Vite + TypeScript page runs the whole pipeline in a tab. Your text goes only to the decision model you name (by default Tev1 on WebGPU in this tab; Ollama is one click away), never to a server of ours.
[code]
[code]
- **Bring any document.** Upload or drop a `.md` / `.txt` file, or paste text.
- **Bring any ontology.** Pick one of seven samples (company news, tech docs, research papers, film, medicine, history, CoNLL04), start from a template, upload your own YAML, and edit it with live validation.
- **Names no list knows are still read.** Every capitalized name in your text is put to the model as a closed question ("is this a name this ontology can hold?"), then typed. You can also pin names to an ontology with one click.
- **Own the cutoff.** Two sliders move what is kept, sent to review, or dropped. The decision cache means moving them asks the model nothing new.
- **The model does the extracting.** Step 3 defaults to **WebGPU** in the tab: the header button is **Load Tev1** until weights are ready, then **Extract graph**. The default graph is `raphaelmansuy/tev1-0.8b-onnx-webgpu` (Together Tev1 ONNX; attribution in `docs/THIRD_PARTY_NOTICES.md`). **Ollama** is the other option (`http://localhost:11434`, model `tev1`; set `OLLAMA_ORIGINS`) and remains the Metal/CUDA speed ceiling. Same closed-question JSON either way. There is no rule-based mode in the page. If the backend cannot answer, the graph stays empty.
`make demo-e2e` runs the Playwright suite against a deterministic test dou