Skip to main content

Hacktoberfest 2026: 28 first-time contributors, 46 merged pull requests ๐Ÿฆ”

ยท 13 min read
Ryan Millard
Img2Num Author

Hero

At the end of September we asked you to contribute to Img2Num this Hacktoberfest, and we were upfront about the deal: Hacktoberfest 2026 stopped counting pull requests, so there was no counter to climb and no t-shirt at the end of it. A reviewed and merged pull request in a real project was the whole prize and

twenty-eight of you took it!

Between 3 and 30 October we merged 46 pull requests from 28 contributors. None of the contributors had contributed to Img2Num before October. They fixed output bugs in the C++ core, made the Python bindings release the GIL, gave the npm package TypeScript types, rebuilt pages of this site, and deleted more than 1 300 lines of code that was no longer needed. Every one of them is now listed on the Hacktoberfest 2026 event page, along with their pull requests.

This post is the long version that explains what got built, what it changed, and what happens next.

The numbersโ€‹

  • 28 contributors, every one of them merging into Img2Num for the first time. GitHub's contributor graph for October has the same names.
  • 46 pull requests merged between 3 and 30 October (the full list on GitHub). Maintainers' own pull requests (five, including the new CLI) are not counted.
  • 177 files changed, +5 232, and โˆ’2 959 lines.
  • At least 29 issues closed by those pull requests.
  • Under four days from opening a pull request to merging it, at the median. Twelve merged within a day; 37 of the 46 within a week.
  • 10 contributors opened more than one pull request. Three of them, @Lothnic, @saptadeep12, and @nitin-kumar-code opened five each.

What got builtโ€‹

This section groups the changes according to where they were made in the project. Pull request numbers link to GitHub, and the event page has the same work grouped by person.

C++ core and GPU (8)โ€‹

  • A reusable WebGPU helper layer - #658 by @siddharth1407. RAII wrappers over Dawn (gpu::Buffer<T>, gpu::Texture, bind-group and compute-pass helpers), then both GPU kernels ported onto them: the bilateral filter went from 313 lines to 120 with identical behaviour. #694 documented the new layer the same week.
  • Two more ways to fall back to the CPU - #663 by @ayusharora07 stops the WebGPU device being initialised twice and falls back when device creation fails; #696 by @BhoomiMahna does the same when the only adapter Dawn can find is the Null backend. A machine without a usable GPU now gets the CPU path instead of a failed conversion.
  • Correct output at the edges - #659 by @RahulKumarBaldia. gaussian_blur_fft now uses reflect padding, which fixes darkened borders and content wrapping around from the opposite edge.
  • k-means with k = 1 - #682 by @nitin-kumar-code fixed the CPU path's output when there is only one cluster. A two-line change; wrong output before, right output after.
  • Fewer run-to-run differences - #765 by @saptadeep12 orders each graph node's neighbours by id, so the contour graph no longer depends on the order they happened to be inserted in.
  • ptr became image - #749 by @MiyaMango renamed the parameter across the C++ core, the C ABI and the JavaScript glue. Small, and the API reference reads better now!
  • 157 lines of unreachable contour-tracing code removed - #768 by @shivangmathur2008-stack, with the matching internal docs.

Most of this shipped in cpp 0.3.0 and bindings-c 0.2.1 on 23 October.

Python (6)โ€‹

  • The GIL is released while the C++ core runs - #777 by @Lothnic. Python threads that call Img2Num now run the native work in parallel instead of taking turns, and the console example gained a two-worker ThreadPoolExecutor demo to prove it. Krasner's #784 built on it a week later to make the GPU path parallel too.
  • img2num.__version__ - #758, and Python 3.13 declared in the package classifiers - #754, both by @Lothnic.
  • Typos in config are errors now - #766 by @IvanGiovany: an unknown key in ImageToSvgConfig raises TypeError.
  • A one-line fix for a double move - #665 by @Gracy769 removed a std::move that moved the SVG string twice in labels_to_svg.
  • Wheels carry only the Python component - #767 by @Farhan-Alam-Jamal scoped the CMake install to the python component, so wheels stop picking up files that belong to other parts of the build.

None of this is on PyPI yet - the current release is 0.3.1. It ships with the next Python release, together with the new img2num command-line tool that Krasner built in #703 and @Adithya6721 documented in #801.

JavaScript and C (2)โ€‹

  • TypeScript declarations for the npm package - #670 by @saptadeep12. The declarations are generated from tightened JSDoc with tsc --allowJs --declaration, so the JSDoc stays the single source of truth; types comes first in every exports branch; and a strict-mode tsc --noEmit type test runs in CI so they cannot drift. Ships in the next npm release.
  • The C error API got real prototypes - #764 by @Ayushrawatcy009. In C, img2num_get_last_error() declares a function taking unspecified arguments; img2num_get_last_error(void) is a prototype. Shipped in bindings-c 0.2.1.

Example apps (7)โ€‹

Docs and this website (15)โ€‹

  • The Hall of Fame - #679 by @08abhinav. The page that honours contributors was itself built by a first-time contributor: a data file of featured members, GitHub profile and merged-PR data fetched at build time, bot filtering, and fallbacks so an API hiccup cannot break the build. The events pages sit on top of it.
  • The Showcase - #644 by @dr-nullptr turned the example-apps index into /showcase, with a "Built with Img2Num" section for third-party projects and a submission page that opens a prefilled Discussion.
  • The FAQ redesigned with accordions - #623 by @flodrick; Core Concepts became a glossary - #646 by @FathimaManal; Discord in the navbar, footer and contributing guide - #689 by @saptadeep12; site styles and the navbar blur fixed - #680 by @thilakshan2003; "Edit this page" links point at dev - #770 by @satyaharendrarushidayaka-sudo.
  • Docs that match the code: min_thickness defaults documented - #655 by @Yipjunwei; black_threshold_image described as the per-channel brightness cutoff it is, in the C++ header, the Python docstring and the docs - #692 by @Lothnic; the gpu_utils layer documented - #694 by @siddharth1407; the Debug Logging guide rewritten to match the actual code - #771 by @Ayushrawatcy009; the swapped C and JavaScript rows in the API bindings tables - #762 by @mayanksingh-7974; the synchronous-API migration guidance in our own blog post corrected - #760 by @jazayush; what happens when several people claim one issue, in the contributing guide - #795 by @saptadeep12; and the new CLI guide - #801 by @Adithya6721.

Build, CI and tooling (8)โ€‹

The badgeโ€‹

Img2Num contributor โ€” Hacktoberfest 2026Img2Num contributor โ€” Hacktoberfest 2026

If your name is on the event page, this is yours. It comes as SVG and PNG in light and dark versions, with ready-made Markdown and HTML snippets for a README or a profile, and a credential URL you can paste into LinkedIn's Licenses & certifications. Everything is at the top of the event page.

Hacktoberfest did not count pull requests toward rewards this year. We thought 28 first merged pull requests deserved something you can keep.

How it went from our sideโ€‹

A few things we noticed reviewing 46 pull requests in a month:

  • The first three days set the pace. Fourteen pull requests were opened on 1โ€“3 October, on top of three that had been waiting since the last days of September. By 11 October, 20 had merged.
  • Small and specific merged fastest. Twelve pull requests merged within a day of being opened, and each of them did one clearly described thing. A good title and a Fixes #... line are most of the work of getting reviewed quickly.
  • Big changes landed too. The GIL release, the TypeScript declarations and the WebGPU helper layer were each several hundred lines, and all three changed what the library can do. This was not a month of typo fixes.
  • Deleting is contributing. More than a third of the changed lines were deletions. The biggest pull request of the month by lines, #789, removed 1,370 of them.
  • People stayed. Ten of the 28 opened more than one pull request.

Thanks to Krasner, who reviewed and co-authored several of these and shipped the CLI (#703) and truly parallel GPU execution (#784) in between, and to Prachi, who wrote the post that started it and posted about it on LinkedIn.

What's nextโ€‹

  • Releases. cpp 0.3.0 and bindings-c 0.2.1 are out with the core and C work. The Python and JavaScript work above - the GIL release, __version__, the TypeError, Python 3.13, the TypeScript declarations and the CLI - ships in the next PyPI and npm releases.
  • The October cohort is not done. @BhoomiMahna's #702, adding C++ and C ABI test coverage, merged on 4 November - the first post-Hacktoberfest pull request from someone who started in October. We hope for far more!
  • Discord. Contributors get the Contributor role and the private channel. Post your GitHub username in Discord and we will match it to the list.
  • You do not have to wait for next October. The good first issues are still there, and so are we.

Thank you, all 28 of you. ๐Ÿฆ”