ThePrimeagen/99Public

Neovim AI agent done right

AI summary: An agentic AI client for Neovim that augments traditional hand-coding workflows.

Stars
4.7K
+-1 today
Forks
254
Watchers
41
Open issues
12
Open PRs
15
Contributors
~28
Commits
350
Branches
7

LuaNo licenseCreated Nov 22, 2025Last push 1mo ago+-1 this month

Star history

since Dec 28, 2025
02K4KDec 2025Mar 2026May 2026Aug 2026
4.7K stars as of Aug 7, 2026, tracked back to Dec 28, 2025. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulMonWedFri2025-08-02: 0 commits2025-08-03: 0 commits2025-08-04: 0 commits2025-08-05: 0 commits2025-08-06: 0 commits2025-08-07: 0 commits2025-08-08: 0 commits2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-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: 2 commits2025-11-23: 0 commits2025-11-24: 6 commits2025-11-25: 1 commit2025-11-26: 3 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 3 commits2025-12-02: 2 commits2025-12-03: 1 commit2025-12-04: 2 commits2025-12-05: 0 commits2025-12-06: 2 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 1 commit2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 1 commit2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 2 commits2025-12-16: 0 commits2025-12-17: 1 commit2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 2 commits2025-12-23: 4 commits2025-12-24: 1 commit2025-12-25: 0 commits2025-12-26: 12 commits2025-12-27: 1 commit2025-12-28: 3 commits2025-12-29: 3 commits2025-12-30: 8 commits2025-12-31: 3 commits2026-01-01: 10 commits2026-01-02: 4 commits2026-01-03: 3 commits2026-01-04: 5 commits2026-01-05: 1 commit2026-01-06: 1 commit2026-01-07: 4 commits2026-01-08: 4 commits2026-01-09: 18 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 7 commits2026-01-15: 13 commits2026-01-16: 3 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 1 commit2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 2 commits2026-01-25: 5 commits2026-01-26: 4 commits2026-01-27: 6 commits2026-01-28: 0 commits2026-01-29: 1 commit2026-01-30: 7 commits2026-01-31: 1 commit2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 1 commit2026-02-04: 18 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 10 commits2026-02-08: 26 commits2026-02-09: 3 commits2026-02-10: 6 commits2026-02-11: 2 commits2026-02-12: 1 commit2026-02-13: 4 commits2026-02-14: 4 commits2026-02-15: 2 commits2026-02-16: 1 commit2026-02-17: 1 commit2026-02-18: 7 commits2026-02-19: 1 commit2026-02-20: 3 commits2026-02-21: 4 commits2026-02-22: 7 commits2026-02-23: 3 commits2026-02-24: 7 commits2026-02-25: 2 commits2026-02-26: 3 commits2026-02-27: 4 commits2026-02-28: 8 commits2026-03-01: 3 commits2026-03-02: 1 commit2026-03-03: 2 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 1 commit2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 1 commit2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 2 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 2 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 1 commit2026-06-11: 1 commit2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits
306 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Repeat trending

    3 trending appearances

What 99 does

99 is a Neovim plugin designed to blend the capabilities of modern agentic AI models with a traditional terminal-based coding workflow. Rather than replacing the programmer with a full-auto AI IDE, it acts as an assistant that can perform specific tasks, search context, and generate code edits from within Neovim. It supports multiple LLM providers (including OpenCode and Claude Code), auto-completion for rules and files directly in the prompt buffer, and the ability to inject context automatically by scanning for local AGENT.md or SKILL.md instruction files.

This plugin is for Neovim power users and 'traditional' coders who want the benefits of agentic AI assistance without abandoning their terminal-based editor for a GUI-based AI IDE.

  • Feature: Integrates agentic AI capabilities natively into the Neovim editor
  • Feature: Supports configurable AI providers including OpenCode and Claude Code
  • Feature: Provides prompt buffer auto-completion for file references (@files) and rules (#rules)
  • Feature: Automatically discovers and applies local AGENT.md instructions based on file path
  • Feature: Allows custom skill definitions via SKILL.md for specialized agent behaviors
  • Feature: Compatible with native Neovim completions, nvim-cmp, and blink

Where teams use it

Agentic Refactoring

Developers can highlight a specific block of code in Neovim and instruct the agent to rewrite or optimize it based on custom project rules.

Contextual AI Assistance

The agent can automatically pull context from local AGENT.md or SKILL.md files to generate accurate code matching the project's coding standards.

Intelligent Project Search

Users can leverage the agent to quickly search the codebase and retrieve relevant files or functions without leaving the editor.

Getting started: Install the plugin using your preferred Neovim package manager and configure `require('99').setup()` in your init.lua.

README

master branch

99

The AI client that Neovim deserves, built by those that still enjoy to code.

IF YOU ARE HERE FROM THE YT VIDEO

So many things have changed. So please be careful!

WARNING :: API CHANGES RIGHT NOW

It will happen that apis will disapear or be changed. Sorry, this is an BETA product.

Project Direction

This repo is meant to be my exploration grounds for using AI mixed with tradcoding.

I believe that hand coding is still very important and the best products i know of today still do that (see opencode vs claude code)

Warning

  1. Prompts are temporary right now. they could be massively improved
  2. Officially in beta, but api can still change. unlikely at this point

99

The AI Neovim experience

_99

99 is an agentic workflow that is meant to meld the current programmers ability with the amazing powers of LLMs. Instead of being a replacement, its meant to augment the programmer.

As of now, the direction of 99 is to progress into agentic programming and surfacing of information. In the beginning and the original youtube video was about replacing specific pieces of code. The more i use 99 the more i realize the better use is through search and work

Basic Setup

	{
		"ThePrimeagen/99",
		config = function()
			local _99 = require("99")

            -- For logging that is to a file if you wish to trace through requests
            -- for reporting bugs, i would not rely on this, but instead the provided
            -- logging mechanisms within 99.  This is for more debugging purposes
            local cwd = vim.uv.cwd()
            local basename = vim.fs.basename(cwd)
			_99.setup({
                -- provider = _99.Providers.ClaudeCodeProvider,  -- default: OpenCodeProvider
				logger = {
					level = _99.DEBUG,
					path = "/tmp/" .. basename .. ".99.debug",
					print_on_error = true,
				},
                -- When setting this to something that is not inside the CWD tools
                -- such as claude code or opencode will have permission issues
                -- and generation will fail refer to tool documentation to resolve
                -- https://opencode.ai/docs/permissions/#external-directories
                -- https://code.claude.com/docs/en/permissions#read-and-edit
                tmp_dir = "./tmp",

                --- Completions: #rules and @files in the prompt buffer
                completion = {
                    -- I am going to disable these until i understand the
                    -- problem better.  Inside of cursor rules there is also
                    -- application rules, which means i need to apply these
                    -- differently
                    -- cursor_rules = "<custom path to cursor rules>"

                    --- A list of folders where you have your own SKILL.md
                    --- Expected format:
                    --- /path/to/dir/<skill_name>/SKILL.md
                    ---
                    --- Example:
                    --- Input Path:
                    --- "scratch/custom_rules/"
                    ---
                    --- Output Rules:
                    --- {path = "scratch/custom_rules/vim/SKILL.md", name = "vim"},
                    --- ... the other rules in that dir ...
                    ---
                    custom_rules = {
                      "scratch/custom_rules/",
                    },

                    --- Configure @file completion (all fields optional, sensible defaults)
                    files = {
                        -- enabled = true,
                        -- max_file_size = 102400,     -- bytes, skip files larger than this
                        -- max_files = 5000,            -- cap on total discovered files
                        -- exclude = { ".env", ".env.*", "node_modules", ".git", ... },
                    },
                    --- File Discovery:
                    --- - In git repos: Uses `git ls-files` which automatically respects .gitignore
                    --- - Non-git repos: Falls back to filesystem scanning with manual excludes
                    --- - Both methods apply the configured `exclude` list on top of gitignore

                    --- What autocomplete engine to use. Defaults to native (built-in) if not specified.
                    source = "native", -- "native" (default), "cmp", or "blink"
                },

                --- WARNING: if you change cwd then this is likely broken
                --- ill likely fix this in a later change
                ---
                --- md_files is a list of files to look for and auto add based on the location
                --- of the originating request.  That means if you are at /foo/bar/baz.lua
                --- the system will automagically look for:
                --- /foo/bar/AGENT.md
                --- /foo/AGENT.md
                --- assuming that /foo is project root (based on cwd)
				md_files = {
					"AGENT.md",
				},
			})

            -- take extra note that i have visual selection only in v mode
            -- technically whatever your last visual selection is, will be used
            -- so i have this set to visual mode so i dont screw up and use an
            -- old visual selection
            --
            -- likely ill add a mode check and assert on required visual mode
            -- so just prepare for it now
			vim.keymap.set("v", "<leader>9v", function()
				_99.visual()
			end)

            --- if you have a request you dont want to make any changes, just cancel it
			vim.keymap.set("n", "<leader>9x", function()
				_99.stop_all_requests()
			end)

			vim.keymap.set("n", "<leader>9s", function()
				_99.search()
			end)
		end,
	},

Usage

I would highly recommend trying out search as its the direction the library is going

_99.search()

See search for more details

Description

Name Type Default Value
setup fun(opts?: _99.Options): nil -
search fun(opts: _99.ops.SearchOpts): _99.TraceID -
vibe fun(opts?: _99.ops.Opts): _99.TraceID | nil -
open fun(): nil -
visual fun(opts: _99.ops.Opts): _99.TraceID -
view_logs fun(): nil -
stop_all_requests fun(): nil -
clear_previous_requests fun(): nil -
Extensions _99.Extensions -

API

setup

Sets up _99. Must be called for this library to work. This is how we setup in flight request spinners, set default values, get completion to work the way you want it to.

search

Performs a search across your project with the prompt you provide and return out a list of locations with notes that will be put into your quick fix list.

vibe

No description.

open

Opens a selection window for you to select the last interaction to open and display its contents in a way that makes sense for its type. For search and vibe, it will open the qfix window. For tutorial, it will open the tutorial window.

visual

takes your current selection and sends that along with the prompt provided and replaces your visual selection with the results

view_logs

views the most recent logs and setups the machine to view older and new logs this is still pretty rough and will change in the near future

stop_all_requests

stops all in flight requests. this means that the underlying process will be killed (OpenCode) and any result will be discared

clear_previous_requests

clears all previous search and visual operations

Extensions

check out Worker for cool abstraction on search and vibe

_99.Extensions.Worker

A persistent way to keep track of work.

this will likely be where the most change and focus goes into. I would like to take this into worktree territory and be able to swap between stuff super slick.

Until then, it is going to be a single bit of work that you can provide the description and then use search to find what is left that needs to be done.

Description

Name Type Default Value
set_work fun(opts?: _99.WorkOpts): nil -
search fun(): nil -

API

set_work

will set the work for the project. If opts provide a description then no input capture of work description will be required

search

will use _99.search to find what is left to be done for this work item to be considered done

_99.Options

No description.

Description

Name Type Default Value
logger _99.Logger.Options | nil -
model string | nil -
in_flight_options _99.InFlight.Opts | nil -
md_files string[] | nil -
provider _99.Providers.BaseProvider | nil -
display_errors boolean | nil -
auto_add_skills boolean | nil -
completion _99.Completion | nil -
tmp_dir string | nil -

API

logger

No description.

model

No description.

in_flight_options

No description.

md_files

No description.

provider

No description.

display_errors

No description.

auto_add_skills

No description.

completion

No description.

tmp_dir

No description.

_99.ops.Opts

The options that are used throughout all the interations with 99. This includes search, visual, and others

Description

Name Type Default Value
additional_prompt string | nil -
additional_rules _99.Agents.Rule[] | nil -

API

additional_prompt

by providing additional_prompt you will not be required to provide a prompt. this allows you to define actions based on remaps

remap("n", "<leader>9d", function()
  --- this function could be used to auto debug your project
  _99.search({
    additional_prompt = [[
run `make test` and debug the test failures and provide me a comprehensive set of steps where
the tests are breaking ]]
  })
end)

This would kick off a search job that will run your tests in the background. the resulting failures would be diagnosed and search results would be transfered into a quick fix list.

additional_rules

can be used to provide extra args. If you have a skill called "cloudflare" you could provide the rule for cloudflare and its context will be injected into your request

_99.ops.SearchOpts

See _99.opts.Opts for more information.

There are no properties yet. But i would like to tweek some behavior based on opts

Description

Name Type Default Value
- - -

API

No properties.

_99.WorkOpts

No description.

Description

Name Type Default Value
description string | nil -

API

description

No description.

_99.Completion

No description.

Description

Name Type Default Value
source "cmp" | "blink" | nil -
custom_rules string[] -
files _99.Files.Config? -

API

source

No description.

custom_rules

No description.

files

No description.

_99.InFlight.Opts

this is pure a class for testing. helps controls timings

Description

Name Type Default Value
throbber_opts _99.Throbber.Opts | nil -
in_flight_interval number | nil -
enable boolean | nil -

API

throbber_opts

options for the throbber in the top left

in_flight_interval

frequency in which the in-flight interval checks to see if it should be displayed / removed

enable

defaults to true

_99.Logger.Options

No description.

Description

Name Type Default Value
level number? -
type "print" | "void" | "file" | nil -
path string? -
print_on_error boolean | nil -
max_requests_cached number | nil -

API

level

No description.

type

No description.

path

No description.

print_on_error

No description.

max_requests_cached

No description.

_99.Agents.Rule

No description.

Description

Name Type Default Value
name string -
path string -
absolute_path string? -

API

name

No description.

path

No description.

absolute_path

No description.

Completions

When prompting, you can reference rules and files to add context to your request.

  • # references rules — type # in the prompt to autocomplete rule files from your configured rule directories
  • @ references files — type @ to fuzzy-search project files. This will exclude files that are in .gitignore.

Referenced content is automatically resolved and injected into the AI context. Native completions work by default. For nvim-cmp or blink.cmp, set source = "cmp" or source = "blink".

Providers

99 supports multiple AI CLI backends. Set provider in your setup to switch. If you don't set model, the provider's default is used.

Provider CLI tool Default model
OpenCodeProvider (default) opencode opencode/claude-sonnet-4-5
ClaudeCodeProvider claude claude-sonnet-4-5
CursorAgentProvider cursor-agent sonnet-4.5
GeminiCLIProvider gemini auto
_99.setup({
    provider = _99.Providers.ClaudeCodeProvider,
    -- model is optional, overrides the provider's default
    model = "claude-sonnet-4-5",
})

Extensions

Telescope Model Selector

If you have telescope.nvim installed, you can switch models on the fly via the Telescope picker:

vim.keymap.set("n", "<leader>9m", function()
  require("99.extensions.telescope").select_model()
end)

The selected model is used for all subsequent requests in the current session.

Telescope Provider Selector

Switch between providers (OpenCode, Claude, Cursor, Kiro) without restarting Neovim. Switching provider also resets the model to that provider's default.

vim.keymap.set("n", "<leader>9p", function()
  require("99.extensions.telescope").select_provider()
end)

fzf-lua

If you use fzf-lua instead of telescope, the same pickers are available:

vim.keymap.set("n", "<leader>9m", function()
  require("99.extensions.fzf_lua").select_model()
end)

vim.keymap.set("n", "<leader>9p", function()
  require("99.extensions.fzf_lua").select_provider()
end)

Reporting a bug

To report a bug, please provide the full running debug logs. This may require a bit of back and forth.

Please do not request features. We will hold a public discussion on Twitch about features, which will be a much better jumping point then a bunch of requests that i have to close down. If you do make a feature request ill just shut it down instantly.

The logs

To get the last run's logs execute :lua require("99").view_logs().

Dont forget

If there are secrets or other information in the logs you want to be removed make sure that you delete the query printing. This will likely contain information you may not want to share.

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Discussions

all 15

Code frequency

additions and deletions
+5.8K-5.8KWeek of 2025-11-16: +2 linesWeek of 2025-11-16: -0 linesWeek of 2025-11-23: +2,300 linesWeek of 2025-11-23: -1,287 linesWeek of 2025-11-30: +2,010 linesWeek of 2025-11-30: -1,034 linesWeek of 2025-12-07: +362 linesWeek of 2025-12-07: -217 linesWeek of 2025-12-14: +312 linesWeek of 2025-12-14: -70 linesWeek of 2025-12-21: +1,738 linesWeek of 2025-12-21: -1,038 linesWeek of 2025-12-28: +1,557 linesWeek of 2025-12-28: -729 linesWeek of 2026-01-04: +2,141 linesWeek of 2026-01-04: -1,021 linesWeek of 2026-01-11: +4,364 linesWeek of 2026-01-11: -3,478 linesWeek of 2026-01-18: +328 linesWeek of 2026-01-18: -189 linesWeek of 2026-01-25: +1,654 linesWeek of 2026-01-25: -888 linesWeek of 2026-02-01: +716 linesWeek of 2026-02-01: -977 linesWeek of 2026-02-08: +2,489 linesWeek of 2026-02-08: -518 linesWeek of 2026-02-15: +1,512 linesWeek of 2026-02-15: -1,130 linesWeek of 2026-02-22: +5,778 linesWeek of 2026-02-22: -1,916 linesWeek of 2026-03-01: +264 linesWeek of 2026-03-01: -52 linesWeek of 2026-03-08: +1 linesWeek of 2026-03-08: -2 linesWeek of 2026-03-15: +13 linesWeek of 2026-03-15: -6 linesWeek of 2026-03-22: +34 linesWeek of 2026-03-22: -2 linesWeek of 2026-03-29: +0 linesWeek of 2026-03-29: -0 linesWeek of 2026-04-05: +0 linesWeek of 2026-04-05: -0 linesWeek of 2026-04-12: +0 linesWeek of 2026-04-12: -0 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +102 linesWeek of 2026-04-26: -4 linesWeek of 2026-05-03: +0 linesWeek of 2026-05-03: -0 linesWeek of 2026-05-10: +0 linesWeek of 2026-05-10: -0 linesWeek of 2026-05-17: +0 linesWeek of 2026-05-17: -0 linesWeek of 2026-05-24: +0 linesWeek of 2026-05-24: -0 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +13 linesWeek of 2026-06-07: -3 linesWeek of 2026-06-14: +0 linesWeek of 2026-06-14: -0 linesWeek of 2026-06-21: +0 linesWeek of 2026-06-21: -0 linesWeek of 2026-06-28: +0 linesWeek of 2026-06-28: -0 linesWeek of 2026-07-05: +0 linesWeek of 2026-07-05: -0 linesWeek of 2026-07-12: +0 linesWeek of 2026-07-12: -0 linesWeek of 2026-07-19: +0 linesWeek of 2026-07-19: -0 linesWeek of 2026-07-26: +0 linesWeek of 2026-07-26: -0 linesNov 16, 2025Jul 26, 2026
+27.7K lines added, -14.6K removed over the last year.

Commits per week

last 52 weeks
460Week of 2025-08-02: 0 commitsWeek of 2025-08-09: 0 commitsWeek of 2025-08-16: 0 commitsWeek of 2025-08-23: 0 commitsWeek of 2025-08-30: 0 commitsWeek of 2025-09-06: 0 commitsWeek of 2025-09-13: 0 commitsWeek of 2025-09-20: 0 commitsWeek of 2025-09-27: 0 commitsWeek of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 2 commitsWeek of 2025-11-23: 10 commitsWeek of 2025-11-30: 10 commitsWeek of 2025-12-07: 2 commitsWeek of 2025-12-14: 3 commitsWeek of 2025-12-21: 20 commitsWeek of 2025-12-28: 34 commitsWeek of 2026-01-04: 33 commitsWeek of 2026-01-11: 23 commitsWeek of 2026-01-18: 3 commitsWeek of 2026-01-25: 24 commitsWeek of 2026-02-01: 29 commitsWeek of 2026-02-08: 46 commitsWeek of 2026-02-15: 19 commitsWeek of 2026-02-22: 34 commitsWeek of 2026-03-01: 6 commitsWeek of 2026-03-08: 1 commitsWeek of 2026-03-15: 1 commitsWeek of 2026-03-22: 2 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 2 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 2 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 0 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 0 commitsAug 2, 2025Jul 26, 2026
306 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 2 commitsSun 1:00 — 2 commitsSun 2:00 — 0 commitsSun 3:00 — 1 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 7 commitsSun 8:00 — 3 commitsSun 9:00 — 6 commitsSun 10:00 — 2 commitsSun 11:00 — 0 commitsSun 12:00 — 2 commitsSun 13:00 — 5 commitsSun 14:00 — 1 commitsSun 15:00 — 2 commitsSun 16:00 — 1 commitsSun 17:00 — 4 commitsSun 18:00 — 3 commitsSun 19:00 — 10 commitsSun 20:00 — 0 commitsSun 21:00 — 0 commitsSun 22:00 — 0 commitsSun 23:00 — 1 commitsMon 0:00 — 0 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 3 commitsMon 7:00 — 11 commitsMon 8:00 — 6 commitsMon 9:00 — 3 commitsMon 10:00 — 2 commitsMon 11:00 — 1 commitsMon 12:00 — 1 commitsMon 13:00 — 0 commitsMon 14:00 — 0 commitsMon 15:00 — 1 commitsMon 16:00 — 1 commitsMon 17:00 — 0 commitsMon 18:00 — 0 commitsMon 19:00 — 1 commitsMon 20:00 — 0 commitsMon 21:00 — 0 commitsMon 22:00 — 0 commitsMon 23:00 — 0 commitsTue 0:00 — 0 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 1 commitsTue 7:00 — 8 commitsTue 8:00 — 4 commitsTue 9:00 — 10 commitsTue 10:00 — 0 commitsTue 11:00 — 2 commitsTue 12:00 — 1 commitsTue 13:00 — 3 commitsTue 14:00 — 4 commitsTue 15:00 — 3 commitsTue 16:00 — 2 commitsTue 17:00 — 1 commitsTue 18:00 — 3 commitsTue 19:00 — 3 commitsTue 20:00 — 0 commitsTue 21:00 — 0 commitsTue 22:00 — 0 commitsTue 23:00 — 0 commitsWed 0:00 — 0 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 1 commitsWed 6:00 — 2 commitsWed 7:00 — 7 commitsWed 8:00 — 10 commitsWed 9:00 — 5 commitsWed 10:00 — 7 commitsWed 11:00 — 0 commitsWed 12:00 — 1 commitsWed 13:00 — 1 commitsWed 14:00 — 3 commitsWed 15:00 — 1 commitsWed 16:00 — 2 commitsWed 17:00 — 1 commitsWed 18:00 — 2 commitsWed 19:00 — 2 commitsWed 20:00 — 0 commitsWed 21:00 — 0 commitsWed 22:00 — 4 commitsWed 23:00 — 1 commitsThu 0:00 — 0 commitsThu 1:00 — 0 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 1 commitsThu 8:00 — 2 commitsThu 9:00 — 1 commitsThu 10:00 — 3 commitsThu 11:00 — 4 commitsThu 12:00 — 5 commitsThu 13:00 — 9 commitsThu 14:00 — 2 commitsThu 15:00 — 3 commitsThu 16:00 — 0 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 1 commitsThu 20:00 — 0 commitsThu 21:00 — 1 commitsThu 22:00 — 2 commitsThu 23:00 — 2 commitsFri 0:00 — 1 commitsFri 1:00 — 0 commitsFri 2:00 — 1 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 1 commitsFri 7:00 — 0 commitsFri 8:00 — 11 commitsFri 9:00 — 2 commitsFri 10:00 — 0 commitsFri 11:00 — 0 commitsFri 12:00 — 1 commitsFri 13:00 — 1 commitsFri 14:00 — 2 commitsFri 15:00 — 6 commitsFri 16:00 — 4 commitsFri 17:00 — 8 commitsFri 18:00 — 0 commitsFri 19:00 — 3 commitsFri 20:00 — 2 commitsFri 21:00 — 8 commitsFri 22:00 — 5 commitsFri 23:00 — 0 commitsSat 0:00 — 1 commitsSat 1:00 — 0 commitsSat 2:00 — 1 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 2 commitsSat 8:00 — 1 commitsSat 9:00 — 7 commitsSat 10:00 — 1 commitsSat 11:00 — 5 commitsSat 12:00 — 2 commitsSat 13:00 — 3 commitsSat 14:00 — 2 commitsSat 15:00 — 1 commitsSat 16:00 — 1 commitsSat 17:00 — 0 commitsSat 18:00 — 2 commitsSat 19:00 — 5 commitsSat 20:00 — 2 commitsSat 21:00 — 1 commitsSat 22:00 — 0 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits137 (39%)
Community commits213 (61%)

350 commits in total over the last year.

DateListRankStars gained
Feb 1, 2026daily#9+253
Jan 31, 2026daily#9+241
Jan 30, 2026daily#24+128