diff --git a/README.md b/README.md index 91b02ff..2b626c4 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ A responsive, bilingual, RSS-ready and system-themed blog with zero lines of Jav ## Next - [ ] Make visited links purple -- [ ] [Add tags](https://docs.octothorp.es/) -- [ ] Implement webmentions ([ref. 1](https://github.com/PlaidWeb/Pushl), [ref. 2](https://www.owenyoung.com/en/blog/indieweb/)) +- [ ] Deploy webmentions ([ref. 1](https://github.com/PlaidWeb/Pushl), [ref. 2](https://www.owenyoung.com/en/blog/indieweb/)) +- [ ] Replace all translation conditionals with `trans` calls ## Done +- [x] [Add tags](https://docs.octothorp.es/) - [x] Add footers to more pages - [x] Add links RSS feed to header metadata - [x] Columnar widescreen articles diff --git a/config.toml b/config.toml index f518e78..5cd83d7 100644 --- a/config.toml +++ b/config.toml @@ -5,13 +5,29 @@ base_url = "https://blog.jutty.dev" default_language = "en" generate_feeds = true -feed_filenames = ["rss.xml", "atom.xml"] +feed_filenames = [ "atom.xml" ] taxonomies = [ - { name = "tags", feed = true }, + { name = "tags", feed = true, render = true }, ] +[markdown] +smart_punctuation = true +bottom_footnotes = true +external_links_class = "out-link" +insert_anchor_links = "right" + +[markdown.highlighting] +theme = "night-owl" +style = "class" + +[extra] +title_separator = "-" + [translations] +page = "page" +page_plural = "pages" + [languages] [languages.pt] @@ -20,13 +36,10 @@ feed_filenames = ["atom.xml"] title = "jutty.dev" description = "Vazamentos de uma memória nerd-computante" -[markdown] -smart_punctuation = true -bottom_footnotes = true +taxonomies = [ + { name = "tags", feed = true, render = true }, +] -[markdown.highlighting] -theme = "night-owl" -style = "class" - -[extra] -title_separator = "-" +[languages.pt.translations] +page = "página" +page_plural = "páginas" diff --git a/content/feeds.md b/content/feeds.md index 97d7485..0bbf07e 100644 --- a/content/feeds.md +++ b/content/feeds.md @@ -3,9 +3,10 @@ # Feeds -- [All content](https://blog.jutty.dev/atom.xml) -- [Posts only](https://blog.jutty.dev/posts/atom.xml) -- [Notes only](https://blog.jutty.dev/notes/atom.xml) -- [Links only](https://blog.jutty.dev/links/atom.xml) +- [All content](/atom.xml) +- [Posts only](/posts/atom.xml) +- [Notes only](/notes/atom.xml) +- [Links only](/links/atom.xml) +- [Tag feeds](/tags) The links above contain only English content. To also get Portuguese content, see the [corresponding page](/pt/feeds). diff --git a/content/feeds.pt.md b/content/feeds.pt.md index 7d291a1..3b257d9 100644 --- a/content/feeds.pt.md +++ b/content/feeds.pt.md @@ -3,9 +3,10 @@ # Feeds -- [Todo o conteúdo em português](https://blog.jutty.dev/pt/atom.xml) -- [Apenas posts](https://blog.jutty.dev/pt/posts/atom.xml) -- [Apenas notas](https://blog.jutty.dev/pt/notes/atom.xml) -- [Apenas links](https://blog.jutty.dev/links/atom.xml) +- [Todo o conteúdo em português](/pt/atom.xml) +- [Apenas posts](/pt/posts/atom.xml) +- [Apenas notas](/pt/notes/atom.xml) +- [Apenas links](/links/atom.xml) +- [Por tags](/pt/tags) -À exceção do feed de links, os feeds acima contêm apenas conteúdo em português. Para também receber conteúdo em inglês, veja a [página correspondente](/feeds). +À exceção dos feeds de links e tags, os feeds acima contêm apenas conteúdo em português. Para também receber conteúdo em inglês, veja a [página correspondente](/feeds). diff --git a/content/notes/enjoying-alpine.md b/content/notes/enjoying-alpine.md index 8eed9eb..3d6648e 100644 --- a/content/notes/enjoying-alpine.md +++ b/content/notes/enjoying-alpine.md @@ -1,6 +1,9 @@ +++ title = "Enjoying Alpine as a daily driver" date = 2025-02-23T22:07:09-03:00 + +[taxonomies] +tags = [ "linux", "alpine-linux" ] +++ I am happy to report that my Alpine root-on-ZFS experiment is -- apparently -- a success. I've been running it as my only OS on my laptop for the past week. diff --git a/content/notes/waypipe.md b/content/notes/waypipe.md index 8281c00..7850a57 100644 --- a/content/notes/waypipe.md +++ b/content/notes/waypipe.md @@ -1,6 +1,9 @@ +++ title = "Waypipe: graphical remote access for Wayland applications" date = 2025-05-28T19:29:14-03:00 + +[taxonomies] +tags = [ "linux", "FreeBSD", "wayland" ] +++ Tried out [Waypipe](https://gitlab.freedesktop.org/mstoeckl/waypipe) today as a way to remotely control graphical Wayland applications between Alpine Linux and FreeBSD hosts and it's snappy on my wireless network + decade-old hardware combo! diff --git a/content/posts/half-an-year-on-alpine.md b/content/posts/half-an-year-on-alpine.md index cfad04a..cb9f9b1 100644 --- a/content/posts/half-an-year-on-alpine.md +++ b/content/posts/half-an-year-on-alpine.md @@ -1,6 +1,9 @@ +++ title = "Half an year on Alpine: just musl aside" date = 2025-08-31T20:05:26-03:00 + +[taxonomies] +tags = [ "linux", "alpine-linux" ] +++ _**Warning**: Contains tongue-in-cheek language that might feel provocative if you have invested part of your identity into your software choices.[^1]_ diff --git a/content/posts/introducing-tori.md b/content/posts/introducing-tori.md index 9ffdbd9..d36a9a3 100644 --- a/content/posts/introducing-tori.md +++ b/content/posts/introducing-tori.md @@ -2,6 +2,9 @@ title = "Introducing tori" date = 2024-06-30 aliases = ["posts/introducing-tori.html"] + +[taxonomies] +tags = [ "tori", "programming", "operating-systems" ] +++ **[tori](https://tori.jutty.dev/)** is a tool to track your personal systems' configurations and replicate them. @@ -61,20 +64,20 @@ I mentioned a `base` directory. This is what a sample tori directory would look ``` . ├── base -│   ├── dhcpcd.conf -│   ├── kernel-cmd-line.conf -│   ├── packages -│   └── vars.sh +│ ├── dhcpcd.conf +│ ├── kernel-cmd-line.conf +│ ├── packages +│ └── vars.sh ├── .bkp -│   ├── canonical -│   │   ├── etc -│   │   └── opt -│   └── ephemeral -│   └── etc +│ ├── canonical +│ │ ├── etc +│ │ └── opt +│ └── ephemeral +│ └── etc ├── src -│   ├── checks.sh -│   ├── copy.sh -│   └── get.sh +│ ├── checks.sh +│ ├── copy.sh +│ └── get.sh └── strap ``` @@ -129,5 +132,5 @@ So I decided to rewrite it with portability in mind. I am doing this rewrite in tori is a bird that has just hatched, so everything is still very, very crude. At this stage, the docs often show intentions rather than implemented functionality. Still, because it is something I've come to depend on, it has this rewarding sense of usefulness behind it. -If it sounds interesting to you, take a look. You can follow development at the main [Git repository](https://brew.bsd.cafe/tori/tori) in BSD.Cafe's Git forge or through its mirrors on [GitHub](https://github.com/tori-nest/tori) and [Codeberg](https://codeberg.org/tori/tori). Going forward, I will also probably be talking a lot about it on my [Mastodon profile](https://mastodon.bsd.cafe/@jutty). +If it sounds interesting to you, take a look. You can follow development at the [main repository at Codeberg](https://codeberg.org/tori/tori) or through its mirrors on [GitHub](https://github.com/tori-nest/tori) and [elsewhere](https://tori.jutty.dev/code). Going forward, I will also probably be talking a lot about it on my [Mastodon profile](https://mastodon.bsd.cafe/@jutty). diff --git a/content/posts/meeting-the-bsd-family.md b/content/posts/meeting-the-bsd-family.md index 40ce682..bb2379f 100644 --- a/content/posts/meeting-the-bsd-family.md +++ b/content/posts/meeting-the-bsd-family.md @@ -2,6 +2,9 @@ title = "Meeting the BSD family" date = 2024-05-20 aliases = ["posts/meeting-the-bsd-family.html"] + +[taxonomies] +tags = [ "bsd", "unix", "operating-systems" ] +++ During this year I have been delving deeper and deeper in the BSD realm. Switching my home server to FreeBSD, trying NetBSD and OpenBSD on my backup machine, getting a cheap SSD to see how they'd all run on my main one, all beaming with the joy of tinkering and learning. @@ -30,9 +33,9 @@ Now, to lay any zealousness aside and not make this a saccharine one-sided tale, This is certainly not something specific to BSD, but because it has such an engaged and savvy community, you definitely get to notice it sometimes. I'm talking about the tendency to identify with and then indiscriminately defend the software you use. -One common meme you'll find is people complaining about lack of hardware support, especially wifi. In response, I've seen people stating with little nuance that any difficulty to getting your hardware to work on \ is to be explained by poor skills or lack of dedication in reading the documentation. +One common meme you'll find is people complaining about lack of hardware support, especially wifi. In response, I've seen people stating with little nuance that any difficulty to getting your hardware to work on `` is to be explained by poor skills or lack of dedication in reading the documentation. -I see that as denial. When everyone around is just defending something to no end, no critiques allowed, it starts to feel... awkward, to say the least. +I see that as denial. When everyone around is just defending something to no end, no critiques allowed, it starts to feel... awkward, to say the least. Conversely, when I see people openly pointing out weaknesses in something I value and that I can tell they also care for, I feel relief and admiration for that person and that community at large. And thankfully I have also found a lot of this among the BSD folks. diff --git a/content/posts/scripts-em-ocaml.pt.md b/content/posts/scripts-em-ocaml.pt.md index c98dab2..03d0f90 100644 --- a/content/posts/scripts-em-ocaml.pt.md +++ b/content/posts/scripts-em-ocaml.pt.md @@ -2,6 +2,9 @@ title = "Scripts em OCaml" date = 2024-02-23 aliases = ["posts/scripts-em-ocaml.html"] + +[taxonomies] +tags = [ "ocaml" ] +++ Este blog gera suas postagens com o Pandoc, mas quem faz o trabalho lógico de identificar os arquivos e montar os comandos é um pequeno script em OCaml. @@ -11,7 +14,7 @@ Descobri essa linguagem quando comecei a investigar como poderia substituir o Ba O script se resume a: ```ocaml -let pandoc_params = +let pandoc_params = "--css ../../assets/style.css -s --to html5 --metadata pagetitle='basename' " let vert md = begin diff --git a/content/posts/self-hosting-patch.md b/content/posts/self-hosting-patch.md index 6583895..7c85a1f 100644 --- a/content/posts/self-hosting-patch.md +++ b/content/posts/self-hosting-patch.md @@ -1,6 +1,9 @@ +++ title = "On self-hosting being a patch" date = 2024-11-23T15:00:00-03:00 + +[taxonomies] +tags = [ "self-hosting" ] +++ Recently the blog post [Self-Hosting Isn't a Solution; It's A Patch](https://matduggan.com/self-hosting-isnt-a-solution-its-a-patch/) landed in my reading list via [Lobsters](https://lobste.rs/s/eisgx0/self_hosting_isn_t_solution_it_s_patch). @@ -15,7 +18,7 @@ The second thought is that regulation and self-hosting are not opposed to each o The regulations in Europe during the past years have surprised in how strong they are in favoring interoperability and some decentralization. Also, more then a few stories about European tech funds putting money into open source projects have crossed the same channels that landed this article among my browser tabs. -Neither of them is, alone, the solution, as you could also see regulation as a lubricant, a way of legitimizing the predatory practices of everyday capitalism by putting it into a nice, confined setting and stamping it with the seal of compliance, however you are able to ascertain it, while still allowing most of the damage to happen, be it a loophole, a cover-up or simply something that didn't happen to bother the regulators to begin with. +Neither of them is, alone, the solution, as you could also see regulation as a lubricant, a way of legitimizing the predatory practices of everyday capitalism by putting it into a nice, confined setting and stamping it with the seal of compliance, however you are able to ascertain it, while still allowing most of the damage to happen, be it a loophole, a cover-up or simply something that didn't happen to bother the regulators to begin with. In this sense, the act of building completely independent platforms, able to operate using their own software and infrastructure, comes from a whole different angle and a much more incisive one at that. It works not simply on the level of "how can we make these companies play nice" but of "how can we not depend on these companies to begin with". This is not solely a concern about reliability, as seen when the article notices how small and underfunded decentralized projects can simply vanish due to lack of funds or inability to stand up to legal threats, it is a concern about privacy and autonomy too. diff --git a/content/posts/void-on-zfs.md b/content/posts/void-on-zfs.md index 2b87a2e..cfcf7c3 100644 --- a/content/posts/void-on-zfs.md +++ b/content/posts/void-on-zfs.md @@ -2,13 +2,16 @@ title = "Void on ZFS" date = 2024-06-09 aliases = ["posts/void-on-zfs.html"] + +[taxonomies] +tags = [ "void-linux", "zfs" ] +++ ![An L-shaped desk with two laptops, an external monitor, a router and a third headless computer in a tower case with several power cables connected to a power strip on top of it. Next to the power strip are two cellphones, a long red box, and a charging case for Bluetooth headphones with a red LED on. The tower case has three stickers on it: one with the machine specifications, one the FreeBSD logo, and one reading "platform feodalism (sic) is so 1492". Scattered around the machines are some office supplies, medicine containers, a screwdriver, a notepad, a small notebook, an NVMe SSD card on top of its packaging, a mug, a water bottle and a scarf. Hanging on the wall are a small painting of a dead tree before the twilight, prayer beads, a sunflower-pattern keychain and a calendar. Between the desk and the camera, a green plastic chair has a pillow and blanket on top of it. A few wires and cardboard boxes are visible under the desk.](/assets/img/posts/void-on-zfs/desk.jpg) June is here. It brings the usual cold weather and some extra rhinitis complications. With that I find myself in a recovery mood Sunday, wrapped in a blanket with a mug of tea, a screwdriver, some notes on paper, a flash drive, a couple of NVMe cards and the trio of Unix-powered machines that will help me get this done. -The mission is to get a root-on-ZFS EFI installation of Void Linux with ZFSBootMenu on a Dell Latitude 7480. +The mission is to get a root-on-ZFS EFI installation of Void Linux with ZFSBootMenu on a Dell Latitude 7480. To my left, a ceiling-collapse-survivor Sony VAIO is running NetBSD with spectrwm. It's split with sakura and tmux on a terminal to one side, where Neovim is storing these words, and Firefox on the other, ready to fetch all the docs. In the middle, the object of today's operation. And to my right, a headless PC board runs FreeBSD with ZFS, holding all the backups needed for the post-install tasks. @@ -46,7 +49,7 @@ For example, `xpbps-query --cat /etc/zfsbootmenu/config.yaml zfsbootmenu` will s My first contact with ZFS was when using FreeBSD, which provides it as an option in its installer, making it a bit too easy not to try. Having a server on ZFS means all the data it holds can be safeguarded and transferred in robust ways, and mistakes are also easier to recover from. -Aside from all the data integrity features and flexibility it brings, the features that interest me the most are the ones for managing snapshots. +Aside from all the data integrity features and flexibility it brings, the features that interest me the most are the ones for managing snapshots. ZFS snapshots allow you to store the filesystem state at a given point in time, and to compare against, access the content of, and fully revert to this state. After the guide has been followed throughout, an extra section at the end of this post has some snapshot basics. @@ -54,7 +57,7 @@ ZFS snapshots allow you to store the filesystem state at a given point in time, So, first things first, open the machine up and swap the NVMe cards. For me, that means getting my 128 GB NVMe stick, which I use basically for tests, and replace it with the 256 GB one which currently has Debian on it. Yes, I get by just fine with that much. -While a bit dusty, the machine was overall in good state. The release date for the model is 2017, which for my computing standards is very recent. +While a bit dusty, the machine was overall in good state. The release date for the model is 2017, which for my computing standards is very recent. It has a single NVMe slot, one 16 GB RAM stick and one unused RAM slot. If you look closely, you can notice a dent on the vent tube connecting the cooler to the CPU. Despite this, it very rarely heats up. @@ -151,7 +154,7 @@ zgenhostid -f 0x00bab10c If they must be unique, that seems odd. -The value `0x00bab10c` actually has significance in the context of OpenZFS as an identifier (and leetspeak) for its uberblock. However, it apparently is totally unrelated to host IDs. +The value `0x00bab10c` actually has significance in the context of OpenZFS as an identifier (and leetspeak) for its uberblock. However, it apparently is totally unrelated to host IDs. Should you be curious still, you can refer to [this GitHub discussion](https://github.com/zbm-dev/zfsbootmenu/discussions/465) where a ZFSBootMenu user brought this exact question to the developers. @@ -285,7 +288,7 @@ Option `-t` is for setting the typecode for each partition. Typecode `ef00` is f For a list of typecodes, see `sgdisk -L`. -While just running these commands as-is is your safest option, you might have a different layout in mind or prefer an interactive UI. +While just running these commands as-is is your safest option, you might have a different layout in mind or prefer an interactive UI. For one thing, I've had issues in the past with the boot partition being too small, so I'll be using `2g` instead of `512m` for it. @@ -309,7 +312,7 @@ Here's the `zpool(8)` man page: > A storage pool is a collection of devices that provides physical storage and data replication for ZFS datasets. All datasets within a storage pool share the same space. -The definition of a dataset is then indicated to be at `zfs(8)`: +The definition of a dataset is then indicated to be at `zfs(8)`: > A dataset is identified by a unique path within the ZFS namespace:
> `pool[/component]/component` for example: `rpool/var/log` @@ -324,7 +327,7 @@ We'll be exploring only the `zpool-create(8)` command in depth, in particular th - `-f` force the use of virtual devices, even if they appear in use - `-o feature=value` set a pool feature -- `-O property=value` set a file system property in the root file system of the pool +- `-O property=value` set a file system property in the root file system of the pool - `-o compatibility=off|legacy|file[,file]` specify a compatibility feature set - `-m mountpoint` the mountpoint (default: `/pool`) - `pool` the pool @@ -477,7 +480,7 @@ To reconfigure **all** packages, just run `xbps-reconfigure -fa`. If you'd rathe #### root password -As early as possible is a good time to run `passwd` and set the root password. +As early as possible is a good time to run `passwd` and set the root password. #### `rc.conf` `runit` reads the `/etc/rc.conf` file during startup to configure the system, setting up things like the keymap, hardware clock and terminal font. @@ -597,7 +600,7 @@ We are all done. It's time to exit the chroot, unmount and export the pool. exit umount -n -R /mnt zpool export zroot -``` +``` If all above went well, we can now run `reboot`, remove the flash drive used for installation, and log in for the first time into our new system. diff --git a/static/assets/css/style.css b/static/assets/css/style.css index 35c4020..eb5e53d 100644 --- a/static/assets/css/style.css +++ b/static/assets/css/style.css @@ -1,3 +1,8 @@ +:root { + color-scheme: light dark; + --base-font-size: 1em; +} + @font-face { font-family: 'Mononoki'; src: url('../fonts/Mononoki.ttf'), format('truetype'); @@ -63,6 +68,20 @@ body { margin-right: 20px; } +a.nav-tags-link { + color: light-dark(#0bb, #0fa); + background: light-dark(#ccdfdf, #333); + padding: 4px 6px; + border-radius: 4px; + text-decoration-color: light-dark(#00923f, #0e6); +} + +a.nav-tags-link:hover { + color: light-dark(#0aa, #0ff); + background: light-dark(#ddd, #002); + text-decoration-color: none; +} + #language-selector { justify-self: end; grid-area: lang; @@ -98,6 +117,91 @@ ul { list-style: none; } +div.contet-metadata { + display: inline; +} + +div.content-tags { + display: inline; + font-size: 14px; + border: dashed; + border-radius: 5px; + border-width: 1px; + border-color: #666; + padding: 4px 10px; + margin-left: 15px; +} + +.link-page-metadata div.content-tags { + margin-left: 10px; + margin-top: 0px; +} + +.content-tags span { + color: light-dark(#063, #6db); +} + +.content-tags ul { + display: inline; + padding-left: 0; +} + +.content-tags li::before { + content: ""; +} + +.content-tags li { + display: inline; +} + + +a.rss-link { + color: light-dark(#eb5e00ff, #f60); + background: light-dark(#ddd, #333); + padding: 4px 6px; + border-radius: 4px; + text-decoration-color: #f40; +} + +a.rss-link:hover { + color: light-dark(#333, #000); + background: light-dark(#ffa666ff, #8f3700); + text-decoration: none; +} + +.taxon-list .rss-link { + font-size: 12px; +} + +span.taxon-count { + font-size: 12px; +} + +.taxon-title { + display: flex; + align-items: center; + width: 100%; +} + +.taxon-title a.taxon-rss-link { + margin-left: 10px; +} + +.taxon-page-kind-label { + color: light-dark(#222, #999); + background: light-dark(#ccc, #333); + padding: 4px 6px; + border-radius: 4px; + font-size: 12px; + text-decoration: none; +} + +a.zola-anchor { + color: #555; + font-style: italic; + text-decoration: none; +} + details { margin: 30px; background: #cccccc; @@ -146,6 +250,10 @@ main { text-decoration-thickness: 0.1px; } +.post-date { + display: inline; +} + .link-data { margin-top: 0 } @@ -154,6 +262,10 @@ main { margin-right: 20px; } +.content-metadata .link-author { + margin-left: 30px; +} + article .post-date { margin-left: 30px; } @@ -325,6 +437,15 @@ footer { padding-top: 0px; } + .link-box .link-date, .link-box .link-author { + display: block; + margin-bottom: 10px; + } + + .link-box .link-date, .link-box div.content-tags { + margin-left: 30px; + } + } /* tablet */ diff --git a/templates/anchor-link.html b/templates/anchor-link.html new file mode 100644 index 0000000..d49ebc6 --- /dev/null +++ b/templates/anchor-link.html @@ -0,0 +1,3 @@ +{%- if level > 1 %} + # +{%- endif -%} diff --git a/templates/base.html b/templates/base.html index 6d3966c..4bcca43 100644 --- a/templates/base.html +++ b/templates/base.html @@ -2,6 +2,8 @@ {%- set translation_count = page.translations | length %} {%- elif section %} {%- set translation_count = section.translations | length %} +{%- else %} + {%- set translation_count = 0 %} {%- endif -%} {%- if lang == "pt" %} @@ -46,7 +48,20 @@ - {% block rss -%} + + {% if page.taxonomies -%} + {%- for taxonomy, terms in page.taxonomies -%} + {%- if taxonomy == "tags" -%} + {%- for tag in terms -%} + + {% endfor -%} + {%- endif -%} + {% endfor -%} + {%- endif -%} + + {%- block extra_head %}{% endblock %} + + {%- block rss -%} {%- if lang == "pt" %} {%- set locale_all_content = "Todo o conteúdo" %} {%- set locale_language_name = "Português" %} @@ -59,7 +74,6 @@ {%- endblock %} - {%- block extra_head %}{% endblock %} @@ -86,8 +100,9 @@
  • Posts
  • {% if lang == "pt" %}Notas{% else %}Notes{% endif %}
  • Links
  • -
  • RSS
  • -
  • Mastodon
  • +
  • Tags
  • +
  • RSS
  • +
  • Socials
  • {% if current_path and translation_count > 1 %} @@ -110,7 +125,19 @@ diff --git a/templates/content.html b/templates/content.html index 7bc8132..6b5a97b 100644 --- a/templates/content.html +++ b/templates/content.html @@ -1,23 +1,29 @@ {% extends "base.html" %} +{%- block extra_head %} +{%- endblock -%} + {% block content %}

    {{ page.title }}

    - + {{ page.content | safe }}
    {%- endblock content -%} - -{%- block footer %} -
    - -{% endblock footer -%} diff --git a/templates/link-page.html b/templates/link-page.html index 6dd1960..06dcfc2 100644 --- a/templates/link-page.html +++ b/templates/link-page.html @@ -1,11 +1,25 @@ {% extends "content.html" %} {%- block content %} - +