p2r3/convertPublic

Truly universal online file converter

AI summary: A highly versatile, universal online file conversion tool handling extensive formats locally or remotely.

Stars
3.8K
+4 today
Forks
350
Watchers
14
Open issues
129
Open PRs
17
Contributors
~58
Commits
499
Branches
2

TypeScriptGPL-2.0Created Dec 7, 2025Last push 1mo ago+18 stars this week+22 this month

Star history

since Jan 25, 2026
01K2K3KJan 2026Mar 2026Jun 2026Aug 2026
3.8K stars as of Aug 7, 2026, tracked back to Jan 25, 2026. 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: 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: 6 commits2025-12-08: 18 commits2025-12-09: 2 commits2025-12-10: 25 commits2025-12-11: 9 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: 3 commits2026-01-23: 2 commits2026-01-24: 9 commits2026-01-25: 17 commits2026-01-26: 2 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: 7 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 6 commits2026-02-06: 7 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: 4 commits2026-02-15: 0 commits2026-02-16: 23 commits2026-02-17: 78 commits2026-02-18: 34 commits2026-02-19: 28 commits2026-02-20: 51 commits2026-02-21: 43 commits2026-02-22: 5 commits2026-02-23: 14 commits2026-02-24: 5 commits2026-02-25: 0 commits2026-02-26: 1 commit2026-02-27: 2 commits2026-02-28: 1 commit2026-03-01: 1 commit2026-03-02: 1 commit2026-03-03: 7 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 1 commit2026-03-07: 0 commits2026-03-08: 1 commit2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 16 commits2026-03-16: 9 commits2026-03-17: 4 commits2026-03-18: 1 commit2026-03-19: 3 commits2026-03-20: 0 commits2026-03-21: 1 commit2026-03-22: 5 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 5 commits2026-03-26: 1 commit2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 2 commits2026-03-30: 1 commit2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 1 commit2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 1 commit2026-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: 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: 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: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 1 commit2026-06-16: 8 commits2026-06-17: 0 commits2026-06-18: 3 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 3 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 1 commit2026-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: 1 commit2026-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
480 commits in the last yearLessMore

What convert does

Convert acts as a truly universal online file converter designed to process a vast array of file types seamlessly. The platform leverages both client-side processing and backend architectures to ensure fast and secure transformations between documents, media, and archive formats. It eliminates the need for disparate specialized conversion utilities by centralizing format translation into one robust engine. Its system architecture is built to handle edge cases in formatting natively. This tool prioritizes high fidelity retention of data structure during complex conversions.

Useful for digital content creators, web developers, data analysts, and everyday users needing a quick, reliable file converter. No specialized programming knowledge required.

  • Broad format support: Converts between hundreds of different document, image, audio, and video formats.
  • Universal processing engine: Centralizes format translation to avoid using multiple specific utilities.
  • High fidelity retention: Maintains the structural integrity and quality of complex file conversions.
  • Web-based interface: Provides an accessible, easy-to-use online platform without requiring installations.
  • Scalable backend architecture: Designed to handle high-throughput file transformations efficiently.

Where teams use it

Media transcoding

Quickly converting incompatible video or audio files into standard web-friendly formats.

Document translation

Transforming PDFs, DOCX, and markdown files while retaining the original layout and styling.

Archive extraction

Unpacking and repackaging various compressed file formats on the fly.

Rapid web asset preparation

Optimizing image formats and sizes before deployment to a production environment.

Getting started: Visit the online converter platform and upload your target file.

README

master branch

Truly universal online file converter.

Many online file conversion tools are boring and insecure. They only allow conversion between two formats in the same medium (images to images, videos to videos, etc.), and they require that you upload your files to some server.

This is not just terrible for privacy, it's also incredibly lame. What if you really need to convert an AVI video to a PDF document? Try to find an online tool for that, I dare you.

Convert.to.it aims to be a tool that "just works". You're almost guaranteed to get an output - perhaps not always the one you expected, but it'll try its best to not leave you hanging.

For a semi-technical overview of this tool, check out the video: https://youtu.be/btUbcsTbVA8

Usage

  1. Go to convert.to.it
  2. Click the big blue box to add your file (or just drag it on to the window).
  3. An input format should have been automatically selected. If it wasn't, yikes! Try searching for it, or if it's really not there, see the "Issues" section below.
  4. Select an output format from the second list. If you're on desktop, that's the one on the right side. If you're on mobile, it'll be somewhere lower down.
  5. Click Convert!
  6. Hopefully, after a bit (or a lot) of thinking, the program will spit out the file you wanted. If not, see the "Issues" section below.

Issues

Ever since the YouTube video released, we've been getting spammed with issues suggesting the addition of all kinds of niche file formats. To keep things organized, I've decided to specify what counts as a valid issue and what doesn't.

Important

SIMPLY ASKING FOR A FILE FORMAT TO BE ADDED IS NOT A MEANINGFUL ISSUE!

There are thousands of file formats out there. It can take hours to add support for just one. The math is simple - we can't possibly support every single file. As such, simply listing your favorite file formats is not helpful. We already know that there are formats we don't support, we don't need tickets to tell us that.

When suggesting a file format, you must at minimum:

  • Make sure that there isn't already an issue about the same thing, and that we don't already support the format.
  • Explain what you expect the conversion to be like (what medium is it converting to/from). It's important to note here that simply parsing the underlying data is not sufficient. Imagine if we only treated SVG images as raw XML data and didn't support converting them to raster images - that would defeat the point. In other words, try to avoid crude "binary waterfalls".
  • Provide links to existing browser-based solutions if possible, or at the very least a reference for implementing the format, and make sure the license is compatible with GPL-2.0.

If this seems like a lot, please remember - a developer will have to do 100x more work to actually implement the format. Doing a bit of research not only saves them precious time, it also weeds out "unserious" proposals that would only bloat our to-do list.

If you're submitting a bug report, you only need to do step 1 - check if the problem isn't already reported by someone else. Bug reports are generally quite important otherwise.

Though please note, "converting X to Y doesn't work" is not a bug report. However, "converting X to Y works but not how I expected" likely is a bug report.

Deployment

Local development (Bun + Vite)

  1. Clone this repository WITH SUBMODULES. You can use git clone --recursive https://github.com/p2r3/convert for that. Omitting submodules will leave you missing a few dependencies.
  2. Install Bun.
  3. Run bun install to install dependencies.
  4. Run bunx vite to start the development server.

The following steps are optional, but recommended for performance:

When you first open the page, it'll take a while to generate the list of supported formats for each tool. If you open the console, you'll see it complaining a bunch about missing caches.

After this is done (indicated by a Built initial format list message in the console), use printSupportedFormatCache() to get a JSON string with the cache data. You can then save this string to cache.json to skip that loading screen on startup.

If you run into issues where your changes seem to not be applying, try disabling this cache.

Docker (prebuilt image)

Docker compose files live in the docker/ directory, so run compose with -f from the repository root:

docker compose -f docker/docker-compose.yml up -d

Alternatively download the docker-compose.yml separately and start it by executing docker compose up -d in the same directory.

This runs the container on http://localhost:8080/convert/.

Docker (local build for development)

Use the override file to build the image locally:

docker compose -f docker/docker-compose.yml -f docker/docker-compose.override.yml up --build -d

The first Docker build is expected to be slow because Chromium and related system packages are installed in the build stage (needed for puppeteer in buildCache.js). Later builds are usually much faster due to Docker layer caching.

Contributing

The best way to contribute is by adding support for new file formats (duh). If you don't have a format to add but are eager to help, take a look at our issues. There are plenty of suggestions there.

Here's how adding a format works works:

Creating a handler

Each "tool" used for conversion has to be normalized to a standard form - effectively a "wrapper" that abstracts away the internal processes. These wrappers are available in src/handlers.

Below is a super barebones handler that does absolutely nothing. You can use this as a starting point for adding a new format:

// file: dummy.ts

import type { FileData, FileFormat, FormatHandler } from "../FormatHandler.ts";
import CommonFormats, { Category } from "src/CommonFormats.ts";

class dummyHandler implements FormatHandler {

  public name: string = "dummy";
  public supportedFormats: FileFormat[] = [
    // Example PNG format, with both input and output disabled
    CommonFormats.PNG.builder("png")
      .markLossless()
      .allowFrom(false)
      .allowTo(false),

    // Alternatively, if you need a custom format, define it like so:
    {
      name: "CompuServe Graphics Interchange Format (GIF)",
      format: "gif",
      extension: "gif",
      mime: "image/gif",
      from: false,
      to: false,
      internal: "gif",
      category: [Category.IMAGE, CATEGORY.VIDEO], // See src/CommonFormats.ts for valid categories
      lossless: false
    },
  ];
  public ready: boolean = false;

  async init () {
    this.ready = true;
  }

  async doConvert (
    inputFiles: FileData[],
    inputFormat: FileFormat,
    outputFormat: FileFormat
  ): Promise<FileData[]> {
    const outputFiles: FileData[] = [];
    return outputFiles;
  }

}

export default dummyHandler;

For more details on how all of these components work, refer to the doc comments in src/FormatHandler.ts. You can also take a look at existing handlers to get a more practical example.

There are a few additional things that I want to point out in particular:

  • Pay attention to the naming system. If your tool is called dummy, then the class should be called dummyHandler, and the file should be called dummy.ts.
  • The handler is responsible for setting the output file's name. This is done to allow for flexibility in rare cases where the full file name matters. Of course, in most cases, you'll only have to swap the file extension.
  • The handler is also responsible for ensuring that any byte buffers that enter or exit the handler do not get mutated. If necessary, clone the buffer by wrapping it in new Uint8Array().
  • When handling MIME types, run them through normalizeMimeType first. One file can have multiple valid MIME types, which isn't great when you're trying to match them algorithmically.
  • When implementing/suggesting a new file format, please treat the file as the media that it represents, not the data that it contains. For example, if you were making an SVG handler, you should treat the file as an image, not as XML. In other words, avoid simple "binary waterfalls", as they're not semantically meaningful.

Testing

This project currently uses two levels of tests:

  • Broad project-level tests live directly in test/ (for example graph traversal and end-to-end conversion smoke tests).
  • Optional handler-specific unit tests live in test/handlers/, using the file name pattern <handlerName>.test.ts. These are a good fit for handlers with meaningful parsing, serialization, or file-naming logic that is hard to exercise reliably through traversal alone.

Not every handler needs a dedicated unit test, but handlers with non-trivial custom internal logic may benefit from having one.

Adding dependencies

If your tool requires an external dependency (which it likely does), there are currently two well-established ways of going about this:

  • If it's an npm package, just install it to the project like you normally would.
  • If it's a Git repository, add it as a submodule to src/handlers.
  • If neither of the above are available, then as a last resort, you may create a folder with the required assets under src/handlers/handlerName.

Please try to avoid CDNs (Content Delivery Networks). They're really cool on paper, but they don't work well with TypeScript, and each one introduces a tiny bit of instability. For a project that leans heavily on external dependencies, those bits of instability can add up fast.

  • If you need to load a WebAssembly binary (or similar), add its path to vite.config.js and target it under /convert/wasm/. Do not link to node_modules.

AI Usage Policy

If you intend to use an LLM, agent-enabled IDE, or other AI-driven tool for your contribution, please follow these guidelines:

  • Clearly state that you've used an LLM, ideally in your pull request's description. Do not attempt to pass off an AI's work as your own. I'm far more likely to accept a pull request that openly admits to using AI than one that does but pretends it doesn't. Transparency helps the maintainer (me) know what to keep an eye out for (e.g. hallucinations), and helps you keep yourself in check.
  • Do not overindulge. If your contribution is trivial or simple enough to be written by hand, please opt to write it by hand. This is especially true if it's your first contribution. You're much more likely to retain knowledge and understanding about architectural details if you've familiarized yourself with the process hands-on first.
  • Keep the scope to things you could do by hand. LLMs are tools, and this is a community-driven project. Orchestrating an AI to write logic that you don't fully comprehend is not only reckless for a community project, it's also disrespectful towards human contributors who took the time to research their additions. In other words, there should never be a scenario where you need an LLM.
  • Explain what you (and the LLM) are doing, in a way that makes it clear that you understand the changes you're making.

Not adhering to these rules will likely get your pull request closed.

I figure that there are people who'd prefer if I merged zero AI-written code, but I believe that's simply not feasible. Just from a code integrity perspective, it's much safer to be transparent about AI usage and define clear guidelines than to make it a taboo and risk people "sneaking in" unvetted AI code. Making things illegal doesn't stop everyone from doing those things - some will still do them, just in secret and with less oversight.

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

1 total
  1. Rolling ReleaselatestMar 16, 2026pre-release154 downloads

    This release contains offline Electron builds of convert.to.it, built from the latest commit on the `master` branch.

Commits per week

last 52 weeks
2570Week 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: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 60 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: 14 commitsWeek of 2026-01-25: 19 commitsWeek of 2026-02-01: 20 commitsWeek of 2026-02-08: 4 commitsWeek of 2026-02-15: 257 commitsWeek of 2026-02-22: 28 commitsWeek of 2026-03-01: 10 commitsWeek of 2026-03-08: 1 commitsWeek of 2026-03-15: 34 commitsWeek of 2026-03-22: 11 commitsWeek of 2026-03-29: 4 commitsWeek of 2026-04-05: 1 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 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: 0 commitsWeek of 2026-06-14: 12 commitsWeek of 2026-06-21: 3 commitsWeek of 2026-06-28: 1 commitsWeek of 2026-07-05: 1 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 0 commitsAug 2, 2025Jul 26, 2026
480 commits in the last 52 weeks.

When work happens

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

Who is committing

last 52 weeks
Maintainer commits228 (46%)
Community commits268 (54%)

496 commits in total over the last year.

DateListRankStars gained
Feb 17, 2026daily#17+159
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    453.6K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • anomalyco/opencode

    The open source coding agent.

    194.7K stars · TypeScript