DEV Community

Laura Durieux
Laura Durieux

Posted on

I built an API in C, couldn't document it, so I accidentally created an open-source tool

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" }
      ]
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

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.json before 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 .
Enter fullscreen mode Exit fullscreen mode

Open http://localhost:3000. Edit api.json. Reload. That's it.

🔗 Live demo
GitHub
📦 NPM

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 (0)