NOTE: I’ve refactored and absorbed this repo into Clawe, my dev-tools monorepo.
I’ll leave the repo as-is as a reference, as the implementation is roughly the same.
—
Hopefully the last time I overengineer my blog.
I was curious if I could combine the clerk devloop with a blog based on an org-roam mind-garden - this repo is that experiment!
You can see the current state of it here: https://russmatney.com/
- A static blog generator written in clojure
- Pulls content primarily from an org (org-roam) directory
- Uses clerk to define and render the pages (as notebooks) via clojure dynamic vars
- The
org-blog.pages.*
namespaces define the pages and provide a nice dev-loop when working on them
- The
- Uses russmatney/org-crud to parse the org content
This is just getting started - plenty of quirks and details left to iron out.
For now I’m enjoying the repl feedback loop via clerk and the org-watcher (see
org-blog.watcher
, which calls clerk/recompute!
when an org-file is changed).
- The static clerk frontend pages are not necessarily SEO/crawler friendly - the static clerk frontends are big data blobs that run via scittle when the page loads. (I’m assuming this, but maybe crawlers run/eval js these days?)
- The header is kind of hacked into the base hiccup/html (See the
org-blog.render
namespace). The devloop for working with this is not great at the moment, as it only shows up in the static export. Probably a new base notebook viewer should be written for the entire blog, to provide some new theming (so we’re not just reusing the clerk notebook styles). I’ve taken a shot or two at this, but don’t fully grok it yet - viewers seem to be coupled tightly to theclerk.sci-viewer
implementation, so that needs to be learned to implement a new blog-notebook-viewer. - The clerk pages are rendered for each note via clojure’s dynamic bindings, which might be kind of crazy(?).
- Namespaces and functionality from russmatney/clawe are baked in for now - these were convenient to get things going, but would hopefully be brought into this repo and that dependency should be dropped.
- Indexes, navigation, and backlinks are a WIP. There is only a last-modified index for now - tag indexes and backlinking content should be added/improved.
In general, the way this works is fairly opinionated at the moment - the daily notes only publish sub-items that have tags, and certain tags are filtered completely.
The notes need to be opted-into via the org-blog.export
miniapp (run
clerk/show! in that namespace to render some buttons for ‘publishing’ recent
notes). I hope to build this and other namespaces into clerk notebooks that
make managing the content easier.
Publishing right now requires the repl - I call org-blog.publish/publish-all
to create the latest ./public
dir.