Paste an argument. See what it isn't resolving.
Tension Map turns argumentative text into an interactive graph: claims, hidden assumptions, and the tensions between them. Click a tension to see the shared premise keeping both sides plausible, and one open question — addressed to you, not resolved by the tool.
Every time we read a persuasive argument — a policy document, an AI response, a speech — implicit value-choices are being made for us and delivered as conclusions. The AI response resolved a tension you never saw. The argument assumed a framework you might not share.
This tool is a direct inversion of AI deference: the AI extracts the logical structure, the human navigates it. Nothing in the tool resolves anything. The graph stays open because you have to close it.
That commitment is architecturally enforced. No scores, no verdicts, no winner button. Arrow's impossibility theorem as a design decision.
- Paste text (or pick an example — no API call needed for built-in scenarios).
- An LLM extracts claim nodes, assumption nodes (unstated premises), and tensions (where claims or assumptions pull against each other).
- D3 lays out the graph. Click any tension to read: both poles, the shared assumption making both seem valid, and one open question for you to answer.
Text → /api/extract (server-side, key never leaves) → { nodes, edges, tensions } → D3 force graph
This is a prototype, not a production product — it demonstrates the core primitive. A fuller tool would add persistent maps, provenance linking, human-in-the-loop editing, multi-document comparison, and export. See roadmap below.
git clone https://github.com/syneid/tension-map.git
cd tension-map
npm install
cp .env.example .env.local # add your API key
npm run devOpen http://localhost:3000. Example buttons work with no key.
| Variable | Description |
|---|---|
LLM_API_KEY |
DeepSeek key — server-side only, never exposed to the browser |
Never commit .env.local or any file containing secrets.
- Push to GitHub.
- Import at vercel.com/new.
- Add
LLM_API_KEYunder Settings → Environment Variables. - Deploy.
| Limit | Value |
|---|---|
| Input length | 50–5,000 characters |
| Custom extractions | 10 per session per hour |
Example buttons bypass the API entirely.
- Next.js 14 (App Router)
- D3 force simulation
- DeepSeek Chat for structure extraction
This prototype demonstrates the core primitive — the tension node. The 90-day plan from here:
Phase 1 (July) — schema and rendering polish; shareable URLs (a tension map as a link you can send); better label layout for dense graphs.
Phase 2 (August) — user annotations: type your own answer to the open question; mark a tension "resolved by me" with a note; the node changes state. Export as JSON or PNG.
Phase 3 (September) — 10+ design partners; documented cases of the tool surfacing assumptions users didn't know they were accepting; write-up on what the grammar of a tension reveals across argument types; open contribution guide.
The most useful contributions right now are schema improvements — better prompts for tension extraction, alternative rendering approaches, and domain applications (legal documents, scientific abstracts, policy briefs, therapeutic conversations).
Open an issue labelled schema, rendering, or application.
If you want to use this as a building block in your own deliberation tool, the tension node schema is designed to be reusable — open an issue or reach out directly.
For the full scaffolding context from initial development, see docs/build-guide.md.
- Did You See That Too? — on what we lose when the machine answers before the question forms
- The Aliveness Subspace — the broader research and writing project this emerges from
MIT — use and adapt freely.
Built by Zsombor Koman / Syneid Labs