CraftBukkit, Bukkit, and Spigot Differences Explained

One of the confusing things I encountered whenever trying to look behind the scenes of the Bukkit API is what CraftBukkit, Bukkit, and Spigot referred to. Recently I've been looking at the source a lot more, and am even contributing towards it as well.

Years ago, Bukkit was DMCA'd by one of it's own developers. A DMCA (Digital Millennium Copyright Act - yes I had to Google that one) is similar to being taken down for piracy, but usually applies to stolen code. Technically nothing was stolen, since the code was under the GPL license, but it didn't stop the takedown from going through, stopping Bukkit development. Development attempted to continue, but it was later found that Mojang owned Bukkit, and they shut it down.

Because of the licensing at the time, you could still fork (make a copy and independently develop) Bukkit and continue development. Before it was DMCA'd, Spigot had existed. It's mission was to make it more performance friendly, but after Bukkit went down it became the most popular and basically the only active development of Bukkit.

When someone refers to the Spigot API or Bukkit API, they usually mean the same thing. Really, though, it's the Bukkit API being developed by the Spigot team, so it's still the Bukkit API. 

Bukkit is the interface for CraftBukkit, the implementation. Bukkit provides the function parameters and documentation, but on it's own are just empty interface functions. The purpose of keeping them separate is that Bukkit only changes with feature changes and then very rarely (usually not breaking anything depending on it every update) whereas CraftBukkit must be updated for every update to support new Minecraft changes.