Cover image for project: NEXUS Meilisearch IN PROGRESS

Technical summary

NEXUS plugin that integrates Meilisearch (open-source, self-hosted Docker search engine) for typo-tolerant full-text search over tasks and plugins — with autocomplete, filters (status, project, priority), sorting and batch or on-demand auto-indexing, with no cost per search.

Executed scope

  • plugin.json: v1.0.0, slug meilisearch, "Search" category (Search & Discovery tab, search icon, is_core: false).
  • Self-hosted stack: Meilisearch instance via Docker Compose exposed at http://127.0.0.1:7700 — no cost per search; Master Key configurable in the panel.
  • Settings (DB::getConfig('plugin.meilisearch')): api_url (default http://127.0.0.1:7700, rtrim '/'), master_key (never exposed — only master_key_masked substr(0,4)…substr(-4) + master_key_set flag), auto_index (true), enabled (true), indexes (['tasks','plugins']).
  • HTTP (meili_request) — cURL with custom method and Authorization: Bearer <key>; 60s timeout, 5s connect; error extracted from data.message.
  • Health (meilisearch_dashboard) — /health (online = 'available' status), /version, /stats, /indexes?limit=50, recent searches (30) and last index, all in one payload.
  • Indexes (meili_ensure_index) — created via POST /indexes with uid + primaryKey (409 = already exists), PATCH /settings applied and each task awaited (poll /tasks/{uid} every 200ms).
  • - tasks: searchable title, description, notes, project, nexus_id, id · filterable status, project, priority, holding, type · sortable updated_at, created_at, priority, seq. - plugins: searchable name, slug, description, category, author · filterable category, active, type · sortable name, slug.

  • Safe IDs (meili_safe_id) — Meilisearch primary keys accept only [a-zA-Z0-9_-]; NEXUS IDs contain . and become _, keeping the original nexus_id in the doc (fallback doc_<md5>).
  • Documents — tasks: id, nexus_id, seq, title, description (strip_tags, 8000), notes (2000), project, priority, status, holding, created_at, updated_at, type; plugins: name, slug, description, category, version, author, active, type.
  • Indexing (meilisearch_index) — what: all|tasks|plugins, optional limit, upload in 500-doc chunks awaiting each task (90s timeout); last_index meta (at, indexed, what, errors) persisted.
  • Auto-index (meili_index_one_task) — on-demand indexing through the internal API respecting enabled + auto_index; task reads themselves are no-op (legacy filter disabled — avoids index flooding).
  • Search (meilisearch_search) — q, index (tasks/plugins whitelist), limit 1–50 (default 20), offset, AND filter with escaping (status/project strings, priority int, active bool), sort default :desc; task hits return nexus_id as id (with meili_id kept); recent searches deduplicated by index|q (max 40) and estimatedTotalHits + processingTimeMs in the result.
  • Suggestions (meilisearch_suggest) — top 8–10; tasks with #seq title label (+ status/project), plugins with name (slug) and slug value.
  • Fastr /search (meilisearch_fastr) — markdown comment: numbered list (plugins name (slug) — category; tasks #seq title — status · project + id:), _hits≈N · Xms_ footer.
  • API: 6 actions (meilisearch_dashboard, meilisearch_search, meilisearch_suggest, meilisearch_index, meilisearch_settings_save, meilisearch_fastr).
  • Alpine.js UI (tab.php) — slate theme (gray + cyan-600 accents), Search & Discovery tab; Online/Offline badge; 4 stat cards (Indexes, DB Docs, Tasks idx, Plugins idx); 4 sub-tabs (Search, Indexes, Index, Settings); highlighted search, hints when the index is empty, Index all button and masked Master Key in settings.
  • No cron, no migrations, no modals and no i18n (Portuguese texts).

Stack and tools

  • PHP 8 (no framework)
  • MySQL 8 (config via DB::getConfig('plugin.meilisearch') + recent searches)
  • Alpine.js + Tailwind CSS (premium light, slate/cyan)
  • cURL (60s timeout, 5s connect, Bearer auth)
  • Meilisearch API (self-hosted, http://127.0.0.1:7700 — /health, /version, /stats, /indexes, /tasks, /search)
  • NEXUS plugin system (PluginManager: tabs, API actions, Fastr, filters)

Operational tags

  • Meilisearch
  • Full-Text Search
  • Typo Tolerance
  • Autocomplete
  • Search Engine
  • Self-Hosted
  • Plugin NEXUS

Operational result

  • Instant, typo-tolerant search: native Meilisearch typo-tolerance with field highlighting, filters and sorting — at no API cost.
  • Two indexing modes: full batch (tasks/plugins/all, 500-doc chunks) or on-demand auto-index on every task change.
  • Zero secret exposure: the Master Key never leaves the backend (only the XXXX…XXXX mask in the panel).
  • Friendly results: task hits come back with nexus_id as id (the sanitized meili_id is preserved).
  • Traceability: deduplicated recent searches (30 on the dashboard) and indexing metadata (last_index).
  • Slash /search in chat: markdown results in the comment with hit count and processing time.

GitHub progress (issues)

Real-time panel with latest repository issues.

abertas (amostra): -- fechadas (amostra): -- base: -- ultimas issues

carregando andamento...

Real results

NEXUS plugin that integrates Meilisearch (open-source, self-hosted Docker search engine) for typo-tolerant full-text search over tasks and plugins — with autocomplete, filters (status, project, priority), sorting and batch or on-demand auto-indexing, with no cost per search.

Architecture and organization

Execution and operations

The project follows reproducible execution flow with technical validation in production-like environments.

Screenshots

Talk about this project

Apply this implementation pattern in your environment and accelerate delivery with technical consistency.