cactus-compute/needlePublic

Automation foundation model for tiny devices: 2-bit, 8-29 MB, tool calls, structured extraction and embeddings on phones, wearables, smart homes, robots, cars and microcontrollers.

AI summary: A 26M parameter Simple Attention Network optimized for function calling.

Stars
13.2K
+283 today
Forks
891
Watchers
72
Open issues
13
Open PRs
20
Contributors
~32
Commits
330
Branches
37

PythonApache-2.0Created Feb 24, 2026Last push today+563 stars this week+2.9K this month

Quick answers

What is needle?
A 26M parameter Simple Attention Network optimized for function calling.
What does needle do?
Needle is a highly compact, 26-million parameter language model tailored specifically for structured function calling. Built on the Simple Attention Network architecture, it is designed for deployment in resource-constrained environments where standard large language models are impractical. It offers extremely fast inference, achieving 6000 tokens per second for prefilling and 1200 tokens per second for decoding when running on Cactus. The model can also be fine-tuned locally on consumer hardware like a standard Mac or PC. It is meticulously optimized for environments with minimal RAM, operating within a few hundred megabytes.
Who is needle for?
AI developers and researchers who need a fast, local, and lightweight model specifically for translating natural language into function calls.
How do I get started with needle?
https://huggingface.co/Cactus-Compute/needle
How popular is needle on GitHub?
cactus-compute/needle has 13,209 stars and 891 forks on GitHub, and gained 563 stars in the last 7 days.
What license does needle use?
cactus-compute/needle is released under the Apache-2.0 license.

Star history

since Jul 28, 2026
05K10KJul 2026Aug 2026Sep 2026Oct 2026
13.2K stars as of Oct 4, 2026. Measured daily since Jul 28, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

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

Signals and awards

derived from tracked data
  • Widely adopted

    13,209 stars

  • Actively maintained

    Pushed within 48 hours

  • Permissive license

    Apache-2.0

  • Continuous integration

    Automated checks passing

  • Repeat trending

    36 trending appearances

What needle does

Needle is a highly compact, 26-million parameter language model tailored specifically for structured function calling. Built on the Simple Attention Network architecture, it is designed for deployment in resource-constrained environments where standard large language models are impractical. It offers extremely fast inference, achieving 6000 tokens per second for prefilling and 1200 tokens per second for decoding when running on Cactus. The model can also be fine-tuned locally on consumer hardware like a standard Mac or PC. It is meticulously optimized for environments with minimal RAM, operating within a few hundred megabytes.

AI developers and researchers who need a fast, local, and lightweight model specifically for translating natural language into function calls.

  • Ultra-lightweight architecture: utilizes only 26 million parameters to enable execution on minimal consumer hardware.
  • Function calling focus: trained specifically to parse complex inputs and accurately output structured tool calls.
  • High-speed inference: achieves exceptionally fast prefill and decode speeds when paired with the Cactus runtime.
  • Local finetunability: designed so developers can train and adapt the model entirely on personal computers.
  • Open-weight distribution: provides complete access to model weights and dataset generation scripts on Hugging Face.

Where teams use it

On-device tool execution

Developers deploy it on local machines to route natural language to local APIs without cloud latency.

Edge computing automation

Engineers embed the model into edge devices to handle structured JSON outputs locally.

Custom function calling

Researchers fine-tune the model on specific datasets to improve accuracy for proprietary internal tools.

Low-latency parsing

Systems use it to rapidly convert user intent into actionable backend commands.

Getting started: https://huggingface.co/Cactus-Compute/needle

README

main branch

Needle

A foundation model for mobiles, wearables, robots, smart home, automotive and microcontrollers. The whole model is a single 8-29 MB binary built on our Simple Attention Network, and we trade general chat capacity to beat models 10x its size on mobile tool calls and match 2-3x bigger models on extraction.

  • Tool calls: given the functions your app exposes, Needle picks the right ones and fills every argument from what the user said. Ask for two things and you get two calls in order; ask for something no tool covers and you get an empty list, not a guess.
  • Structured extraction: declare a shape, hand over messy text, get typed fields back: an invoice, a booking, a notification, a form. The decode grammar guarantees the output parses, and extraction generalises to classification.
  • Text embedding: the same model returns a vector for a sentence, so an app can search, match and route locally.
  • Speech: Whistle, our speech-to-text model, shares Needle's container and engine. One build gives Needle audio input: the clip goes in, the tool calls come out.

Needle 3 at a glance

Needle 3 is a Laddered Simple Attention Network: a Monarch Hadamard MLP in place of the FFN, GQA attention with causal conv taps, engram n-gram memory read by gather, and multi-lane hyper-connections, trained so that every depth from 2 to 20 layers is a deployable model. Most of its parameters sit in the engram, so the 121M model does the arithmetic of a 50M one. A byte-level grammar compiled from your schemas constrains every token, and every response carries a calibrated confidence score from a learned head. The architecture diagram is on the release page.

Benchmarks

Tool calling is exact-match accuracy on the full test splits, extraction is field micro-F1 on the full test splits.

Needle 3 against baselines on six benchmarks

The interactive frontier plot, the architecture and the fine-tuning results are at cactuscompute.com/needle.

Get started

pip install cactus-needle

Try it in the browser at cactuscompute.com/needle; the weights and every platform engine are on Hugging Face.

Decorate a function: the signature gives the argument types, the docstring is the tool description, and run() completes the loop, executing your function and returning its results.

import needle

@needle.tool
def get_weather(city: str):
    "Get the current weather for a city."
    return {"city": city, "temp_c": 27, "sky": "clear"}

agent = needle.Needle(tools=[get_weather])
print(agent.run("what's it like in Lagos right now?")["results"])
# [{'city': 'Lagos', 'temp_c': 27, 'sky': 'clear'}]

Every turn returns one JSON object with function_calls, the model's reasoning and a calibrated confidence; an off-topic request returns an empty list rather than a guess. needle.Needle(tools=[...], generation=2) keeps running Needle 2 for existing deployments.

Whistle

One engine, three ways to load it

Whistle is our speech-to-text model, one 16.9 MB file on the CPU: 16 kHz mono audio, up to 30 seconds in one pass, in English, German, French, Spanish, Italian, Dutch and Polish. It shares Needle's .cact container, its quantisation and its C++ engine, so the two are one runtime, and its decoder is laddered the same way, with --audio-depth N running the N-layer rung of the same weights.

import needle

print(needle.transcribe("clip.wav")["text"])
# turn off the kitchen lights

Every call returns the text, the language, the milliseconds to the first token and the decoder's tokens per second after it. word_timestamps=True adds each word with its start, end and probability, keywords=[...] favours the names and product words your users say, and language="de" forces the language instead of detecting it. needle.Whistle() is the same model as an object, for embed(audio) or to hold one tuned .cact. Silence and steady noise return an empty transcript rather than an invented sentence. needle whistle playground transcribes from the microphone, and needle whistle compare puts Whistle next to Whisper and Moonshine on the same clip.

At 16.9 MB Whistle is 8.6x smaller than Whisper base and 6.6x quicker to the first token. It is ahead on LibriSpeech test-clean and test-other, on SPGISpeech, on Earnings-22 and on the FLEURS average. Whisper base is ahead on TED-LIUM, on AMI and on the MLS average.

Whistle against Whisper and Moonshine

Word error rate on the full test splits, scored with the Whisper normalizers. Whisper and Moonshine figures are the ones their authors published. Latency and decode are 10 s of audio on an Apple M4 Pro, at each engine's defaults. The per-benchmark caveats are on Hugging Face.

needle --model needle3.cact --model whistle.cact --tools tools.json --audio clip.wav

One engine holds both models: needle_load reads whichever one a .cact carries, and needle_complete takes a clip wherever it takes text. It transcribes, answers the transcript against your tools, and returns one JSON object with the tool calls and the speech fields, the speech ones prefixed audio_. The transcription stays inside the engine, so audio in and tool calls out is one call.

The benchmarks against Whisper and Moonshine, the architecture and the interactive demo are at cactuscompute.com/whistle; the weights and every platform engine are on Hugging Face.

Guides

  • How to design tools for Needle 3: one tool per action, names users would say, formats in descriptions, constraints in the grammar, triggers.
  • Leveraging Needle's confidence: what the score measures, what the engine withholds, and routing on act, confirm or refuse.
  • Structured JSON extraction with Needle: the record as the only tool, typed results, classification with enums.
  • Fine-tuning Needle: the data format, the commands, reading the loss, sizing the dataset.
  • Needle Python docs: the API, the response shape, the behaviour contract, system facts, tool retrieval, offline devices, environments, the CLI.
  • What devices are supported on Needle: every platform folder, the CLI runner, the C API, the browser, WASI, air-gapped setup.
  • The .cact format: the file the engine maps and reads in place, Cactus Quants at 2.125 bits per weight, and how to parse it yourself.
  • Porting Needle 3: notes for writing your own runtime, the oracle to test against, the tensor order the container promises, the prompt on the wire, the ladder rule, retrieval with needle_embed.

llms.txt in this repo carries the same reference for AI coding assistants.

Customisation

Needle was designed to be customised. Its capacity is a ladder, and a subnetwork as small as 2 layers, fine-tuned on one product's tools, runs optimally on devices far smaller than the full model needs. Fine-tuning on DroidCall lifts every subnetwork by 18 to 36 points, and from 4 layers up the tuned subnetwork passes DeepSeek V4 Flash, starting at 29M parameters.

Every subnetwork before and after fine-tuning on DroidCall and on Mobile Actions

Two ways to fine-tune, from the same package:

Local, needle finetune Platform, needle platform finetune
What trains LoRA adapters on the attention projections, base frozen, merged at export The full model, every depth from 2 layers up
What it keeps Your data only Your data reinforced with Needle's original dataset, so nothing already learned is unlearned
Confidence Head untouched; confidence is None Head fine-tuned with the model, calibrated on your tools
Precision 4-bit 2-bit, the same post-training as the shipped model
Data Your JSONL, query/answers or chat format Yours, or generated from your tool definitions, 100 to 10,000 examples per run
Scores Validation loss Validation and test accuracy for every depth
Compute Your machine, JAX on CPU, CUDA or Metal Cactus GPUs
Runs from The CLI The CLI, Python, the dashboard, or a coding agent holding your key

Local:

pip install "cactus-needle[train]"
needle finetune data.jsonl --epochs 10 --out adapter.safetensors
needle build --lora adapter.safetensors --layers 8 --out tuned.cact

Platform, with a key from the console in NEEDLE_API_KEY. One command uploads the files, trains and scores every size, and downloads the .cact files; once a job is submitted it can also be followed on the dashboard:

export NEEDLE_API_KEY=needle_ft_...
needle platform generate --tools tools.json --examples 1000 --out ./data
needle platform finetune data/train.jsonl data/validation.jsonl data/test.jsonl --suffix smart-home --out ./models
from needle.platform import Platform

client = Platform()
job = client.wait(client.finetune(["train.jsonl"], ["validation.jsonl"], ["test.jsonl"], suffix="smart-home"))
paths = client.download(job["fine_tuned_model"], "models", depth=8)

Or hand the key to Claude Code or Codex with cactuscompute.com/llms.txt and let the agent run the loop. needle platform jobs | models | files | billing list what the account holds, needle download model-<id> fetches a model by id, and the fine-tuning guide covers the data format and how to read the scores.

Deploy

Every deployment target ships a prebuilt engine that loads the needle3.cact weights at start. needle build --platform <folder> [--layers N] fetches that engine and puts the weights beside it.

One engine per platform folder

needle build --platform macos-arm64
needle build --platform linux-arm64 --layers 8 --out ./pi
./macos-arm64/needle --model needle3.cact --tools tools.json --serve

The devices guide lists every folder and what ships in it.

By default, telemetry is turned on in the binary. To turn it off, set environment variables NEEDLE_TELEMETRY=0 and DO_NOT_TRACK=1.

Citation

Needle is built by the Cactus Compute team. If you use it in your work, please cite:

@misc{needle3_2026,
  title        = {Needle: Automation Foundation Model for Tiny Devices},
  author       = {Ndubuaku, Henry and Mosoyan, Karen and Mroz, Jakub and Cylich, Noah and
                  Kumar, Satyajit and Sandhu, Parkirat and Shemet, Roman and Lee, Justin H.},
  year         = {2026},
  organization = {Cactus Compute, Inc.},
  howpublished = {\url{https://github.com/cactus-compute/needle}}
}
View on GitHub

Recent activity

commits and pull requests

Code frequency

additions and deletions
+21.9K-21.9KWeek of 2026-02-22: +2,929 linesWeek of 2026-02-22: -391 linesWeek of 2026-03-01: +5,932 linesWeek of 2026-03-01: -2,948 linesWeek of 2026-03-08: +7,918 linesWeek of 2026-03-08: -6,062 linesWeek of 2026-03-15: +3,780 linesWeek of 2026-03-15: -3,430 linesWeek of 2026-03-22: +2,120 linesWeek of 2026-03-22: -1,973 linesWeek of 2026-03-29: +6,773 linesWeek of 2026-03-29: -3,333 linesWeek of 2026-04-05: +2,132 linesWeek of 2026-04-05: -807 linesWeek of 2026-04-12: +640 linesWeek of 2026-04-12: -0 linesWeek of 2026-04-19: +1,598 linesWeek of 2026-04-19: -3,619 linesWeek of 2026-04-26: +0 linesWeek of 2026-04-26: -0 linesWeek of 2026-05-03: +2,248 linesWeek of 2026-05-03: -11 linesWeek of 2026-05-10: +19,729 linesWeek of 2026-05-10: -21,886 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: +0 linesWeek of 2026-06-07: -0 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: +1 linesWeek of 2026-06-28: -1 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: +1 linesWeek of 2026-07-19: -1 linesWeek of 2026-07-26: +0 linesWeek of 2026-07-26: -0 linesWeek of 2026-08-02: +0 linesWeek of 2026-08-02: -0 linesWeek of 2026-08-09: +6,201 linesWeek of 2026-08-09: -11,404 linesWeek of 2026-08-16: +425 linesWeek of 2026-08-16: -70 linesWeek of 2026-08-23: +1,359 linesWeek of 2026-08-23: -40 linesWeek of 2026-08-30: +1,331 linesWeek of 2026-08-30: -160 linesWeek of 2026-09-06: +455 linesWeek of 2026-09-06: -34 linesWeek of 2026-09-13: +3,294 linesWeek of 2026-09-13: -2,657 linesWeek of 2026-09-20: +1,570 linesWeek of 2026-09-20: -135 linesWeek of 2026-09-27: +1,924 linesWeek of 2026-09-27: -579 linesWeek of 2026-10-04: +0 linesWeek of 2026-10-04: -0 linesFeb 22, 2026Oct 4, 2026
+72.4K lines added, -59.5K removed over the last year.

Commits per week

last 52 weeks
490Week 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: 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: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 17 commitsWeek of 2026-03-01: 42 commitsWeek of 2026-03-08: 49 commitsWeek of 2026-03-15: 24 commitsWeek of 2026-03-22: 21 commitsWeek of 2026-03-29: 29 commitsWeek of 2026-04-05: 24 commitsWeek of 2026-04-12: 1 commitsWeek of 2026-04-19: 3 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 1 commitsWeek of 2026-05-10: 14 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 1 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 1 commitsWeek of 2026-07-26: 0 commitsWeek of 2026-08-02: 0 commitsWeek of 2026-08-09: 27 commitsWeek of 2026-08-16: 13 commitsWeek of 2026-08-23: 7 commitsWeek of 2026-08-30: 7 commitsWeek of 2026-09-06: 4 commitsWeek of 2026-09-13: 17 commitsWeek of 2026-09-20: 7 commitsWeek of 2026-09-27: 11 commitsWeek of 2026-10-04: 0 commitsOct 11, 2025Oct 4, 2026
320 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 2 commitsSun 1:00 — 3 commitsSun 2:00 — 3 commitsSun 3:00 — 2 commitsSun 4:00 — 3 commitsSun 5:00 — 1 commitsSun 6:00 — 2 commitsSun 7:00 — 3 commitsSun 8:00 — 5 commitsSun 9:00 — 3 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 0 commitsSun 13:00 — 0 commitsSun 14:00 — 0 commitsSun 15:00 — 0 commitsSun 16:00 — 3 commitsSun 17:00 — 3 commitsSun 18:00 — 0 commitsSun 19:00 — 1 commitsSun 20:00 — 2 commitsSun 21:00 — 2 commitsSun 22:00 — 4 commitsSun 23:00 — 4 commitsMon 0:00 — 1 commitsMon 1:00 — 3 commitsMon 2:00 — 4 commitsMon 3:00 — 5 commitsMon 4:00 — 3 commitsMon 5:00 — 1 commitsMon 6:00 — 1 commitsMon 7:00 — 3 commitsMon 8:00 — 6 commitsMon 9:00 — 0 commitsMon 10:00 — 0 commitsMon 11:00 — 4 commitsMon 12:00 — 2 commitsMon 13:00 — 1 commitsMon 14:00 — 0 commitsMon 15:00 — 1 commitsMon 16:00 — 0 commitsMon 17:00 — 1 commitsMon 18:00 — 3 commitsMon 19:00 — 0 commitsMon 20:00 — 5 commitsMon 21:00 — 3 commitsMon 22:00 — 2 commitsMon 23:00 — 3 commitsTue 0:00 — 1 commitsTue 1:00 — 2 commitsTue 2:00 — 1 commitsTue 3:00 — 2 commitsTue 4:00 — 0 commitsTue 5:00 — 4 commitsTue 6:00 — 0 commitsTue 7:00 — 1 commitsTue 8:00 — 0 commitsTue 9:00 — 0 commitsTue 10:00 — 1 commitsTue 11:00 — 1 commitsTue 12:00 — 0 commitsTue 13:00 — 2 commitsTue 14:00 — 2 commitsTue 15:00 — 3 commitsTue 16:00 — 10 commitsTue 17:00 — 3 commitsTue 18:00 — 7 commitsTue 19:00 — 2 commitsTue 20:00 — 2 commitsTue 21:00 — 2 commitsTue 22:00 — 4 commitsTue 23:00 — 2 commitsWed 0:00 — 3 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 3 commitsWed 6:00 — 3 commitsWed 7:00 — 3 commitsWed 8:00 — 0 commitsWed 9:00 — 1 commitsWed 10:00 — 6 commitsWed 11:00 — 0 commitsWed 12:00 — 1 commitsWed 13:00 — 0 commitsWed 14:00 — 0 commitsWed 15:00 — 0 commitsWed 16:00 — 1 commitsWed 17:00 — 3 commitsWed 18:00 — 1 commitsWed 19:00 — 2 commitsWed 20:00 — 1 commitsWed 21:00 — 3 commitsWed 22:00 — 2 commitsWed 23:00 — 1 commitsThu 0:00 — 3 commitsThu 1:00 — 0 commitsThu 2:00 — 1 commitsThu 3:00 — 2 commitsThu 4:00 — 2 commitsThu 5:00 — 2 commitsThu 6:00 — 1 commitsThu 7:00 — 5 commitsThu 8:00 — 4 commitsThu 9:00 — 0 commitsThu 10:00 — 2 commitsThu 11:00 — 4 commitsThu 12:00 — 1 commitsThu 13:00 — 1 commitsThu 14:00 — 1 commitsThu 15:00 — 4 commitsThu 16:00 — 3 commitsThu 17:00 — 3 commitsThu 18:00 — 1 commitsThu 19:00 — 1 commitsThu 20:00 — 1 commitsThu 21:00 — 4 commitsThu 22:00 — 2 commitsThu 23:00 — 7 commitsFri 0:00 — 2 commitsFri 1:00 — 2 commitsFri 2:00 — 1 commitsFri 3:00 — 2 commitsFri 4:00 — 3 commitsFri 5:00 — 2 commitsFri 6:00 — 4 commitsFri 7:00 — 4 commitsFri 8:00 — 0 commitsFri 9:00 — 1 commitsFri 10:00 — 1 commitsFri 11:00 — 2 commitsFri 12:00 — 0 commitsFri 13:00 — 1 commitsFri 14:00 — 3 commitsFri 15:00 — 1 commitsFri 16:00 — 0 commitsFri 17:00 — 2 commitsFri 18:00 — 3 commitsFri 19:00 — 2 commitsFri 20:00 — 2 commitsFri 21:00 — 0 commitsFri 22:00 — 2 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 3 commitsSat 3:00 — 3 commitsSat 4:00 — 4 commitsSat 5:00 — 3 commitsSat 6:00 — 1 commitsSat 7:00 — 2 commitsSat 8:00 — 0 commitsSat 9:00 — 1 commitsSat 10:00 — 0 commitsSat 11:00 — 2 commitsSat 12:00 — 1 commitsSat 13:00 — 3 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 2 commitsSat 18:00 — 6 commitsSat 19:00 — 2 commitsSat 20:00 — 4 commitsSat 21:00 — 1 commitsSat 22:00 — 2 commitsSat 23:00 — 1 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Sep 20, 2026daily#12+207
Sep 19, 2026daily#12+207
Sep 12, 2026monthly#18+7,395
Sep 11, 2026monthly#18+7,395
Sep 10, 2026monthly#15+7,313
Sep 9, 2026monthly#11+7,220
Sep 8, 2026monthly#10+7,126
Sep 7, 2026monthly#10+7,069
Sep 6, 2026monthly#12+7,001
Sep 5, 2026monthly#11+6,940
Sep 4, 2026monthly#11+6,855
Sep 3, 2026monthly#9+6,771
Sep 2, 2026monthly#12+6,669
Sep 1, 2026monthly#12+6,577
Aug 31, 2026monthly#7+6,450