If your mental model of Hacktoberfest is still "open four pull requests against any public repo, get a T-shirt or a tree planted," that model is gone in 2026. Good news first: this isn't Hacktoberfest going away or getting stingier, it's a genuine rebuild, and if you've ever felt like the old PR-quota format was more grind than community, the new one is worth a second look.
Hacktoberfest's own FAQ states the reason plainly: AI tools made low-effort pull requests trivial to generate at scale, and open-source maintainers ended up flooded with spam and burned out reviewing it. That's a real problem worth fixing, maintainers giving up their time for free deserve better than a flood of drive-by PRs nobody meant seriously. Counting PRs stopped being a signal of real contribution once generating a plausible-looking one became close to free, so instead of bolting on stricter spam filters, they rebuilt the event around something spam can't fake: showing up.
Hacktoberfest 2026 is run by Major League Hacking (MLH) and DEV, in partnership with DigitalOcean, and it looks pretty different from prior years, in a good way if you've ever wanted a lower-pressure way into open source. The event is now built around Fests: one-day, in-person events, either a Hack Day or a Meetup, hosted by local organizers, running 3 to 12 hours, focused on hands-on building and learning with open-source AI and open-weight models together, not racing solo to hit a PR quota. If you've been curious about open source but never felt ready to send a real pull request into the void, this format is aimed squarely at you, talks, workshops, and people in the room to ask questions.
There's also an online path for people who can't get to a Fest: an individual Swag Envelope program, earned by hitting participation milestones online. Those milestones aren't published yet, the FAQ just says "more details soon," worth bookmarking and checking back on.
T-shirts are real, but only at in-person Fests, and even then not guaranteed: they're shipped to organizers who hand them out at their own discretion based on on-site supply. Online-only participants are explicitly not eligible for a T-shirt. The Swag Envelope (stickers and other small items) is the online consolation prize, once its milestones exist.
Small disclosure: I already own more Hacktoberfest shirts than occasions to wear them, so none of this was really about the cotton. Another one, sure, I wouldn't say no. A sticker pack for the laptop lid, also sure. But if the actual plan here was "get free swag," this would be a spectacularly inefficient way to go about it, an evening of reading FAQs and hitting a JSON API for a maybe-someday envelope of stickers. I wanted to know what actually happens in October before I said anything confident about it.
Rather than trust a summary, I pulled the actual event list. The Fest-finder page at hacktoberfest.com/fests/ has a straight line for anyone scripting against it: "Are you an LLM? → pull every Fest from the API," linking to a plain JSON endpoint. One gotcha worth flagging before you copy any of this: the endpoint 403s a bare request with no User-Agent header, plain curl or Python's default urllib both get rejected, so every example below sets one explicitly.
curl -s -H "User-Agent: Mozilla/5.0" https://hacktoberfest-api.mlh.com/api/events | jq '.events | length'
217 events total as of today. Filtering by country for Bulgaria and its closer neighbors:
const res = await fetch('https://hacktoberfest-api.mlh.com/api/events', { headers: { 'User-Agent': 'Mozilla/5.0' } });
const events = (await res.json()).events;
events.filter(e => ['BG','RO','RS','GR','TR','MK','GB'].includes(e.address?.country))
.map(e => `${e.address.country} | ${e.address.city} | ${e.name}`);
Zero in Bulgaria. The closest hits in that filtered list were the UK and Ankara, Turkey, nothing realistically local. If you're checking your own city, that same endpoint is the actual source of truth, not a map widget that may or may not have finished .
curl -s -H "User-Agent: Mozilla/5.0" https://hacktoberfest-api.mlh.com/api/events | jq -r '.events[] | select(.address.country=="<YOUR_COUNTRY_CODE>") | "\(.address.city) | \(.name) | \(.startsAt)"'
Swap in your own two-letter country code. That's the same live list the site's own map pulls from, so it's current as of whenever you run it, not whenever this post was written, and new Fests keep getting added right through October. Worth the five minutes to check before deciding there's nothing for you this year.