Also, I try to simply boycott everything that uses JSON and XML instead because both formats are garbage, but if you're going to do that, you could at least use libexpat instead of libxml2 for XML. libexpat having an order of magnitude less lines of code than libxml2 is reason enough. If a project has say one bug every 1000 lines, then that's an order of magnitude less bugs. It's even part of the base system on OpenBSD which either means it sucks so much they forked it in which case it's too broken to use, or it's so good they use it in which case make that bug count in expat ten orders of magnitude less than libxml2 because libxml2 is made by GNOME, but I absolutely refuse to touch anything related to XML to find out.
You could use libUCL instead of JSON for your config file, there's a sane configuration language hidden under all the useless features and dozens of different ways of doing the same thing in that library. Or just use YACC.
Your Makefile lacks an installation step and it can only make debug builds. True, the user could specify their own CFLAGS, but then they'll get a build failure because overriding CFLAGS also removes all the libraries the program links with. The user would have to read the Makefile to figure out how to fix it before using it, so that Makefile is about as good as not having one.
Make is braindamaged anyway, use Meson.
BTW, your program won't build on BSD because it assumes libraries and headers outside the base system are in the default search paths for the linker and compiler. It also won't build on any system that uses pkgsrc such as UnixWare 7 or OS X for the same reason. pkgconfig is the BSD and pkgsrc way of doing things (and it wasn't even created there) and it's available everywhere.