I have been using small upstream PRs as a forcing function for proof.
Not big rewrites. Not "I built a platform" posts. Just narrow bugs in real repositories, with a test, a focused patch, and whatever cleanup the maintainer asks for.
That has been more useful than I expected.
The main reason is that a merged PR carries constraints a portfolio project usually does not. You have to fit the repo's style. You have to reproduce the issue. You have to keep the diff small enough for someone else to review. If the maintainer asks for a different shape, the answer is not to argue with your original idea. The answer is to understand the invariant they are protecting.
The fixes that taught me the most were not flashy:






