Table of Contents
Changelog
- 2026-04-02
- Initial publication
Background
For many months I’ve been trying to migrate away from my Boox Palma. I’ve had it for pushing 3 years now (I think, definitely over 2 years now) and the Android updates have stopped. This worries me because the Android version is old enough now to risk going unsupported by Google. This won’t happen ‘soon’ but it will happen. For me this is A Problem. That said: I adore the Boox devices and still strongly recommend them if you’re ok with an Android based device.
Now onto my brand of bullshit.
I’ll spare you the why of my decision to move back to a non smart e-reader (that’s for another post). The take away is I’m working to move away from an Android based reading device to one that’s less smart, more focused and utilitarian. Preferably with a long support window like the Kobo or Kindle devices (ie. sometimes 10+ years, 5+ minimum).
With my recent filenaming rethink (see here for details) I’ve been able to use a more typical e-reader that’s not smart and lets me read books efficiently. It’s worked well enough that I’ve read about one book per week since I started using a dedicated reader. Before I was reading an average of one book per month at best. As of this writing, I’ve already read 2/3 of my best case norms of the last few years in just two months.
Clearly I’m walking the right path.
The Faux Problem
Recently I ran into a quirk with my reading setup. I pull a lot of content from around the web into Wallabag (see here for specifics) and anything that could be considered a ’long read’ or ‘focused read’ is exported to epub and put into a Wallabag folder. The problem is I use an estimated reading time to select which Wallabag item to read based on my current free time; I didn’t include this in the file name. Oops.
On top of that, I do look at the length of books prior to putting them on my ‘up next’ pile. I’ve historically worked off page count / word count using the Calibre Count Pages Plugin. Thanks to noticing the lack of reading time in my Wallabag file names I realized that it’d be useful info to include in my books setup within Calibre.
Another item that’s been bothering me is the metadata Wallabag adds to epub files is not up to my exacting standards. Since I can see epub metadata on my reading device I have Opinions on correctness and completness of metadata, inclusive of Wallabag content.
Now I have two problems:
- Adding estimated reading time to Calibre and filenames
- Metadata cleanup of Wallabag epubs
sigh
The Fix
Helpfully someone on Reddit posted about their estimated reading time Calibre setup here and the approach works well. I already have mulitple custom columns and adding one for estimated reading time is well within my tolerance for customization of Calibre. I used a WPM of 200 to match Wallabag for speed calcultions. I’m not upset I added this, I now have an estimated reading time column in my main Calibre list and I actually look at it. So that’s one problem solved. The Reddit poster also included a trick for auto-adding estimated reading time, page count and word count to epub files on export. Now I can see estimated reading time in any epub’s metadata. Wins all around!
To solve the Wallabag metadata problem I chose to put my Wallabag epubs into Calibre. I’ve avoided this historically as they aren’t technically books or novellas or anthologies or any other type of content I’d instinctively put in Calibre. However, these are being treated as books on my e-reader, why not put them into Wallabag for better metadata management? I can adjust my perspective to be more flexible.
Putting the Wallabag items in Calibre let me cleanup authorship, title, publish date, publisher and more. I now have clean metadata for Wallabag files which is a huge help. One key thing I did: I use the series field in Calibre to capture a short code that I use to identify the website source via filename. For example: The Dead Language Society blog is now dls for series. If I don’t regularly read a site I use misc as a catch all. I used the series field because any website’s articles / content is effectively a series published to a specific place.
Now I have everything I need, and a bit more, for adjusting my file naming scheme to include estimated reading time. I also have the Wallabag epubs in Calibre so I can automate file naming of books and Wallabag items.
File Naming
My file naming scheme now has 3 forms:
- Books, stand alone:
[title]-[author] - Books, series:
[series]-[book #]-[title]-[author] - Wallabag:
[short code]-[publish date]-[reading time]-[title]
This is incredibly powerful. The file naming effectively auto-groups content where appropriate and gives me all the key info I need for making a reading selection. I still use sub-folders for each type of content but the way this naming works, it’s not strictly necessary.
I was able to set this up in Calibre as a file naming template (see below for the template code) and it Just Works. I do need to be judicious about Wallabag metadata but I’m already a stickler about metadata so this isn’t a meaningful change for me which is nice.
Below are some actual file names that were produced by Calibre automatically.
Books - Stand Alone
alice's_adventures_in_wonderland-lewis_carroll.epubfreeze-frame_revolution,_the-peter_watts.epub
Books - Series
sherlock_holmes-001-study_in_scarlet,_a-arthur_conan_doyle.epubold_man's_war-001-old_man's_war-john_scalzi.epub
Wallabag
dls-20260315-24-why_english_spelling_actually_does_make_sense.epubmisc-20250415-50-lightfast_testing__50_plus_coloured_pencil_brands.epub
File Naming Template
Below is the file naming template I use. Feel free to borrow / adapt if desired.
Things to note
- I tag all Wallabag items with
wallabagso I can programatically adjust which filename template is used on output. field('series')is not behind a guard: if a field is empty Calibre returns an empty string tostrcatso you don’t actually need a guard.
program:
contains(
field('tags'),
'wallabag',
strcat(
'wallabag/',
field('series'),
'-',
format_date(field('pubdate'), 'yyyyMMdd'),
'-',
floor(divide(field('#word_count'), 200)),
'-',
field('title')
),
strcat(
'books/',
field('series'),
test(
field('series_index'),
strcat('-', format_number(field('series_index'), '03.0f'), '-'),
''
),
field('title'),
'-',
field('authors')
)
)