You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the landing page for anyone who wants to contribute. Everything open is listed below, ranked by size, with the two things that actually matter up front: how hard it is, and whether you need Windows.
MoonDownloader runs on Windows, but almost none of the open work requires it. Documentation, CI, tests and dependency work all run on Linux and macOS, and the test suite stubs Chrome and the network at the moon_extract boundary so it runs anywhere. Exactly one open issue needs a Windows machine, and it says so.
Most of the bugs below were found by using the program, not by reading it. Several come with measurements from real runs in the issue itself, so you can check the fix against a number instead of a feeling.
Last checked against the repository: 12 August 2026.
Never contributed to open source before?
Three issues are reserved for people who have never had a pull request merged anywhere. All three are done entirely in the browser — no install, no command line, nothing to run.
One line so a CI workflow watches its own file on pull requests, as it already does on push
The work is deliberately small. The point is to get you through fork → edit → pull request once, with every step written out. If you get stuck halfway, say so on the issue — that is what it is there for.
If you have contributed before, please leave these three and take something below.
Free right now
Nothing here is claimed. No Windows machine needed unless the row says so.
Extractors sits under "COMMON — BOTH METHODS" but datanodes is hard-capped at 8 lanes. Measured: fuckingfast keeps ~40 of 48 download slots busy, datanodes keeps ~4
ruff.toml and pytest.ini are not in any workflow's paths filter — so the two files that decide what CI enforces are the two files that never trigger it. A pull request touching only one of them gets no checks at all
Engine.snapshot() has no unit tests, and it is the contract both front-ends read ~12 times a second. Held for @XEDAB for a couple of days — see the issue — then open to everyone
A square backdrop appears behind the progress rings during a run
GUI/CSS
Yes
#83 is the most valuable one free, and it is the only open bug found by measuring rather than reading: the two providers get the same "streams" setting in the interface while one of them cannot use more than 8 lanes, so the number on screen is not the number in effect.
Genuinely running low on free work — if nothing here fits, say so on #39 and I will write something that does. That is not a formality; the bottleneck in this project is available issues, not people.
Claimed, in progress
Listed so nobody duplicates the work. If one has gone quiet for five days it goes back to the free table above, and returning is always welcome.
V4 repaired both providers after they changed how they hand out links.
How to claim one
Comment on the issue saying you are taking it. You will be assigned, usually within a few hours. (If the assignee field stays empty, that is GitHub, not a rejection: it only accepts assignees who have commented on the issue itself. Your comment is the claim either way, and I record it in the table below.) You do not need to ask permission first, and you do not need to have a plan — saying "taking this, not sure yet how" is fine and gets you the same answer.
A claim holds for five days, counted from whichever of us spoke last — if you are waiting on me, the clock is not running against you. After that the issue goes back to the free table so it is not parked indefinitely — no blame attached, and you are welcome to pick it up again.
Two things worth knowing before you start:
Read the function, not the description. Issue bodies here are written by the maintainer and have been wrong before — docs(cli): fix stale --proxies row and document the actual warning behavior #63 was merged partly because it corrected a mistake in the issue that opened it. If the code disagrees with the issue, the code wins and I would rather hear it.
Keep the diff to the issue. Reformatting, renaming and "while I was in there" edits are the most common reason a pull request needs a second round, even when each change is harmless on its own.
CONTRIBUTING.md has the verification commands. Everything else — architecture, style, the rules that are not preferences — is in there too, and nothing in this issue repeats it.
This is the landing page for anyone who wants to contribute. Everything open is listed below, ranked by size, with the two things that actually matter up front: how hard it is, and whether you need Windows.
MoonDownloader runs on Windows, but almost none of the open work requires it. Documentation, CI, tests and dependency work all run on Linux and macOS, and the test suite stubs Chrome and the network at the
moon_extractboundary so it runs anywhere. Exactly one open issue needs a Windows machine, and it says so.Most of the bugs below were found by using the program, not by reading it. Several come with measurements from real runs in the issue itself, so you can check the fix against a number instead of a feeling.
Last checked against the repository: 12 August 2026.
Never contributed to open source before?
Three issues are reserved for people who have never had a pull request merged anywhere. All three are done entirely in the browser — no install, no command line, nothing to run.
ruff.tomlthat describes its own effect incorrectlymoon_engine.py— taken by @mazi-ethThe work is deliberately small. The point is to get you through fork → edit → pull request once, with every step written out. If you get stuck halfway, say so on the issue — that is what it is there for.
If you have contributed before, please leave these three and take something below.
Free right now
Nothing here is claimed. No Windows machine needed unless the row says so.
Extractorssits under "COMMON — BOTH METHODS" but datanodes is hard-capped at 8 lanes. Measured: fuckingfast keeps ~40 of 48 download slots busy, datanodes keeps ~4ruff.tomlandpytest.iniare not in any workflow'spathsfilter — so the two files that decide what CI enforces are the two files that never trigger it. A pull request touching only one of them gets no checks at allEngine.snapshot()has no unit tests, and it is the contract both front-ends read ~12 times a second. Held for @XEDAB for a couple of days — see the issue — then open to everyone#83 is the most valuable one free, and it is the only open bug found by measuring rather than reading: the two providers get the same "streams" setting in the interface while one of them cannot use more than 8 lanes, so the number on screen is not the number in effect.
Genuinely running low on free work — if nothing here fits, say so on #39 and I will write something that does. That is not a formality; the bottleneck in this project is available issues, not people.
Claimed, in progress
Listed so nobody duplicates the work. If one has gone quiet for five days it goes back to the free table above, and returning is always welcome.
Engine.snapshot()Recently shipped
Some context on what the work here looks like when it lands:
loop.call_soon_threadsafe; a user stop is recorded asstoppedso the retry path cannot re-queue it and undo the stop.ENOSPCdetected by errno, a shared abort both front-ends observe,.tmpfiles kept for resume, and the folder named on screen.ruffruns once per pull request instead of five times (@nightcityblade, ci: run ruff once outside syntax matrix #158), with the version pin kept.web/styles.css.aiohttp.BasicAuthdeprecation no longer clutters the test output (@Divesh-Kshirsagar, test: suppress aiohttp BasicAuth deprecation warning #161), matched by exact message so a genuine future deprecation still surfaces.How to claim one
Comment on the issue saying you are taking it. You will be assigned, usually within a few hours. (If the assignee field stays empty, that is GitHub, not a rejection: it only accepts assignees who have commented on the issue itself. Your comment is the claim either way, and I record it in the table below.) You do not need to ask permission first, and you do not need to have a plan — saying "taking this, not sure yet how" is fine and gets you the same answer.
A claim holds for five days, counted from whichever of us spoke last — if you are waiting on me, the clock is not running against you. After that the issue goes back to the free table so it is not parked indefinitely — no blame attached, and you are welcome to pick it up again.
Two things worth knowing before you start:
CONTRIBUTING.mdhas the verification commands. Everything else — architecture, style, the rules that are not preferences — is in there too, and nothing in this issue repeats it.