{"_id":"@alexzeitler/lazyqmd","_rev":"4-3a7e671746755d4af1bccf5188782eb1","name":"@alexzeitler/lazyqmd","dist-tags":{"latest":"0.6.3"},"versions":{"0.6.1":{"name":"@alexzeitler/lazyqmd","version":"0.6.1","_id":"@alexzeitler/lazyqmd@0.6.1","maintainers":[{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"}],"bin":{"lazyqmd":"lazyqmd"},"dist":{"shasum":"118156b3fc7e4d803e5f526a92a4d5d4f1832dc3","tarball":"https://registry.npmjs.org/@alexzeitler/lazyqmd/-/lazyqmd-0.6.1.tgz","fileCount":19,"integrity":"sha512-UJU+PdFKQeCdqwz4bJ3mRM9Py9fmBYWhyFqxT58z/vo50uLx3Jj31T6YBF+wtenBzNvPlTiiWdkY+4ThfszQ6A==","signatures":[{"sig":"MEQCIHNnko6VplOyzD49ygZCETfOqV3ndv5YIhjgabjhuQofAiBvF+1yY/1jA4cfySRVsUBrE5VYbu8bujdhOqxe6j1Kxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101700},"type":"module","gitHead":"e1dda687c78a10517b79a31df22382658e067a43","_npmUser":{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"},"_npmVersion":"10.9.2","description":"A terminal UI for browsing, searching, and previewing [qmd](https://github.com/tobi/qmd) document collections. Built with [Bun](https://bun.sh) and [@opentui/core](https://github.com/anomalyco/opentui).","directories":{},"_nodeVersion":"22.16.0","dependencies":{"yaml":"^2.8.2","marked":"^17.0.2","@opentui/core":"^0.1.79","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/lazyqmd_0.6.1_1774457894576_0.8069743796100757","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@alexzeitler/lazyqmd","version":"0.6.2","_id":"@alexzeitler/lazyqmd@0.6.2","maintainers":[{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"}],"bin":{"lazyqmd":"lazyqmd"},"dist":{"shasum":"77ca1fc01f2f2cdf83f8d5c588be445c908d9cbc","tarball":"https://registry.npmjs.org/@alexzeitler/lazyqmd/-/lazyqmd-0.6.2.tgz","fileCount":19,"integrity":"sha512-UZ/U19FZlT8S99oZkmVohJL9iU1ERzWkwQrlBSr18A/xjygz4OPzXym7fNHEN8/qdN41EMes6l2k5KPmkZHh7Q==","signatures":[{"sig":"MEUCIFu/Ct+sUOABDJmW4gDfczjoHFODJVOt9K1rPc87Ae7YAiEAqlf7jrqO4dVvOswfoXQSIDUx0f1f+iOhJfBtNjFyYxE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101659},"type":"module","gitHead":"26a8fc2991f908fe89505f418d2f3625cb5a6baf","_npmUser":{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"},"_npmVersion":"10.9.2","description":"A terminal UI for browsing, searching, and previewing [qmd](https://github.com/tobi/qmd) document collections. Built with [Bun](https://bun.sh) and [@opentui/core](https://github.com/anomalyco/opentui).","directories":{},"_nodeVersion":"22.16.0","dependencies":{"yaml":"^2.8.2","marked":"^17.0.2","@opentui/core":"^0.1.79","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/lazyqmd_0.6.2_1774712965263_0.44733654423180846","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@alexzeitler/lazyqmd","version":"0.6.3","type":"module","bin":{"lazyqmd":"lazyqmd"},"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^5"},"dependencies":{"@modelcontextprotocol/sdk":"^1.26.0","@opentui/core":"^0.1.79","marked":"^17.0.2","yaml":"^2.8.2"},"_id":"@alexzeitler/lazyqmd@0.6.3","gitHead":"26efe09c6e05fa0d8e74f376cd660ebf83dcdffa","description":"A terminal UI for browsing, searching, and previewing [qmd](https://github.com/tobi/qmd) document collections. Built with [Bun](https://bun.sh) and [@opentui/core](https://github.com/anomalyco/opentui).","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-FRSJTs76jyvYhNomjb8MiQfGgS2r/gB25yd1R+AIpFrr2YmyRu8G5SwRwI2bSDxccJO5wwnfdu4EnuyJpqut3A==","shasum":"4a96c44a920a61d17107ea9528bd03d548592e63","tarball":"https://registry.npmjs.org/@alexzeitler/lazyqmd/-/lazyqmd-0.6.3.tgz","fileCount":19,"unpackedSize":103694,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCUA9IpAt7rv4nvKDo/l6SbxLEydxYZgLO/zzMNm0sMfwIhAI5u73P05xByM580pWIgnr5VNGRRBuPCPUuK0lAmSLQE"}]},"_npmUser":{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"},"directories":{},"maintainers":[{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lazyqmd_0.6.3_1774713803866_0.20585090705727538"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-25T16:58:14.575Z","modified":"2026-03-28T16:03:24.141Z","0.6.1":"2026-03-25T16:58:14.729Z","0.6.2":"2026-03-28T15:49:25.400Z","0.6.3":"2026-03-28T16:03:24.025Z"},"description":"A terminal UI for browsing, searching, and previewing [qmd](https://github.com/tobi/qmd) document collections. Built with [Bun](https://bun.sh) and [@opentui/core](https://github.com/anomalyco/opentui).","maintainers":[{"name":"alexzeitler","email":"alexander.zeitler@pdmlab.com"}],"readme":"# lazyqmd\n\nA terminal UI for browsing, searching, and previewing [qmd](https://github.com/tobi/qmd) document collections. Built with [Bun](https://bun.sh) and [@opentui/core](https://github.com/anomalyco/opentui).\n\n![](https://github.com/alexzeitler/lazyqmd/raw/master/assets/lazyqmd-search-tmux-results.png)\n\n## Requirements\n\n- [Bun](https://bun.sh) runtime\n- [qmd](https://github.com/tobi/qmd) CLI (v2.0.1+) installed and configured with at least one collection\n- A Chromium-based browser for live preview, detected automatically in this order: `google-chrome`, `google-chrome-stable`, `chromium`, `chromium-browser`, `brave`, `brave-browser`\n\n## Install\n\n```sh\nbun install -g @alexzeitler/lazyqmd\n```\n\nThen run:\n\n```sh\nlazyqmd\n```\n\n### Update\n\n```sh\nlazyqmd self-update\n```\n\n### From Source\n\n```sh\ngit clone https://github.com/alexzeitler/lazyqmd.git\ncd lazyqmd\nbun install\nbun src/index.ts\n```\n\n## Keyboard Shortcuts\n\n### Collections (Sidebar)\n\n| Key | Action |\n|-----|--------|\n| `j/k` or arrows | Navigate collections |\n| `Enter` | Open collection |\n| `Tab` | Switch focus between sidebar and main panel |\n| `/` or `s` | Open search |\n| `f` | Browse files in collection |\n| `a` | Add collection |\n| `d` | Delete collection |\n| `r` | Rename collection |\n| `x` | Edit context for selected collection |\n| `c` | Run cleanup (clear caches, vacuum DB) |\n| `e` | Create embeddings |\n| `u` | Re-index all collections (`qmd update`) |\n| `q` | Quit |\n\n### Search\n\n| Key | Action |\n|-----|--------|\n| `Enter` | Execute search / Open document |\n| `Tab` | Toggle focus between input and results |\n| `Ctrl+T` | Cycle search mode: Search → Vector → Query |\n| `Ctrl+F` | Toggle full document output (vs. snippet) |\n| `Ctrl+E` | Toggle explain (show score traces in results) |\n| `Ctrl+A` | Toggle all matches (no result limit) |\n| `Ctrl+S` | Cycle min-score filter: off → 0.3 → 0.5 → 0.7 → 0.9 |\n| `Ctrl+L` | Cycle candidate limit: auto → 10 → 20 → 40 → 80 → 200 |\n| `Esc` | Back to collections |\n\nSearch scope follows the sidebar selection — select \"All\" to search across all collections, or select a specific collection to scope the search.\n\nActive search options are displayed below the search input. Enabled options are highlighted, disabled ones are dimmed.\n\n#### Search Modes\n\n- **Search** — Full-text BM25 keyword search (fast, no LLM)\n- **Vector** — Vector similarity search (requires `qmd embed`)\n- **Query** — Hybrid search with automatic query expansion and reranking (recommended, uses LLM)\n\n#### Structured Queries\n\nIn any mode, you can type structured query prefixes directly in the search input. These are automatically routed to the Query engine:\n\n| Prefix | Description |\n|--------|-------------|\n| `lex: <terms>` | BM25 keyword search |\n| `vec: <terms>` | Vector similarity search |\n| `hyde: <text>` | Hypothetical Document Embedding — LLM generates a hypothetical answer and searches for similar documents |\n| `expand: <query>` | Explicit query expansion |\n\nCombine multiple query types with `\\n`:\n\n```\nlex: htmx\\nvec: web components\n```\n\n#### Search Options\n\n| Option | Shortcut | Description |\n|--------|----------|-------------|\n| **full** | `Ctrl+F` | Return full document body instead of snippet |\n| **explain** | `Ctrl+E` | Show score breakdown in results (rerank score, blended score, RRF). Works best with Query mode. |\n| **all** | `Ctrl+A` | Return all matches instead of top 20. Combine with min-score to filter. |\n| **min-score** | `Ctrl+S` | Only show results above the threshold (0.3–0.9). Useful with `all` to get all high-quality matches. |\n| **candidate limit** | `Ctrl+L` | Max candidates to rerank (default: auto/40). Lower = faster, higher = better quality. |\n\n### Context\n\nEach collection can have a context — a short description that helps qmd understand what the collection contains, improving query expansion and search quality.\n\nPress `x` in the sidebar (with a collection selected) to edit the context. Enter saves, empty input deletes, Esc cancels. The current context is shown in the collection detail view.\n\n### File Browser\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Toggle focus between filter and file list |\n| `Enter` | Open file |\n| `Esc` | Back |\n\nType in the filter input for fuzzy matching on file paths.\n\n### Document\n\n| Key | Action |\n|-----|--------|\n| `j/k` | Scroll |\n| `e` | Open in `$EDITOR` |\n| `p` | Open live preview in Chrome |\n| `Esc` | Back |\n\n![](https://github.com/alexzeitler/lazyqmd/raw/master/assets/lazyqmd-neovim.png)\n\n![](https://github.com/alexzeitler/lazyqmd/raw/master/assets/lazyqmd-html-preview.png)\n\n### Live Preview\n\nPressing `p` in document view opens a rendered HTML preview in Chrome. The preview:\n\n- Renders Markdown with frontmatter metadata\n- Displays images and assets from the source directory\n- Auto-reloads when the source file is saved\n\n## Theming\n\nlazyqmd uses [Tokyo Night](https://github.com/enkia/tokyo-night-vscode-theme) as the default color scheme. Colors are configurable and follow a three-layer cascade:\n\n1. **Defaults** — Tokyo Night built-in\n2. **Omarchy** — Auto-detected from `~/.config/omarchy/current/theme/colors.toml` (if present)\n3. **Config** — User overrides in `options.json`\n\n### Configurable Colors\n\nAdd a `theme` section to your config to override any color:\n\n```json\n{\n  \"mcpPort\": 8181,\n  \"theme\": {\n    \"accent\": \"#7aa2f7\",\n    \"foreground\": \"#c0caf5\",\n    \"background\": \"#1a1b26\",\n    \"muted\": \"#565f89\",\n    \"error\": \"#f7768e\",\n    \"success\": \"#9ece6a\",\n    \"warning\": \"#e0af68\",\n    \"title\": \"#7aa2f7\",\n    \"selection_bg\": \"#2a2d3e\",\n    \"selection_fg\": \"#c0caf5\",\n    \"selection_desc\": \"#565f89\",\n    \"border_active\": \"#3b4261\",\n    \"border_inactive\": \"#292e42\",\n    \"heading\": \"#bb9af7\",\n    \"strong\": \"#e0af68\",\n    \"italic\": \"#e0af68\",\n    \"code\": \"#9ece6a\",\n    \"link\": \"#7dcfff\",\n    \"link_url\": \"#7aa2f7\",\n    \"list\": \"#7aa2f7\"\n  }\n}\n```\n\n## Local Index Support\n\nlazyqmd supports project-local qmd indexes. When you run `lazyqmd` from a directory containing a `.qmd/index.yml`, it automatically uses that local index instead of the global one at `~/.cache/qmd/`.\n\nThis allows per-repository collections and a separate SQLite index, managed independently from the global setup. See [davidgasquez/dotfiles@5de0ae7](https://github.com/davidgasquez/dotfiles/commit/5de0ae7112ecc4c3377083ce3485477dc860894c) for the reference implementation of local qmd indexes.\n\n### Setup\n\nCreate a `.qmd/` directory in your project root with an `index.yml`:\n\n```\nmyproject/\n├── .qmd/\n│   ├── index.yml        # Collection definitions (check into git)\n│   ├── index.sqlite     # Generated index (add to .gitignore)\n│   └── external/        # Cloned external repos (add to .gitignore)\n```\n\nExample `index.yml`:\n\n```yaml\ncollections:\n  myproject:\n    path: /absolute/path/to/project\n    pattern: \"**/*.md\"\n    context:\n      \"\": Description of the project for LLM context\n```\n\nRecommended `.gitignore`:\n\n```gitignore\n.qmd/*\n!.qmd/index.yml\n```\n\nWhen lazyqmd detects a local index, it prints a message on startup and all commands (`u` for update, search, etc.) operate on the local index.\n\n## Configuration\n\nConfig file: `~/.config/lazyqmd/options.json`\n\n```json\n{\n  \"mcpPort\": 8181\n}\n```\n\n## CLI\n\n```sh\nlazyqmd              # Start the TUI\nlazyqmd --version    # Print version\nlazyqmd self-update  # Update to latest release\n```\n","readmeFilename":"README.md"}