Why does Bitcoin no longer have checkpoints? I've read that checkpoints in Bitcoin were removed because they were not preventing any meaningful attack.

Why should a regular checkpoint not prevent majority attacks? For instance, if a checkpoint is made every N blocks and (for example) 3/4 of the hash power agrees, would this not be possible to be used as a mechanism to create a permanent confirmation of the transactions before the checkpoint? Assuming, of course, that clients would check for those checkpoints and enforce them to be included in the valid chain.
The issue is that you assume a majority attack is an attack that can be prevented. It is not. It is a fundamental breakdown of the security assumptions.

Proof of work (PoW)'s assumption is that the majority of the hashrate will cooperate and converge on a single chain, because it is most financially advantageous thing to do. When that is no longer the case, PoW is broken and we should just move to something else - not to try to fix it up.

You might think that adding checkpoints helps to improve this situation, but consider this:


Either the checkpoints are created for old blocks (weeks or months old), in which case there is clearly nothing being prevented. A week-deep reorganization would utterly destroy the currency and the trust in it, and not be prevented by this.
Or the checkpoints are created for recent blocks (days or hours perhaps), in which case they may indeed affect what chain is accepted on the network during certain circumstances, but at the same time it is effectively replacing PoW based consensus with "developers-decide" consensus... something that doesn't need a complex peer to peer protocol at all, as effectively developers need to run systems to keep the system in check.


So, either checkpoints have an effect - and change the security assumptions into an uninteresting one, or they don't - and they don't matter.

To answer your question: the primary reason for removing checkpoints is due to the confusion they create. They make people think they're part of the system's security model (like your question shows). It does not. It was introduced as a necessity for implementing an optimization (skipping script validation) and an unrelated denial-of-service attack (the disk of a new node being filled with low-difficulty blocks during synchronization). Since some changes in the P2P protocol (headers based synchronization) we no longer need checkpoints to do these things safely.