Lazyblorg
Blogging with Org-mode for very lazy people
Install / Use
/learn @novoid/LazyblorgREADME
-- coding: utf-8;mode: org; --
This file is best viewed with GNU Emacs Org-mode: http://orgmode.org/
#+BEGIN_QUOTE «A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away.» ([[https://en.wikipedia.org/wiki/Antoine_de_Saint-Exup%25C3%25A9ry][Antoine de Saint-Exupéry]]) #+END_QUOTE
- lazyblorg -- blogging with Org-mode for very lazy people
This is a web log (blog) environment for [[http://en.wikipedia.org/wiki/Emacs][GNU Emacs]] with [[http://orgmode.org/][Org-mode]] which generates static HTML5 web pages. In my opinion, it is much more superior to any other Org-mode-to-blog-solution I have seen so far when it comes to minimal blogging effort and advanced features that support my blogging experience.
: <(All?) your Org-mode files> --lazyblorg--> static HTML pages : | : v : optional upload (shell) script : | : v : your web space
There is [[http://orgmode.org/worg/org-blog-wiki.html][a list of similar/alternative Org-mode blogging projects]] whose workflows seem really tedious to me.
See [[https://web.archive.org/web/20170909003450/https://article.gmane.org/gmane.emacs.orgmode/49747/][my original post to the Org-mode ML]] for how this idea of lazyblorg started in 2011.
This awesome piece of software is a sheer beauty with regard to:
- simplicity of creating a new blog entry
- I mean it: there is no step which can be skipped!
- add heading+content anywhere, add ID, tag, invoke lazyblorg
- I mean it: there is no step which can be skipped!
- integration into [[http://karl-voit.at/tags/pim/][my personal, published workflows]]
- here, you have to either adapt my totally awesome workflows or you
have to find alternative ways of doing following things:
- linking/including image files or attachments in general (I use [[https://github.com/novoid/Memacs/blob/master/docs/memacs_filenametimestamps.org][this Memacs module]])
- advantage of my method: I simply add an image file by typing ~tsfile:2014-03-03-this-is-my-file-name.jpg~ in double-brackets and I really don't care in which folder the file is currently located on my system
- copying resulting HTML files to web-space (I do it using +[[http://www.cis.upenn.edu/~bcpierce/unison/][unison]]/rsync+ [[https://syncthing.net][Syncthing.net]])
- linking/including image files or attachments in general (I use [[https://github.com/novoid/Memacs/blob/master/docs/memacs_filenametimestamps.org][this Memacs module]])
- here, you have to either adapt my totally awesome workflows or you
have to find alternative ways of doing following things:
** DISCLAIMER: This is a personal project
I wrote lazyblorg to get a blogging system that works for me exactly the way I need it. I did not write lazyblorg for the pleasure on the coding process - I just wanted to get the resulting thing working in order to be able to blog the way I want to blog.
Therefore, it's mostly a works-for-me project. I won't add anything that I don't use myself.
For the same reason, I won't accept pull requests for things like:
- Features I don't use myself.
- Added complexity I don't want.
- Features or dependencies I don't understand completely.
- Stuff that might interfere with the way I'm using lazyblorg.
If you do want to adapt lazyblorg and implement your own features that conflict with the things listed above, I'd like to see you creating a fork of this project. If you drop me a line with a description how your fork differs from the original, I'm glad to add it to this README file.
If you think that your idea might be also a good one for me, you can always hand in a pull request and I'll have a look if I'm willing to add it. However, don't be disappointed if I don't. I want to keep the time spent on lazyblorg at a minimum. My personal priority is visible in [[https://github.com/novoid/lazyblorg/issues][the lazyblorg issues]] where I introduced tags for [[https://github.com/novoid/lazyblorg/issues?q=is%3Aissue+is%3Aopen+label%3Apriohigh][high]] and [[https://github.com/novoid/lazyblorg/issues?q=is%3Aissue+is%3Aopen+label%3Apriolow][low priority]] things to implement.
** Target group
Lazy users of [[http://orgmode.org/][Org-mode]] who want to do blogging very easily and totally cool.
Or simply wannabes. I'm perfectly fine with this as long as they use lazyblorg. ;-)
** Other people using lazyblorg
Pages using lazyblorg are listed [[https://karl-voit.at/tags/lazyblorg/][on my personal tag page on "lazyblorg"]]. Please do drop me a line when you want to get your page added to the list.
Quote from [[https://web.archive.org/web/20190822081405/https://seppjansen.com/2018/04/24/site-using-lazyblorg/][Sepp Jansen]]:
#+BEGIN_QUOTE [...]
But when I revisited lazyblorg after studying the other packages, it suddenly seemed like a better solution. After only a short time of reading I figured out the entire templating and post generation system. Although not the most elegant, it is super simple and easy to understand. And those are my most important points.
The developer states that it is easy to configure and start building, and is absolutely right.
In just a few hours I went from installing dependencies to having a fully working website, including some layout and CSS customization. The included HTML and CSS is easy to modify so I could (lazily) make the site look like I wanted it to without too much digging in many little files. I even managed to make it look a lot like my old site without too much effort! Lazyblorg really lives up to its name!
[...]
I really like lazyblorg, and I'll happily manage [[https://seppjansen.com/][this website]] with it for as long as possible. #+END_QUOTE
Well, as of 2026-03, his website is not available any more. You can see [[https://web.archive.org/web/20191121111428/https://seppjansen.com/][some older snapshots via WaybackMachine]] though.
** Skills necessary
- modifying configuration settings, e.g., in script files
- optional: creating scheduled tasks (cronjob, ...) if you are a really lazy one (and if you trust lazyblorg to do its job in the background)
** System requirements :PROPERTIES: :CREATED: [2014-03-14 Fr 13:24] :END:
lazyblorg is written in Python 3.
Development platform is Debian GNU/Linux. So with any decent GNU/Linux you should be fine.
It might work on macOS but I never tried it so far and I probably never will. Reach out to me if you've tried.
I definitely does not work with native Microsoft Windows. Although a programmer can add a couple of ~os.path.thisorthat()~ here and there and it should be good to go. Please consider sending a pull-request if you are fixing this issue. Thanks!
Windows including the [[https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux][Windows Subsystem for Linux]] looks promising. It might as well work as with any full-blown Linux system.
** Version and Changelog :PROPERTIES: :CREATED: [2014-03-14 Fr 13:28] :END:
Currently (2026-03-21), I consider lazyblorg in productive status. It just works for me very well.
I don't maintain a specific changelog. However, when there are substantial changes to lazyblorg, you maybe will find [[https://karl-voit.at/tags/lazyblorg/][a blog article tagged with "lazyblorg"]]. Use an RSS/Atom aggregator to follow the blog.
All updates and new features are visible in the [[https://github.com/novoid/lazyblorg/commits/master/][repository history]]. That's the most important source for updates.
As of 2025-12-13, I migrated this project to =uv= which resulted in manifold changes related to the wrapper shell scripts, environment variables used for the shell scripts and pytest invocation. This has simplified stuff.
** Why lazyblorg?
Minimum effort for blogging.
And: your blog entries can be written anywhere in your Org-mode files. They will be found by lazyblorg. :-)
Further advantages are listed below.
** Example workflow for creating a blog entry
- write a blog entry anywhere in your Org-mode files
- With lazyblorg, you can, e.g., write a blog article about an event as a sub-heading of the event itself!
- tag your entry with ~:blog:~ (or whatever tag you've defined within =TAG_FOR_BLOG_ENTRY= in the =config.py=)
- add an unique ID in the PROPERTIES drawer
- set the state of your entry to ~DONE~
- make sure that a ~:LOGBOOK:~ drawer entry will be created that contains the time-stamp
An example blog entry looks like this:
: ** DONE An Example Blog Post :blog:lazyblorg:software: : CLOSED: [2017-06-18 Sun 00:16] : :PROPERTIES: : :ID: 2017-07-17-example-posting : :CREATED: [2017-06-17 Sat 23:45] : :END: : :LOGBOOK: : - State "DONE" from "NEXT" [2017-06-18 Sun 00:16] : :END: : […] : Today, I found out that…
Note that the tags "lazyblorg" as well as "software" aren't required for a minimal blog article.
That's it. lazyblorg does the rest. It feels like magic, doesn't it? :-)
** Advantages
These things make a blogger a happy one:
No other Org-mode blogging system I know of is able to process blog entries which are scattered across all your Org-mode documents except the usual org-export-based approaches.
No other Org-mode blogging system I know of is able to generate a blog entry with that minimum effort to the author.
You do not need to maintain a specific Org-mode file that contains you blog posts only. [[http://www.tbray.org/ongoing/When/201x/2011/03/07/BNotes][Create blog posts]] anywhere in between your notes, todos, contacts, ...
And there are some technological advantages you might consider as well:
- You don't need to write or correct HTML code by yourself.
- produces static, state-of-the-art HTML5
- it's super-fast on delivery to browsers
- very low computing requirements on your web server: minimum of server load
- No in-between format or tool.
- Direct conversion from Org-mode to HTML/CSS.
- dependencies have the tendency to cause problems when the dependent tools change over time
- lazyblor
