It started with C and suffering
A while back I built an API in C. Yes, C — I am weird, I know. Using Mongoose — an embedded HTTP server library for C/C++ by Cesanta (not to be confused with Mongoose.js, the Node ODM).
Every route, every handler, every response — written by hand. No framework. No annotation type system. No decorators.
When I was done, I went looking for a documentation tool and immediately ran into a problem.
Why Swagger didn't work
Swagger and OpenAPI are great, but they work by reading metadata from your code: annotations, decorators, type definitions. Java has them. Python has them. Node has them.
Raw C? Nothing. No reflection, no annotations, no schema to scrape. My API had zero metadata — I have built everything manually, so there was nothing for a tool to discover automatically.
You can write an OpenAPI YAML spec by hand, but no tool will generate it for you from C code. Or if you are only using Mongoose to create your API.
So I built something
I made a small static page that reads an api.json file and renders interactive API documentation. No backend. No build step. Just HTML + CSS + vanilla JS. So it is completely language and framework agnostic.
The JSON describes your API — tables, endpoints, parameters, responses, auth — and Tabula turns it into a browsable, interactive doc site.
{
"settings": { "title": "My API" },
"tables": [
{
"name": "posts",
"primaryKey": "id",
"columns": [
{ "name": "id", "type": "integer" },
{ "name": "title", "type": "string" }
]
}
]
}
Then I realized that I built a complete doc generation tool
Halfway through polishing it, I stepped back and noticed: this isn't just a workaround for my weird C project. This is a documentation tool for any API where you want full control — where you can't or don't want to rely on code introspection.
So I did what you do when that happens: I cleaned it up properly.
- Wrote a CLI (
init,validate,serve,sync) - Added a zero-dependency linter that validates your
api.jsonbefore you deploy - Created three example projects (
minimal,blog,e-commerce) - Set up CI, wrote docs, published to npm
Try it (please 🥸)
npx tabula-docs init my-docs
cd my-docs
npx tabula-docs serve .
Open http://localhost:3000. Edit api.json. Reload. That's it.
It's v0.1.3 and still early. I'd love feedback — especially on the JSON schema design. Does it feel intuitive? Is anything confusing or missing?
And if you're building something weird in C: you're not alone.
PS: This post has been generated by Claude, based on my storytelling that I wrote myself. I wanted to be sure that the English would understandable and share correctly my story! I am really proud of this little project, this is my first open source project I fully committed to and went through to the end.
Top comments (2)
Thank you so much for sharing this! 🙌
I truly admire how you turned a frustrating problem (documenting a C API) into a practical, language-agnostic tool. This is exactly the kind of creative problem-solving that makes open source special. 🤍
Also, your wonderful choice of the name 🌊"Tabula" - a Latin word meaning "board" or "table" - suggests clarity and organization, as if it presents API documentation on a silver platter. It's beautiful that you didn't just build the tool, but even thought of a name that carries meaning!
What I admired most is how you combined European precision (from Belgium) with a beautiful name inspired from Latin America - this global blend truly reflects the spirit of open source.
I will try Tabula🙂 in one of my own projects. Even if I don't use C, I love the simplicity of the JSON-driven approach — no build steps, no backend, just clean, interactive documentation.
And by the way, April 19th is Tabula's birthday! 🎂🎉
I truly appreciate your work. You didn't just use an existing tool, you built a new one from scratch to solve a problem that many struggled with.
I wish you further growth, progress, and success! 🤝🙏
Keep it up! 🙂🌸🤍
Thank you so much for your comment 🥹 I really appreciate it!
It give me strength and motivation to continue! Thank you so so much.
I'm happy you saw the word play for the name of this project! 🎉