Open-source project
dessant/buster avatar
dessant/buster

dessant/buster: a captcha solver that asks you to listen, and asks a native client to type

Captcha solver extension for humans, available for Chrome, Edge and Firefox

9,300 stars694 forksJavaScriptGPL-3.0

At a glance

What is it?
A GPL browser extension for Chrome, Edge, Firefox and Opera that defeats reCAPTCHA audio challenges with speech recognition, plus an optional native client that simulates keystrokes to raise the hit rate.
Who is it for?
dessant/buster is the rare captcha project whose README argues its own ethics rather than hiding them. The motivation section says reCAPTCHA delays or blocks people based on physical ability, cognitive ability, cultural background and the devices or networks they connect from, and concludes that the difficulty is so out of balance that challenges sometimes appear friendlier to bots than to humans.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 106 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 21, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The whole trick is one button on the audio challenge

The README's description section is three sentences and the mechanism fits in them. Buster is a browser extension which helps you to solve difficult CAPTCHAs by completing reCAPTCHA audio challenges using speech recognition. Challenges are solved by clicking on the extension button at the bottom of the reCAPTCHA widget. There is no solver service, no API key, no paid backend in the description, which means the transcription work happens somewhere the user already controls.

That last point is the difference between this project and the commercial captcha farms, and it is a structural one rather than a policy claim. The audio route exists because image challenges can be solved by machine vision pipelines, while audio recognition is comparatively expensive per challenge. By keeping transcription local, Buster converts a cost problem into a tooling problem, and the cost of a solve becomes your own machine's cycles instead of a per-request price.

The quote the README chooses to sit underneath that section is a line from the film Arrested Development, credited to Byron Bluth reading a map, and it is doing more work than a joke. The extension is named Buster, and the joke is that the human reading the challenge correctly is the one who can get through.

Two sections in the README carry no code at all, because the project has no code fences. The Description, Motivation and Client App sections are the entire technical documentation, which tells you how little there is to configure.

The motivation section is the argument, and it is unusually blunt

Most projects with a GPL license and a captcha use case would leave the motivation section vague. Buster does not, and the paragraph is the most interesting content in the repository.

The claim is that reCAPTCHA challenges remain a considerable burden on the web, delaying and often blocking access to services and information depending on our physical and cognitive abilities, our social and cultural background, and the devices or networks we connect from. That is four distinct axes of exclusion stated in one sentence, and each one is a documented pattern rather than an assertion.

The follow-on sentence is the sharpest: the difficulty of CAPTCHA challenges can be so out of balance, that sometimes they seem friendlier to bots than they are to humans. A vision-based bot faces a grid of distorted images and resolves it in milliseconds. A human with a screen reader, a slow connection, or a cognitive load from reading a form faces the same grid and may not resolve it at all. The inversion is real and it is the whole reason this extension exists.

The stated goal follows from that logic rather than preceding it: to improve the user experience on the web, by giving us easy access to solutions utilized by automated systems. Note the word solutions rather than access. The framing is that the solution already exists, automated systems already use it, and the human is simply the last to be offered it.

For anyone evaluating whether to install it, this paragraph is the honest summary. There is no claim here about defeating a security control, and the mechanics are entirely local. The ethical weight sits entirely on whether your use of it violates a site's terms, which is a question the README declines to answer for you.

The client app is a separate repository and a separate decision

The Client App section is four lines and it explains a design decision that would otherwise look arbitrary. The client app enables you to simulate user interactions and improves the success rate of the extension. Follow the instructions from the extension's options to download and install the client app on Windows, Linux and macOS, or get the app from the linked repository, which is dessant/buster-client.

So the split is architectural. The extension runs in the browser and has no way to synthesize trusted input events, which is a deliberate constraint browsers impose for good reason. A native helper can, and doing that work outside the extension is what lets the extension present a solve that looks like typing rather than like a value written into a field.

Three consequences follow from the split. The extension alone is still useful, because the client is presented as an improvement rather than a requirement. Users who cannot or will not install a native binary keep a working tool. The extension's options page is where the download is triggered, which means the client is opt-in per install. And because the client lives in its own repository, its own license and review process are separate from the extension's GPL-3.0 grant.

Three platforms named in one sentence is also a maintenance signal. Windows, Linux and macOS is the full desktop set, and covering it means the project accepts native builds across three toolchains rather than one.

Four browser targets from one pipeline, keyed off TARGET_ENV

The package.json scripts are where the multi-browser support becomes concrete, and the pattern is clean enough to describe in one line: every public build script sets TARGET_ENV and delegates to a private one that invokes gulp.

json
"build:chrome": "cross-env TARGET_ENV=chrome npm run _build",
"build:edge": "cross-env TARGET_ENV=edge npm run _build",
"build:firefox": "cross-env TARGET_ENV=firefox npm run _build",
"build:opera": "cross-env TARGET_ENV=opera npm run _build",

That is the entire architecture for four targets. There is no per-browser code path in the scripts, no separate workspace, no matrix CI. One gulp build reads the environment variable and emits into the right directory.

The private scripts carry the NODE_ENV half of the same trick, so development and production builds differ by one variable too.

json
"_build": "cross-env NODE_ENV=development gulp build",
"_build:prod": "cross-env NODE_ENV=production gulp build",
"inspect": "cross-env NODE_ENV=production gulp inspect",

The zip scripts layer a third dimension on top, packaging a production build per target.

json
"_build:prod:zip": "npm run _build:prod && gulp zip",
"build:prod:zip:chrome": "cross-env TARGET_ENV=chrome npm run _build:prod:zip",

Two things in there are worth flagging for anyone hacking on the source. `cross-env` rather than a bare prefix is what makes the variable assignment portable across shells. And the underscore prefix on the private scripts is a convention rather than a mechanism: npm still exposes them, but the naming marks them as not-for-humans entry points, which keeps the public script list readable at a glance.

web-ext for local runs, commit-and-tag-version for releases

The remaining scripts answer the two questions a contributor always has: how do I see my change, and how does a release happen.

json
"start:chrome": "web-ext run -s dist/chrome -t chromium",
"start:firefox": "web-ext run -s dist/firefox -t firefox-desktop",
"release": "commit-and-tag-version",
"push": "git push --follow-tags origin main"

`web-ext` is Mozilla's tool, and using it for the Chrome target as well is the notable part: `-t chromium` loads a Chromium-based build through a Firefox-ecosystem runner. That suggests the extension's manifest is close enough to the Firefox format that the same tooling drives both, which is the payoff for keeping one source tree instead of four.

`commit-and-tag-version` for release plus a separate `push` that follows tags is a deliberate two-step. The tag creation and the push are separate scripts, so the human decides when the tag leaves the machine. The push script pushes to `main` and follows tags, meaning the branch and the tag move together in one command rather than two.

The `update` script rounds out the tooling story and uses a filter syntax worth recognizing.

json
"update": "ncu --dep prod,dev,peer --filterVersion '^*' --upgrade",

`ncu` is npm-check-updates, invoked across production, dev and peer dependencies with a filter of `^*`, which means upgrade within the current major. Pinning major versions during routine maintenance is a conservative choice for a project that ships to browser extension stores, where a surprise major bump from a transitive dependency can break a signed build with no way to ship a quick fix.

A small tree with one source directory

The repository root is short and reads like a webpack project rather than an application, which is what you would expect for something whose entire runtime behavior is a popup and a content script.

text
.browserslistrc
CHANGELOG.md
LICENSE
README.md
babel.config.js
gulpfile.js
package-lock.json
package.json
postcss.config.js
secrets.json.example
src/
webpack.config.js

Every file there is build infrastructure. `gulpfile.js` and `webpack.config.js` are the two build systems doing the work, `babel.config.js` and `postcss.config.js` handle transpilation and styles, and `.browserslistrc` declares the target browser range for Babel. There is no test directory in the tree, no lint configuration beyond `.prettierrc.yml` and `.prettierignore`, and no CI configuration beyond the `.github/` directory.

`secrets.json.example` is the single most informative entry for an outside reader. It means the project once needed or still needs a secrets file at build time, ships an example so contributors know the shape, and gitignores the real one. For a captcha extension there is an obvious reason to reach for that pattern, since these extensions have historically been used to hold third-party service credentials. That file being committed as an example rather than a real config is the project being careful about a known category of abuse.

The `.nvmrc` and `.npmrc` files pin the Node version and registry configuration. `.prettierignore` and `.gitignore` round out the hygiene set. Note what is absent: no `src/` subdirectories are listed in the tree excerpt, no per-browser directories, and no vendored dependencies.

GPL-3.0-only, four stores, and a release every few months

The license choice is GPL-3.0, and the package.json is more precise than the README about it, recording GPL-3.0-only as the SPDX identifier. That distinction matters legally. GPL-3.0-only means no future relicensing to GPL-3.0-or-later is implied, so forks and derivatives carry the same version obligation rather than an open-ended one. For a widely forked project at 694 forks, the clarity is worth having.

The copyright line reads Copyright (c) 2018-2026 Armin Sebastian, and the software is released under the terms of the GNU General Public License v3.0 with a LICENSE file for further information. The span from 2018 to 2026 tells you the project has outlived several rounds of captcha changes.

Distribution is via four extension stores, and all four appear as badges at the top of the README: the Chrome Web Store, Firefox add-ons, the Microsoft Store listing for Edge, and the Opera add-ons listing. Four badges for one codebase is the same fact the build scripts express from the other side, and it is the strongest signal in the repository that the single-source-pipeline approach works.

The release cadence is what most adopters will actually feel. v3.2.1 published on 2026-06-16, v3.3.0 on 2026-06-17, v3.4.0 on 2026-06-20. Two of the three most recent releases landed within a week of each other, and all three share the same release body, which points at a changelog rather than per-release notes.

text
CHANGELOG.md
LICENSE
README.md

Those three files are where release detail actually lives. Every release body says to download and install the extension from the extension store of your browser and to learn more from the changelog. The detail is in CHANGELOG.md, which sits in the tree. That is the file to read before an update, because the release entries themselves carry no upgrade instructions. The last push was 2026-06-27, a week after v3.4.0, with 50 open issues against a 9300-star project.

What the tool does not do, and what you are actually agreeing to

It is worth being plain about the boundary. Buster solves reCAPTCHA audio challenges and nothing else. There is no image challenge handling in the description, no hCaptcha or Cloudflare Turnstile support mentioned, and no bulk or headless solving API. The interaction model is one human, one click on the extension button, one challenge.

That single-challenge shape is the reason the extension has survived to version 3.4.0 and 9300 stars while bulk solving services churn. It is not built for throughput, so it does not present the same economic profile as a service, and it does not present the same operational profile either. There is no account, no quota and no server.

The counterweight is that it is still a captcha solver, and the terms of service of most sites that deploy reCAPTCHA prohibit automated solving. Installing it is a decision about your own use, and the README does not pretend otherwise. It gives you the tool and the argument for why the tool is reasonable, and it leaves the application question open.

If you are evaluating it on technical merit, the practical checklist is short. Does the audio challenge appear on the site you need, which is most reCAPTCHA configurations but not all. Do you accept the native client on the same machine, which raises the success rate but adds an install. And do you need the extension to survive store updates, which it will, since the last push was recent and the release cadence is active.

The GPL-3.0-only grant means anything you build on top of it, and any fork you publish, must also be GPL-3.0-only. For personal use that obligation is theoretical. For a fork you distribute, read the license text before you start rather than after.

Editorial conclusion

dessant/buster is the rare captcha project whose README argues its own ethics rather than hiding them. The motivation section says reCAPTCHA delays or blocks people based on physical ability, cognitive ability, cultural background and the devices or networks they connect from, and concludes that the difficulty is so out of balance that challenges sometimes appear friendlier to bots than to humans. That framing is the project's real architecture document. The technical shape is deliberately small: one extension, one audio button, and an optional native client in a separate repository that simulates user interactions to raise the success rate. Four browser targets are built from one gulp and webpack pipeline keyed off a TARGET_ENV variable, and v3.4.0 shipped on 2026-06-20 after two releases inside four days. At 9300 stars and 694 forks it is widely installed and GPL-3.0-only licensed, so any fork inherits the copyleft obligation.

Frequently asked questions

How does the Buster captcha solver extension defeat a reCAPTCHA challenge?

It completes reCAPTCHA audio challenges using speech recognition, and you trigger a solve by clicking the extension button at the bottom of the reCAPTCHA widget. The README describes no image challenge handling and no server, so the recognition work runs on your own machine rather than at a paid service.

What is the buster-client app and do I need it?

The client app is a separate native application, published at dessant/buster-client and downloadable from the extension's options page for Windows, Linux and macOS. The README states that it enables you to simulate user interactions and improves the success rate of the extension, so it is an improvement rather than a requirement, and the extension works without it.

Which browsers can I install Buster on?

Four, all listed as badges at the top of the README: the Chrome Web Store, Firefox add-ons, the Microsoft Store listing for Edge, and the Opera add-ons listing. The package.json build scripts confirm it with a build:chrome, build:edge, build:firefox and build:opera target each, all delegating to one gulp build through a TARGET_ENV variable.

What license is Buster released under?

The GNU General Public License v3.0, with copyright held by Armin Sebastian from 2018 to 2026. The package.json records the SPDX identifier GPL-3.0-only rather than GPL-3.0-or-later, so a fork you distribute carries the same version obligation instead of an open-ended one.

Official sources

  1. dessant/buster on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/dessant-buster.svg)](https://hysenlabs.com/projects/dessant-buster)