Contributing
MeiliOps is MIT licensed and contributions are welcome. The whole app is TypeScript; you don't need to know Rust.
Prerequisites
- Node.js 20 or newer
- Rust via rustup (only to build the desktop shell; you won't edit Rust)
- Windows: the MSVC C++ build tools. WebView2 ships with Windows 11.
- macOS: Xcode command line tools
- Linux:
libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libdbus-1-dev
Run it
bash
cd app
npm install
npm run dev # UI only, in a browser at http://localhost:1420
npm run tauri dev # the desktop app, with hot reloadThe browser mode is the fastest loop for UI work. It stores API keys in localStorage (insecure, development only) and can't run local instances.
For a server to point it at, run Meilisearch locally, for example with the local instance manager in the desktop app, or:
bash
meilisearch --http-addr 127.0.0.1:7711 --experimental-enable-metrics --experimental-enable-logs-route --experimental-enable-tasks-streaming-routeBefore you open a pull request
bash
npm run typecheck
npm run coverage -- --strictCI runs the same two checks. coverage --strict fails when a stable Meilisearch operation has no screen.
Conventions
- API calls go through
api().req("METHOD", "/literal/path", …). The path must be a string literal from the generated OpenAPI types: that's what gives compile-time checking and lets the coverage script find every call. - Styling uses the design tokens at the top of
src/styles.css(--bg*,--fg*,--accent*,--control-h). No raw colors in components; both themes must work. - Icons come from
src/components/icons.ts(Lucide). Add new ones there; don't use Unicode glyphs as icons. - Long-running async work pins the client before its first
await(const m = api()), because the user can switch servers mid-flight. - Native code is limited to three small files in
src-tauri/src. Prefer a Tauri plugin; add Rust only when a plugin is broken or missing, and document why.
See Architecture for how the pieces fit together.