Bharatvaj Hemanth
May 21, 2025
Many few things surprise me in a good way, but the one that did was AirTable. When I was first introduced to this idea by my brother, my mind was blown out of the water. It was so simple and effective. Airtable gives a simple interface to understand/edit data without interacting with the code on the target product like web or application, designed to be used by non-technical creators like product owners.
Though AirTable and it's open-source alternative NocoDB presents a simple facade, it's backend functionality is not so simple. This led me to search for alternative workflows. I was searching with keywords "simple airtable", "nocode unix", "nocodb without server" and many such combinations over several sleepless nights, but without any fruition.
After pretty much sucking it up for over a year, I beleive I have come up with a solution with caveats I can live with. I present the Á la carte airtable or Poor man's airtable (based on the route you go), which is basically,
Á la carte Airtable is full of choices, so much it's paralyzing. I'll present how this works, and my personal implementation of ALCAT.
The two choices are: Implement SSO + Cloud storage (or) If self-hosted, go for webdav + ldap/custom authentication.
I have 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 csv files either through the "File Exlprore" 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, and for some it is a life long learning, 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 like shown above in the lighttpd example, more details here.
And after all that we get streamlined file access.
You can choose to either use an online csv editor, or you can go the UNIX way by editing the csv and style file manually.
NOTE: You can skip the styles part if you are a developer comfortable with csv and you are the ultimate user of site or app, but it is important to have for non-technical users.
Style file here is something that prettifies the table, for the user of csv editor (site/app owner), it does not affect the actual site/app.
As you may know, csv doesn't support styles which we can overcome by using using a separate style file that is custom to us.
To keeps things simple, for both the developer and user (the business owner), my convention is to have file-name.css for a corresponding file-name.csv
file.
The table in the csv editor have class="row"
for rows and class="column"
for columns, and other
special classes for special cells.
row {
background-color: #ddd;
}
row[nth-child] {
background-color: #eee;
}
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. And if you want to click to change functionality, it is extremely trivial.
I forked projectcsv and implemented this feature, so that you don't have to which you can find here.
Once all this is done, you have to sync the changes back to the website. This can take many form.
I basically run a awk script to generate m4 data from csv file that looks like this,
# The mismatched `\`'` is not a mistake, it is just how m4 works.
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')
and push it to the appropriate the appropriate html.in file.
m4 saves me lot of headaches having to deal with webpack, nodejs, and other technologies, so don't judge me!
You can apply this with any technology. You have a CSV file, run a script on git hook/or sync and update the repo files.
Actually, organizations love this. Most of the enterprise software are overpacked software with "just incase" features, rightfully so in some case (ex: shipment software), but there are certain trenches in software that needs to be simple for it to effective and custom enough to tailor it to the organization. AirTable is one such case as it exists to reduce complexity not give options. Which makes ALCAT a good alternative.
If this feels too much, you should definitely consider using AirTable or NocoDB or other commercial solutions like Zoho Tables, because the benefits are enormous.
I'm pretty sure these methods are used by some people already in the wild, but I could not find any resource that could go into brief detail. So I posted it as a resource. Have fun!