Skip to main content
My site follows your system default or browser color scheme preferences (using prefers-color-scheme @media query, learn more here). To switch between light and dark mode, change the appearance configuration:
Operating System
  • macOS: System Preferences > Appearance > Appearance
  • Windows: Settings > Personalization > Colours > Mode
  • Linux: Distro dependent; but for example, in Ubuntu: System Settings > Appearance > Style
  • Android: Settings > Display
  • iOS: Settings > Display & Brightness
Browser
  • Firefox: Settings > General > Appearance > Web Site Appearance
  • Safari: Follows system default
  • Chromium: Settings > Appearance > Theme
My preference is dark mode; try it out and let me know what you think? 😉
BurgeonLab.com logo of a light bulb shaped as a flower in a pot. Naty S (she/her). A tech enthusiast who enjoys blogging with SSGs, tinkering on her computer, and promoting IndieWeb principles. (Elsewhere: Mastodon)

A note is a common IndieWeb post type, akin to a microblog (which you might know as a “tweet” or “toot”). This page displays a feed of these short, title-less entries, which usually feature brief entries like quick thoughts or replies presented in reverse chronological order (newest first). Notes are managed via Indiekit and are syndicated to Mastodon as indicated on the /⁠firehose page. Likes are on a separate /⁠likes feed.

Each note entry has a permalink accessible via the date link where you can upvote and make comments.

Follow the blog with RSS/Atom feeds Follow with your feed reader!

Subscribe to the dedicated microblog feed or discover other feeds.

Badge button for BurgeonLab's microblogs feed
Archive of notes

2026

PSA: RSS and Atom XML Feeds Failure

Indiekit Beta 30

Feather Wiki Updates

Mid-Autumn Festivities

Writing Break and WP Migration

Bunny Edge Rules for Quartz and New Supporter

D2 Diagrams Lives On

Blaugust 2026: Final Word

Some Thoughts on Advice

Starting Over With the Pi

Mac Mini 2018 i7 Hand-me-down

About the Revamp

Hot Weather Effects

Last Minute Decision: Blaugust 2026

One Take Pass

Another Backend Heavy Day

DRY Principle: Hugo Layout Templates

Brewed a Coffee From 2022

Thank you so much, kind stranger, for being my first…

Writers and bloggers, does this happen to you? You sit…

As an Indiekit supporter and user, I’m really…

June has flown by it seems, and that means Junited-2026…

Troubleshooting Technical Errors

Homebrew Website Club: Eastern June 17 2026

A feature I didn’t know existed in VS Codium saved my…

digiKam MySQL Database Upgrade Woes

Regular expression (Regex) is a skill I wish I have a…

Maintaining My Own Brew Tap

Hong Kong Open Source Conference 2026

My WordPress Replacement: Zensical

I thought my secondary blog (with WordPress backend)…

Signing Git Commits

Hantavirus and Andes virus 101

Fixed Mac Mini M1 (2020) Disk Corruption

Skipped Weeknote and Mac Disk Corruption

Adding Features to Open Source Projects

Improvements for Code Blocks and Snippets Demos

Unfortunately I have my first driving lesson today (in…

This is the first time I’m using my new Pi Docker…

Came across a site called DI.Day. It’s currently only…

Despite the disruption message still on status.sr.ht,…

I use Mermaid diagrams occasionally on my Hugo blog. It…

My blog relies on SourceHut (aka sr.ht) Git repo and…

After discovering TiddlyWiki from @jbaty, I went ahead…

I haven’t used Indiekit to post anything recently!…

At today’s IndieWeb Homebrew Website Club: Pacific…

Halfway during my Indiekit setup, I decided to use this…

2025

Notes

PSA: RSS and Atom XML Feeds Failure

PSA: RSS and Atom XML Feeds Failure

Hello dear readers. Earlier this week, if you noticed a lot of new (actually duplicate) entries in your feed reader from me—I apologize!

To fix it, mark all as read in your feed reader. If your feed reader didn’t fetch during the time I was messing with all of this, it might not have seen the wrong ID (then you’re fine!)

What Happened?

I should have triple checked before pushing the revised XML templates live, but I failed to pick up on one of the very specific date syntax errors in the Tag URI I used for the ID field (Atom) and GUID field (RSS). The feed ID is a unique string for each entry; with my mistake deployed (before I fixed ~10 min later), feed readers saw the two different IDs for each post and thinks they’re new posts. Hence, the duplication nightmare… 😥

There were a lot of inconsistencies in my Hugo XML templates, which was what triggered me to update all of them (a dangerous move!) I made the following changes:

  • Added all the required fields according to the documentation for Atom and RSS feeds
  • Clean up the Hugo logic to generate notices and the footer message
  • Added an email reply link to the footer of every entry
  • And the troublemaker: deciding to use Tag URIs for <ID> / <GUID> instead of the permalink

The guide mentioned in the W3 Atom spec page was: How to make a good ID in Atom by Mark Pilgrim. I’m following the section, “Other ways to build valid Atom IDs: By entry creation date”.

The Exact Error

The validation check alerted me that my Tag URI’s date was in the wrong format. I had YYYYMMDD instead of either YYYY-MM-DD or YYYY:

Followed by the date at which this tag scheme was first used. Note that this is the date at which the tag scheme was minted, not the date of the specific entry or item. Format is YYYY-MM-DD with the month and day parts being optional.

My Tag URI is now: <id>tag:burgeonlab.com,2026:/posts/20260913212356</id>, with just the year as YYYY after the first comma.

Conclusion

I’ve learnt my lesson; but at a cost to my readers. I will not deploy any XML changes unless I’m 100% certain the feed is valid in at least two validators (if I ever dare touch it again 😅).

Thanks for bearing with my XML tinkering. Sorry again for my oversight.

—Naty

P.S. I want to thank Chris for his pointers and advice re: XML feeds.

Resources

Here are some pages I found useful when working with XML feeds.

Indiekit Beta 30

Indiekit Beta 30

Yesterday I was extremely excited to see the latest big update (Beta 30 & 31) to Indiekit, the Micropub server + client I use in conjunction with Hugo for this site. Lots of QoL updates and bugfixes. I want to thank Paul, Ricardo, and Anthony for making Indiekit better.

Having upgraded a few times, I now know the routine to upgrade my server. When I first started I was very lost indeed… 😅 Here’s a quick rundown of how I did it (mainly for myself in case I forget in the future):

  1. Update package.json to the latest version in dependencies
  2. Double check the version number on npmjs, e.g., @indiekit/post-type-rsvp for additional plugins
  3. Delete node_modules and package-lock.json
  4. Run npm install and npm audit fix (I also run npm ci but I’m not sure if that’s necessary)
  5. Check dockerfile and see if the Node version is up to date (check current tag, it is 26.11.1 as of Oct 12 2026)
  6. Git commit and push changes
  7. Git fetch changes onto server (it’s my Raspberry Pi 4B for me)
  8. Do a sudo apt update && sudo apt upgrade -y, then docker compose down while in the Indiekit directory
  9. Run docker compose build --no-cache and then docker compose up -d
  10. Restart server sudo reboot -h now
  11. Open the browser and go to server URL, clear cache / cookies to prevent stale states
Screenshot of version beta 31 for Indiekit server on Burgeonlab.com.
Up and running!

Learn more about the project or ask questions on the unofficial IRC #indiekit channel or the #indieweb-dev channel.

Feather Wiki Updates

Feather Wiki Updates

Today I updated my Feather Wiki personal brain dump tool (which I have written about here) to the latest version (Goldfinch v1.9.1).

During this process I checked if there was anything new in the extensions, and noticed a nice upgrade to the editor called SunEditor. It claims to be “A lightweight, flexible WYSIWYG editor with zero dependencies.” which sounds really appealing to me.

Editor Extension

The Feather Wiki SunEditor-Replacement plugin was made by @jcoder. I tried installing it but it threw a lot of errors in the console. Luckily it didn’t take too long for me to notice there’s breaking changes from SunEditor v2 > v3, so by pinning the version to the last updated legacy version (v2.47.12) instead of @latest and everything worked!

So if you’re okay with using v2 (legacy SunEditor version), change the source of the CSS and JS.

For example: css.href="https://cdn.jsdelivr.net/npm/suneditor@latest/dist/css/suneditor.min.css"; to https://cdn.jsdelivr.net/npm/suneditor@2.47.12/dist/css/suneditor.min.css.

But I wanted to see if I could get the latest v3.3.3 working as a Feather Wiki plugin. I was about to give up actually, but I got it to work in the end! There’s a handy v2 > v3 migration tool on SunEditor and also a reference table for renamed variables.

V3 SunEditor Now Supported

What changed:

  1. v2 uses a direct assignment for the event handler: editor.onChange = function (contents, core) { state.edits.content = contents; }. v3 uses a nested object block:

    Js
    1events: {
    2	onChange: function (contents) { ... }
    3}
  2. Add memory cleanup and deleting removed elements step.

  3. Use contents.data || contents to extract the content correctly so Feather Wiki can save the content typed into the SunEditor textarea.

  4. I added word and character count to the SunEditor status bar, which means I don’t need to have an extra Feather Wiki extension: Word Count.

  5. Instead of CDN/third-party calls, I downloaded the v3.3.3 CSS and JS files to be used offline.

Feeling Content

I will make a PR later this week and tell Robbie about pinning the v2 version on @jcoder’s version and a v3 version for those who want the update. (Will link to the plugin code here when it’s up.) ⁂

Hope I am not the only one who gets to benefit from my troubleshooting session! It’s always a nice feeling to get something to work.

Have a great week and see you later this week if you’re into personal websites and the IndieWeb as HWC:AP is on this Wednesday!

—Naty

Mid-Autumn Festivities

Mid-Autumn Festivities

Mid Autumn Festival aka Moon Festival (中秋節, zung1 cau1 zit3),is celebrated on August 15 on the lunar calendar (which lands on the Gregorian calendar September 25 this year).

It is considered one of the top Chinese holidays—typically in Hong Kong—families gather, eat and gift each other mooncake 🥮 (a sweet pastry, the traditional one has lotus paste and salted egg yolk), observe the full moon on the night with lanterns, guess “lantern riddles”, visit lantern displays, and/or pay a visit to the Fire Dragon Dance.

I’ve actually never seen the Fire Dragon Dance because I think I’ll have a difficult time breathing with the burning fumes of the 12k incense sticks. I’d love to photograph the event one day!

May your family be together and complete, like the full moon. Happy Mid-Autumn!

月圓人團圓,祝你中秋節快樂! 🌝

Writing Break and WP Migration

Writing Break and WP Migration

I’m still mentally recovering from Blaugust. 😅 During this writing break, instead of writing words, I’m writing HTML, CSS, JS and even some TypeScript/React Components (that’s for Quartz, which is confusing as hell TBH!)

Site Updates

On this site, last week I fixed:

  • Word count calculation mistake on the statistics page
  • Dreaded FOUC issue (not the first time)
    • Fixed by removing the media="print" onload="this.media='all'" trick
  • New SVG image shortcode (used to add the two SVGs in my Blaugust 2026 recap post)
    • This SVG image highlighted a XML bug I had which cut my full-text content short—which is fixed now!
    • And another XML bug (thanks Chris for reporting) fixed for full-content disappearing after <figure> code blocks.
  • Refreshed the RSS/Atom feeds table on /⁠subscribe
  • Saved the KeepAndroidOpen banner script (trimmed unused styles) locally, so it doesn’t require third party access.
  • Fixed date parsing error in JSON-LD schema
  • Updated my beloved heatmap calendar rather significantly:
    • Instead of just including content over 300 words, it now include all activity
    • Days with multiple entries are depicted with a circle
    • Moved the calendar to the homepage
    • New group for very short content (under 100 words)

Heatmap Calendar

The calendar feature is one of my absolute favorite things on BurgeonLab. ⁂ I actually need to update my guide and share the docs + source code which got abandoned part way. Definitely something I want to accomplish but I have too many things I want to do! 😅

Quartz Digital Garden Updates

A big task I’m working on in the last few days is to deploy my Quartz digital garden secondary site, as my Hostinger WordPress plan has expired yesterday. I have to admit I left it a bit late; I was ironing out the final kinks.

It is taking longer than expected with my complete lack of experience with TS overrides and custom .TS and .TSX files to automate OG images, for example. I don’t really like how heavy the backend is with Quartz and as Lesley (a fellow Indieweb blogger who also uses Quartz) pointed out, it is not as customizable compared to other static site generators and can lead to repeated headaches from Git merge conflicts every time updates are fetched upstream.

Possible Downsides of Quartz

This is indeed wise advice as I find both statements very true—I already had one of those Git merge nightmares having not updated for two months… But alas, I am going to push on because I already changed my mind three times (!?) after deciding to leave WordPress; I was set on ClassicPress (with SemPress theme) at first, then went to Zensical, and now Quartz.

Obsidian Prep

I proceeded to creating a fresh new Obsidian vault for my public digital garden site. Starting from scratch was very refreshing, with no plugins and default settings for everything! It wasn’t long before I reinstalled Templater though as I find the ‘Create note from template’ hotkey indispensable. I made two new templates with Quartz in mind, where I am trying to create a path of least resistance so that publishing to it will be as simple as possible.

Deploying Quartz

What remains is how the site will be deployed. I might rely on SourceHut Builds like how I deploy this site (on git push) or on some sort of crontab so that it is automated. The Obsidian vault (Markdown content) will likely be synced to my Android mobile device via Syncthing so that I can access the notes and write anywhere.

But Deployment and CI/CD is not yet the main issue as I’m facing some hosting/routing issues which I shared in yesterday’s note after migrating the “live” domain to Bunny.net Storage.

Anyhow, I hope I can sort it out soon and get into writing mode, as I really look forward to making notes for my new digital garden!

Screenshot of the about page at Naty's Eclectic Passions. Left sidebar shows directory, center shows About page title with dithered image of the author, right sidebar shows table of contents. The page has a general Quartz layout, with dark mode turned on (with a green/orange/yellow theme).
A peek of what it looks like

Bunny Edge Rules for Quartz and New Supporter

Bunny Edge Rules for Quartz and New Supporter

Thank you, kind stranger, who used my Bunny.net referral code on August 30, 2026! You’re my second successful referral to one of my favourite web services. Appreciate you supporting my web hosting fees.

Screenshot of a line graph showing 1 conversion on August 30 2026
Hope you like it as much as I do! 🥰🙏

Quartz SSG with Bunny Storage

I actually just migrated my secondary WordPress site from Hostinger to Bunny Storage and working on getting the routing working because Quartz outputs its HTML files a particular way which I am not used to (it is in two different formats):

  1. Flat .html files for everything e.g. public/about.html
  2. Directory index.html for all folder pages e.g. public/blog/index.html

Since I’m not hosting the site on a web server with Nginx or Caddy, this means that I have to rely on Bunny Edge Rules to add some functionality. Edge Rules was always (and still is to be honest) a bit confusing to me, but they’re super useful as they can do things like Override Origin URL (an action) that is triggered by different filters (aka condition).

For example, an Edge rule I have is to add .html suffix to the Origin URL <origin-url>{{path}}.html when it’s any page that doesn’t have a file extension AND NOT the homepage.

This works for everything except folder directory pages. In the case of the link to the blog archive, going to .com/blog with the above Edge Rule, it will apply the override origin URL and it becomes .com/blog.html which leads to a 404 page not found. The page is actually at .com/blog/index.html.

At the moment, I have only two folder directory pages: /notes and /blog, which is easy enough to add as a Edge Rule first (priority matters) before the “Add .html suffix rule”. It does the same Action of “Override Origin URL” but adds /index.html suffix instead of just .html, <origin-url>{{path}}/index.html when the Request URL is either <hostname>/blog or <hostname>/notes.

The problem is that if I eventually develop the digital garden, I will have more than just two directory / folder pages. I wouldn’t want to keep modifying the rule just to make sure the directory pages don’t 404.

I actually sent a support ticket to see what the Bunny team suggests. Perhaps they will say Middleware scripts (which I have zero experience in) or some wildcard directory filter? I certainly hope it can be worked around somehow!

Update

I’ve written a guide on how to fix this issue, with indeed a Middleware Edge script, in the end. Hope it’s helpful for future Quartz users.

D2 Diagrams Lives On

D2 Diagrams Lives On

One of my favorite open source tools, D2: Declarative Diagramming, is now under Hack Club! This makes D2 a fully open source and non-profit project. Thank you Alex for making this awesome tool available for everyone in the long run.

I’m really thrilled because there was some concern about whether or not this amazing project is still alive over at GitHub discussions (similarly on Discord). Sometime last month(?), I remember seeing Alex respond on Discord that he’s in the final stages of getting D2 into Hack Club… and it’s finally complete! I appreciate Alex’s take on AI in relation to D2 too that he mentions in the announcement (link below). Hope the codebase stays a “healthy dose of human”.

Personally, I was a tad bit concerned about the future of this project that I have become dependent on. I would have hated if I had to change tools because I’ve invested time to learning how D2 works and got my workflow all set up. That’s the underlying risk I guess for relying too heavily on any single tool…

In case you didn’t know, there is a VSCodium / VSCode extension and also an Obsidian plugin that is handy when testing different styles and working on .D2 files as it generates the image in real-time. Coming from Mermaid JS which is perhaps the more popular diagramming language, I was grateful that both apps I use daily (Obsidian and VSCodium) both have official D2 plugins.

All my Open Graph images on this site are created with D2 and I’ve started using it instead of Mermaid for flow chart diagrams in posts that benefit from a visual representation (⁂ will convert existing diagrams when I have time). I think it is a better tool than Mermaid (especially when Mermaid is pushing AI straight in your face). Not to mention the syntax is easier to grasp! Highly recommend playing around with it if you’re looking for a diagramming language.

Blaugust 2026: Final Word

Blaugust 2026: Final Word

James, a fellow blogger and friend, kindly offered me a chance to guest post on his blog: with words, wonder, so that I could tick off one more task in the Community Builder award list. This means I achieved the goal! I will try to contribute more to the Blaugust community next year for sure. Thank you, James for the opportunity!

If you want to read my guest post, it’s on James’s site now: Chinese Idioms (Guest post by Naty). Do check out all the great writing on his blog while you’re there!

This note is definitely the last post of Blaugust2026! Good night y’all.

Some Thoughts on Advice

Some Thoughts on Advice

This post is in response to Blaugust2026 Week 5’s Group Project:

What is the best piece of advice you’ve ever been given? What is the best advice you’ve ever given to someone else?

Best Advice Received

It’s hard to think of a single piece of advice that overrules all the rest, but here are some that I follow:

  • “This too shall pass.”
    • Try to zoom out and look at the big picture once in a while.
  • “You can’t rush life; everyone is running on their own individual timeline.”
    • Also, try not to compare yourself to others.
  • “The most trustworthy and reliable friend is yourself.”
    • If you need to vent about someone or something; try writing it down in a journal and reviewing it once you’ve calmed down. You never know if one day your “best friend” might no longer be a friend and now they know all your “secrets”.
  • “Don’t be dependent on others.”
    • Learn to be happy being alone, stay independent, and try to solve your own problems (but ask for guidance when you genuinely need it).
  • “Great achievements come in tiny steps.”
    • Break down big tasks into bite-sized ones and make completing tasks a habit to achieve your goals.

Best Advice Given

I wouldn’t call my advice the “best” by any means, but I’ve given it to more than one person, so I’ll share it here:

  • “Instead of putting things you want to do in a bucket list, time block them into your calendar.”
    • Seeing the task in your calendar can help motivate you to complete the task.
  • “Make everything important a habit.”
    • Humans are creatures of habit. If you want to accomplish something long term, make it a routine. Use a habit tracker to help you get started with reminders; after about a month, it should become ingrained in your daily routine.
  • “Listen and think before you speak.”
    • Personally, I am more of a listener and I believe the act of listening and thinking is more important than the actual expression.
  • “Step out of your comfort zone often.”
    • It gives us a chance to grow, toughen up, challenges us to problem-solve, and improve as a person.
  • “Remember to love yourself.”
    • Some people (especially carers) forget to look after themselves after giving all their energy loving others.
  • “Check what free resources are available at your local library.”
    • In HK, the public library is free for all citizens and I find the e-resources to be super useful. It is perfect for self-improvement and learning, or even just casual reading. Taking all those short moments in the day, where nothing too productive can be done like queuing or commuting, to read is a great use of time in my opinion! Never stop learning. 📚

Thoughts on Advice in General

Both giving and taking advice is an art in itself. A giver of advice needs to be mindful of the situation of the receiver, not being forceful, ensuring the advice isn’t bad which might make matters worse. A receiver of advice needs to know how to adapt it to their own circumstances, understand that not every piece of advice applies to them, and not to follow advice blindly.

Sometimes though, when a friend comes to you for “advice”; they might just need a safe space for you to listen empathetically and can work it out themselves. At the end of the day, advice is a very subjective thing, and the quality can be extremely variable based on the amount of life experiences one has had—which is why I tend to err on the conservative side of giving advice: give it only when explicitly asked.

Starting Over With the Pi

Starting Over With the Pi

Since Oct of last year, I haven’t had time to reinstate my self-hosted apps like Calibre, Miniflux, Navidrome, etc on my little Pi homelab. During this time, I missed using Navidrome the most (I resorted to listening only on my Mac); with the only thing running on it being Indiekit with Docker.

Neater Installs

But that changed yesterday! After chatting with a new sysadmin friend online, I got a huge surge of motivation to fix my home server to at least what I had before. My previous setup was pretty horrendous to be honest, I didn’t know any better, and the whole Pi was in a disarray of software installed either by:

Docker Management

This time, I am setting up everything in containers with compose files. I am also dropping Portainer for just Lazydocker in the meantime. Portainer felt too heavy for me. TBH, I want to try using Dokploy but not sure if it’s an overkill doing beginner homelab things on my 8GB Pi (it only requires 2GB RAM and 30GB storage which my Pi meets). Arcane is also on my radar.

I can’t find much on people using Dokploy with Raspberry Pis except for this post by Mariano (but they didn’t specify what spec Pi they have). They also run DietPi so that’s nice to know!

Homelab Start Page

My choice of dashboard will remain with Homer as I already had the config set and don’t want to waste time customizing. I still have about four more services I have to restore—but everything is going well so far. I now know how to use Caddy to manage the services with ports mapping to the individual containers and everything will be available within my Tailnet.

When I tried working on this headless Pi project the first time, I didn’t know how to access the server outside from home. With Tailscale and Caddy this time round, I’m very happy to get access when I’m not home!

Restoring Files on the Pi

Back in the day, when I first started messing with the Pi 4B, I was hoping to transfer files directly via USB onto the USB SATA SSD boot drive from my Mac (my primary computer). But super newbie me didn’t realize that ext4 is not compatible on Macs. Rsync saves the day! With my much better Internet connection now (LAN directly from my Mac Mini to the Pi), I can very easily copy directories over with no hassle. For example, my top-level music folder was copied over from my Mac to the Pi using: rsync -avz --progress -e "ssh -p <custom_port_num>" "/mac/path/to/music/" username@<pi_IP_address>:/mnt/dietpi_userdata/music/.

Remember to always add an -n (dry run) flag to double-check before running such tasks. Last night, I let it run overnight, and it copied around 200GB of music over—no problem! I was too excited and forgot to check when it finish / how long it took in total though. :P

Other than using rsync I also like using Syncthing. So I got the Pi and folders setup again so that I have a “dropbox” folder on my Mac that can quickly share files to the Pi and vice versa.

Closing

Self-hosting is a great way to learn and I personally find it extremely rewarding. Being able to run things on hardware you own (or a subscription to a VPS) and having full access and control of where your data lives is incredible. That’s the reason I got into it in the first place.

Nowadays, with the RAMpocalypse, it doesn’t really make sense though to buy a Pi to tinker with since everything is so expensive now. But if you have existing hardware though, I highly recommend you playing with some Docker containers, or even Kubernetes / Ansible if you like that kinda stack more (I don’t know much about those, but one day I want to try!) My favourite place to discover services to self-host is this awesome-list.

If you want to read about my beginnings with homelabbing, see my first post in the Homelab Beginner series: Booting a Pi with SSD.

That’s all the updates I have on my homelab situation. I will finish setting up the rest of the services soon and the next thing will probably to try either Arcane or Dokploy to see if the Pi can cope with the extra burden. A nice monitoring app would be nice too, but there are so many to choose from (Grafana, Prometheus, Uptime Kuma)? What is your favourite monitoring dashboard?


Read about upvotes.

Sparkline data: note posting velocity (learn more).

Enter keyword (use "quotes" to find exact term):