Posted on ::

After finally having reached my limit with the number of breaking changes I'm faced with every time I update hugo, I decided to migrate my website over to zola.

Yeah, I adopted Hugo and now I regret it. Every release seems to break themes, and many theme maintainers give up trying to keep current, so if you use someone else's theme you're running a small intersection of hugo versions and can't rely on packaged releases. A static site generator that has somehow managed to be more inconvenient than many CMSes.
This is using the shortcode I'm going to talk about! (and also why I got fed up with Hugo...)

During this migration, the shortcodes for commentary websites like Twitter struck me as particularly brittle.

After wasting a bunch of time trying to migrate over a number of such shortcodes used in my past posts, I remembered that any text content I would ever want to share from another website, highlight or comment, is already archived in my Notado account.

This website already features a number of integrations with my Notado account, such as the topic-specific feeds on my landing page, and the user testimonials for my software.

So why not just make One Shortcode to Rule Them All which I can use in all of my posts?

<!-- quote.html -->

{% if url %}
    {% set quote_data = load_data(url=url ~ "/json", format="json") %}

    <div class="notado-quote"
         style="border: 1px solid var(--border-color);
                background-color: var(--bg-primary) !important;
                position: relative;
                margin-block: 1em;
                border-radius: 5px;
                padding-left: 1rem;
                padding-right: 1rem;
                padding-top: 1.25rem;
                padding-bottom: 1.25rem;
                {% if caption %} margin-bottom: 0em;
                border-bottom-right-radius: 0px !important;
                border-bottom-left-radius: 0px !important;
                {% endif %}">

        <div style="padding-bottom: 1.25rem">
            <div style="display: flex; gap: 0.75rem">
                <div style="min-width: 0;
                            flex: 1 1 0%;
                            display: flex;
                            flex-direction: column;
                            justify-content: center">
                    <p style="text-overflow: ellipsis;
                              overflow: hidden;
                              white-space: nowrap;
                              margin: 0em">
                        {{ quote_data.title }}
                    </p>
                    <p style="color: var(--text-1); margin: 0em">
                        {% if quote_data.source_url %}
                            <a href="{{ quote_data.source_url }}">{{ quote_data.source_display }}</a>
                        {% else %}
                            {{ quote_data.source_display | split(pat=" - ") | first }}
                        {% endif %}
                    </p>
                </div>

                <div style="flex-shrink: 0;
                            display: flex;
                            flex-direction: row-reverse;
                            align-items: center">
                    <a class="notado-icon" href="https://notado.app" style="border: none">
                        <img style="height: 3rem;
                                    width: 3rem"
                             src="https://notado.app/static/notado-icon.png"
                             alt="notado" />
                    </a>
                </div>
            </div>
        </div>

        {# djlint:off #}
        <div style="white-space: pre-line">{{ quote_data.content }}</div>
        {# djlint:on #}
    </div>

    {% if caption %}
        <div class="notado-quote-caption"
             style="border: 1px solid var(--border-color);
                    background-color: var(--bg-2) !important;
                    position: relative;
                    margin-bottom: 1em;
                    border-bottom-left-radius: 5px;
                    border-bottom-right-radius: 5px;
                    padding-left: 1rem;
                    padding-right: 1rem;
                    padding-top: 0.5rem;
                    padding-bottom: 0.5rem">
            {{ caption }}
        </div>
    {% endif %}
{% endif %}


(I'm sure there are a bunch of unncessary divs and CSS styles in there, and that the whole thing could probably be drastically simplified - feel free to @ me with any suggestions)

I can call this shortcode anywhere in my articles. For example, here is how I added the Hacker News comment at the top of this article:

{{
  quote(
    url="https://notado.app/quote/fec984fa0089c5f1a1f31b6a95a71d36",
    caption="This is using the shortcode I'm going to talk about! (and also why I got fed up with Hugo...)"
  )
}‌}

Besides Hacker News, this works for sharing content from every other source supported by Notado - I'll share examples at the end.

For such a long time, I have saved highlights and comments from across the internet with the intention of expanding on them with my thoughts on this site, but stupid and brittle things constantly breaking would take me out of my flow, again and again, to the point where I built up a reluctance to even trying to get started writing.

It feels so good to find the right level of abstraction and integration.

I am no longer filled with dread at the thought of opening up the repo of this website to find the build breaking with a new version of hugo, having to perform the most insane Go template surgery on a theme, and shortcodes for other websites no longer rendering.

Examples

Here are some examples from my Notado account of comments and highlights from different sources rendered using my quote shortcode.

Lobsters

mattgreenrocks

lobste.rs

Yep. I arrived at a similar conclusion. Life is hard, but doing The Work (in whatever subject(s) that is for you) is one way to find solace and unmediated joy. It’s not just any work (hence the capitalization), but work that is good for me to do. I can apply myself to a challenge, work with other people to build things, and learn more about it in an endless cycle. It’s an infinite game. Anything that gets in the way of that cycle is harmful *for me:* more management than dev, politicking for better titles, even screwing around with my dev environment for too long. It’s about the work of shipping, refining, and learning. When that gets out of balance I become highly vulnerable to anxiety. Where do LLMs fit there? Certainly not in the core loop! Part of The Work necessitates some time spent frustrated: that’s a primary indication of learning (and very easy to forget). I’m okay with them at the periphery of it, or sometimes spitballing things with them. But there’s a real joy to applying your skills, working through frustration and feeling stuck, and gaining confidence that I would never want to outsource to an LLM. It’s essential for human flourishing.
Working through frustration brings the joy of accomplishment in all forms of art

Tildes

All information *eventually* gives way to entropy. The only real solution is constant refresh, validation, and multiple copies of data. The only reason we know about many historical things is due to multiple copies of organisms existing and we are able to find the lucky ones that were preserved in tree sap. Likewise, we are lucky to find old stories because they were passed down through constant rehearsal in oral tradition and/or because some crazy guy brought some scrolls up to a mountain. There are probably many scrolls that we don't know about because they weathered away. We just find the lucky ones. It's chance. Analog may last longer than digital data but I wouldn't trust just one type of storage. If you care about something you need to have multiple copies and validate that the data is still readable every year or at the very least 5-10 years. If (VHS) players are no longer manufactured you also need to consider that aspect as well. Even stone tablets have bitrot at a timescale of months if the conditions are right
Oral tradition as the original distributed information archival mechanism

Reddit

szthesquid

old.reddit.com

This is one of the big reasons my whole Team Fortress 2 group can't go back to the game. We played *thousands* of hours together in its early years. At the time, some of us had 100% achievement completion. We played on our local Toronto servers and got to know all the regulars. It's *such* a different game when you play with a community who recognizes player and clan names by sight and develop respect and rivalries. The time when we skilled up enough to contend with the server's top Sniper. The time when the server's best medic attached himself to me for the whole game because he recognized me as the best offensive player on the team. The times when we'd all hop on the same team and other players would switch teams specifically to play with or against us. The times when all talk was enabled and we could hear the other team get demoralized and panicked when they realized that our buddy was playing Spy this game. Checking the server leaderboards after the session and realizing our whole group had broken into the top 100. The feeling that if we went out for a walk and ran into another Team Fortress player on the street, we might actually recognize their user name. Quick play with randos will never be the same.
I get very sad thinking about the loss of the online CS, TF and RA community servers I used to play in as a teenager

Lemmy

I particularly enjoyed a recent company meeting that spent considerable time talking about the importance of flow state. It had an awkward pregnant pause when someone (usually very quiet) unmuted to ask, "is the policy to increase the number of days we must spend in our open-plan office kind of undermining this?". Literally all of our directors just shifted on their seats hoping another would answer that. Eventually, HR director stated "Not at all, that's what headphones are for!" Which was particularly delightful, as our tech director had only 20 minutes before stated how he would like to discourage people sitting in the office in silos with their headphones on.
We work in the stupidest timeline

Discourse

jakehamilton

discourse.nixos.org

I do not want any of my work associated with arms dealers and/or the deaths of others. Having any sponsorship from a military entity steps over that line. I would much prefer that the NixOS Foundation set ethical guidelines for accepting sponsorship. I do not believe it is absurd to suggest that we shouldn’t take money from people who are responsible for the slaughter of others. Rejecting sponsorship from weapons manufacturers should be a reasonable standard. I would like to be clear here: this is a significant problem for myself and many others and will result in community fracture if it is not resolved. I’m sure we would all prefer to not split into two groups of “people okay with killing others” and “people who think killing others is bad”.
I added support for Discourse to Notado just so I could save this comment

Mastodon

Work isn't hard when you've got the capacity and capability to do what is needed, and you're in a good mood. Work is fulfilling when it is purposeful and not frustrating. The conditions under which many of us were taught to work were not ideal, and only prepared us to tolerate without complaint the conditions under which we were expected to perform in our adult lives, conditions usually bad ONLY because the powerful need to abuse, and not for any necessary reason. That's why nobody likes work. We're wired to like work, but we've been made to dislike it. Because the cruelty is the point. Exploitation is the point. Dominance is the point.
Capitalism: The Cruelty is the Point

Bluesky

hmsnofun.bsky.social

bsky.app

the labor of art is mostly invisible. what you don't see in a finished piece is all the hours of thought it required, all the little discoveries and surprises and tragedies of production. art IS the process. if you aren't interested in the process, then i don't really know why you want to be artist
This also rings true for my experience building software

Twitter

mitchellh

twitter.com

For open source in particular, the misbalance that always made me sad was when an issue reporter spends 30 seconds writing an issue that's going to take a maintainer (working for free) hours, days, weeks to resolve and maintain, then gets mad when its not fixed quickly. 🤔
I have long since stopped accepting drive-by issues on my public GitHub projects

YouTube

QuantaStarfire

www.youtube.com

I feel like the decline of the arena shooter can also be attributed to the lack of dedicated servers and the lack of editing tools, because both of these things together are what have allowed games like DOOM and Quake to continue to exist for almost three decades now. Dedicated servers allow people to form small communities of regular players, while editors allow people to create new modes and levels for the game to keep things fresh. Publishers don't like either of these things since a game you buy once and can play forever with nigh-infinite content doesn't generate the nigh-infinite revenue they want, so of course those features had to either be taken out back and shot, or at least be put under very heavy developer control.
Community sacrificed at the altar of corporate greed

Kindle

Ada Palmer

Too Like the Lightning: Book One of Terra Ignota

I told you, reader, that Utopia does not give up on dreams. When a Utopian dies, of anything, the cause is marked and not forgotten until solved. A fall? They rebuild the site to make it safe. A criminal? They do not rest until he is rendered harmless. An illness? It is researched until cured, regardless of the time, the cost, over generations if need be. A car crash? They create their separate system, slower, less efficient, costing hours, but which has never cost a single life. Even for suicide they track the cause, and so, patiently, blade by blade, disarm Death. Death, of course, has many weapons, and, if they have deprived him of a hundred million, he still has enough at hand to keep them mortal. For now.
A highlight from one of my favorite book series which I read on Kindle

Kobo

Hwang Bo-Reum

Welcome to the Hyunam-Dong Bookshop: The Heart-Warming Korean Sensation

I had thought of work as stairs. Stairs to climb to reach the top. Now, I see work as food. Food that you need every day. Food that makes a difference to my body, my heart, my mental health, and my soul. There is food you just shove down your throat, and food that you eat with care and sincerity. I want to be one who takes great care in eating simple food. Not for anyone, but for myself.
I build software first and foremost for myself, to address my own needs

If you have any questions or comments you can reach out to me on Bluesky and Mastodon.

If you're interested in what I read to come up with solutions like this, you can subscribe to my Software Development RSS feed.

If you'd like to watch me writing code while explaining what I'm doing, you can also subscribe to my YouTube channel.

If you would like early access to komorebi for Mac, you can sponsor me on GitHub.