MoreRSS

site iconBryce WrayModify

Based in the Dallas/Fort Worth area in Texas, U.S.A., I’m a nerdy advocate for static websites and the tools that build them — particularly Eleventy and Hugo.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of Bryce Wray

What the Floccus?!? — or, another look at cross-browser bookmarks sync

2026-07-15 03:28:00

My new choice turns out to be not new at all.


I wrote nearly three years ago about wanting to simplify the chore of keeping bookmarks synchronized across multiple web browsers. While I’ve tried various possible solutions, I’m now on another. And, to my embarrassment, it seems actually to have been around well before some of the others I’d tried; I just hadn’t heard of it until recently. In case you haven’t, either, I invite you to meet Floccus.

Our story so far . . .

Before I tell you about Floccus, I’ll rehash my aforementioned 2023 post about syncing bookmarks.

Up to that point, I had long been using xBrowserSync for this purpose, but that choice had grown increasingly unsatisfactory for a variety of reasons, not the least of which was that xBrowserSync was no longer under active development. That sadly remains true: the latest version is still v.1.5.2 from mid-2020. Making this worse is that, since then, the whole Manifest V3 drama has ensured that any browser extension of such vintage probably won’t work with any reasonably up-to-date Blink-based browser (e.g., Google Chrome, Microsoft Edge, Brave, and Opera, among many others). Eventually, that’s likely to be the case, also, for Gecko-based browsers like Firefox and its numerous forks.

I’d also hoped to include Safari in the sync, which wasn’t possible with xBrowserSync chiefly because of Safari’s limitations concerning extensions in general. So, after briefly trying the venerable and highly capable BookMacster, I wound up using Raindrop.io. It’s a different kettle of fish altogether, in that it stores bookmarks in its own app and UI rather than working with a browser’s typical bookmarks-storage process.

Although that served my needs well enough for nearly three years, I finally realized a few weeks ago that the Raindrop.io approach, while certainly quite competent and usable, just wasn’t my cup of tea. In the end, what I still wanted was what had originally attracted me to xBrowserSync in the first place: the ability to make all the browsers I use — well, at least, the Blink-based browsers and Firefox, since Safari was and is a lost cause on this front — share in their own storage and bookmark bars exactly the same bookmarks, including all the numerous, multi-leveled folders thereof, I’d built over the years.

What the Floccus?!?

And, then, I learned of Floccus. It’s a very actively developed FOSS project, appears to have been around since the mid-2010s (!) even though it was new to me for some embarrassing reason, and — so far — has worked very well for me.

Mind you, “for me” is referring to desktop browsing, because I care very little about bookmark-syncing involving mobile devices; as long as I can sync across Blink-based and Gecko-based browsers on multiple desktop OSs, I’m good. However, for those of you who do want to sync bookmarks with mobile devices, Floccus offers a slightly different, Raindrop.io-ish path through its apps for iOS and Android.1

As for where your bookmark storage will “live” for syncing purposes, Floccus works with various self-hosted platforms as well as Google Drive and Dropbox. It even can use a Git repository, whether only locally hosted or on GitHub, GitLab, and such. Floccus also can sync open browser tabs, but I have no need to try that capability.

The following video, from the YouTube channel of Floccus creator Marcel Klehr, gives you a brief overview (and I do apologize for its somewhat annoying narration-by-AI, something that’s increasingly hard to avoid out there in WebVideoLand):

Relief for an admitted bookmark hoarder

As I noted above, Floccus’s tab-syncing powers don’t interest me; this is mainly because I’m not a tab hoarder, unlike what seems to be true for many folks I encounter online.2 I might, however, be accurately termed a bookmark hoarder. My growing collection of bookmarks, and their incorporation within the bookmark bars of my daily-driver browsers, combine to form a must-have aspect of how I use the web. Floccus makes that just a little easier, and that’s proving to be enough to keep me happy with it. Perhaps you will find it an equally satisfying addition to your own browsing toolbox.


  1. In fact, at least one user has even tried running the Floccus iOS app on Apple Silicon Macs as a way of melding Floccus functionality with the desktop version of Safari, albeit with only limited success↩︎

  2. Reading others’ comments about keeping hundreds or thousands of open browser tabs, much less for weeks or months on end, gives me the same kind of inner shudder as when I see a screenshot of an email app with a badge indicating the user has thousands of unread emails. Yikes. ↩︎

Reply via email

MarkEdit: a TextEdit that knows Markdown

2026-06-21 05:21:00

Apple may never give us this answer to a long-standing itch; but, fortunately, someone else did.


We macOS users have long been familiar with using Apple’s included TextEdit app for, as the name suggests, editing plain-text files. However, we macOS users who also like using Markdown have found TextEdit lacking — it can open and edit such files, of course, but it can’t do Markdown-ish things in them — and wished Apple would make it Markdown-savvy. While there’s no indication Apple ever intends to do that, the good news is that there now is a FOSS app, MarkEdit, which is essentially TextEdit that speaks Markdown. And that may well be good enough.

The vast majority of my Markdown-editing endeavors over the last few years, especially for this website, have been spent in iA Writer, and I suspect that will continue to be the case long-term.1 That said, I wrote this post mostly in MarkEdit, and found the experience to be a good one.

Screen capture of MarkEdit application on macOS

Other than its ability to be “Markdown-savvy TextEdit,” another of MarkEdit’s key advantages is that it’s a native macOS app. To put that another way, it doesn’t rely on Electron or any other bloated framework. This keeps it small (four MB as installed), light, and quick, even on older Macs — although it’s mainly for newer ones, albeit with special, additional versions for macOS iterations from several years ago. MarkEdit also works, looks, and feels like a real macOS app. As its GitHub page explains:

UI controls remain native to macOS in both aesthetics and behavior, including force-touch word lookup, inline predictions, and Writing Tools.

Oh, and for those like me who care about such things: it appears MarkEdit is not (yet?) vibe-coded. How long that will continue to be the case, I obviously can’t know; but, for now, MarkEdit seems to be a human(s)-built endeavor.

Correction: I looked again at MarkEdit’s GitHub repo and saw that multiple LLMs are in the list of contributors. [Sigh.] My apologies for the mistaken and now stricken-through assumption above.

Incidentally: to date, although the original TextEdit is on iOS/iPadOS as well as macOS, MarkEdit is macOS-only.


One other (and unrelated) item while I have your much-appreciated attention . . .

I’ve spoken here a number of times about how I converted my old Intel iMac to Linux. Most recently, my Linux distribution of choice was the Arch-based CachyOS, after I’d spent over two years with Fedora. But, while I still think CachyOS itself is pretty interesting, I’ve now reversed course and gone back to Fedora because of the craziness — still ongoing as of this writing — that we’ve seen in the Arch Users Repository (AUR) over the last few weeks. Yes, I knew and observed the correct procedures for safely using the AUR; and, besides, I really wasn’t using the AUR all that much anyway (just two packages, one of which is provided by no less than 1Password); but I simply felt better and safer in going back to Fedora. At my age, I’ll gladly pass up a little performance for greater peace of mind.


  1. Incidentally, as I write, iA Writer has just reached v.8.0. To my surprise, I received the upgrade for free even though it’s been over seven years since I bought the macOS version of iA Writer as v.5-something-or-other. ↩︎

Reply via email

Mixed nuts #18

2026-06-04 03:27:00

AVIF support in Hugo, hashes in action(s), floaters, and clankers.


For no major reason other than that I feel like writing about a few odds and ends which have recently occupied my mind, here’s yet another “Mixed nuts” post.


Although I haven’t yet tried it on this here site, the Hugo static site generator has added AVIF support to its already impressive image processing capabilities as of v.0.162.0. The curious may want to check out this demo repo and its corresponding site. Note that, apparently, not all browsers handle the HDR aspects equally well.

When I build this site through CI/CD, I typically use a GitHub Action which, in turn, calls on other actions to facilitate things — e.g., checkout for accessing the site repo’s contents. After reading about one supply-chain attack after another over the last few months, I finally decided to heed widely discussed advice and pin those actions by their respective commit-hashes, not their release tags. This means that even if a bad actor manages to hijack the repo of (again, e.g.) checkout, my overarching GHA won’t be affected. This article by Rafael Gonzaga explains; and this one on the StepSecurity website gives you additional details, notably how you get each hash in the first place.1

Ah, me, but getting old does so bite sometimes. To quote T. S. Eliot’s The Love Song of J. Alfred Prufrock:

I grow old . . . I grow old . . .
I shall wear the bottoms of my trousers rolled.

Shall I part my hair behind? Do I dare to eat a peach?
I shall wear white flannel trousers, and walk upon the beach.

Well, that’s all well and good, but Eliot never said a word about floaters; and, boy, are they ever in my eyes (which are both aged and myopic2, an especially floaters-friendly combo). So much so, in fact, that my web-browsing habits have veered away from a position I took here six years ago — in one of the earliest “Mixed nuts” posts, as a matter of fact — on the question of light mode vs. dark mode. Despite studies I cited back then, I am now making use of dark mode whenever possible because, simply put, the floaters make reading light text on dark backgrounds far less aggravating than is the case with dark text on light backgrounds. I will reserve judgment on the trousers, the hair (as if I had enough to consider), the peach, and the beach.

I’ve added another “slash page.” This one explains my stances on AI where the site is concerned. The bottom line: I don’t use AI for writing, although I do let it give me limited assistance in coding. The day when I can no longer write without the help of clankers will be the day when I call it a day, website-wise. There’s already enough slop out there without this site’s adding to it.


  1. In short: you navigate to the web page of the commit itself and copy the hash from the end of the page’s URL. ↩︎

  2. Sort-of correction: Actually, on second thought, it’s not accurate to say that I have myopia now, because I had cataract surgeries nearly ten years ago which fixed that. However, I suspect that my having had myopia (and severe myopia, at that) for a bit over sixty years prior to those procedures may still be contributing to my floaters-related woes. ↩︎

Reply via email

A “new normal” update

2026-05-05 04:29:00

Improving my scripting following hvm’s recent changes.


Late last year, I had to adapt this website’s repository to accommodate a change in how Hugo’s macOS version is packaged. In short, I started to use the hvm (Hugo Version Manager) app to manage my computer’s use of the Hugo binary. More recently, after a change to hvm itself, I made a further adaptation. Fortunately for me, as in the case of that earlier post, Hugo maintainer and hvm creator Joe Mooring gave me help in overcoming, as I described to him, “my embarrassing lack of scripting-fu.”

I will assume you’ve already read the aforementioned post from last December; that way, I needn’t go into a huge amount of detail about why I switched to hvm, how it works, and so on. Instead, this post is about the latest incarnation of hvm, how it works, and what that meant — and, to be fair, made possible — for my purposes.

When I first began using hvm, it was at v.0.9.0. At that point, and for a few versions thereafter, it was providing only one edition of Hugo, the extended one. As a result, hvm’s auto-generated .hvm file needed to give you only the Hugo version number being used by your repo, such as:

v0.153.0

Then, a few weeks ago, Mooring released hvm v.0.14.0, the first version which allowed the user to choose from among multiple different Hugo editions. Currently, those are standard, standard-with-deploy, extended, and extended-with-deploy.1 This change in hvm, thus, would require the resulting .hvm file to provide more information. For example, as I write, here is the content of my repo’s .hvm file:

v0.161.1/standard

I initially thought this change would bollix up the local scripting I described in that previous post, but it didn’t because hvm 0.14.0+ installs the user-specified Hugo binary in a directory structure that corresponds exactly to the mini-path in that .hvm file. In other words, this:

/Users/$USERNAME/Library/Caches/hvm/$HUGO_VERSION/hugo

. . . still works the same, because $HUGO_VERSION continues to be the same as what’s in .hvm:

/Users/$USERNAME/Library/Caches/hvm/v0.161.1/standard/hugo

I got an additional benefit from hvm 0.14.0+, thanks to Mooring’s helpful suggestion: it now makes my site-deployment CI/CD a little less needful of my attention. (After all, automation is supposed to be less troublesome, not more so, than doing everything manually.) He showed me, in part of a demo repo he maintains, how he uses the .hvm output to tell a GitHub Action which version of Hugo it should download. Previously, I’d always provided that information through manually updating my GitHub Actions workflow file whenever I updated Hugo. Now, with a slight variation2 on Mooring’s code, the workflow file gets that info from .hvm:

- name: Hugo download/install
 run: |
 if [ -f .hvm ]; then
 hvm_raw=$(cat .hvm)
 HUGO_VERSION=$(echo "${hvm_raw%/*}" | tr -d 'v')
 fi
 wget https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb -O hugo_${HUGO_VERSION}_linux-amd64.deb
 sudo dpkg -i hugo*.deb

In the third line of that if/fi loop, ${hvm_raw%/*} reads the .hvm file’s contents up to the slash, while tr -d 'v' removes the v that precedes the version number (since that v isn’t used in the actual file names for the Hugo release assets). The result provides only the Hugo version number as HUGO_VERSION, which the succeeding lines use to download the desired version of Hugo onto the GitHub Actions runner.

Incidentally, if you prefer a GitLab CI/CD version of this, here’s one I’ve used:

- >
 if [ -f .hvm ]; then
 hvm_raw=$(cat .hvm)
 HUGO_VERSION=$(echo "${hvm_raw%/*}" | tr -d 'v')
 fi
- echo "Downloading and installing Hugo v.$HUGO_VERSION ..."
- curl -LJO https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb
- apt install -y ./hugo_${HUGO_VERSION}_linux-amd64.deb

Of course, given how the various CI/CD platforms seem increasingly overwhelmed by AI-created traffic, I may end up reverting to my previously used direct deployment method — in which case, I wouldn’t have to inform any remote code runner of the Hugo version I’m using. However, while I’m still using remotely hosted CI/CD, I’m pleased to use these methods to simplify things just a tad.

Update, 2026-05-05: On a slightly related note, I learned while researching for this post that, at long last, GitHub Actions now allows you to set your runner’s time zone (including for cron jobs) by simply using a TZ variable, as has long been possible in GitLab CI/CD. This eliminates the need to access other, mostly (apparently) unmaintained Actions to perform that one basic function within one’s workflow file.


  1. Hugo’s extended edition (and, presumably, its extended-with-deploy edition) will be deprecated sometime within the next year or so. With the recent deprecation of its embedded LibSass (which itself is long since gone), the extended edition’s only remaining raison d’être has ended, so removing that edition from the list of regular releases will ease the Hugo team’s maintenance burdens. ↩︎

  2. I now always use the standard edition of Hugo, so I didn’t need an additional line from Mooring’s code that also pulled the Hugo edition. Instead, my script simply gets the standard edition of whatever Hugo version is mentioned in .hvm↩︎

Reply via email

Hugo’s new CSS powers

2026-04-03 01:19:00

A recent update can make it easier than ever to style your site, depending on how you want to do that styling.


As I mentioned in my previous post, I was intrigued when the release of Hugo v.0.158.0 introduced its css.Build function. The new powers that resulted are worth a look when you consider all the aspects of styling a site you’ve built, or plan to build, on Hugo. Still, the enhancements have certain limitations of which you’ll also want to be aware.

When forming the styling structure for a Hugo-based website, you have a variety of options. CSS itself has gained many additional features over the years, and browsers have improved to handle them.

For example, it wasn’t so long ago that simply nesting your CSS like this . . .

.my-div {
 background-color: #ffffaa;

 h1 {
 font-size: 2rem;
 color: #005500;
 }

 p {
 font-size: 0.75rem;
 }
}

. . . required pre-processing through Sass or post-processing through something like PostCSS or Lightning CSS; but, now, you can deliver CSS in production just like you see above, and any browser compatible with Baseline 2023 will display it as you intend. However, unless you’re sure everyone in your site’s target audience is using a sufficiently updated browser, you have to adapt your site’s production styling accordingly — manually by using only pre-2023 vanilla CSS, or automatically through Sass-processed CSS or using a post-processor to transpile modern CSS for compatibility with older browsers. That post-processing is one way that css.Build shines (mostly; more on that in a little while).

Unless your site’s styling is very simple, you may want to organize your CSS into multiple files. If so, you then must determine how best to deliver all that CSS in production. Of course, your HTML can just link to multiple stylesheets, but it’s often better to combine multiple CSS files, especially for critical CSS, into one production-side bundle. That, too, formerly required one or more external packages, but CSS-bundling is another advantage css.Build can give you.

Also, you almost certainly want to minify your CSS for production. Although Hugo’s long been able to do that for CSS, as it does for other delivered files, css.Build now provides another way to do it for just CSS.

All that said, css.Build has some gotchas which you’ll need to take into account when assessing whether this feature can be your sole “helper” where CSS is concerned rather than having to use, say, Sass in development and/or PostCSS on the production side.

What it comes down to is that you must make a judgment call about which newer-style CSS features your site may require. Since css.Build works atop the esbuild package, the best source for what css.Build can and can’t do in this regard is the actual CSS-specific documentation for esbuild itself; this information lists the features for which esbuild performs either transpilation or browser-prefixing. And, even when armed with this knowledge, you still must test how/whether css.Build converts all the newer-style CSS you wish to deploy.

For those items which esbuild (and, thus, css.Build) currently can’t convert to your liking, you’re left with two choices: (a.) add some post-processing that will fill in the gaps; or (b.) decide to target only those browser versions that “know” those CSS items. While deciding, you’ll appreciate the convenience of tools like the Browserslist playground and the Baseline-specific list of supported browsers.1

Such limitations notwithstanding, css.Build’s other capabilities that I mentioned above can reduce or eliminate your needs for other CSS processors. Bundling and minification work right out of the box. And, best of all, css.Build works very quickly, which is an especially big advantage during development. The bigger your site and the more CSS you’re using, the more you’ll appreciate the speed of css.Build.

Perhaps, after thinking through all this, you decide css.Build might just work for your site. Other than those specific CSS gotchas we already mentioned above, what else, if anything, would you lose by going with just a vanilla-CSS-and-css.Build solution? To help answer that, let’s conclude by looking at the alternatives as you would use them in Hugo:

  • Sass pre-processing (involves writing .scss or .sass files, rather than .css files)

    • Requires use of the Dart Sass binary (but works smoothly and very quickly with Hugo Pipes).
    • Provides no browser-prefixing. Remember, it’s a pre-processor. For that, you need to use Sass and a post-processor, which adds more complexity and likely slows down your work, especially in development.
    • Lets you nest your styling , but currently doesn’t support native CSS nesting — which may not matter to you if your styling code is all-Sass anyway.
    • Provides bundling through Sass’s @use command.
    • Performs minification through the “compressed” outputStyle option.
    • Offers math functions, logical functions, and mixins — some or all of which either already are, or might become, part of Baseline CSS at some point in the not-too-distant future.
  • PostCSS post-processing

    • Works well with Hugo Pipes but, due to PostCSS’s JavaScript foundation, is much slower than the other options described here.
    • Uses various plugins to:
      • Perform transpilation, polyfills, and browser-prefixing for older browsers.
      • Provide bundling through a plugin’s interpretation of CSS’s @import command.
      • Perform minification.
  • Lightning CSS post-processing

    • Must be “shoehorned” into Hugo. Also, Lightning CSS has no file-“watching” capability for use during development, so that, too, must be part of the “shoehorning.”2 To be fair, though, the Rust-based Lightning CSS is very fast (although not as fast as either css.Build or Dart Sass) when properly “shoehorned.”
    • Performs transpilation, polyfills, and browser-prefixing for older browsers.
    • Provides bundling through Lightning CSS’s interpretation of CSS’s @import command.
    • Performs minification.

  1. For my own lightly visited, non-commercial site with its relatively simple styling, I’ve determined that Baseline 2024 will suffice; but those of you with more heavily visited sites, especially if they’re commercial in nature, may well want to use additional post-processing to accommodate older and/or less commonly used browser versions. ↩︎

  2. This is as opposed to how Lightning CSS works with some other static site generators, especially if Vite is involved. ↩︎

Reply via email

Mixed nuts #17

2026-03-17 05:46:00

A new name for Eleventy, trying CachyOS, some new powers for Hugo, and other folderol from my noggin.


Here we go once again with an entry in my “Mixed nuts” series of posts, each of which contains musings on multiple topics that have recently occupied my semi-reasonable facsimile of a brain.


Perhaps soon we’ll be referring to “the static site generator formerly known as Eleventy,” at least in jest, but it will be true. Eleventy’s creator, Zach Leatherman, announced earlier this month that the SSG now will be called Build Awesome. You may recall that this open-source project came under the aegis of Font Awesome in 2024, apparently settling any remaining worries about Eleventy’s long-term financial sustainability. Despite the name change, Build Awesome will remain free. However, there also will be a paid “Pro” version that will add more features; exactly which features, and what the Pro package will cost, remain TBA. (An earlier announcement, containing more details, was removed.) Also, Leatherman promised to keep future versions as backward-compatible as possible with existing Eleventy sites and the current ecosphere of Eleventy plugins.

My Linux-on-the-old-Mac adventures continue. Now, after about a year and a half on Fedora, I’m running the Arch-based CachyOS distribution. Its purpose is to provide the flexibility of Arch Linux, but with greater ease of use plus — and this is what got me to try it — special enhancements to optimize performance. It’s early, but I’ve been quite pleased with CachyOS. It seems to have many of the aspects I preferred about Arch compared to Fedora, such as far faster mirrors when it’s update time, yet without my having to tinker quite so much to keep things running smoothly.

While I was starting to draft this post, the Hugo team released v.0.158.0, the most interesting new feature (IMHO) of which is called css.Build. As the documentation says, css.Build lets you “bundle, transform, and minify CSS resources” — which, up to now, I’ve been using a combination of PostCSS plugins and bespoke code to do, especially in production. Now, Hugo can do all those things on its own! Indeed, after spending a couple of hours fixing a few things in my existing layout files, I was able to go Hugo-only for handling the site’s styling even in production. If you’re a fellow Hugo user, I suggest you view the docs and see if you might be similarly interested.1

I recently put aside this site’s Sass files after realizing I had little or no remaining reason to keep maintaining them. Sass long ago lost its main advantage for me over vanilla CSS, namely the nesting that became native to the latter years ago; so continuing to keep around the Sass versions of my CSS files, much less having to change them for consistency’s sake every time I edited their CSS counterparts, had ceased to be anything other than a nuisance.

The growing weight of “you-must-use-AI-no-matter-what” demands upon developers by various firms’ IT overseers makes me ever gladder that I retired well before the craze ramped up to today’s cacophonous level. My final job was mainly managing websites and the servers on which they were living, so I might have escaped the worst of the madness at first, but that relative calm wouldn’t have lasted. After all, when a company spends big bucks to make a Thing available to its IT team, the folks on that IT team had better-by-God be using the Thing if they know what’s good for them.


  1. Please note that, starting with Hugo 0.158.0, there are some important deprecations that you may have to address in your site, as Hugo contributor Joe Mooring explained in a post on the Hugo Discourse. For example, I had to change all my Site.LanguageCode references to Site.Language.Locale, and that’s for a site that isn’t multi-lingual; on one that is, there likely will be quite a few more such changes to make. ↩︎

Reply via email