Show HN: SQLite Plugin for Jekyll (github.com)
However, Liquid is a terrible language for data-mangling, and simple filtering/sorting/merging can become very annoying. So I wrote a Jekyll SQLite plugin that lets you use the same data interface in Jekyll/Liquid, but backed by a SQLite file(s).
It gives you the simplicity of the Baked Data pattern[2], and the flexibility of using SQL for data-wrangling, within a static site generator.
As a demo, I took the northwind dataset, and generated a site[3] with a few sample queries[4]. It demos both site-level, and page-level queries alongside data-pages generator to generate a page for every product/category/customer.
I've been using this across a few sites in production for almost a year, looking for feedback on usage semantics and feature suggestions.
[0]: https://jekyllrb.com/docs/datafiles/
[1]: https://github.com/avillafiorita/jekyll-datapage_gen
[2]: https://simonwillison.net/2021/Jul/28/baked-data/
69 comments
[ 5.3 ms ] story [ 114 ms ] threadI've ran swiftjectivec.com on it, and it's always been the perfect middle ground of taking care of the cruft I don't want to deal with, while allowing me to get my hands dirty and code when I want. Some of my favorite software ever.
[1] https://github.com/endoflife-date/endoflife.date/commit/7dae...
[2] https://github.com/endoflife-date/endoflife.date/commit/ab16...
[3] https://github.com/endoflife-date/endoflife.date/commit/12a7...
Bear in mind this was 5 years ago and I had never used Ruby before, so probably a user error :)
Glad it's been so stable for you!
That‘s something that works incredibly well on Windows, better than I would have expected to.
The rubyinstaller.org people are shipping a fantastic installation. Under the hood it‘s msys2, but everything simply works out of the box.
Just sucks that eventually, that will happen with whatever you use after migrating too, the only difference is how long it takes.
I'm hoping NixOS or even just Nix for dev envs (or something similar) will help against this, so you end up with environments that just keep working.
Though the idea of using a database to store the content could make things even better. Maybe sprinkle some redundant postgres?
Enjoyed the read.
Looking forward to when you chuck the whole thing into the bin and run Wordpress on your linux home server, fronted by a free Cloudflare zero trust tunnel.
I wonder if DuckDB would make it easier to do this same thing and use the existing Jekyll data files?
I found that separating data from content on a Jekyll site is a really powerful way to have anything from photo galleries, blog entries, book lists, easily changeable menus etc...
https://tina.io/
Many are far more user-friendly than WP. All are more secure, better performing, most easier to develop on¹ and several have far better fitting architectures and concepts for common use-cases.
Yet WP continues to churn along. It has it's "marketing" going for it. It has a familiar name, it is predictable (you know what cr*p and legacy you're signing up for, as a techie), and therefore it remains a popular choice. Which is a metric many people use to choose a tech stack on, so it's a flyweel.
You've probably not heard about any of the simple, secure, fast, static-file, build-on-CI, nice-UIs CMSs out there. They are there. You can use them to replace your WP. Yes, even if you have a staff of 20+ web-editors that have never even heard about something like "CI", "Git" or commandlines.
¹ I've been Drupal and WP developer from early 2000-s to early 2010-s. I've founded a few webhosting companies specialised in WP hosting. I've helped hundreds, maybe thousands of ppl with "WP stopped working last week, can you have a look". WP development is a ghetto full of dumpsterfires, with, if you know where to look, are very disciplined, avoid 95% of the "streets" (ecosystem), some gems.
Not complaining, mind you. My kid is trying to learn HTML/CSS/JS and wants to put together a read-only website with a database backend. I'll be pointing him this way as an ootion once he's far enough.
But it's still puzzling to link it to baked-data. Maybe I'm missing something.
You can see https://github.com/captn3m0/northwind for example, which bundles the entire database alongside the code in the _db/northwind.db file. While Simon considers it primarily for dynamic apps, you have the ability to build PWAs and other interesting apps with the baked data pattern.
I'm building blr.today for example using this.
Mind you, it's great to have a Jekyll plugin to do that from sqlite, it's just confusing when you call it baked data.
https://github.com/evidence-dev/evidence
THe craziest production with this approach that I've seen is the crt.sh website, which builds a full dynamic website with postgres and sql: https://github.com/crtsh/certwatch_db/blob/master/fnc/web_ap...
Technically I'm sure I could run a script to generate .md (or a format like .csv that Hugo can work with) from my database, but this seems like it might be easier for a database that updates frequently.
Yeh I am genuinely interested in this project. but I don't think I have the technical prowess to manage it , but I am going to try but I hope that others could somehow create it as well (since I have created nothing open source which people care about)
My code is messy, and probably not suitable for others, but it's here: https://github.com/ralexander-phi/rss-blogroll-network/blob/...
This uses a weekly web crawler run to populate the sqlite database (https://github.com/ralexander-phi/feed2pages-action/tree/mai...) and it generates a couple thousand pages which are then hosted on GitHub Pages (https://alexsci.com/rss-blogroll-network/).
Also TIL about the baked data pattern, which I think is exactly what I needed for an upcoming project, so thanks for that. Though, I do align with one of the commenters here—this doesn’t seem like the same thing as the Baked data pattern in that Simon’s approach was about using a server rendered app with read-only data instead of generating a lot of static pages.
Nevertheless, this seems like a nice way for static generators to work with bit more complex data sources without dumbing them down to JSON/YAML.
The idea would be to feed the wordpress content into a sqlite DB and re-publish the entire site as a static site. Since wordpress comments have declined in usage, this should work well.
Publishing time would be a bit slower, but reads will be 100x faster and 10000x cheaper.
Quick FYI on Jekyll performance:
I noticed slow generation times on one of my sites and traced it to a plugin that was spawning a git process to get the last commit info for every page. I wrote a drop-in replacement called jekyll-last-commit[0] that uses the ruby libgit2 wrapper for improved performance. Details on its origins are in an old HN comment[1] if you are interested!
[0]: https://github.com/klandergren/jekyll-last-commit
[1]: https://news.ycombinator.com/item?id=34331663
We show the last-modified date on endoflife.date products (https://endoflife.date/jekyll), but I'm not sure how we have the property set right now, since I don't remember including either plugin. Thanks for creating this, I have a few other sites where this will be quite helpful.
Is FTS5 included in the SQLite browser builds? The SQLite amalgamation includes it by default.
[1]: https://lunrjs.com/docs/index.html
[0] https://github.com/mmomtchev/sqlite-wasm-http
The core problem you will run into is that Go is a very static language, and Ruby is a very dynamic "free for all" language. Obviously up- and downsides to both approaches, but IMHO Ruby is clearly a much better fit for this sort of thing. On my own Jekyll website I do syntax highlighting with Vim's :TOhtml. I like how my Vim looks and I know how to tweak Vim syntax files. Kind of crazy I guess, but it works, and it's actually very little code. I would be hard to replicate this in Hugo, or any other Go-based site generator.
Similarly, doing a plugin like jekyll-sqlite will be hard. You can bake it in of course, but people experimenting with random stuff like this? Not going to happen with Go.
Not that Hugo can't be improved on by the way – I have generally found using Hugo to be highly complex and a forest of weird confusing errors that don't make much sense. But you will never really replicate Jekyll in Go.
I like Go. I have written tons of Go code over the last 10 years. But for some things it's just not a great fit, and this is one of those things.
[1]: https://stackoverflow.com/a/68287682/660921
[2]: https://github.com/jekyll/jekyll/issues/8707
[0]: https://prezet.com/index
If you're into SQL-powered tooling, you might find something like https://sql-page.com interesting as a comparison point. It flips the model by letting you create dynamic web apps entirely in SQL, skipping the static file generatio step.
Anyways it's really nice to see new tooling removing a lot of the plumbing work needed to go from database to website.
https://www.mikekasberg.com/blog/2024/04/23/better-related-p...
Isn't this what Gatsby tries to do with GraphQL?
I can see how someone is grabbing it and regenerating content on data change and then if data changes often enough you are back to dynamic templating engines. Then nagging how awful it is for such use case and staring to build „new thing” that was already in RoR or else.
If you have data in a database most likely better to use RoR or whatever else you fancy.
But hey this might still be useful for some one off jobs.
I use it at BLR.today, where I curate events happening in Bangalore. The dataset updates roughly 4 times a day, and generating 100 pages 4 times a day is simpler than running an always on server.
The endgame for me would be to roll this into running a Jekyll-lite engine on the edge, against a SQlite database locally available to the edge compute.