LXC is a project centered around a library, liblxc which allows for the creation of containers of any type from userspace. It also provides a set of tools (
lxc-*) that allows interacting with that C library and offers a pretty low level user interface.
LXD is a container manager that focuses on system containers and which uses liblxc through go-lxc. It offers a very opinionated, user experience that was designed from the ground up to allow for the easy creation of system containers, exposing the features user expect in a way that doesn’t require an advanced understanding of the various kernel components at play.
LXD is also network aware, offers remote management of containers, image servers and clustering.
So LXD does use liblxc as its runtime and relies on it for most kernel interactions but it also has a lot of logic of its own to deal with more abstract concepts that LXC doesn’t know about (infiniband, sriov, gpus, abstract resource limits, cpu scheduling, networking, …).