WikiMind — Feature Evidence & Capabilities

Production: wikimind.fly.dev  |  Source: github.com/manavgup/wikimind  |  Docs: manavgup.github.io/wikimind  |  API test results  |  Test script  |  v0.1.0  |  2026-05-18
138
API Endpoints
6
LLM Providers
13
MCP Tools
15
Frontend Views
16
Screenshots
100%
Compile Rate

Architecture Overview

WikiMind Architecture

WikiMind is a personal LLM-powered knowledge OS. Drop in articles, papers, PDFs, or YouTube links. The LLM compiles them into structured wiki articles. Ask questions against the wiki. The system detects contradictions, orphans, and knowledge gaps. Synthesis generates cross-cutting analyses across sources.

Backend: FastAPI + PostgreSQL + Redis + ARQ workers. Frontend: React + TypeScript + Vite. Deployed on Fly.io with Docker.

Content Ingestion api ui cli

Inbox — Sources awaiting processing

Drop URLs, PDFs, or text. Each source is fetched, cleaned, chunked, and compiled into a wiki article by the LLM. Real-time progress via WebSocket.

Inbox with arxiv papers

Source Detail — Pipeline artifacts

Full processing pipeline: Fetch → Extract → Clean → Compile. Shows author, token count, ingestion time, and compiled articles.

Source detail for Attention Is All You Need

Supported formats

FormatEndpointDetails
Web URLPOST /api/ingest/urlArticles, blog posts, documentation. Readability extraction.
YouTubePOST /api/ingest/urlAuto-detects YouTube URLs, extracts transcript.
PDFPOST /api/ingest/pdfUpload up to 50 MB. Docling extraction for tables and figures.
Plain textPOST /api/ingest/textPaste or send raw text content.
RSS feedsPOST /api/capture/rss/feedsSubscribe to feeds. Auto-poll for new items.

API Evidence — Ingest arxiv paper

$ curl -X POST http://localhost:7842/api/ingest/url \
    -H "Content-Type: application/json" \
    -d '{"url":"https://arxiv.org/abs/1706.03762"}'

{
  "source_type": "url",
  "title": "Attention Is All You Need",
  "source_url": "https://arxiv.org/abs/1706.03762",
  "id": "393d1cac-83d0-4ec9-88a3-8b43b0f607bc",
  "ingested_at": "2026-05-18T19:28:27",
  "compiled_at": null   ← compiling in background
}

Wiki & Knowledge Base ui api

Wiki Explorer

Browse articles with concept facets. Filter by topic, confidence level, page type. Full-text search with ranking.

Wiki explorer

Article Detail

Structured articles with Summary, Key Claims (with confidence), Analysis, Open Questions, Related links, and Sources. Table of contents, backlinks, and concept tags in sidebar.

Article detail

Key capabilities

Rich Content Rendering ui

Articles rendered with full rich content support: extracted PDF figures and tables, LaTeX math, syntax-highlighted code blocks, and sanitized HTML. Images extracted via Docling are embedded inline with captions.

PDF Figures in Article

5 figures extracted from "The Geometry of Forgetting" (arxiv 2604.06222) rendered in the article's Figures & Tables panel with filter tabs and lightbox zoom.

Figures panel in article view

PDF Image Extraction (Docling)

Figures extracted from PDFs via Docling/pymupdf, stored in Postgres, served via authenticated API.

PDF image rendering

Table Rendering

Tables from PDFs preserved and rendered as styled HTML with zebra rows.

Table rendering

Math & Code

KaTeX for LaTeX math. Syntax-highlighted code blocks with GitHub theme.

Math rendering

Ask & Query ui api cli

Conversational Q&A

Ask questions against your wiki. RAG-powered answers with citations. Conversation threading with history. Fork conversations to explore tangents.

Ask view

API & CLI

$ curl -X POST http://localhost:7842/api/query \
    -H "Content-Type: application/json" \
    -d '{"question":"How does BERT differ from GPT?"}'

{
  "answer": "BERT uses bidirectional attention...",
  "citations": [
    {"article": "BERT: Pre-training of...",
     "claim": "BERT pre-trains deep bidirectional
               representations..."}
  ],
  "conversation_id": "abc123"
}

# Streaming via SSE
POST /api/query/stream

# CLI
$ wikimind ask "How does BERT differ from GPT?"

Synthesis & Cross-Cutting Analysis ui api

4-Step Synthesis Wizard

Guided wizard: choose type (Comparative, Chronological, Thematic, Gap Analysis), select articles, add guidance, review draft.

Synthesis wizard

Auto-Detected Suggestions

System detects synthesis opportunities: shared concepts, active contradictions, same topic from different sources. One-click create.

Synthesis suggestions

Preview → Refine → Confirm workflow

Preview

POST /api/wiki/synthesis/preview
{
  "article_ids": ["bert","gpt","transformer"],
  "synthesis_type": "thematic",
  "guidance": "Focus on attention"
}

Returns draft without saving

Refine

POST /api/wiki/synthesis/refine
{
  "draft_content": "<previous>",
  "article_ids": [...],
  "guidance": "More detail on
               cross-attention"
}

Iterates with feedback

Confirm

POST /api/wiki/synthesis/confirm
{
  "title": "Attention Mechanisms",
  "draft_content": "...",
  "article_ids": [...]
}

Saves as real wiki article

API Evidence — Comparative synthesis across 3 arxiv papers

POST /api/wiki/synthesize
{ "query": "Compare transformer architectures", "synthesis_type": "comparative",
  "article_ids": ["bert-id", "gpt-id", "transformer-id"] }

{
  "title": "Comparative Analysis of Transformer Architectures: BERT, GPT-3, and Original Transformer",
  "themes": ["Bidirectional vs. Autoregressive Models", "Attention Mechanisms", "Task Versatility"],
  "source_count": 3,
  "page_type": "synthesis"
}

Export & Sharing ui api

Export Dropdown

Download as Markdown, Download as JSON, Copy as Markdown. Appears on every article detail page.

Export dropdown

Share with Expiry

Create public share links with configurable expiry: 1 day, 7 days, 30 days, or never. Track view count per link.

Share expiry

API Evidence

# Markdown export
GET /api/wiki/articles/{id}/export?format=markdown

HTTP/1.1 200 OK
content-type: text/markdown; charset=utf-8
content-disposition: attachment; filename="bert-...md"

---
title: "BERT: Pre-training of Deep Bidirectional..."
concepts: [language representation, NLP, transformers]
---

## Summary
BERT is a language representation model...
# Share link with 7-day expiry
POST /api/wiki/share-links
{ "article_id": "d65e8c6b-...", "expires_in_days": 7 }

{
  "token": "o8K1dltPkbfFT-c48...",
  "expires_at": "2026-05-25T19:29:53",
  "view_count": 0,
  "article_title": "BERT: Pre-training..."
}

# Full wiki export
POST /api/wiki/export/wiki
Formats: obsidian, markdown_json

Knowledge Graph ui api

Interactive Visualization

Force-directed graph of articles linked by relationships: contradicts, supersedes, extends, synthesizes, references. Filter by concept, confidence, page type. Click nodes to navigate.

Knowledge graph

Relationship Types

contradictsConflicting claims between articles
supersedesNewer article replaces older
extendsBuilds on another article
synthesizesCross-cutting analysis
referencesBacklinks / wikilinks
GET /api/wiki/graph

{ "nodes": [...], "edges": [...] }
Used by frontend GraphView component

Quality Assurance & Linting engine api

Automated wiki quality checks run on demand or via background jobs. Detects contradictions, orphaned articles, stale content, and missing links.

Contradiction Detection

LLM analyzes overlapping claims across articles. Surface conflicting statements with article context for resolution.

Orphan Detection

Finds articles with no inbound links. Suggests connections to related articles.

Staleness Tracking

Identifies articles not recompiled recently. Flags when source content has changed.

POST /api/lint/run          # Trigger lint
GET  /api/lint/reports       # List reports
GET  /api/wiki/contradictions # List contradictions with status
PATCH /api/wiki/contradictions/{id} # Resolve or dismiss

MCP Server — AI Agent Integration mcp api

Exposes WikiMind as an MCP server for Claude Desktop, Cursor, and other AI agents. Two transports: stdio (local) and HTTP (JWT-authenticated remote).

13 Tools

wiki_overviewStats
wiki_list_articlesBrowse
wiki_list_conceptsTaxonomy
wiki_searchFull-text
wiki_get_articleRead
wiki_askQ&A
wiki_ingest_urlAdd URL
wiki_ingest_textAdd text
wiki_get_source_statusProgress
wiki_synthesizeAnalyze
wiki_get_healthHealth
wiki_list_sourcesSources
wiki_get_graphGraph

3 Resources

wikimind://indexArticle TOC
wikimind://articles/{slug}Article content
wikimind://sources/{id}Source metadata

4 Prompts

wiki_onboardingOrientation
research_topicResearch workflow
compare_articlesComparison
knowledge_gapsGap analysis

Auth

OAuth 2.1 Authorization Server for Claude Desktop. JWT tokens for HTTP transport. Per-user access control.

# Start MCP server
$ wikimind mcp serve
$ wikimind mcp serve --transport http

# Claude Desktop config
$ wikimind mcp config

Admin Dashboard & Monitoring ui api

Admin Dashboard

System overview: users, articles, sources, concepts, claims, backlinks, orphans, compile rate. Content breakdown by page type, source type, status, and confidence. Operational health: queue depth, stuck sources, LLM traces.

Admin dashboard

Endpoints

GET  /admin/stats          # System statistics
GET  /admin/orphans        # Orphaned articles
GET  /admin/stuck-sources  # Stuck in compilation
POST /admin/retry-stuck/{id} # Retry
POST /admin/sweep          # Link sweep
POST /admin/reindex        # Rebuild search
GET  /admin/docling-status # PDF extractor status
GET  /admin/traces         # LLM trace logs
GET  /health/deep          # DB + service health

Settings & LLM Providers ui

LLM Provider Configuration

6 providers supported: Anthropic (Claude), OpenAI (GPT), Google (Gemini), Ollama (local), OpenAI-compatible, Mock (testing). Automatic fallback routing. Per-user cost tracking with monthly budget limits.

Settings

Cost Tracking

Real-time spend tracking per provider. Budget enforcement prevents runaway costs. API call counting and breakdown by task type (compilation, query, synthesis, lint).

Settings cost

Security & Auth security

Authentication

  • OAuth2: GitHub, Google
  • Magic Link: email-based passwordless
  • API Keys: long-lived tokens
  • MCP OAuth 2.1: dedicated flow
  • JWT session tokens

Data Isolation

  • All data scoped to authenticated user
  • No anonymous access (enforced)
  • Path traversal protection
  • PDF size limits (50 MB)
  • Field max_length validation

Rate Limiting

auth:   5/minute
query:  30/minute
ingest: 10/minute

Request 6: HTTP 429
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded:
                5 per 1 minute"
  }
}

CLI cli

$ wikimind status                              # Check server and auth
$ wikimind login                               # Magic link login
$ wikimind whoami                              # Show authenticated user

$ wikimind ingest url https://arxiv.org/abs/1706.03762  # Ingest URL
$ wikimind ingest file paper.pdf               # Ingest PDF
$ wikimind ingest text "Some content"          # Ingest text

$ wikimind ask "How does BERT work?"           # Ask against wiki
$ wikimind ask --conversation abc123 "And GPT?" # Continue conversation

$ wikimind wiki list                           # List articles
$ wikimind wiki list --concept transformers    # Filter by concept
$ wikimind wiki show bert-pre-training-of...   # View article
$ wikimind wiki delete some-article            # Delete (with confirmation)

$ wikimind mcp serve                           # Start MCP server (stdio)
$ wikimind mcp serve --transport http          # HTTP transport
$ wikimind mcp config                          # Print Claude Desktop config

Infrastructure

Stack

  • FastAPI (Python 3.11+)
  • React + TypeScript + Vite
  • PostgreSQL (SQLModel ORM)
  • Redis (job queue + caching)
  • ARQ (async background workers)
  • Alembic (schema migrations)

Deployment

  • Docker + Docker Compose
  • Fly.io (staging + production)
  • GHCR image registry
  • CI/CD: GitHub Actions
  • Staging → smoke test → prod
  • Automatic rollback on failure

Real-time

  • WebSocket for live updates
  • Compilation progress events
  • Draft ready notifications
  • SSE streaming for Q&A
  • Per-user message broadcasting

Full Endpoint Inventory (138 endpoints)

AreaCountKey Endpoints
Wiki Management13GET/PATCH /articles/{id}, GET /concepts, GET /search, GET /graph
Content Ingestion11POST /ingest/url|pdf|text, GET /sources/{id}/detail, RSS feeds
Ambient Capture7POST /capture/{kind}, POST /capture/{id}/ingest|discard
Query & Conversations8POST /query, POST /query/stream, GET /conversations/{id}, fork, file-back
Synthesis6POST /synthesize, preview, refine, confirm, GET /suggestions
Quality / Linting8POST /lint/run, GET /contradictions, PATCH /contradictions/{id}
Drafts & Schemas8GET /sources/{id}/draft, POST /draft/approve|reject, CRUD schemas
Tags & Searches8POST /tags, POST /saved-searches, execute
Export & Sharing6GET /articles/{id}/export, POST /share-links, GET /public/articles/{token}
Jobs5GET /jobs, POST /jobs/compile/{id}, lint, reindex
Settings & Auth17OAuth, magic-link, API keys, MCP tokens, LLM config, cost tracking
Admin9GET /admin/stats, orphans, stuck sources, traces, sweep, reindex

All Screenshots

Inbox

3 arxiv papers ingested and compiled

Inbox

Wiki Explorer

Articles with concept facets

Wiki

Article Detail

Export, Share, Edit buttons. Backlinks sidebar.

Article

Export Dropdown

Markdown, JSON, clipboard copy

Export

Share with Expiry

1 day, 7 days, 30 days, Never

Share

Synthesis Wizard

4-step guided synthesis creation

Synthesis

Ask / Query

Conversational Q&A with history

Ask

Knowledge Graph

Articles connected by synthesis links

Graph

Source Detail

Processing pipeline: Fetch → Extract → Clean → Compile

Source

Admin Dashboard

System stats, content breakdown, operational health

Admin

Settings

LLM providers and cost tracking

Settings

Settings (API Tokens)

Token management and cost dashboard

Tokens

PDF Figures in Article

5 figures from arxiv PDF in Figures & Tables panel

Figures panel

Rich Content: Images

Docling-extracted figures with captions

PDF images

Rich Content: Tables & Math

Styled tables, KaTeX math, syntax-highlighted code

Tables

API Test Results 140 tests

Automated test of 138 API endpoints. Idempotent script creates test data and cleans up after itself. Endpoints that trigger LLM calls, require browser OAuth, or are destructive are skipped intentionally.

Run: ./api-test.sh  |  View script source  |  Standalone results page

89
Pass
0
Fail
51
Skip
140
Total
0. Health & Connectivity
StatusMethodPathCode
PASSGET/health200
PASSGET/health/deep200
1. Authentication (4 pass, 6 skip)
StatusMethodPathCode
PASSGET/auth/me200
PASSPOST/auth/magic-link200
PASSGET/auth/tokens200
PASSGET/auth/tokens.js200
SKIPOAuth login, callback, magic-link verify, create token, logout, delete accountbrowser/destructive
2. Content Ingestion (8 pass, 4 skip)
StatusMethodPathCode
PASSGET/api/ingest/sources200
PASSGET/api/ingest/sources/{id}200
PASSGET/api/ingest/sources/{id}/detail200
PASSGET/api/ingest/sources/{id}/content200
PASSGET/api/ingest/sources/{id}/images200
PASSPOST/api/ingest/text200
PASSGET/api/ingest/sources/{pdf_id}/images200
PASSGET/api/ingest/sources/{pdf_id}/images/picture-1.png200
SKIPIngest URL, ingest PDF, get original, delete sourceLLM cost/destructive
3. Draft Review (1 pass, 2 skip)
StatusMethodPathCode
PASSGET/api/ingest/sources/{id}/draft404
SKIPApprove draft, reject draftrequires pending draft
4. Wiki & Knowledge Base (11 pass, 5 skip)
StatusMethodPathCode
PASSGET/api/wiki/articles200
PASSGET/api/wiki/articles?page_type=source&limit=5200
PASSGET/api/wiki/articles/{slug}200
PASSGET/api/wiki/articles/{id}200
PASSGET/api/wiki/articles/{slug}/relationships200
PASSGET/api/wiki/articles/{id}/tags200
PASSGET/api/wiki/articles/random200
PASSGET/api/wiki/search?q=transformer200
PASSGET/api/wiki/search/facets?q=transformer200
PASSGET/api/wiki/wikilinks/resolve?q=attention200
PASSGET/api/wiki/graph200
SKIPWiki health, create stub, edit, refresh, recompiledeprecated/mutating
5. Concept Taxonomy (3 pass, 1 skip)
StatusMethodPathCode
PASSGET/api/wiki/concepts200
PASSGET/api/wiki/concepts/{name}200
PASSGET/api/wiki/concepts/{name}/articles200
SKIPRebuild taxonomyLLM call
6. Contradictions (2 pass, 2 skip)
StatusMethodPathCode
PASSGET/api/wiki/contradictions200
PASSGET/api/wiki/contradiction-resolutions200
SKIPGet/resolve contradictionnone found / mutating
7. Export & Download (3 pass, 2 skip)
StatusMethodPathCode
PASSGET/api/wiki/articles/{id}/export?format=markdown200
PASSGET/api/wiki/articles/{id}/export?format=json200
PASSGET/api/wiki/articles/{id}/export?format=csv422
SKIPExport PDF, full wiki exportheavy operation
8. Sharing & Public Access (6 pass)
StatusMethodPathCode
PASSGET/api/wiki/share-links200
PASSPOST/api/wiki/share-links201
PASSGET/public/articles/{token}200
PASSGET/public/articles/{token}/json200
PASSGET/api/wiki/share-links?article_id={id}200
PASSGET/public/articles/nonexistent-token404
9. Synthesis (4 pass, 3 skip)
StatusMethodPathCode
PASSGET/api/wiki/synthesis200
PASSGET/api/wiki/synthesis/suggestions200
PASSGET/api/wiki/synthesis/suggestions?limit=3200
PASSPOST/api/wiki/synthesis/preview200
SKIPRefine, confirm, create (direct)LLM call / persistent
10. Query & Conversations (4 pass, 5 skip)
StatusMethodPathCode
PASSGET/api/query/conversations200
PASSGET/api/query/history?limit=5200
PASSGET/api/query/conversations/{id}200
PASSGET/api/query/conversations/{id}/export200
SKIPAsk, stream, fork, file-back, crystallizeLLM call
11. Tags (5 pass — full CRUD cycle)
StatusMethodPathCode
PASSGET/api/tags200
PASSPOST/api/tags201
PASSPOST/api/wiki/articles/{id}/tags201
PASSGET/api/tags/{id}/articles200
PASSDELETE/api/wiki/articles/{id}/tags/{tag_id}204
12. Saved Searches (3 pass — full CRUD cycle)
StatusMethodPathCode
PASSGET/api/saved-searches200
PASSPOST/api/saved-searches201
PASSPOST/api/saved-searches/{id}/execute200
13. Compilation Schemas (4 pass — full CRUD cycle)
StatusMethodPathCode
PASSGET/api/compilation-schemas200
PASSPOST/api/compilation-schemas201
PASSGET/api/compilation-schemas/{id}200
PASSPATCH/api/compilation-schemas/{id}200
14. Ambient Capture (3 pass, 3 skip)
StatusMethodPathCode
PASSGET/api/capture200
PASSGET/api/capture/rss/feeds200
PASSPOST/api/capture/clipboard200
SKIPIngest capture, subscribe RSS, poll RSScompilation/external
15-16. Jobs & Linting (3 pass, 5 skip)
StatusMethodPathCode
PASSGET/api/jobs200
PASSGET/api/lint/reports200
PASSGET/api/lint/reports/latest404
SKIPTrigger compile/lint/reindex, dismiss findingLLM call / mutating
17. Settings & Configuration (4 pass, 3 skip)
StatusMethodPathCode
PASSGET/api/settings200
PASSGET/api/settings/llm/cost200
PASSGET/api/settings/llm/cost/breakdown200
PASSGET/api/settings/onboarding-status200
SKIPSet provider, update settings, test LLMconfig change / external
18-20. API Keys, MCP Tokens & OAuth (3 pass, 8 skip)
StatusMethodPathCode
PASSGET/api/settings/api-keys200
PASSGET/api/settings/mcp-tokens200
PASSGET/.well-known/oauth-authorization-server200
SKIPSet/delete API key, create/revoke MCP token, OAuth flowsecrets / browser
21. Admin Dashboard (6 pass, 3 skip)
StatusMethodPathCode
PASSGET/api/admin/stats200
PASSGET/api/admin/orphans200
PASSGET/api/admin/concepts/eligible200
PASSGET/api/admin/stuck-sources200
PASSGET/api/admin/docling-status200
PASSGET/api/admin/traces200
SKIPRetry stuck, sweep, reindexmutating
22. Rate Limiting (1 pass)
StatusMethodPathCode
PASSPOST/auth/magic-link429
23. Error Handling (3 pass)
StatusMethodPathCode
PASSGET/api/nonexistent200
PASSGET/api/wiki/articles/nonexistent-slug404
PASSPOST/api/ingest/text (empty body)422
Cleanup (6 pass — all test artifacts removed)
StatusMethodPathCode
PASSDELETE/api/wiki/share-links/{id}204
PASSDELETE/api/tags/{id}204
PASSDELETE/api/saved-searches/{id}204
PASSDELETE/api/compilation-schemas/{id}204
PASSPOST/api/capture/{id}/discard200
PASSDELETE/api/ingest/sources/{id}200