When it comes to platformers there are typically two things I see that frustrate people:
Anything pixel perfect such as jumps and gaps - challenging is fine but don't make a narrow area so tight that the margin for error is a pixel or 2 wider than the player collider
Imperfect controls - There is no such thing from a technical standpoint as code is binary... did the player press jump at this exact moment? no? ok no jumping, BUT that isn't what feels good to the player. Input buffering is a great way to get fluid controls and you can have full control over how strict or lenient it is, here's a good blog point explaining it.