Bharatvaj Hemanth
May 21, 2025
I've been blind to many advancements in software since I started carrying the torch of UNIX and singing the praise of Vim since 2023, and one of them was the no code revolution. And it blew my mind when my brother showed me, how he has been using a spreadsheet like thing (Airtable) as a CMS. The idea was simple and effective, and more importantly it was UNIX like.
My only ripe with it was the implementation. Airtable and its open-source alternative NocoDB presents a simple façade, but its backend functionality is not so simple, requiring stuff like docker image, nodejs, money and whatnot. This ultimately led me to search for alternatives.
For several sleepless nights, I would search for "simple Airtable", "nocode unix", "nocodb without server" and many such combinations, but without fruition. And after pretty much sucking it up for over a year, editing HTMLs by hand like a Neanderthal, I believe I have come up with a solution.
I present the Á La Carte Airtable or The Poor Man's Airtable (based on the path you tread), which is basically,
Á la carte Airtable is full of choices, but I hope I can provide some guidance to those choices and show my personal implementation of ALCAT.
I have a webdav server with LDAP setup, so anyone who wants to access any file on the organization server, has to enter their credentials. Once that is done, organization users can access the files either through the "File Explorer" or through the web interface.
Enabling webdav is trivial to do in many web servers, this is how enable it in lighttpd without LDAP,
# /etc/lighttpd/lighttpd.conf
$HTTP["url"] =~ "^/dav($|/)" {
alias.url = ("/dav" => "/srv/www/dav")
webdav.activate = "enable"
webdav.is-readonly = "disable"
webdav.sqlite-db-name = "/var/db/lighttpd/webdav.db"
dir-listing.activate = "enable"
dir-listing.show-readme = "enable"
## Use LDAP if required ##
auth.require = ( "/dav" => (
"method" => "basic",
"realm" => "WebDAV",
"require"=> "valid-user"
))
}
Setting up LDAP is not trivial, but there are good resources out there. I suggest reading LDAP for Rocket Scientists if you are a beginner, it is fun and easy to follow along.
If you feel that LDAP is too much for you, you can use a simple authentication as shown above in the lighttpd example, more here.
And after all that we get streamlined file access.

I went with the simple route of using LibreOffice/Vim to edit CSV files on the local WebDav folder, which on save gets saved on to the server.
There is also a slightly more complicated but better (for non-technical users) route which involves having an online editor and a style file.
Since I want things to be simple, I forked Projectcsv, simplified it and implemented the style feature. You can find it here.
Style file here is something that prettifies the table, for the user of CSV editor (site/app owner) to improve the user experience of the CSV editor. It does NOT affect the actual site/app.
As you may know, CSV doesn't support styles but we can overcome this by storing the values in a separate style file.
To keeps things simple, for both the developer and user (the site/app owner), my convention is to have file-name.csvcss for a corresponding file-name.csv file.
In Projectcsv conveniently, the <table> in the CSV editor have class="row" for rows and class="column" for columns.
/* header color */
row[nth-child(1)] {
background-color: #eee;
}
/* rest of the row color */
row {
background-color: #ddd;
}
All I had to do in my implementation is just allow loading the style file that matches the CSVs file name.
If you know a little bit css, you can understand how powerful this is. When loading the csv in the editor, just loading the style file along with it is enough to have a stylized preview.
Once all this is done, you have a CSV file that is accessible by the server. Run a script on git hook/or sync and update the repo files. you have to sync the changes back to the website. This can take many form.
You could have separate servers for operations for storing csv among other things and for deploying website that will face the Internet, but since I'm treading on the poorer side here, both my webdav and webpage are hosted in the same instance, so the transformation for me is just a shell command away.
I basically run a awk script to generate m4 induced html from csv file,
# generate.sh
awk -F',' 'printf "refill_book_card([%s], [%s], [%s])\n", $1, $2, $3}' file-name.csv > refill-booking.html.in
and push it to the appropriate html.in file,
refill_book_card([https://www.amazon.in/hfc/bill/lpg], [/assets/icons/amazon.svg], [Amazon])
refill_book_card([https://gpay.app.goo.gl/Org], [/assets/icons/gpay.svg], [Google Pay])
refill_book_card([https://www.phonepe.com/], [/assets/icons/phonepe.svg], [PhonePe])
m4 has its cons but mind you, it saves me lot of headaches having to deal with webpack, nodejs, and other technologies, so don't judge me!
Neverthless, you can apply this with any technology.
If this feels too much, you should definitely consider using Airtable, NocoDB or other commercial solutions like Zoho Tables, because ALCAT or not, the benefits are enormous.
I'm pretty sure people use some form of ALCAT in the wild west of Internet, but I could not find any resource. Hence my delibirations here. Have fun building!