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, slugmeilisearch, "Search" category (Search & Discovery tab,searchicon,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(defaulthttp://127.0.0.1:7700,rtrim '/'),master_key(never exposed — onlymaster_key_maskedsubstr(0,4)…substr(-4)+master_key_setflag),auto_index(true),enabled(true),indexes(['tasks','plugins']). - HTTP (
meili_request) — cURL with custom method andAuthorization: Bearer <key>; 60s timeout, 5s connect; error extracted fromdata.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 viaPOST /indexeswithuid+primaryKey(409 = already exists),PATCH /settingsapplied and each task awaited (poll/tasks/{uid}every 200ms). - Safe IDs (
meili_safe_id) — Meilisearch primary keys accept only[a-zA-Z0-9_-]; NEXUS IDs contain.and become_, keeping the originalnexus_idin the doc (fallbackdoc_<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, optionallimit, upload in 500-doc chunks awaiting each task (90s timeout);last_indexmeta (at, indexed, what, errors) persisted. - Auto-index (
meili_index_one_task) — on-demand indexing through the internal API respectingenabled+auto_index; task reads themselves are no-op (legacy filter disabled — avoids index flooding). - Search (
meilisearch_search) —q,index(tasks/pluginswhitelist),limit1–50 (default 20),offset,ANDfilter with escaping (status/projectstrings,priorityint,activebool), sort default:desc; task hits returnnexus_idasid(withmeili_idkept); recent searches deduplicated byindex|q(max 40) andestimatedTotalHits+processingTimeMsin the result. - Suggestions (
meilisearch_suggest) — top 8–10; tasks with#seq titlelabel (+ status/project), plugins withname (slug)and slug value. - Fastr
/search(meilisearch_fastr) — markdown comment: numbered list (pluginsname (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-600accents), 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).
- 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.
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…XXXXmask in the panel). - Friendly results: task hits come back with
nexus_idasid(the sanitizedmeili_idis preserved). - Traceability: deduplicated recent searches (30 on the dashboard) and indexing metadata (
last_index). - Slash
/searchin chat: markdown results in the comment with hit count and processing time.
GitHub progress (issues)
Real-time panel with latest repository issues.
live feed
open issues on GitHubcarregando andamento...
não foi possivel carregar as issues agora. abra no github pelo link acima.
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
- PHP 8
- MySQL 8
- Alpine.js
- Tailwind CSS
- cURL
- Meilisearch API
- Plugin NEXUS
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.