# πŸ”Ž QuickCite for Obsidian ![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg) ![Obsidian Plugin](https://img.shields.io/badge/Obsidian-Plugin-7c3aed.svg) ![Version](https://img.shields.io/badge/version-0.1.0-green.svg) > **Instant inline fact-checking and verified markdown citations under your cursor β€” without breaking flow.** QuickCite turns any selection or thought into a properly cited, fact-checked reference in seconds. Hit the hotkey, search the web, and drop a sequential markdown footnote into your note. Optionally, let an LLM tell you whether the sources actually *support* your claim β€” before you cite it. --- ## ✨ Features | | | |---|---| | πŸ” **Zero-Config Web Search** | Powered by DuckDuckGo with a resilient 3-layer strategy (HTML β†’ Lite β†’ Instant Answer API). **No API keys required** β€” it works out of the box. | | 🧠 **AI Fact-Checking (Optional)** | Add an OpenRouter key (or point at a local Ollama / OpenAI-compatible endpoint) to get instant confidence scores, verdict notices, and color-coded `[βœ“ Verified]` badges on every suggestion. | | ⚑ **Auto Sequential Footnotes** | Inserts `[^1]`, `[^2]`, … inline at your cursor and appends a formatted reference (title + domain link) at the bottom of the note. Never manage footnote numbering by hand again. | | 🌐 **In-Modal Article Reader (⇧↡)** | Open any highlighted result in your default browser to read the full article β€” without dismissing the modal β€” then come back and cite it. | | ♾️ **Infinite Scroll** | Scroll near the bottom of results and the next page loads automatically. A persistent footer tells you when you've reached the end. | | ✏️ **Editable Query** | The modal opens pre-filled with your selected text, fully selected β€” type to replace it instantly, or backspace to refine. | ## ⌨️ Keyboard Shortcuts | Shortcut | Action | |---|---| | `Ctrl/Cmd + Shift + C` | Open QuickCite (fact-check selection / insert citation) | | `↑` / `↓` | Navigate search results | | `Enter` | Insert footnote citation at cursor | | `Shift + Enter` | Open highlighted result in browser | | `Esc` | Dismiss the modal | ## πŸš€ Installation ### From Community Plugins (when published) 1. Open **Settings β†’ Community plugins** in Obsidian. 2. Click **Browse** and search for **QuickCite**. 3. Click **Install**, then **Enable**. ### Manual Installation 1. Download `main.js`, `manifest.json`, and `styles.css` from the [latest release](https://github.com/ismailsaoulaj/quickcite/releases). 2. Create the folder `/.obsidian/plugins/quickcite/`. 3. Copy the three files into it. 4. Reload Obsidian and enable **QuickCite** under **Settings β†’ Community plugins**. ### Building from Source ```bash git clone https://github.com/ismailsaoulaj/quickcite.git cd quickcite npm install npm run build # type-checks and bundles src/main.ts β†’ main.js npm run dev # watch mode for development ``` Then symlink or copy `main.js`, `manifest.json`, and `styles.css` into your vault's plugin folder. ## βš™οΈ Configuration QuickCite works with **zero configuration** for search. Optional settings live under **Settings β†’ QuickCite**: | Setting | Description | |---|---| | **OpenRouter API Key** | Optional. Enables AI fact-checking. Get one free at [openrouter.ai](https://openrouter.ai/). Leave empty to use QuickCite as a pure citation tool. | | **Model** | Any OpenRouter model ID (default: `openai/gpt-4o-mini`). | | **Base URL** | Any OpenAI-compatible endpoint. Point it at `http://localhost:11434/v1` for local [Ollama](https://ollama.com/) models, or LM Studio β€” no cloud required. | When AI fact-checking is active, each result row displays a badge: - 🟒 **βœ“ Verified** β€” sources support the claim - πŸ”΄ **βœ— Contradicted** β€” sources refute the claim - 🟑 **? Unclear** β€” inconclusive evidence …plus a notice with confidence percentage and a short explanation. Cited footnotes include the verdict inline. ## πŸ› οΈ How It Works ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” Ctrl+Shift+C β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Selection / β”‚ ───────────────▢ β”‚ SuggestModal β”‚ β”‚ cursor text β”‚ β”‚ (editable input) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ debounced query (350 ms) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DuckDuckGoService β”‚ β”‚ 1. HTML 2. Lite 3. API β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ SearchResult[] { title, url, snippet } β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ optional LLMService verification β”‚ β”‚ β†’ verdict Β· confidence Β· citations β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Enter β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ [^n] ref at cursor β”‚ β”‚ [^n]: def at bottom β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ“„ License [MIT](LICENSE) Β© 2026 [Ismail Saoulaj](https://github.com/ismailsaoulaj)