So right now I mostly fund smaller projects because it feels they need it more, but at the same time I think I should also consider how important some piece of software is to me, or how much I depend on it, which gets really hard as soon as you don't just include "visible" software, but also libraries. I guess I'd have a really bad time without a jpeg library, for example. But that leads into your point about rewarding contributors. Ideally, every project that receives donations will fairly redistribute a share of it to every contributor and library they depend on, but that seems absolutely impractical to get right, especially for larger projects.
Also, should you take the complexity of a project into account? Not to diminish the work of the folks behind eg libjpeg-turbo, but a jpeg encoder/decoder isn't exactly rocket science, so should they receive less than for example libx264?
So yeah, I think this is a fairly deep topic that you can put a lot of thought into, and even get a bit philosophical about. Interested to hear other people's approach to this.
Gamification of contributions… shoehorning projects into other projects that get funding.
Forks just to try to rake in contributions.
Just free avoids a lot of problems, but certainly isn’t problem free.
Examples: Python Software Foundation, Haskell Foundation
In practice this seems to work well.