jundot/omlxPublic

LLM inference server with continuous batching & SSD caching for Apple Silicon — managed from the macOS menu bar

AI summary: A highly optimized LLM inference server for Apple Silicon, controllable directly from the macOS menu bar.

Stars
23.4K
+132 today
Forks
2.1K
Watchers
114
Open issues
368
Open PRs
178
Contributors
~354
Commits
3.6K
Branches
135
Views (30d)
3

PythonApache-2.0Created Feb 13, 2026Last push 2d agoLatest release v0.7.4.dev1+239 stars this week+850 this month

Quick answers

What is omlx?
A highly optimized LLM inference server for Apple Silicon, controllable directly from the macOS menu bar.
What does omlx do?
oMLX is a specialized inference server designed to run Large Language Models efficiently on Apple Silicon (M-series) Macs using the MLX framework. It implements advanced techniques like continuous batching and tiered KV caching, significantly maximizing throughput and memory efficiency compared to naive implementations. The backend exposes an OpenAI-compatible API, allowing it to seamlessly drop into existing workflows and tools. Uniquely, the entire server lifecycle, model downloading, and performance monitoring are managed via a lightweight, native macOS menu bar application, removing the need for complex terminal commands.
Who is omlx for?
Targeted at Mac users with Apple Silicon (M1/M2/M3/M4) chips who want to run powerful local LLMs with high efficiency. It requires macOS and sufficient unified memory to load the desired models.
How do I get started with omlx?
Download the oMLX.dmg release, drag it to Applications, and select a model from the menu bar.
How popular is omlx on GitHub?
jundot/omlx has 23,370 stars and 2,093 forks on GitHub, and gained 239 stars in the last 7 days.
What license does omlx use?
jundot/omlx is released under the Apache-2.0 license.

Star history

since Jul 29, 2026
010K20KJul 2026Aug 2026Oct 2026Nov 2026
23.4K stars as of Nov 4, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Update history

4 recorded
  • Nov 4, 2026New release v0.7.4.dev1 (previously v0.7.3.dev2).
  • Oct 25, 2026New release v0.7.3.dev2 (previously v0.7.1rc1).
  • Oct 17, 2026New release v0.7.1rc1 (previously v0.7.0).
  • Oct 8, 2026New release v0.7.0 (previously v0.7.0rc1).

Contribution activity

commits per day, last 52 weeks
NovDecJanFebMarAprMayJunJulAugSepOctNovMonWedFri2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 10 commits2026-02-14: 9 commits2026-02-15: 8 commits2026-02-16: 8 commits2026-02-17: 3 commits2026-02-18: 1 commit2026-02-19: 1 commit2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 3 commits2026-02-23: 3 commits2026-02-24: 11 commits2026-02-25: 11 commits2026-02-26: 4 commits2026-02-27: 20 commits2026-02-28: 20 commits2026-03-01: 14 commits2026-03-02: 26 commits2026-03-03: 21 commits2026-03-04: 15 commits2026-03-05: 14 commits2026-03-06: 13 commits2026-03-07: 7 commits2026-03-08: 16 commits2026-03-09: 6 commits2026-03-10: 21 commits2026-03-11: 37 commits2026-03-12: 18 commits2026-03-13: 18 commits2026-03-14: 21 commits2026-03-15: 34 commits2026-03-16: 14 commits2026-03-17: 28 commits2026-03-18: 12 commits2026-03-19: 11 commits2026-03-20: 2 commits2026-03-21: 36 commits2026-03-22: 28 commits2026-03-23: 5 commits2026-03-24: 17 commits2026-03-25: 10 commits2026-03-26: 14 commits2026-03-27: 12 commits2026-03-28: 16 commits2026-03-29: 43 commits2026-03-30: 7 commits2026-03-31: 7 commits2026-04-01: 5 commits2026-04-02: 3 commits2026-04-03: 25 commits2026-04-04: 8 commits2026-04-05: 21 commits2026-04-06: 12 commits2026-04-07: 17 commits2026-04-08: 6 commits2026-04-09: 3 commits2026-04-10: 21 commits2026-04-11: 5 commits2026-04-12: 2 commits2026-04-13: 3 commits2026-04-14: 32 commits2026-04-15: 13 commits2026-04-16: 7 commits2026-04-17: 6 commits2026-04-18: 0 commits2026-04-19: 3 commits2026-04-20: 2 commits2026-04-21: 6 commits2026-04-22: 21 commits2026-04-23: 7 commits2026-04-24: 8 commits2026-04-25: 1 commit2026-04-26: 0 commits2026-04-27: 6 commits2026-04-28: 16 commits2026-04-29: 0 commits2026-04-30: 4 commits2026-05-01: 1 commit2026-05-02: 0 commits2026-05-03: 2 commits2026-05-04: 25 commits2026-05-05: 4 commits2026-05-06: 19 commits2026-05-07: 4 commits2026-05-08: 0 commits2026-05-09: 15 commits2026-05-10: 3 commits2026-05-11: 18 commits2026-05-12: 37 commits2026-05-13: 24 commits2026-05-14: 7 commits2026-05-15: 8 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 2 commits2026-05-19: 30 commits2026-05-20: 9 commits2026-05-21: 11 commits2026-05-22: 18 commits2026-05-23: 0 commits2026-05-24: 11 commits2026-05-25: 7 commits2026-05-26: 18 commits2026-05-27: 28 commits2026-05-28: 10 commits2026-05-29: 18 commits2026-05-30: 15 commits2026-05-31: 17 commits2026-06-01: 19 commits2026-06-02: 29 commits2026-06-03: 30 commits2026-06-04: 20 commits2026-06-05: 25 commits2026-06-06: 17 commits2026-06-07: 16 commits2026-06-08: 18 commits2026-06-09: 29 commits2026-06-10: 14 commits2026-06-11: 31 commits2026-06-12: 4 commits2026-06-13: 9 commits2026-06-14: 9 commits2026-06-15: 14 commits2026-06-16: 10 commits2026-06-17: 6 commits2026-06-18: 3 commits2026-06-19: 3 commits2026-06-20: 0 commits2026-06-21: 4 commits2026-06-22: 4 commits2026-06-23: 0 commits2026-06-24: 4 commits2026-06-25: 11 commits2026-06-26: 6 commits2026-06-27: 0 commits2026-06-28: 4 commits2026-06-29: 17 commits2026-06-30: 1 commit2026-07-01: 3 commits2026-07-02: 7 commits2026-07-03: 0 commits2026-07-04: 4 commits2026-07-05: 0 commits2026-07-06: 1 commit2026-07-07: 1 commit2026-07-08: 25 commits2026-07-09: 34 commits2026-07-10: 20 commits2026-07-11: 4 commits2026-07-12: 22 commits2026-07-13: 1 commit2026-07-14: 2 commits2026-07-15: 1 commit2026-07-16: 0 commits2026-07-17: 8 commits2026-07-18: 19 commits2026-07-19: 0 commits2026-07-20: 20 commits2026-07-21: 29 commits2026-07-22: 20 commits2026-07-23: 7 commits2026-07-24: 6 commits2026-07-25: 3 commits2026-07-26: 4 commits2026-07-27: 6 commits2026-07-28: 19 commits2026-07-29: 20 commits2026-07-30: 33 commits2026-07-31: 7 commits2026-08-01: 5 commits2026-08-02: 19 commits2026-08-03: 11 commits2026-08-04: 11 commits2026-08-05: 2 commits2026-08-06: 9 commits2026-08-07: 5 commits2026-08-08: 17 commits2026-08-09: 5 commits2026-08-10: 14 commits2026-08-11: 6 commits2026-08-12: 14 commits2026-08-13: 9 commits2026-08-14: 4 commits2026-08-15: 24 commits2026-08-16: 41 commits2026-08-17: 13 commits2026-08-18: 21 commits2026-08-19: 30 commits2026-08-20: 44 commits2026-08-21: 11 commits2026-08-22: 3 commits2026-08-23: 7 commits2026-08-24: 20 commits2026-08-25: 20 commits2026-08-26: 2 commits2026-08-27: 18 commits2026-08-28: 4 commits2026-08-29: 24 commits2026-08-30: 5 commits2026-08-31: 2 commits2026-09-01: 6 commits2026-09-02: 10 commits2026-09-03: 1 commit2026-09-04: 3 commits2026-09-05: 4 commits2026-09-06: 27 commits2026-09-07: 8 commits2026-09-08: 10 commits2026-09-09: 4 commits2026-09-10: 25 commits2026-09-11: 21 commits2026-09-12: 3 commits2026-09-13: 7 commits2026-09-14: 23 commits2026-09-15: 14 commits2026-09-16: 19 commits2026-09-17: 21 commits2026-09-18: 18 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 30 commits2026-09-22: 10 commits2026-09-23: 19 commits2026-09-24: 27 commits2026-09-25: 4 commits2026-09-26: 7 commits2026-09-27: 26 commits2026-09-28: 28 commits2026-09-29: 19 commits2026-09-30: 57 commits2026-10-01: 2 commits2026-10-02: 39 commits2026-10-03: 1 commit2026-10-04: 1 commit2026-10-05: 50 commits2026-10-06: 23 commits2026-10-07: 10 commits2026-10-08: 14 commits2026-10-09: 51 commits2026-10-10: 4 commits2026-10-11: 7 commits2026-10-12: 31 commits2026-10-13: 16 commits2026-10-14: 19 commits2026-10-15: 49 commits2026-10-16: 9 commits2026-10-17: 4 commits2026-10-18: 12 commits2026-10-19: 25 commits2026-10-20: 20 commits2026-10-21: 32 commits2026-10-22: 3 commits2026-10-23: 6 commits2026-10-24: 37 commits2026-10-25: 11 commits2026-10-26: 33 commits2026-10-27: 21 commits2026-10-28: 8 commits2026-10-29: 13 commits2026-10-30: 4 commits2026-10-31: 27 commits2026-11-01: 6 commits2026-11-02: 19 commits2026-11-03: 10 commits2026-11-04: 23 commits2026-11-05: 0 commits2026-11-06: 0 commits2026-11-07: 0 commits
3,473 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    23,370 stars

  • Very active

    3,473 commits in 52 weeks

  • Community-driven

    ~354 contributors

  • Outside contributions

    92% of recent commits from the community

  • Well documented

    High community health score

  • Permissive license

    Apache-2.0

  • Continuous integration

    Automated checks passing

  • Repeat trending

    13 trending appearances

What omlx does

oMLX is a specialized inference server designed to run Large Language Models efficiently on Apple Silicon (M-series) Macs using the MLX framework. It implements advanced techniques like continuous batching and tiered KV caching, significantly maximizing throughput and memory efficiency compared to naive implementations. The backend exposes an OpenAI-compatible API, allowing it to seamlessly drop into existing workflows and tools. Uniquely, the entire server lifecycle, model downloading, and performance monitoring are managed via a lightweight, native macOS menu bar application, removing the need for complex terminal commands.

Targeted at Mac users with Apple Silicon (M1/M2/M3/M4) chips who want to run powerful local LLMs with high efficiency. It requires macOS and sufficient unified memory to load the desired models.

  • Apple Silicon optimization: Built specifically on Apple's MLX framework to fully utilize unified memory and Neural Engine hardware.
  • OpenAI API compatibility: Serves models via standard endpoints, making it instantly compatible with UI clients and coding agents.
  • Continuous batching: Processes multiple requests simultaneously, drastically improving throughput for concurrent API calls.
  • Native menu bar UI: Provides a simple GUI to start, stop, and monitor models without touching the command line.
  • Tiered KV caching: Intelligently manages context memory to prevent the server from crashing when context windows get large.

Where teams use it

Local AI coding assistance

Developers point their IDE tools like Cursor to the local oMLX server to get zero-latency code completions without paying API fees.

Running private autonomous agents

Researchers execute multi-step agent loops entirely on their Mac, ensuring sensitive data never leaves their machine.

High-throughput local processing

Engineers batch process thousands of text classification tasks locally overnight using the continuous batching capabilities.

Offline model experimentation

Enthusiasts easily download and test the latest open-source models using the intuitive menu bar interface.

Getting started: Download the oMLX.dmg release, drag it to Applications, and select a model from the menu bar.

README

main branch

oMLX

oMLX

LLM inference, optimized for your Mac
Continuous batching and tiered KV caching, managed directly from your menu bar.

License Python 3.11-3.13 Apple Silicon

[email protected] · https://omlx.ai/me

Install · Quickstart · Features · Models · CLI Configuration · Benchmarks · oMLX.ai

English · 中文 · 한국어 · 日本語


oMLX Admin Dashboard

Every LLM server I tried made me choose between convenience and control. I wanted to pin everyday models in memory, auto-swap heavier ones on demand, set context limits - and manage it all from a menu bar.

oMLX persists KV cache across a hot in-memory tier and cold SSD tier - even when context changes mid-conversation, all past context stays cached and reusable across requests, making local LLMs practical for real coding work with tools like Claude Code. That's why I built it.

Install

macOS App

Download the .dmg from Releases, drag to Applications, done. The app includes in-app auto-update, so future upgrades are just one click. The macOS app also installs a lightweight ~/.omlx/bin/omlx CLI shim so terminal commands and Apple Shortcuts can control the app-managed server.

Homebrew

brew tap jundot/omlx https://github.com/jundot/omlx
brew install jundot/omlx/omlx --with-custom-kernel   # With native custom kernels (needs full Xcode)
# No full Xcode? brew install jundot/omlx/omlx installs without the kernels

# Upgrade to the latest version
brew update && brew upgrade omlx

# Run as a background service (auto-restarts on crash)
omlx start

# Optional: MCP (Model Context Protocol) support, then restart to load it
/opt/homebrew/opt/omlx/libexec/bin/pip install mcp
omlx restart

From Source

git clone https://github.com/jundot/omlx.git
cd omlx
make install                # Editable install with the web UI and native custom kernels
# No full Xcode? make install-no-kernels installs without the kernels
make mcp                    # Optional: MCP support, restart `omlx serve` to load it

Requires macOS 15.0+ (Sequoia), Python 3.11–3.13, and Apple Silicon (M1/M2/M3/M4/M5).

Note on native custom kernels: GLM-5.2, MiniMax M3, and Qwen3.5 need them. Without them those families silently fall back to much slower generic paths -- for GLM-5.2 the fused DSA prefill is roughly 30x faster with the kernels (measured 845 vs ~29 tok/s on an M3 Ultra), and the fallback also uses more memory (#2137). make install builds them and checks that each one loads. That needs full Xcode with the Metal toolchain (xcodebuild -downloadComponent MetalToolchain); Command Line Tools alone do not provide it (xcrun: error: unable to find utility "metal"). Without Xcode, use the official DMG, which ships the kernels precompiled, or make install-no-kernels. A plain pip install -e . also skips them. make kernels rebuilds only the kernels from scratch. Homebrew builds them with --with-custom-kernel, which also needs full Xcode. To verify any install:

python -c "from omlx.custom_kernels import native_kernel_status; print(native_kernel_status())"

Quickstart

macOS App

Launch oMLX from your Applications folder. The Welcome screen guides you through three steps - model directory, server start, and first model download. That's it. To connect OpenClaw, OpenCode, Codex, Hermes Agent, Copilot, or DeepSeek Harness, see Integrations.

oMLX Welcome Screen oMLX Menubar

CLI

# Managed background server (macOS app or Homebrew install)
omlx start
omlx stop
omlx restart

# Foreground server attached to this terminal
omlx serve --model-dir ~/models

The server discovers LLMs, VLMs, embedding models, and rerankers from subdirectories automatically. Any OpenAI-compatible client can connect to http://localhost:8000/v1. A built-in chat UI is also available at http://localhost:8000/admin/chat.

Homebrew Service

If you installed via Homebrew, you can run oMLX as a managed background service:

omlx start                    # Start via brew services
omlx stop                     # Stop
omlx restart                  # Restart

brew services start omlx    # Start (auto-restarts on crash)
brew services stop omlx     # Stop
brew services restart omlx  # Restart
brew services info omlx     # Check status

The service runs omlx serve with zero-config defaults (~/.omlx/models, port 8000). omlx start, omlx stop, and omlx restart are the portable lifecycle commands; Homebrew installs delegate them to brew services. To customize, either set environment variables (OMLX_MODEL_DIR, OMLX_PORT, etc.) or run omlx serve --model-dir /your/path once to persist settings to ~/.omlx/settings.json.

Logs are written to two locations:

  • Service log: $(brew --prefix)/var/log/omlx.log (stdout/stderr)
  • Server log: ~/.omlx/logs/server.log (structured application log)

Features

Supports text LLMs, vision-language models (VLM), OCR models, embeddings, and rerankers on Apple Silicon.

Admin Dashboard

Web UI at /admin for real-time monitoring, model management, chat, benchmark, and per-model settings. Supports English, Korean, Japanese, Chinese, French, Russian, Spanish, and Brazilian Portuguese. All CDN dependencies are vendored for fully offline operation.

oMLX Admin Dashboard

Experimental Multi-Mac Inference

Source builds can split one downloaded language model across unequal-memory Macs using MLX pipeline ranks over Ring or Thunderbolt RDMA/JACCL. The Cluster dashboard handles read-only peer discovery, strict SSH/runtime verification, byte-aware unequal shard planning, measured compute/link rebalancing, headroom-aware execution tuning, activation, and a live shard/performance map on both Macs. Interactive, balanced, and throughput profiles expose coalesced batching, prompt-cache affinity, rotating-KV limits, Ring connection tuning, and a capability-gated experimental token-only output path. See Distributed inference across Macs for setup, security boundaries, current limitations, and the physical-hardware validation checklist.

A paired Mac can also speed up prefill without splitting the model: the Prefill Accelerator runs the first layers of long prompts on the other Mac while the model, its cache and decoding stay on this one (DeepSeek V4.1, GLM-5.3, Qwen3.8 Flash-Next and MiniMax M3).

Vision-Language Models

Run VLMs with the same continuous batching and tiered KV cache stack as text LLMs. Supports multi-image chat, base64/URL/file image inputs, and tool calling with vision context. MiMo V2.6 checkpoints with bundled sidecars also accept sampled-frame video and 24 kHz audio. Qwen3.5, Qwen3.6 and Qwen3.8 checkpoints (dense and MoE) accept native video input as base64 video_url / input_video data URIs; video needs OpenCV (opencv-python-headless). oQ conversion of official MiMo V2.6 checkpoints preserves image and audio support. OCR models (DeepSeek-OCR, DOTS-OCR, GLM-OCR) are auto-detected with optimized prompts.

Tiered KV Cache (Hot + Cold)

Block-based KV cache management inspired by vLLM, with prefix sharing and Copy-on-Write. The cache operates across two tiers:

  • Hot tier (RAM): Frequently accessed blocks stay in memory for fast access.
  • Cold tier (SSD): When the hot cache fills up, blocks are offloaded to SSD in safetensors format. On the next request with a matching prefix, they're restored from disk instead of recomputed from scratch - even after a server restart.

Optional Affine4 and Affine8 KV compression add signed 4-bit and 8-bit cache formats with Metal TensorOps decode attention and a portable fallback. Select either under Model settings → Memory Saving → KV cache compression.

oMLX Hot & Cold Cache

Continuous Batching

Handles concurrent requests through mlx-lm's BatchGenerator. Max concurrent requests is configurable via CLI or admin panel.

Claude Code Optimization

Runs smaller context models with Claude Code by reporting the model's real context window to auto-compact instead of scaling token counts, and SSE keep-alive prevents read timeouts during long prefill.

Multi-Model Serving

Load LLMs, VLMs, embedding models, and rerankers within the same server. Models are managed through a combination of automatic and manual controls:

  • LRU eviction: Least-recently-used models are evicted automatically when memory runs low.
  • Manual load/unload: Interactive status badges in the admin panel let you load or unload models on demand.
  • Model pinning: Pin frequently used models to keep them always loaded.
  • Per-model TTL: Set an idle timeout per model to auto-unload after a period of inactivity.
  • Process memory enforcement: Total memory limit (default: system RAM - 8GB) prevents system-wide OOM.

Per-Model Settings

Configure sampling parameters, chat template kwargs, TTL, model alias, model type override, and more per model directly from the admin panel. Changes apply immediately without server restart.

  • Model alias: set a custom API-visible name. /v1/models returns the alias, and requests accept both the alias and directory name.
  • Model type override: manually set a model as LLM or VLM regardless of auto-detection.
  • External engine: serve the models Splash supports, including GGUF files, from your model directories on Splash's Metal engine in its own process. See docs/Splash.md for the supported models and Splash versions.
  • Profiles: save named bundles of per-model settings and switch between them from the admin panel. A profile can optionally be exposed as its own model: /v1/models then also lists <model>:<profile> (e.g. qwen3-8b:thinking), which serves on the same engine as the base model with the profile's settings overlaid per request — no extra memory, no reload. When the base model has an alias, the exposed ID is advertised as <alias>:<profile>; the directory-name form keeps working, just like for the base model.

oMLX Chat Template Kwargs

Built-in Chat

Chat directly with any loaded model from the admin panel. Supports conversation history, model switching, dark mode, reasoning model output, and image upload for VLM/OCR models.

Document attachments support PDF, DOCX, PPTX, TXT, and MD. Attachments are accepted by filename extension. If the client reports a MIME type oMLX does not recognize, such as application/octet-stream, the converter MIME type is inferred from the extension.

oMLX Chat

Model Downloader

Search and download models from HuggingFace directly in the admin dashboard, in MLX, GGUF or all formats. Browse model cards, then pick the files to download: an MLX checkpoint keeps the files it needs, and a GGUF brings its vision projector.

oMLX Model Downloader

Integrations

Set up OpenClaw, OpenCode, Codex, Hermes Agent, Copilot, Pi, Mistral Vibe, and DeepSeek Harness directly from the admin dashboard with a single click. No manual config editing required.

oMLX Integrations

omlx launch codex and omlx launch codex_app give Codex a catalog of every chat model on the server, so you switch models with /model or the app's model picker. --model, the saved Codex model, or the server default picks the starting model. This needs Codex 0.148 or newer; relaunch after you add or remove models.

omlx launch copilot gives Copilot CLI a catalog of every chat model on the server, so you switch models with /model. --model, the saved Copilot model, or the server default picks the starting model. The catalog goes into Copilot's providers.json next to your other providers, and the file is kept at 0600 because it holds the server's API key. This needs Copilot CLI 1.0.83 or newer; relaunch after you add or remove models.

Install Mistral Vibe 2.26.0 or newer with uv tool install mistral-vibe, then run omlx launch vibe to select a local model, or omlx launch vibe --model <model-id>. Vibe's provider, model, API-key reference and context window are configured for that process through its VIBE_* environment overrides. Existing config.toml, VIBE_HOME, tool permissions and cloud configuration are preserved. Pass Vibe arguments after --, for example omlx launch vibe --model <model-id> -- --resume.

Performance Benchmark

One-click benchmarking from the admin panel. Measures prefill (PP) and text generation (TG) tokens per second, with partial prefix cache hit testing for realistic performance numbers.

oMLX Benchmark Tool

macOS Menubar App

Native Swift / SwiftUI menubar app (not Electron). Start, stop, and monitor the server without opening a terminal. Includes local usage history with per-model totals and an hourly heatmap, persistent serving stats (survives restarts), auto-restart on crash, and built-in auto-update.

oMLX Menubar Stats

API Compatibility

Drop-in replacement for OpenAI and Anthropic APIs. Supports streaming usage stats (stream_options.include_usage), llama.cpp-style prefill progress (return_progress), Anthropic adaptive thinking, and vision inputs (images as base64 or URL, video as base64).

Endpoint Description
POST /v1/chat/completions Chat completions (streaming)
POST /v1/completions Text completions (streaming)
POST /v1/messages Anthropic Messages API
POST /v1/embeddings Text embeddings
POST /v1/rerank Document reranking
POST /v1/systemone Typed decisions with decision models or chat models (TypeSafe System One)
GET /v1/models List available models
POST /tokenize, POST /detokenize vLLM-compatible tokenizer API (also under /v1)

The admin API for settings, models, downloads, quantization, and benchmarks takes the main API key as a Bearer token and also works in headless mode. See Admin API.

Tool Calling & Structured Output

Supports all function calling formats available in mlx-lm, JSON schema validation, and MCP tool integration. Tool calling requires the model's chat template to support the tools parameter. The following model families are auto-detected:

Model Family Format
Llama, Qwen, DeepSeek, etc. JSON <tool_call>
Qwen3.5 Series, Raon-1 mini XML <function=...>
Gemma <start_function_call>
GLM (4.7, 5) <arg_key>/<arg_value> XML
MiniMax Namespaced <minimax:tool_call>
Mistral [TOOL_CALLS]
IFM K2 Horizon XML or JSON inside <ifm|tool_calls>. Requires omlx[grammar]
Kimi K2 <|tool_calls_section_begin|>
Longcat <longcat_tool_call>

Models not listed above may still work if their chat template accepts tools and their output uses a recognized <tool_call> XML format. For tool-enabled streaming, assistant text is emitted incrementally while known tool-call control markup is suppressed from visible content; structured tool calls are emitted after parsing the completed turn.

A bare JSON, EBNF, or regex grammar constrains the answer from the first generated token, so thinking_budget is ignored. Configure a compatible reasoning_parser to combine constrained output with a separate, budgeted reasoning phase.

Models

Point --model-dir at a directory containing MLX-format model subdirectories. Two-level organization folders (e.g., mlx-community/model-name/) are also supported. GGUF files in these folders are listed one model per file and run on an external engine.

~/models/
├── Step-3.5-Flash-8bit/
├── Qwen3-Coder-Next-8bit/
├── gpt-oss-120b-MXFP4-Q8/
├── Qwen3.5-122B-A10B-4bit/
└── bge-m3/

Models are auto-detected by type. You can also download models directly from the admin dashboard.

Type Models
LLM Any model supported by mlx-lm
VLM Qwen3.5 Series, GLM-4V, Pixtral, and other mlx-vlm models
OCR DeepSeek-OCR, DOTS-OCR, GLM-OCR
Embedding BERT, BGE-M3, ModernBERT, EmbeddingGemma 2
Reranker ModernBERT, XLM-RoBERTa
Decision Clef, Clef-Flash, OpenJev, Decision 3.0 (d3, d3-flash, d3-mini, d3-nano, d3-lite, d3-edge)

CLI Configuration

# Managed background server (macOS app or Homebrew install)
omlx start
omlx stop
omlx restart

# Start with default settings (memory guard tier = balanced, manage via admin UI)
omlx serve --model-dir ~/models

# Choose a memory guard tier at startup
omlx serve --model-dir ~/models --memory-guard safe

# Set a custom memory guard ceiling in GB
omlx serve --model-dir ~/models --memory-guard-gb 48

# Enable SSD cache for KV blocks
omlx serve --model-dir ~/models --paged-ssd-cache-dir ~/.omlx/cache

# Set in-memory hot cache size
omlx serve --model-dir ~/models --hot-cache-max-size 20%

# Adjust max concurrent requests (default: 8)
omlx serve --model-dir ~/models --max-concurrent-requests 16

# With MCP tools
omlx serve --model-dir ~/models --mcp-config mcp.json

# HuggingFace mirror endpoint (for restricted regions)
omlx serve --model-dir ~/models --hf-endpoint https://hf-mirror.com

# API key authentication
omlx serve --model-dir ~/models --api-key your-secret-key
# Localhost-only: skip verification via admin panel global settings

# Network access requires authentication
OMLX_API_KEY=your-secret-key omlx serve --model-dir ~/models --host 0.0.0.0

# Inference and admin APIs only, without the web UI (not saved to settings)
omlx serve --model-dir ~/models --headless

The default SSD cache limit, auto, uses 50% of the sum of free disk space and existing SSD cache files, including GDN sidecars. The budget is refreshed during use and does not shrink simply because the cache grows or the server restarts. Other disk usage can change the budget. Set --paged-ssd-cache-max-size 20GB for a fixed limit.

Most settings can also be configured from the web admin panel at /admin. Settings are persisted to ~/.omlx/settings.json, and CLI flags take precedence. Set the main API key before changing the server host to a LAN address or 0.0.0.0, or save both settings together. oMLX refuses to start on any non-loopback address without a main API key. "Disable all authentication" (skip_api_key_verification) turns off both inference and admin authentication, so it stays restricted to loopback-only binds.

For keyless inference on a network bind, turn on "Allow inference without API key" in the web admin settings or the Security screen of the macOS app. It sets auth.allow_unauthenticated_inference, defaults to false, and applies without a restart. This allows anyone who can reach the server to use inference (including stored Responses and audio), MCP tools, and web search. Management endpoints still require the main API key or an admin login.

Architecture
FastAPI Server (OpenAI / Anthropic API)
    │
    ├── EnginePool (multi-model, LRU eviction, TTL, manual load/unload)
    │   ├── BatchedEngine (LLMs, continuous batching)
    │   ├── VLMEngine (vision-language models)
    │   ├── EmbeddingEngine
    │   ├── RerankerEngine
    │   └── DecisionEngine
    │
    ├── ProcessMemoryEnforcer (total memory limit, TTL checks)
    │
    ├── Scheduler (FCFS, configurable concurrency)
    │   └── mlx-lm BatchGenerator
    │
    └── Cache Stack
        ├── PagedCacheManager (GPU, block-based, CoW, prefix sharing)
        ├── Hot Cache (in-memory tier, write-back)
        └── PagedSSDCacheManager (SSD cold tier, safetensors format)

Development

Build commands

Command What it does
make install Editable install of the server and the web UI, then the native custom kernels
make install-no-kernels The same without the kernels, for machines without full Xcode
make mcp Add MCP (Model Context Protocol) support
make dev Same as make install, with dev tools (make dev-no-kernels skips the kernels)
make kernels Delete any built native custom kernels, compile them again in place, and check that each one loads
make web Rebuild the web UI CSS and normalize the translation files
make app Stage a runnable oMLX.app with freshly compiled native custom kernels

The native custom kernels need full Xcode with the Metal toolchain (xcodebuild -downloadComponent MetalToolchain).

CLI Server

git clone https://github.com/jundot/omlx.git
cd omlx
make dev
pytest

Web UI

The web admin UI lives in apps/omlx-web/ and ships in the same package, so make dev installs it too. After editing its templates, JavaScript, or translations, run make web to rebuild the CSS and normalize the translation files.

macOS App

The native SwiftUI app lives at apps/omlx-mac/. Requires Xcode 26.5+ and Python 3.11+. venvstacks is declared as a dev dependency so make dev (or uv sync --dev) brings the pinned version in. The build script also falls back to uvx venvstacks or pipx run venvstacks if you prefer a host-global tool runner.

# Stage a runnable oMLX.app (xcodebuild + venvstacks Python layers + native kernels + ad-hoc sign)
make app

# Result lands at apps/omlx-mac/build/Stage/oMLX.app
open apps/omlx-mac/build/Stage/oMLX.app

# Force a fresh venvstacks rebuild (otherwise it's cached by fingerprint)
apps/omlx-mac/Scripts/build.sh release --rebuild-donor

First cold build takes 10–20 minutes (venvstacks Python layer assembly). Subsequent builds reuse the cached packaging/_export/ and finish in about 4 minutes. See packaging/README.md for the layer configuration and apps/omlx-mac/ for the Swift sources.

Contributing

Contributions are welcome! See Contributing Guide for details.

  • Bug fixes and improvements
  • Performance optimizations
  • Documentation improvements

License

Apache 2.0

Acknowledgments

  • MLX and mlx-lm by Apple
  • mlx-vlm - Vision-language model inference on Apple Silicon
  • vllm-mlx - oMLX started from vllm-mlx v0.1.0 and evolved significantly with multi-model serving, tiered KV caching, VLM with full paged cache support, an admin panel, and a macOS menu bar app
  • venvstacks - Portable Python environment layering for the macOS app bundle
  • mlx-embeddings - Embedding model support for Apple Silicon
  • dflash-mlx - Block diffusion speculative decoding on Apple Silicon
  • MTPLX - Lightning MTP's verify-shape Metal kernels are powered by MTPLX by Youssof Altoukhi, which also inspired the depth-k pipeline
  • mlx-serve - The fused GDN verify prework kernel is adapted from mlx-serve's port of the mlxfast-challenge qwen35_packed_gdn_prework kernel, and Qwen4's fused GDN decode and prefill kernels are adapted from mlx-serve's MIT-licensed transformer.zig; Qwen4 QSA's 128-bit K/V staging is adapted from mlx-serve's MIT-licensed msv_attn_p256 kernel
  • Splash - The verify-shape linear kernels use Splash's bf16 0x4300 | q weight operand with per-group input sums (from its Apache-2.0 linear_q4_sgmatrix.metal), and the tensor-op verify attention adapts the tile design of Splash's paged_attention_tile.h, and a GGUF's tokenizer is derived from its header as Splash's Apache-2.0 install/gguf.py derives it; Splash itself can also serve supported models as an external engine
  • SiliconScope - The menu bar statistics take their design and rendering approach from SiliconScope by Kennt Kim, which also inspired the energy-efficient re-render gating
  • m5gpu - The GPU power limit writes the AGX GPU power target that m5gpu by beamivalice documented (SetMaxGPUAbsolutePower with AbsoluteTarget, and -1000 to remove it)
  • ming-tts-serve - Ming-3.0-tts's pipelined decode loop follows Stéphane Busso's ming-tts-serve, and its fused DiT kernels are adapted from ming-tts-serve's MIT-licensed ming_fused.zig
View on GitHub

Recent activity

commits and pull requests

Releases and announcements

137 total
  1. 0.7.4.dev1v0.7.4.dev1Nov 4, 20261.7K downloads

    # oMLX 0.7.4.dev1 > This is a development release. Please report any bugs through [GitHub Issues](https://github.com/jundot/omlx/issues/new/choose). If you need a stable release, please use [oMLX 0.7.3](https://github.com/jundot/omlx/releases/tag/v0.7.3). oMLX 0.7.4.dev1 lets a second Mac with a fast GPU speed up prefill for a model that only fits on your big Mac, and makes DeepSeek V4.1 and Qwen3.8 Flash-Next faster. **Download:** [macOS 26 / 27](https://github.com/jundot/omlx/releases/download/v0.7.4.dev1/oMLX-0.7.4.dev1-macos26-27.dmg) | [macOS 15 Sequoia](https://github.com/jundot/omlx/releases/download/v0.7.4.dev1/oMLX-0.7.4.dev1-macos15-sequoia.dmg) <img width="2400" height="1350" alt="prefill-accelerator" src="https://github.com/user-attachments/assets/d17d27fd-f21b-4723-9b14-0eb96fe6555b" /> ## Prefill Accelerator Big MoE models fit on a Mac with lots of memory like an M3 Ultra 512GB, but long prompts prefill slowly there. Pair it with a Mac that has a faster GPU, like an M5 Max, and the fast Mac runs the first layers of each prompt chunk while the big Mac runs the rest, decodes and keeps the KV cache. Decode speed stays the same, and Thunderbolt or 5GbE i

  2. 0.7.3v0.7.3Oct 31, 202623.1K downloads

    # oMLX 0.7.3 oMLX 0.7.3 makes DeepSeek V4.1 prefill and batched decode faster, lets Ask AI hold voice conversations, search the web, read links and look at your screen, and cuts memory use when many requests run at long context. The notes below cover changes since 0.7.3rc1, and earlier 0.7.3 highlights are summarized at the end. **Download:** [macOS 26 / 27](https://github.com/jundot/omlx/releases/download/v0.7.3/oMLX-0.7.3-macos26-27.dmg) | [macOS 15 Sequoia](https://github.com/jundot/omlx/releases/download/v0.7.3/oMLX-0.7.3-macos15-sequoia.dmg) https://github.com/user-attachments/assets/d63f2dbd-a3a9-47e0-bf1f-1add45c39395 ## Ask AI Voice Mode, Web Search and Screen Capture Talk to your local models. Turn on Voice under App > Ask AI, press Option-Shift-Space and speak, and the answer plays back with captions. Ask AI can also search the web, read links and look at your screen (#4976). ## Faster DeepSeek V4.1 DeepSeek V4.1 Flash prefills much faster on M5 with INT8 Activation Prefill in Model Settings (#4946) and Engram prefetch (@N1k1tung in #4993). Batches of more than 8 requests now stay on the fused decode kernels (@junmo-kim in #4989). | DeepSeek V4.1 F

  3. 0.7.3rc1v0.7.3rc1Oct 27, 202610.4K downloads

    # oMLX 0.7.3rc1 > This is a release candidate. Please report any bugs through [GitHub Issues](https://github.com/jundot/omlx/issues/new/choose). If you need a stable release, please use [oMLX 0.7.2](https://github.com/jundot/omlx/releases/tag/v0.7.2). The release candidate for oMLX 0.7.3 adds Ask AI, a question bar for your local models in any app, a GPU power limit for working on battery, and Ling 3.1 Flash with Lightning MTP. It also brings everything from the 0.7.3 development releases: MiniMax M3.1 Flash, faster M1 and M5 Macs, and better low-bit oQ. **Download:** [macOS 26 / 27](https://github.com/jundot/omlx/releases/download/v0.7.3rc1/oMLX-0.7.3rc1-macos26-27.dmg) | [macOS 15 Sequoia](https://github.com/jundot/omlx/releases/download/v0.7.3rc1/oMLX-0.7.3rc1-macos15-sequoia.dmg) ## Ask AI Ask your local models from any app. Press Option-Space and a question bar floats over whatever you are working on without taking focus, and the answer streams in as Markdown. Slash presets set the model and system prompt per command, so `/translate` can run a small model with a fixed prompt and copy the result for you. Vision models also take images pasted with Command-V. Turn it on in t

  4. 0.7.3.dev2v0.7.3.dev2Oct 25, 20265.1K downloads

    # oMLX 0.7.3.dev2 > This is a hotfix release that fixes an error when turning on Lightning MTP for MiniMax M3.1 (#4827). It also removes the stray `</think>` at the start of MiniMax M3.1 non-streaming replies and fixes prefill for DeepSeek V4 Flash oQ3.5e. > This is a development release. Please report any bugs through [GitHub Issues](https://github.com/jundot/omlx/issues/new/choose). If you need a stable release, please use [oMLX 0.7.2](https://github.com/jundot/omlx/releases/tag/v0.7.2). oMLX 0.7.3.dev2 adds MiniMax M3.1 Flash with Lightning MTP, makes M1 and M5 Macs, DFlash on fp16 models and GLM-5.3 faster, and gives low-bit oQ quants a better split of their bits. **Download:** [macOS 26 / 27](https://github.com/jundot/omlx/releases/download/v0.7.3.dev2/oMLX-0.7.3.dev2-macos26-27.dmg) | [macOS 15 Sequoia](https://github.com/jundot/omlx/releases/download/v0.7.3.dev2/oMLX-0.7.3.dev2-macos15-sequoia.dmg) ## MiniMax M3.1 Flash oMLX now serves MiniMax M3.1 Flash from the original NVFP4 checkpoint or from oQ builds. Its bundled DSpark draft runs as Lightning MTP and verifies a whole batch in one forward, and greedy output is the same with it on or off. #4777 > oQ4e on an M3 Ul

  5. 0.7.3.dev1v0.7.3.dev1Oct 24, 2026

    # oMLX 0.7.3.dev1 > Please use [oMLX 0.7.3.dev2](https://github.com/jundot/omlx/releases/tag/v0.7.3.dev2) instead. It is a hotfix release that fixes an error when turning on Lightning MTP for MiniMax M3.1 (#4827). The download links below now point to 0.7.3.dev2. > This is a development release. Please report any bugs through [GitHub Issues](https://github.com/jundot/omlx/issues/new/choose). If you need a stable release, please use [oMLX 0.7.2](https://github.com/jundot/omlx/releases/tag/v0.7.2). oMLX 0.7.3.dev1 adds MiniMax M3.1 Flash with Lightning MTP, makes M1 and M5 Macs, DFlash on fp16 models and GLM-5.3 faster, and gives low-bit oQ quants a better split of their bits. **Download:** [macOS 26 / 27](https://github.com/jundot/omlx/releases/download/v0.7.3.dev2/oMLX-0.7.3.dev2-macos26-27.dmg) | [macOS 15 Sequoia](https://github.com/jundot/omlx/releases/download/v0.7.3.dev2/oMLX-0.7.3.dev2-macos15-sequoia.dmg) ## MiniMax M3.1 Flash oMLX now serves MiniMax M3.1 Flash from the original NVFP4 checkpoint or from oQ builds. Its bundled DSpark draft runs as Lightning MTP and verifies a whole batch in one forward, and greedy output is the same with it on or off. #4777 > oQ4e on a

Code frequency

additions and deletions
+149.9K-149.9KWeek of 2026-02-08: +64,218 linesWeek of 2026-02-08: -267 linesWeek of 2026-02-15: +2,845 linesWeek of 2026-02-15: -586 linesWeek of 2026-02-22: +18,391 linesWeek of 2026-02-22: -5,482 linesWeek of 2026-03-01: +13,702 linesWeek of 2026-03-01: -1,997 linesWeek of 2026-03-08: +19,718 linesWeek of 2026-03-08: -2,244 linesWeek of 2026-03-15: +54,939 linesWeek of 2026-03-15: -7,919 linesWeek of 2026-03-22: +69,334 linesWeek of 2026-03-22: -3,287 linesWeek of 2026-03-29: +9,505 linesWeek of 2026-03-29: -6,331 linesWeek of 2026-04-05: +10,368 linesWeek of 2026-04-05: -1,658 linesWeek of 2026-04-12: +7,180 linesWeek of 2026-04-12: -1,565 linesWeek of 2026-04-19: +44,044 linesWeek of 2026-04-19: -1,022 linesWeek of 2026-04-26: +5,347 linesWeek of 2026-04-26: -775 linesWeek of 2026-05-03: +18,732 linesWeek of 2026-05-03: -2,926 linesWeek of 2026-05-10: +18,922 linesWeek of 2026-05-10: -3,529 linesWeek of 2026-05-17: +9,313 linesWeek of 2026-05-17: -1,843 linesWeek of 2026-05-24: +59,411 linesWeek of 2026-05-24: -12,897 linesWeek of 2026-05-31: +30,766 linesWeek of 2026-05-31: -11,194 linesWeek of 2026-06-07: +21,373 linesWeek of 2026-06-07: -3,662 linesWeek of 2026-06-14: +18,173 linesWeek of 2026-06-14: -4,377 linesWeek of 2026-06-21: +24,914 linesWeek of 2026-06-21: -5,442 linesWeek of 2026-06-28: +8,386 linesWeek of 2026-06-28: -774 linesWeek of 2026-07-05: +34,531 linesWeek of 2026-07-05: -5,116 linesWeek of 2026-07-12: +8,455 linesWeek of 2026-07-12: -1,138 linesWeek of 2026-07-19: +30,817 linesWeek of 2026-07-19: -1,758 linesWeek of 2026-07-26: +109,972 linesWeek of 2026-07-26: -3,235 linesWeek of 2026-08-02: +149,935 linesWeek of 2026-08-02: -24,139 linesWeek of 2026-08-09: +37,726 linesWeek of 2026-08-09: -2,109 linesWeek of 2026-08-16: +43,327 linesWeek of 2026-08-16: -4,253 linesWeek of 2026-08-23: +31,649 linesWeek of 2026-08-23: -2,547 linesWeek of 2026-08-30: +6,000 linesWeek of 2026-08-30: -1,892 linesWeek of 2026-09-06: +79,870 linesWeek of 2026-09-06: -18,181 linesWeek of 2026-09-13: +45,458 linesWeek of 2026-09-13: -13,854 linesWeek of 2026-09-20: +35,986 linesWeek of 2026-09-20: -5,546 linesWeek of 2026-09-27: +73,426 linesWeek of 2026-09-27: -22,090 linesWeek of 2026-10-04: +106,936 linesWeek of 2026-10-04: -92,063 linesWeek of 2026-10-11: +81,073 linesWeek of 2026-10-11: -64,086 linesWeek of 2026-10-18: +44,530 linesWeek of 2026-10-18: -10,717 linesWeek of 2026-10-25: +37,197 linesWeek of 2026-10-25: -11,787 linesWeek of 2026-11-01: +31,024 linesWeek of 2026-11-01: -3,289 linesFeb 8, 2026Nov 1, 2026
+1.5M lines added, -367.6K removed over the last year.

Commits per week

last 52 weeks
1720Week of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 19 commitsWeek of 2026-02-15: 21 commitsWeek of 2026-02-22: 72 commitsWeek of 2026-03-01: 110 commitsWeek of 2026-03-08: 137 commitsWeek of 2026-03-15: 137 commitsWeek of 2026-03-22: 102 commitsWeek of 2026-03-29: 98 commitsWeek of 2026-04-05: 85 commitsWeek of 2026-04-12: 63 commitsWeek of 2026-04-19: 48 commitsWeek of 2026-04-26: 27 commitsWeek of 2026-05-03: 69 commitsWeek of 2026-05-10: 97 commitsWeek of 2026-05-17: 70 commitsWeek of 2026-05-24: 107 commitsWeek of 2026-05-31: 157 commitsWeek of 2026-06-07: 121 commitsWeek of 2026-06-14: 45 commitsWeek of 2026-06-21: 29 commitsWeek of 2026-06-28: 36 commitsWeek of 2026-07-05: 85 commitsWeek of 2026-07-12: 53 commitsWeek of 2026-07-19: 85 commitsWeek of 2026-07-26: 94 commitsWeek of 2026-08-02: 74 commitsWeek of 2026-08-09: 76 commitsWeek of 2026-08-16: 163 commitsWeek of 2026-08-23: 95 commitsWeek of 2026-08-30: 31 commitsWeek of 2026-09-06: 98 commitsWeek of 2026-09-13: 102 commitsWeek of 2026-09-20: 97 commitsWeek of 2026-09-27: 172 commitsWeek of 2026-10-04: 153 commitsWeek of 2026-10-11: 135 commitsWeek of 2026-10-18: 135 commitsWeek of 2026-10-25: 117 commitsWeek of 2026-11-01: 58 commitsNov 9, 2025Nov 1, 2026
3.5K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 41 commitsSun 1:00 — 36 commitsSun 2:00 — 36 commitsSun 3:00 — 21 commitsSun 4:00 — 13 commitsSun 5:00 — 18 commitsSun 6:00 — 7 commitsSun 7:00 — 4 commitsSun 8:00 — 5 commitsSun 9:00 — 9 commitsSun 10:00 — 8 commitsSun 11:00 — 10 commitsSun 12:00 — 9 commitsSun 13:00 — 4 commitsSun 14:00 — 15 commitsSun 15:00 — 19 commitsSun 16:00 — 19 commitsSun 17:00 — 29 commitsSun 18:00 — 20 commitsSun 19:00 — 22 commitsSun 20:00 — 22 commitsSun 21:00 — 15 commitsSun 22:00 — 28 commitsSun 23:00 — 29 commitsMon 0:00 — 51 commitsMon 1:00 — 18 commitsMon 2:00 — 18 commitsMon 3:00 — 15 commitsMon 4:00 — 9 commitsMon 5:00 — 6 commitsMon 6:00 — 2 commitsMon 7:00 — 6 commitsMon 8:00 — 6 commitsMon 9:00 — 27 commitsMon 10:00 — 26 commitsMon 11:00 — 18 commitsMon 12:00 — 15 commitsMon 13:00 — 17 commitsMon 14:00 — 33 commitsMon 15:00 — 28 commitsMon 16:00 — 56 commitsMon 17:00 — 54 commitsMon 18:00 — 39 commitsMon 19:00 — 16 commitsMon 20:00 — 9 commitsMon 21:00 — 16 commitsMon 22:00 — 39 commitsMon 23:00 — 28 commitsTue 0:00 — 36 commitsTue 1:00 — 35 commitsTue 2:00 — 20 commitsTue 3:00 — 10 commitsTue 4:00 — 16 commitsTue 5:00 — 9 commitsTue 6:00 — 8 commitsTue 7:00 — 3 commitsTue 8:00 — 8 commitsTue 9:00 — 16 commitsTue 10:00 — 28 commitsTue 11:00 — 62 commitsTue 12:00 — 34 commitsTue 13:00 — 32 commitsTue 14:00 — 31 commitsTue 15:00 — 47 commitsTue 16:00 — 31 commitsTue 17:00 — 45 commitsTue 18:00 — 38 commitsTue 19:00 — 14 commitsTue 20:00 — 7 commitsTue 21:00 — 15 commitsTue 22:00 — 22 commitsTue 23:00 — 28 commitsWed 0:00 — 59 commitsWed 1:00 — 39 commitsWed 2:00 — 8 commitsWed 3:00 — 7 commitsWed 4:00 — 3 commitsWed 5:00 — 5 commitsWed 6:00 — 11 commitsWed 7:00 — 14 commitsWed 8:00 — 11 commitsWed 9:00 — 24 commitsWed 10:00 — 36 commitsWed 11:00 — 26 commitsWed 12:00 — 10 commitsWed 13:00 — 30 commitsWed 14:00 — 34 commitsWed 15:00 — 28 commitsWed 16:00 — 46 commitsWed 17:00 — 46 commitsWed 18:00 — 30 commitsWed 19:00 — 16 commitsWed 20:00 — 8 commitsWed 21:00 — 24 commitsWed 22:00 — 26 commitsWed 23:00 — 42 commitsThu 0:00 — 33 commitsThu 1:00 — 31 commitsThu 2:00 — 17 commitsThu 3:00 — 3 commitsThu 4:00 — 6 commitsThu 5:00 — 3 commitsThu 6:00 — 3 commitsThu 7:00 — 7 commitsThu 8:00 — 16 commitsThu 9:00 — 16 commitsThu 10:00 — 34 commitsThu 11:00 — 43 commitsThu 12:00 — 16 commitsThu 13:00 — 27 commitsThu 14:00 — 35 commitsThu 15:00 — 31 commitsThu 16:00 — 43 commitsThu 17:00 — 24 commitsThu 18:00 — 30 commitsThu 19:00 — 17 commitsThu 20:00 — 12 commitsThu 21:00 — 11 commitsThu 22:00 — 12 commitsThu 23:00 — 29 commitsFri 0:00 — 36 commitsFri 1:00 — 21 commitsFri 2:00 — 20 commitsFri 3:00 — 25 commitsFri 4:00 — 3 commitsFri 5:00 — 12 commitsFri 6:00 — 5 commitsFri 7:00 — 11 commitsFri 8:00 — 17 commitsFri 9:00 — 24 commitsFri 10:00 — 36 commitsFri 11:00 — 25 commitsFri 12:00 — 15 commitsFri 13:00 — 13 commitsFri 14:00 — 24 commitsFri 15:00 — 28 commitsFri 16:00 — 29 commitsFri 17:00 — 13 commitsFri 18:00 — 17 commitsFri 19:00 — 10 commitsFri 20:00 — 11 commitsFri 21:00 — 14 commitsFri 22:00 — 15 commitsFri 23:00 — 15 commitsSat 0:00 — 16 commitsSat 1:00 — 21 commitsSat 2:00 — 13 commitsSat 3:00 — 10 commitsSat 4:00 — 15 commitsSat 5:00 — 8 commitsSat 6:00 — 11 commitsSat 7:00 — 12 commitsSat 8:00 — 14 commitsSat 9:00 — 18 commitsSat 10:00 — 16 commitsSat 11:00 — 10 commitsSat 12:00 — 13 commitsSat 13:00 — 4 commitsSat 14:00 — 14 commitsSat 15:00 — 13 commitsSat 16:00 — 25 commitsSat 17:00 — 34 commitsSat 18:00 — 20 commitsSat 19:00 — 8 commitsSat 20:00 — 7 commitsSat 21:00 — 9 commitsSat 22:00 — 20 commitsSat 23:00 — 38 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits273 (8%)
Community commits3,333 (92%)

3,606 commits in total over the last year.

DateListRankStars gained
Aug 27, 2026weekly#10+1,432
Aug 26, 2026weekly#10+1,432
Aug 25, 2026weekly#9+1,689
Aug 24, 2026weekly#7+1,671
Aug 23, 2026weekly#10+1,597
Aug 22, 2026weekly#12+1,536
Aug 21, 2026daily#5+472
Aug 21, 2026weekly#12+1,388
Aug 20, 2026daily#5+472
Aug 19, 2026daily#9+370
Aug 18, 2026daily#5+78
Mar 11, 2026daily#22+113
Mar 10, 2026daily#8+264