We keep recommending the same three exercises to junior developers and watch them figure it out the hard way. Here's what actually works.
The first PR: fix a typo in the README. Seriously. It sounds trivial but it forces you to fork, branch, commit, push, and open a PR with a clear message. If you can't do all of that cleanly, the rest doesn't matter.
The second PR: address a real issue. Pick something from the issues tab that a maintainer labelled good first issue. It will be harder than you expect. That's the point. You learn to read unfamiliar code, ask clear questions, and accept a polite no gracefully.
The third PR: refactor something small. Not a whole module, a single function. The constraint forces you to understand what the code does before you move it. Most developers skip this step and wonder why their changes break things.
Three PRs. One month. More learning than any bootcamp.