Despite having bumped it from 2.x to 3.xyesterday, I'm callingv4.0 onblogmore.el today. There's a goodreason for this though. While tinkering with some of the configurationyesterday, and also answering a configuration question last night, Irealised that it made sense to make some of the internals into publicutility functions.Now, sure, Emacs Lisp doesn't really have internals inthe private function sense, but I've always liked the approach that apackage-- prefix communicates "internal, might go away" vs package-which tells me "this is a stable part of the API of this package". Withthis in mind I've always tried to write my code using this convention. I didthis with blogmore.el too and a lot of the code had the blogmore--prefix.There's plenty of code in there that someone might want to make use of, ifthey wanted to add their own commands, or do fun things with theconfiguration. So with this in mind I've "promoted" a bunch of code to being"public" and, in that case, I feel this deserves another major versionbump1.Things that are now part of the "public" interface include:blogmore-clean-time-stringblogmore-get-frontmatterblogmore-remove-frontmatterblogmore-set-frontmatterblogmore-slugblogmore-toggle-frontmatterblogmore-with-postEach one is documented via its docstring (just a quickCtrl+h f function-name RETaway) and hopefully is pretty self-explanatory.blogmore-with-post is especially handy as it provides a quick and easy wayof pulling information from a post file. So something like this:(blogmore-with-post "~/write/davep.github.com/content/posts/2026/04/2026-04-05-blogmore-el-v3-1.md" (list (blogmore-get-frontmatter "title") (blogmore-get-frontmatter "date")))resulting in:("blogmore.el v3.1" "2026-04-05 20:04:44+0100")Meaning that this snippet from yesterday'spost:(with-temp-buffer (insert-file-contents-literally file) (parse-iso8601-time-string (blogmore--clean-time-string (blogmore--get-frontmatter-property "date"))))becomes:(blogmore-with-post file (parse-iso8601-time-string (blogmore-clean-time-string (blogmore-get-frontmatter "date"))))Not massively different, but it reads better and now all the calls are tothe "public API" of the package.Not all the changes are "promoted internals". I've also added ablogmore-remove-tag command (and also added it to the transient menu).I've also changed the way that blogmore-add-tag works so that, now, ifit's called from the transient, it immediately goes back to the tag inputprompt, allowing for another tag to be immediately selected (you can quitout of this with Ctrl+g). Removal of a tag works in asimilar way, making things a lot quicker.I've also added some extra tests too, which makes it even easier for me tomake future changes with confidence. The more I work with it the more Iappreciate thatERT isavailable.Ordinarily it shouldn't matter as the public interface isn't changing,but some of the "internal" functions had been mentioned as options forconfiguration. ↩