1
0
Fork 0
mirror of https://git.sr.ht/~seirdy/seirdy.one synced 2024-11-10 00:12:09 +00:00

Compare commits

..

4 commits

Author SHA1 Message Date
Rohan Kumar
4433603899
New note: site refactor 2022-05-27 17:18:08 -07:00
Rohan Kumar
c84c8d4214
BREAKING: Prettify URLs, add Atom feeds
Adding a bunch of server configs to do the re-directs too.
2022-05-26 18:57:49 -07:00
Rohan Kumar
38c0d38fa4
Add RSS feed for notes, part 1
Add an RSS feed for notes. Next up, replacing the RSS navlink with a
page containing links to both my posts and notes RSS feeds. When I get
ATOM and WebSub, it'll have links ot those too.

Also fixed some typos and switched "Posted" to "Noted" in the context of
notes.
2022-05-26 18:03:28 -07:00
Rohan Kumar
69a49b5dc0
Add non-interactive space between form tap targets
Also fixes alignment on some browsers like IE.
2022-05-26 18:00:02 -07:00
36 changed files with 291 additions and 227 deletions

View file

@ -99,7 +99,6 @@ deploy-html:
.PHONY: deploy-gemini
deploy-gemini:
rsync $(RSYNCFLAGS) --exclude '*.html' --exclude '*.xml' --exclude '*.gz' --exclude '*.br' --exclude-from .rsyncignore $(OUTPUT_DIR)/gemini/ $(OUTPUT_DIR)/about $(OUTPUT_DIR)/posts $(OUTPUT_DIR)/publickey.* $(GEMINI_RSYNC_DEST)/ --delete
rsync $(RSYNCFLAGS) $(OUTPUT_DIR)/posts/gemini.xml $(GEMINI_RSYNC_DEST)/feed.xml
.PHONY: deploy
deploy: deploy-html deploy-gemini

View file

@ -11,7 +11,7 @@
* background-color is all I need.
* This is the brightest background that still achieves an APCA
* contrast of 90 Lc.*/
background-color: #1a1919;
background-color: #191919;
/* Dimming the default text color is not the same as reducing screen
* brightness, since other colors in this stylesheet have brighter
* red and blue channels than the default text. */

View file

@ -106,8 +106,9 @@ html {
/* If we have a list of disclosure widgets, we need some
* non-interactive space on the screen that's safe to tap. */
form,
li details {
margin: .5em .25em;
margin: .5em 0;
}
/* SC 2.5.5, Google a11y: Increase tap target size a bit
@ -178,25 +179,37 @@ nav ul li {
margin-right: .375em;
}
/* Make search box and submit button wide enough */
/* Make search box and submit button as wide as possible while keeping
* them next to each other. */
/* Use table-style layout (no, not actual tables. eww.). It's like a
* single-row flexbox that supports more browsers. Kanged this CSS from
* ww.gov.uk. Give the entire width of the row to the search box, but
* allow the minimum width for the submit button. */
form {
display: table;
width: 100%
}
/* A text box should not look like a button */
input[type="search"] {
display: table-cell;
width: 100%;
width: 98%;
}
form > div {
display: table-cell;
vertical-align: top; /* IE and some botique browsers need this */
width: 1%;
}
/* Don't shrink the size of the text in forms. */
input {
/* Browsers like Safari make the submit button pill-shaped which
* clashes with the input box. The only purely-cosmetic change on this
* site. */
appearance: none;
/* Don't shrink the size of the text in forms. */
font-size: inherit;
}

View file

@ -7,150 +7,151 @@ summaryLength = 150
enableInlineShortcodes = true
enableGitInfo = true
disableHugoGeneratorInject = true # I inject it explicitly at the BOTTOM of <head>
uglyurls = true
pygmentsCodeFences = true
pygmentsUseClasses = true
uglyurls = false
pygmentsCodeFences = false
pygmentsUseClasses = false
disableKinds = ["taxonomy", "term"]
[params]
description = "Seirdy's Home: personal website and blog for Rohan Kumar, A.K.A. Seirdy"
src = "https://sr.ht/~seirdy/seirdy.one/"
canonicalBaseURL = "https://seirdy.one" # I have mirrors with different baseURLs
webmentionEndpoint = "https://seirdy.one/webmentions/receive"
logUrlPrefix = "https://git.sr.ht/~seirdy/seirdy.one/log/master/item/"
copyright = "Copyright © 2021 Rohan Kumar"
dark = "auto"
highlight = false
description = "Seirdy's Home: personal website and blog for Rohan Kumar, A.K.A. Seirdy"
src = "https://sr.ht/~seirdy/seirdy.one/"
canonicalBaseURL = "https://seirdy.one" # I have mirrors with different baseURLs
webmentionEndpoint = "https://seirdy.one/webmentions/receive"
logUrlPrefix = "https://git.sr.ht/~seirdy/seirdy.one/log/master/item/"
copyright = "Copyright © 2021 Rohan Kumar"
dark = "auto"
highlight = false
icon = "/favicon.svg"
[frontmatter]
lastmod = ['lastmod', ':git', 'date', 'publishDate']
lastmod = ['lastmod', ':git', 'date', 'publishDate']
[author]
name = "Rohan Kumar"
first = "Rohan"
last = "Kumar"
nick = "Seirdy"
name = "Rohan Kumar"
url = "https://seirdy.one/"
first = "Rohan"
last = "Kumar"
nick = "Seirdy"
[menu]
[[menu.main]]
identifier = "posts"
name = "Posts"
title = "posts"
url = "/posts.html"
weight = 10
[[menu.main]]
identifier = "posts"
name = "Posts"
title = "posts"
url = "/posts/"
weight = 10
[[menu.main]]
identifier = "notes"
name = "Notes"
title = "notes"
url = "/notes.html"
weight = 15
identifier = "notes"
name = "Notes"
title = "notes"
url = "/notes/"
weight = 15
[[menu.main]]
identifier = "bookmarks"
name = "Bookmarks"
title = "bookmarks"
url = "/bookmarks.html"
weight = 20
[[menu.main]]
identifier = "bookmarks"
name = "Bookmarks"
title = "bookmarks"
url = "/bookmarks/"
weight = 20
[[menu.main]]
identifier = "about"
name = "About"
title = "about"
url = "/about.html"
weight = 30
[[menu.main]]
identifier = "about"
name = "About"
title = "about"
url = "/about/"
weight = 30
[[menu.main]]
identifier = "resume"
name = "Resume"
title = "resume"
url = "/resume.html"
weight = 40
[[menu.main]]
identifier = "resume"
name = "Resume"
title = "resume"
url = "/resume/"
weight = 40
[[menu.main]]
identifier = "rss"
name = "RSS feed"
title = "rss feed"
url = "/posts/index.xml"
weight = 50
[[menu.main]]
identifier = "rss"
name = "RSS feed"
title = "rss feed"
url = "/posts/index.xml"
weight = 50
[permalinks]
posts = "/:year/:month/:day/:filename"
notes = "/notes/:year/:month/:day/:filename"
posts = "/posts/:year/:month/:day/:filename"
notes = "/notes/:year/:month/:day/:filename"
[markup.goldmark.renderer]
# Allows HTML in Markdown
unsafe = true
unsafe = true
[markup.tableOfContents]
ordered = true
startLevel = 2
endLevel = 3
ordered = true
startLevel = 2
endLevel = 3
# lifted from https://git.sr.ht/~sircmpwn/drewdevault.com
[mediaTypes]
[mediaTypes."text/gemini"]
suffixes = ["gmi"]
suffixes = ["gmi"]
[mediaTypes."application/manifest+json"]
suffixes = ["webmanifest"]
suffixes = ["webmanifest"]
[outputFormats]
[outputFormats.Gemini]
name = "GEMTEXT"
isPlainText = true
isHTML = false
mediaType = "text/gemini"
protocol = "gemini://"
permalinkable = true
path = "gemini/"
[outputFormats.Gemini]
name = "GEMTEXT"
isPlainText = true
isHTML = false
mediaType = "text/gemini"
protocol = "gemini://"
permalinkable = true
path = "gemini/"
[outputFormats.GEMRSS]
name = "GEMRSS"
isHTML = false
mediaType = "application/rss+xml"
protocol = "gemini://"
path = "gemini/"
[outputFormats.atom]
baseName="atom"
isPlainText = true
mediaType = "application/xml"
[outputs]
section = ["HTML", "RSS", "GEMRSS"]
home = ["HTML", "atom", "GEMTEXT", "RSS"]
section = ["HTML", "atom", "RSS"]
posts = ["HTML", "atom", "RSS"]
notes = ["HTML", "atom", "RSS"]
# https://github.com/nekr0z/static-webmentions
[webmentions]
newDir = "public"
oldDir = "old"
webmentionsFile = "mentions.json"
excludeSources = [
"/tags/*", # only trailing * are supported at the moment
"/posts/*", # this only excludes /posts/index.html, not /posts/somepost/
"/", # same as "/index.html"
]
newDir = "public"
oldDir = "old"
webmentionsFile = "mentions.json"
excludeSources = [
"/tags/*", # only trailing * are supported at the moment
"/posts/*", # this only excludes /posts/index.html, not /posts/somepost/
"/", # same as "/index.html"
]
# addresses that we don't want to send webmentions to
# other schemes and stuff that I link to too often
excludeDestinations = [
"mailto:",
"gemini:",
"https://web.archive.org",
"https://lists.sr.ht/~seirdy/seirdy.one-comments",
"https://useplaintext.email/",
"https://seirdy.one",
]
# addresses that we don't want to send webmentions to
# other schemes and stuff that I link to too often
excludeDestinations = [
"mailto:",
"gemini:",
"https://web.archive.org",
"https://lists.sr.ht/~seirdy/seirdy.one-comments",
"https://seirdy.one",
]
[imaging.exif]
# Regexp matching the fields you want to Exclude from the (massive) set of Exif info
# available. As we cache this info to disk, this is for performance and
# disk space reasons more than anything.
# If you want it all, put ".*" in this config setting.
# Note that if neither this or ExcludeFields is set, Hugo will return a small
# default set: GPS|Exif|Exposure[M|P|B]|Contrast|Resolution|Sharp|JPEG|Metering|Sensing|Saturation|ColorSpace|Flash|WhiteBalance
includeFields = ""
# Regexp matching the fields you want to Exclude from the (massive) set of Exif info
# available. As we cache this info to disk, this is for performance and
# disk space reasons more than anything.
# If you want it all, put ".*" in this config setting.
# Note that if neither this or ExcludeFields is set, Hugo will return a small
# default set: GPS|Exif|Exposure[M|P|B]|Contrast|Resolution|Sharp|JPEG|Metering|Sensing|Saturation|ColorSpace|Flash|WhiteBalance
includeFields = ""
# Regexp matching the Exif fields you want to exclude. This may be easier to use
# than IncludeFields above, depending on what you want.
excludeFields = ".*"
# Regexp matching the Exif fields you want to exclude. This may be easier to use
# than IncludeFields above, depending on what you want.
excludeFields = ".*"
# don't minify html but minify other resources, esp the fulltext rss feed
# don't minify html but minify other resources, esp the fulltext rss/atom feeds
[minify]
minifyOutput = true
disableXML = false
disableHTML = true
minifyOutput = false
disableXML = false
disableHTML = true

View file

@ -5,8 +5,8 @@ It me! I'm Rohan Kumar, a.k.a. Seirdy (online handle).
## Other versions of this site
Canonical versions:
=> gemini://seirdy.one Canonical Gemini capsule
=> https://seirdy.one Canonical Web site
=> gemini://seirdy.one/ Canonical Gemini capsule
=> https://seirdy.one/ Canonical Web site
Staging/rough-draft Tildeverse mirror:
=> gemini://envs.net/~seirdy/ Tildeverse Gemini capsule
@ -60,5 +60,5 @@ Orbits (Gemini equivalent of webrings):
I don't collect anything except default server logs, purged regularly. More detail on a dedicated page:
=> gemini://seirdy.one/privacy.gmi
=> gemini://seirdy.one/privacy/

View file

@ -68,7 +68,7 @@ Analyze WeeChat logs to quantify, graph, forecast, and perform anomaly-detection
Generate passwords and analyze password strength given physical limits to computing. Based on a weblog/gemlog entry:
=> gemini://seirdy.one/2021/01/12/password-strength.gmi Becoming physically immune to brute-force attacks
=> ../posts//2021/01/12/password-strength/ Becoming physically immune to brute-force attacks
Written in Go.
@ -80,7 +80,7 @@ I ought to come up with more interests than these, but that sounds hard.
I care a lot about accessibility, resource usage, and compatibility. My Web site may seem simple, but I put almost 20 thousand words of thought into its design in an effort to maximize its inclusivity:
=> gemini://seirdy.one/2020/11/23/website-best-practices.gmi Best practices for inclusive textual websites
=> ../posts/2020/11/23/website-best-practices/ Best practices for inclusive textual websites
This site should work well whether you're using Lynx, NetSurf, the Tor Browser with a screen reader, or a printout
@ -94,7 +94,7 @@ While I care very much about "free software" (the name is confusing, it refers t
I think that simply meeting GNU's definition of free software isn't enough: it's one of multiple requirements for software to avoid the possibility of user domestication:
=> gemini://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.gmi Whatsapp and the domestication of users
=> ../posts/2021/01/27/whatsapp-and-the-domestication-of-users/ Whatsapp and the domestication of users
I lean towards simplicity; I usually prefer line-mode command-line interfaces that follow the UNIX philosophy. If a piece of software is complex enough to require a funding round, I would rather avoid it. My reasons for preferring simplicity also relate to user autonomy: extremely complex software can't be forked easily, creating dependence on the vendor. It's also because I'm a bit paranoid and want to know everything that happens on my system.

View file

@ -18,7 +18,7 @@ This website's canonical location is on seirdy.one.
This page also exists on the [tildeverse](https://tildeverse.org/), a bunch of \*nix computers that let people sign up for shell accounts. A typical shell account features clients for IRC and email, common terminal/commandline utilities, and (most importantly) web hosting. Read about the tildeverse's [origins](https://web.archive.org/web/20180917091804/https://medium.com/message/tilde-club-i-had-a-couple-drinks-and-woke-up-with-1-000-nerds-a8904f0a2ebf), read [the FAQ](https://tilde.club/wiki/faq.html), pick [a tilde](https://tilde.club/%7Epfhawkins/othertildes.html) and [get started](https://tilde.club/~anthonydpaul/primer.html). My Tildeverse pages will serve as a "rough draft".
Content on this site also appears on <a href="gemini://seirdy.one">my Gemini capsule</a>. My Web and Gemini content may be slightly different: I often phrase things differently to accommodate the strengths and weaknesses of each medium.
Content on this site also appears on <a href="gemini://seirdy.one/">my Gemini capsule</a>. My Web and Gemini content may be slightly different: I often phrase things differently to accommodate the strengths and weaknesses of each medium.
I have a [Tor hidden Web service](http://wgq3bd2kqoybhstp77i3wrzbfnsyd27wt34psaja4grqiezqircorkyd.onion/) which mirrors this site's contents, except for the fact that it replaces some SVGs with PNGs.
@ -40,7 +40,7 @@ My handle is "Seirdy" on all the platforms I use.
- Social (non-federated): I'm Seirdy on [Hacker News](https://news.ycombinator.com/user?id=Seirdy), [Lobsters](https://lobste.rs/u/Seirdy), [Reddit](https://www.reddit.com/user/Seirdy/), [Tildes.net](https://tildes.net/user/Seirdy), and Linux Weekly News.
- Email: my address is [seirdy<wbr>@seirdy.one](mailto:seirdy@seirdy.one). I typically sign my emails with my public PGP key: [`1E892DB2A5F84479`](./publickey.asc). My key is also available via WKD.
- Email: my address is [seirdy<wbr>@seirdy.one](mailto:seirdy@seirdy.one). I typically sign my emails with my public PGP key: [`1E892DB2A5F84479`](../publickey.asc). My key is also available via WKD.
- Chat: for IRC, my nick is Seirdy on Libera.chat, Snoonet, OFTC, Tilde.Chat, and a few smaller networks. I'm also [@seirdy<wbr>:seirdy.one](https://matrix.to/#/@seirdy:seirdy.one) on Matrix.
@ -59,7 +59,7 @@ Analyze WeeChat logs to quantify, graph, forecast, and perform anomaly-detection
### [MOAC](https://sr.ht/~seirdy/MOAC/)
Generate passwords and analyze password strength given physical limits to computing. Based on a weblog/gemlog entry: [Becoming physically immune to brute-force attacks](https://seirdy.one/2021/01/12/password-strength.html). Written in Go.
Generate passwords and analyze password strength given physical limits to computing. Based on a weblog/gemlog entry: [Becoming physically immune to brute-force attacks](../posts/2021/01/12/password-strength/). Written in Go.
Interests, preferences, et cetera
---------------------------------
@ -68,7 +68,7 @@ I ought to come up with more interests than these, but that sounds hard.
### Inclusive design
I care a lot about accessibility, resource usage, and compatibility. My Web site may seem simple, but I put [almost 20 thousand words of thought into its design](https://seirdy.one/~seirdy/2020/11/23/website-best-practices.html) in an effort to maximize its inclusivity. This site should work well whether you're using Lynx, NetSurf, the Tor Browser with a screen reader, or a printout.
I care a lot about accessibility, resource usage, and compatibility. My Web site may seem simple, but I put [almost 20 thousand words of thought into its design](../posts/2020/11/23/website-best-practices/) in an effort to maximize its inclusivity. This site should work well whether you're using Lynx, NetSurf, the Tor Browser with a screen reader, or a printout.
Many people frame accessibility and compatibility in terms of "percentage of users impacted" to justify ignoring certain demographics. I find that this mindset somewhat discriminatory. I prefer framing concerns in terms of "populations excluded".
@ -78,7 +78,7 @@ I have some skin in the game: I rely on forced colors and use often use screen r
While I care very much about "free software" (the name is confusing, it refers to freedom rather than price), I don't share the same perspective as most "fossbros" and organizations like the FSF. Software freedom is important because it gives people agency instead of delegating control to an authority; it's not valuable in and of itself, and promoting a "FOSS" alternative that has vulnerabilities and accessibility issues is sometimes counterproductive.
I think that simply meeting GNU's definition of free software isn't enough: it's one of multiple requirements for software to avoid the possibility of [user domestication](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html).
I think that simply meeting GNU's definition of free software isn't enough: it's one of multiple requirements for software to avoid the possibility of [user domestication](../posts/2021/01/27/whatsapp-and-the-domestication-of-users/).
I lean towards simplicity; I usually prefer line-mode command-line interfaces that follow the UNIX philosophy. If a piece of software is complex enough to require a funding round, I would rather avoid it. My reasons for preferring simplicity also relate to user autonomy: extremely complex software can't be forked easily, creating dependence on the vendor. It's also because I'm a bit paranoid and want to know everything that happens on my system.
@ -106,4 +106,4 @@ I think that at least one entry in that list has some problematic messages, but
### Music
I've put together a periodically-updated [list of tracks](music.txt) that I've rated 8/10 or higher in my mpd stickers database, auto-generated by some of my [mpd-scripts](https://git.sr.ht/~seirdy/mpd-scripts/tree/master/smart-playlists). I'm a fan of glitch, trailer music, and symphonic and power metal; I've also recently been getting into Japanese rock thanks to a few anime openings. Some of my favorite artists are The Glitch Mob, Pretty Lights, Beats Antique, Hammerfall, Badflower, Celldweller and Scandroid, Helloween, Two Steps from Hell, Nightwish, Mili, and MYTH & ROID.
I've put together a periodically-updated [list of tracks](../music.txt) that I've rated 8/10 or higher in my mpd stickers database, auto-generated by some of my [mpd-scripts](https://git.sr.ht/~seirdy/mpd-scripts/tree/master/smart-playlists). I'm a fan of glitch, trailer music, and symphonic and power metal; I've also recently been getting into Japanese rock thanks to a few anime openings. Some of my favorite artists are The Glitch Mob, Pretty Lights, Beats Antique, Hammerfall, Badflower, Celldweller and Scandroid, Helloween, Two Steps from Hell, Nightwish, Mili, and MYTH & ROID.

8
content/notes/_index.md Normal file
View file

@ -0,0 +1,8 @@
---
template: "notes.html"
description: "All the notes on Seirdy's Home"
title: "Notes"
sitemap:
ChangeFreq: daily
Priority: 0.8
---

View file

@ -12,7 +12,7 @@ I read your article and share similar concerns. Using Microsoft Bing and Google
Most of these agreements are confidential, so users don't really get transparency. On rare occasions, certain engines have successfully negotiated exceptions to result-mixing, but we don't know what other terms are involved in these agreements.
I've catalogued some other engines in my post {{<mention-work itemprop="citation" itemtype="BlogPosting">}}{{<cited-work name="A look at search engines with their own indexes" url="https://seirdy.one/2021/03/10/search-engines-with-own-indexes.html" extraName="headline">}}{{</mention-work>}}, and there are many alternatives that don't have this conflict of interest.
I've catalogued some other engines in my post {{<mention-work itemprop="citation" itemtype="BlogPosting">}}{{<cited-work name="A look at search engines with their own indexes" url="../../../../../posts/2021/03/10/search-engines-with-own-indexes/" extraName="headline">}}{{</mention-work>}}, and there are many alternatives that don't have this conflict of interest.
Most of these are not as good as Google/Bing when it comes to finding specific pieces of information, but many are far better when it comes to website discovery under a particular topic. Mainstream engines always seem to serve up webpages carefully designed to answer a specific question when I'm really just trying to learn about a larger topic. When using an engine like Marginalia or Alexandria, I can find "webpages about a topic" rather than "webpages designed to show up for a particular query".

View file

@ -9,4 +9,4 @@ Reply to {{< mention-work itemprop="about" itemtype="SocialMediaPosting" reply=t
What do you mean by "false sense of security"? Signal's cryptography is pretty solid. It's one of the only messengers with such a lack of metadata leakage; if you combine it with Tor you can add enough noise to the network-layer metadata to be more private than almost any alternative.
Don't get me wrong, [I dislike it on the grounds of being a closed platform](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html), but few alternatives exist that support both offline messaging and have such little metadata leakage. I'm willing to hear suggested alternatives that do not bake a "cryptographically-secure, decentralized pyramid scheme" (cryptocurrency) into the protocol. I'm not aware of any such alternative at the moment.
Don't get me wrong, [I dislike it on the grounds of being a closed platform](../../../../../posts/2021/01/27/whatsapp-and-the-domestication-of-users/), but few alternatives exist that support both offline messaging and have such little metadata leakage. I'm willing to hear suggested alternatives that do not bake a "cryptographically-secure, decentralized pyramid scheme" (cryptocurrency) into the protocol. I'm not aware of any such alternative at the moment.

View file

@ -0,0 +1,20 @@
---
title: "Site refactor"
date: 2022-05-27T17:18:08-07:00
---
I just made a massive internal overhaul of my website, [seirdy.one](https://seirdy.one/).
I prettified all the URLs to remove the trailing "`.html`" suffixes. I added re-directs from the old locations to the new ones, so your links won't break.
The reason I did this was because I plan on making alternative content types share the same index URL, except for the suffix. So `seirdy.one/notes/` could have an `index.html`, `index.xml` (RSS), `index.md`, `index.gmi`...you get the picture.
I removed the RSS feed from my Gemini capsule in favor of just supporting gmisub.
I also added Atom feeds to keep my existing RSS feed company:
- [Posts feed](https://seirdy.one/posts/atom.xml)
- [Notes feed](https://seirdy.one/notes/atom.xml)
Those make for the first step towards supporting WebSub. I'll have to look into ActivityStreams documentation to figure out which markup to add to my Atom feeds first. I'll probably add a `curl` command to my CI job to get a WebSub endpoint to re-read my Atom feeds whenever I push a change.
I need to figure out how to get Hugo to do a "combined" feed for everything.

8
content/posts/_index.md Normal file
View file

@ -0,0 +1,8 @@
---
template: "posts.html"
description: "All the posts on Seirdy's Home"
title: "Posts"
sitemap:
ChangeFreq: weekly
Priority: 0.7
---

View file

@ -4,8 +4,8 @@ I find it easy to handle views different from my own. I feel more troubled when
It's no secret that I'm a passionate supporter of software freedom: I've written two posts about how Free, Libre, and Open-Source Software (FLOSS) is necessary but insufficient to preserve user autonomy:
=> ./../../../2021/01/27/whatsapp-and-the-domestication-of-users.gmi Whatsapp and the domestication of users
=> ./../../../2021/02/23/keeping-platforms-open.gmi Keeping platforms open
=> ../../../../2021/01/27/whatsapp-and-the-domestication-of-users/ Whatsapp and the domestication of users
=> ../../../../2021/02/23/keeping-platforms-open/ Keeping platforms open
After two posts spanning over 5000 words, I need to add some nuance.

View file

@ -18,11 +18,12 @@ I find it quite easy to handle views different from my own. I feel more troubled
It's no secret that I'm a passionate supporter of software freedom: I've written two posts about how Free, Libre, and Open-Source software (<abbr title="Free, Libre, and Open-Source Software">FLOSS</abbr>) is necessary but insufficient to preserve user autonomy:
[Whatsapp and the domestication of users](./../../../2021/01/27/whatsapp-and-the-domestication-of-users.html "{itemprop='mentions'}")
: The phenomenon of a class of predatory businesses models I call "user domestication" and defense measures: FLOSS, open platforms, and simplicity.
[Keeping platforms open](./../../../2021/02/23/keeping-platforms-open.html "{itemprop='mentions'}")
: How open platforms can lose their openness, and what measures can prevent this. The Web, XMPP, email, and Matrix are examples that highlight both sides of the issue.
<dl>
<dt><a href="../../../../2021/01/27/whatsapp-and-the-domestication-of-users/" itemprop="mentions">Whatsapp and the domestication of users</a></dt>
<dd>The phenomenon of a class of predatory businesses models I call &ldquo;user domestication&rdquo; and defense measures: FLOSS, open platforms, and simplicity.</dd>
<dt><a href="../../../../2021/02/23/keeping-platforms-open/" itemprop="mentions">Keeping platforms open</a></dt>
<dd>How open platforms can lose their openness, and what measures can prevent this. The Web, XMPP, email, and Matrix are examples that highlight both sides of the issue.</dd>
</dl>
After two posts spanning over 5000 words, I need to add some nuance.
@ -199,7 +200,7 @@ I readily concede to several points in favor of source availability from a secur
- Source code can make analysis _easier_ by _supplementing_ source-independent approaches. The lines between the steps I mentioned in the [four-step vulnerability-fixing process](#how-security-fixes-work) are blurry.
- Patching vulnerabilities is important. Source availability makes it possible for the community, package maintainers, or reporters of a vulnerability to patch software. Package maintainers often blur the line between "packager" and "contributor" by helping projects migrate away from abandoned/insecure dependencies. One example that comes to mind is the Python 2 to Python 3 transition for projects like Calibre.[^12] Being able to fix issues independent of upstream support is an important mitigation against [user domestication](./../../../2021/01/27/whatsapp-and-the-domestication-of-users.html).
- Patching vulnerabilities is important. Source availability makes it possible for the community, package maintainers, or reporters of a vulnerability to patch software. Package maintainers often blur the line between "packager" and "contributor" by helping projects migrate away from abandoned/insecure dependencies. One example that comes to mind is the Python 2 to Python 3 transition for projects like Calibre.[^12] Being able to fix issues independent of upstream support is an important mitigation against [user domestication](../../../../2021/01/27/whatsapp-and-the-domestication-of-users/).
- Some developers/vendors don't distribute binaries that make use of modern toolchain-level exploit mitigations (e.g. <abbr title="Position-Independent Executables">PIE</abbr>, <abbr title="ReLocation Read-Only">RELRO</abbr>, stack canaries, automatic variable initialization, [<abbr title="Control-Flow Integrity">CFI</abbr>](https://clang.llvm.org/docs/ControlFlowIntegrity.html), etc.[^13]). In these cases, building software yourself with these mitigations (or delegating it to a distro that enforces them) requires source code availability (or at least some sort of intermediate representation).

View file

@ -10,7 +10,7 @@ I'll update this post as I add articles to the series.
Articles in this series:
=> ../../../2020/11/18/git-workflow-1.gmi 1. Hydra Hosting
=> ../../../../2020/11/18/git-workflow-1/ 1. Hydra Hosting
Articles yet to be written:
@ -42,4 +42,4 @@ Q: I'm not interested in trying anything new, no matter what the benefits are.
A: First of all, that wasn't a question. Second, this series isn't for you. You should not read this. I recommend doing literally anything else.
=> ../../../2020/11/18/git-workflow-1.gmi Next: Resilient Git, Part 1: Hydra Hosting
=> ../../../../2020/11/18/git-workflow-1/ Next: Resilient Git, Part 1: Hydra Hosting

View file

@ -22,7 +22,7 @@ Following the drama, I'm putting together a multi-part guide on how to leverage
I'll update this post as I add articles to the series. At the moment, I've planned to write the following articles:
1. [Hydra Hosting](/2020/11/18/git-workflow-1.html): repository hosting.
1. [Hydra Hosting](../../../../2020/11/18/git-workflow-1/): repository hosting.
2. Community feedback (issues, support, etc.)
@ -55,5 +55,5 @@ Q: I'm not interested in trying anything new, no matter what the benefits are.
A: First of all, that wasn't a question. Second, this series isn't for you. You should not read this. I recommend doing literally anything else.
Next: Resilient Git, Part 1: [Hydra Hosting](/2020/11/18/git-workflow-1.html)
Next: Resilient Git, Part 1: [Hydra Hosting](../../../../2020/11/18/git-workflow-1/)

View file

@ -1,6 +1,6 @@
This is Part 1 of a series called Resilient Git:
=> ../../../2020/11/17/git-workflow-0.gmi Resilient Git
=> ../../../../2020/11/17/git-workflow-0/ Resilient Git
The most important part of a project is its code. Resilient projects should have their code in multiple places of equal weight so that work continues normally if a single remote goes down.

View file

@ -13,7 +13,7 @@ title: "Resilient Git, Part 1: Hydra Hosting"
---
<div role="note">
This is Part 1 of a series called [Resilient Git](/2020/11/17/git-workflow-0.html "{itemprop='relatedLink'}").
This is Part 1 of a series called <a itemprop="relatedLink" href="../../../../2020/11/17/git-workflow-0/">Resilient Git</a>
</div>

View file

@ -2,7 +2,7 @@ This article is the second entry of series of posts exploring situations in whic
My previous article, Whatsapp and the domestication of users, got more attention than I was expecting. Some responses gave me a lot to think about,¹ especially regarding *actions* we can take. I suggest reading that article first; it explained what "user domestication" is and why it's a problem. It enumerated three countermeasures: FLOSS, simplicity, and open platforms.
=> ./../../../2021/01/27/whatsapp-and-the-domestication-of-users.gmi Whatsapp and the Domestication of Users
=> ../../../../2021/01/27/whatsapp-and-the-domestication-of-users/ Whatsapp and the Domestication of Users
Hard problems, by definition, lack easy solutions. Simply choosing (or creating) a platform that avoids user domestication isn't enough if that platform can change. The price of freedom is eternal vigilance; in addition to settling on the right platform, we must ensure that it honors its users in both the present *and the future*. Keeping a platform FLOSS and simple is more straightforward² than keeping a platform "open".
@ -56,7 +56,7 @@ Matrix is an open and federated instant-messaging platform similar to XMPP, with
Since there aren't any third-party clients and servers that can replace the official ones, one vendor is close to controlling all parts of the platform. The growing complexity required of clients and servers can also further entrench these dominant implementations, as I explained in the previous article's "Simplicity" section:
=> gemini://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.gmi
=> ../../../../2021/01/27/whatsapp-and-the-domestication-of-users/
Matrix is close to being a boxed platform because the official client and server can iterate independently of the greater ecosystem.

View file

@ -19,7 +19,7 @@ This article is the second entry of series of posts exploring situations in whic
Intro&shy;duction {#introduction}
-----------------
My previous article, [Whatsapp and the domestication of users](/2021/01/27/whatsapp-and-the-domestication-of-users.html), got more attention than I was expecting. Some responses gave me a lot to think about,[^1] especially regarding _actions_ we can take. I suggest reading that article first; it explained what "user domestication" is and why it's a problem. It enumerated three countermeasures: FLOSS, simplicity, and open platforms.
My previous article, [Whatsapp and the domestication of users](../../../../2021/01/27/whatsapp-and-the-domestication-of-users/), got more attention than I was expecting. Some responses gave me a lot to think about,[^1] especially regarding _actions_ we can take. I suggest reading that article first; it explained what "user domestication" is and why it's a problem. It enumerated three countermeasures: FLOSS, simplicity, and open platforms.
Hard problems, by definition, lack easy solutions. Simply choosing (or creating) a platform that avoids user domestication isn't enough if that platform can change. The price of freedom is eternal vigilance; in addition to settling on the right platform, we must ensure that it honors its users in both the present _and the future_. Keeping a platform FLOSS and simple is more straightforward[^2] than keeping a platform "open".
@ -66,7 +66,7 @@ With enough leverage, a dominant implementation can serve as a reference impleme
One example of this phenomenon is [Matrix](https://matrix.org/). Matrix is an open and federated instant-messaging platform similar to XMPP, with a very large spec boasting many features: server-side history, replies, rich text, reactions, room versions, <abbr title="end-to-end encryption">E2EE</abbr>, avatars, display names, typing indicators, read receipts, device verification...the list goes on and grows every month.[^3] The only client that implements all the necessary features is Element. In addition to being the most popular client, Element practically serves as the reference client implementation: it's developed by the same company that builds the dominant servers and most of the spec. The tight coupling between Element and the Matrix spec allow it to add features at a rate too fast for other clients too keep up; pretty much every Matrix user has to open up Element at some point to perform an action that isn't supported in any other client. On the server side, Synapse is the only server that implements enough of the spec to be usable, with Dendrite coming in second. Both are made by the same company that develops Element.
Since there aren't any third-party clients and servers that can replace the official ones, one vendor is close to controlling all parts of the platform. The growing complexity required of clients and servers can also further entrench these dominant implementations, as I [previously explained](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html#simplicity). Matrix is close to being a boxed platform because the official client and server can iterate independently of the greater ecosystem.
Since there aren't any third-party clients and servers that can replace the official ones, one vendor is close to controlling all parts of the platform. The growing complexity required of clients and servers can also further entrench these dominant implementations, as I [previously explained](../../../../2021/01/27/whatsapp-and-the-domestication-of-users/#simplicity). Matrix is close to being a boxed platform because the official client and server can iterate independently of the greater ecosystem.
I don't think that Matrix is going to become a fully closed platform anytime soon; the blog post ["On Privacy versus Freedom"](https://matrix.org/blog/2020/01/02/on-privacy-versus-freedom/) seems to put it on the right side of the closed/open spectrum. Clients like [gomuks](https://github.com/tulir/gomuks) and [FluffyChat](https://fluffychat.im/) seem to keep up with Element well enough to serve as partial replacements. I do, however, find its current state problematic and much closer to "closed" on the closed/open spectrum than XMPP, IRC, and email.

View file

@ -34,7 +34,7 @@ Our goal: make a textual website maximally inclusive, using restricted enhanceme
One of the defining differences between textual websites and advanced Web 2.0 sites/apps is safety. Most browser vulnerabilities are related to modern Web features like JavaScript and WebGL. If that isn't reason enough, most non-mainstream search indexes have little to no support for JavaScript:
=> ./../../../2021/03/10/search-engines-with-own-indexes.gmi A look at search engines with their own indexes
=> ../../../../2021/03/10/search-engines-with-own-indexes/ A look at search engines with their own indexes
The simplicity of basic textual websites should guarantee some extra safety; however, webmasters need to take additional measures to ensure limited use of "modern" risky features.
@ -604,7 +604,7 @@ Even if you set custom colors, ensure that the page is compatible with color ove
The Web version of this page is an example application of Technique C25 and the similar G148:
=> https://seirdy.one/2020/11/23/website-best-practices.html The Web mirror of this Gemlog post
=> https://seirdy.one/posts/2020/11/23/website-best-practices/ The Web mirror of this Gemlog post
=> https://www.w3.org/WAI/WCAG22/Techniques/general/G148 Technique G148: Not specifying background color, not specifying text color, and not using technology features that change those defaults
The Web version of this page only uses non-default colors when a user agent requests a dark color scheme (using the "prefers-color-scheme" CSS media query; see the next subsection) and for lightening borders. Any image with a solid background may match the page background; to ensure that their dimensions are clear, I surrounded them with borders. Most browsers will render these borders with the default foreground color, which should be visually distinct from the background. I included borders and/or horizontal rules to break up some sections, since heading-based delineation is either unavailable or insufficient for them. When overriding color schemes or disabling CSS altogether, the page layout remains clear.
@ -1082,7 +1082,7 @@ Excessive indentation makes reading difficult on narrow viewports, but preservin
For now, I've decided to keep some indentation on list elements (<ol>, <dl>, <ul>) since I often fill them with links. See see this article's table of contents on its Web mirror for an example:
=> https://seirdy.one/2020/11/23/website-best-practices.html#toc Table of contents
=> https://seirdy.one/posts/2020/11/23/website-best-practices/#toc Table of contents
This indentation provides important non-interactive negative space. Readers with hand tremors depend on this space to scroll without accidentally selecting an interactive element:
@ -1107,10 +1107,10 @@ The edges of a touch screen are often tap-targets (the top edge might toggle nav
On lists with many links, I had to find other ways to ensure adequate tap-target size and provide sufficient non-interactive space for readers with hand-tremors to scroll. Some examples:
=> https://seirdy.one/2020/11/23/website-best-practices.html#webmentions 1. The webmention list after this article separates links with timestamps and some paragraph spacing.
=> https://seirdy.one/posts/2020/11/23/website-best-practices/#webmentions 1. The webmention list after this article separates links with timestamps and some paragraph spacing.
2. Some list items have links with extra padding. These include description terms (`<dt>`) and navigation elements, such as the table of contents or the site header and footer,
=> https://seirdy.one/#posts 3. The homepage posts list separates links with non-interactive text descriptions
=> https://seirdy.one/2022/02/02/floss-security.html 4. The list of related articles at the beginning of one of my posts does the same.
=> https://seirdy.one/posts/2022/02/02/floss-security/ 4. The list of related articles at the beginning of one of my posts does the same.
### Line spacing
@ -1194,7 +1194,7 @@ Google's style guide recommends annotating format placeholders in code blocks wi
For an example, check the HTML version of this article's code sample describing my PNG optimization pipeline:
=> https://seirdy.one/2021/03/10/search-engines-with-own-indexes.html#png-pipeline PNG pipeline
=> https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/#png-pipeline PNG pipeline
Most implementations do not yet support `translate="yes"` embedded inside untranslated blocks, but I'm counting on this changing.
@ -1358,7 +1358,7 @@ If your site is simple enough, it should automatically handle the vast majority
No matter how simple a page is, I don't think simplicity eliminates the need for testing. I outlined the need to analyze actual run-time behavior in another post exploring how code alone doesn't give the full picture:
=> gemini://seirdy.one/2022/02/02/floss-security.gmi The right thing for the wrong reasons: FLOSS doesn't imply security
=> ../../../../2022/02/02/floss-security/ The right thing for the wrong reasons: FLOSS doesn't imply security
### Automated tests

View file

@ -12,7 +12,7 @@ tags:
- featured
- web
sitemap:
ChangeFreq: daily
ChangeFreq: weekly
Priority: 0.7
featured: 2
image: "serenity-4x.png"
@ -74,7 +74,7 @@ A false sense of security is far worse than transparent insecurity. Don't offer
Consider taking hardening measures to maximize the security benefits made possible by the simplicity of textual websites, starting with script removal.
JavaScript and WebAssembly are responsible for the bulk of modern web exploits. If that isn't reason enough, most [non-mainstream search indexes](./../../../2021/03/10/search-engines-with-own-indexes.html) have little to no support for JavaScript. Ideally, a text-oriented site can enforce a scripting ban at the [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (<abbr title="Content Security Policy">CSP</abbr>) level.
JavaScript and WebAssembly are responsible for the bulk of modern web exploits. If that isn't reason enough, most [non-mainstream search indexes](../../../../2021/03/10/search-engines-with-own-indexes/) have little to no support for JavaScript. Ideally, a text-oriented site can enforce a scripting ban at the [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (<abbr title="Content Security Policy">CSP</abbr>) level.
{{<codefigure>}} {{< codecaption >}} this is the CSP for my main website, with hashes removed for readability. {{< /codecaption >}}
@ -373,7 +373,7 @@ I've discussed loading pages in the background, but what about saving a page off
<figcaption itemprop="caption">
Infinite-scroll means that accidental navigation to a link results in losing your place. From [xkcd](https://xkcd.com/1309/ "{itemprop='url'}").
Infinite-scroll means that accidental navigation to a link results in losing your place. From <a itemprop="url" href="https://xkcd.com/1309/">xkcd</a>
</figcaption>
{{< /transcribed-image-figure >}}
@ -676,7 +676,7 @@ Black on white? How often do you see that kind of contrast in real life? Tone it
Even if you set custom colors, ensure that the page is compatible with color overrides: elements shouldn't be distinguished solely by foreground and background color. [Technique C25](https://www.w3.org/WAI/WCAG22/Techniques/css/C25) for the <cite>Web Content Accessibility Guidelines (<abbr title="Web Content Accessibility Guidelines">WCAG</abbr>)&nbsp;2.2</cite> describes how doing so can meet the WCAG&nbsp;2.2's [Success Criterion&nbsp;1.4.8](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation). Specifically, it describes using default colors in combination with visible borders. The latter helps distinguish elements from surrounding content without relying on a custom color palette.
[This page's canonical location](https://seirdy.one/2020/11/23/website-best-practices.html) is an example application of Technique C25 (and the related [Technique G148](https://www.w3.org/WAI/WCAG22/Techniques/general/G148)). It only uses non-default colors when a user agent requests a dark color scheme (using the `prefers-color-scheme` CSS media query; see the next subsection) and for lightening borders. Any image with a solid background may match the page background; to ensure that their dimensions are clear, I surrounded them with borders. Most browsers will render these borders with the default foreground color, which should be visually distinct from the background. I included borders and/or horizontal rules to break up some sections, since heading-based delineation is either unavailable or insufficient for them. When overriding color schemes, the page layout remains clear.
[This page's canonical location](https://seirdy.one/posts/2020/11/23/website-best-practices/) is an example application of Technique C25 (and the related [Technique G148](https://www.w3.org/WAI/WCAG22/Techniques/general/G148)). It only uses non-default colors when a user agent requests a dark color scheme (using the `prefers-color-scheme` CSS media query; see the next subsection) and for lightening borders. Any image with a solid background may match the page background; to ensure that their dimensions are clear, I surrounded them with borders. Most browsers will render these borders with the default foreground color, which should be visually distinct from the background. I included borders and/or horizontal rules to break up some sections, since heading-based delineation is either unavailable or insufficient for them. When overriding color schemes, the page layout remains clear.
Color overrides go well beyond simple foreground and background color changes. Windows High Contrast Mode (<abbr title="Windows High Contrast Mode">WHCM</abbr>) is perhaps the best example. [WHCM makes advanced modifications to color palettes](#win-hcm): it colors elements with a user-specified palette, all according to semantic markup while ignoring ARIA overrides.[^15]
@ -1110,7 +1110,7 @@ Readers with hand tremors depend on this space to scroll without accidentally se
{{<image-figure>}} {{<picture name="touch_targets" alt="List of rectangles with a 56 pixel wide square to its left, filling negative space.">}}
<figcaption itemprop="caption">
I made sure to leave enough non-interactive space in <a href="../../../#webrings">my homepage&rsquo;s webring list</a> to accommodate a 48&nbsp;px tap target, with extra space in between.
I made sure to leave enough non-interactive space in <a href="../../../../#webrings">my homepage&rsquo;s webring list</a> to accommodate a 48&nbsp;px tap target, with extra space in between.
</figcaption>
{{</image-figure>}}
@ -1130,7 +1130,7 @@ On lists with many links, I had to find other ways to ensure adequate tap-target
- Some list items have links with extra padding. These include description terms (`<dt>`) and navigation elements, such as the table of contents or the site header and footer,
- The [homepage posts list](https://seirdy.one/#posts) and the list of related articles at the beginning of [one of my posts](https://seirdy.one/2022/02/02/floss-security.html) separates links with non-interactive text descriptions
- The [posts list](../../../../) and the list of related articles at the beginning of [one of my posts](../../../../2022/02/02/floss-security/) separates links with non-interactive text descriptions
- This list separates two list-items containing links with a third list-item that lacks links.
@ -1375,7 +1375,7 @@ Testing
If your site is simple enough, it should automatically handle the vast majority of edge-cases. Different devices and browsers all have their quirks, but they generally have one thing in common: they understand <abbr title="Plain-Old, Semantic HTML">POSH</abbr>.
No matter how simple a page is, I don't think simplicity eliminates the need for testing. I outlined the need to analyze actual run-time behavior in [another post exploring how code alone doesn't give the full picture](https://seirdy.one/2022/02/02/floss-security.html).
No matter how simple a page is, I don't think simplicity eliminates the need for testing. I outlined the need to analyze actual run-time behavior in [another post exploring how code alone doesn't give the full picture](../../../../2022/02/02/floss-security/).
### Automated tests

View file

@ -1,5 +1,5 @@
Update: I wrote a follow-up; check it out if you found this article interesting:
=> ../../../2021/02/23/keeping-platforms-open.gmi Keeping platforms open
=> ../../../../2021/02/23/keeping-platforms-open/ Keeping platforms open
I have never used WhatsApp, and never will. Despite this, I still feel the need to write an article about WhatsApp since it's the perfect case study to help understand a class of businesses models I call "user domestication". The domestication of users is high on my list of problems plaguing the human race, and is worth a detailed explanation.
@ -184,7 +184,7 @@ This article extends the guiding philosophies of the Free Software and Copyleft
Since 2900 words wasn't quite enough, I wrote a follow-up; check it out if you found this article interesting:
=> ../../../2021/02/23/keeping-platforms-open.gmi Keeping platforms open
=> ../../../../2021/02/23/keeping-platforms-open/ Keeping platforms open
## Translations

View file

@ -22,7 +22,7 @@ Intro&shy;duction {#introduction}
-----------------
<p role="note">
<em>Update: I wrote a follow up: <a href="../../../2021/02/23/keeping-platforms-open.html">Keeping platforms open</a>. Check it out if you found this article interesting.</em>
<em>Update: I wrote a follow up: <a href="../../../../2021/02/23/keeping-platforms-open/">Keeping platforms open</a>. Check it out if you found this article interesting.</em>
</p>
<p itemprop="backstory">
@ -209,7 +209,7 @@ I initially decided to expand it to its current form for personal reasons. Nowad
This article extends the guiding philosophies of the Free Software and Copyleft movements. Thanks to [Barna Zsombor](https://bzsombor.web.elte.hu/) for giving good feedback over IRC.
Since 2900 words wasn't quite enough, I wrote a follow-up: [Keeping platforms open](/2021/02/23/keeping-platforms-open.html). Check it out if you found this article interesting.
Since 2900 words wasn't quite enough, I wrote a follow-up: [Keeping platforms open](../../../../2021/02/23/keeping-platforms-open/). Check it out if you found this article interesting.
Translations
------------

View file

@ -59,7 +59,7 @@ These logs are purged _every two days._
### How I use your information
I use server logs to detect <abbr title="Denial of Service">DoS</abbr> attacks, misbehaving bots, and search engines to add to [my public collection](https://seirdy.one/2021/03/10/search-engines-with-own-indexes.html).
I use server logs to detect <abbr title="Denial of Service">DoS</abbr> attacks, misbehaving bots, and search engines to add to [my public collection](../posts/2021/03/10/search-engines-with-own-indexes/).
Information I share
-------------------

View file

@ -0,0 +1,12 @@
{{- $parsedDest := urls.Parse (.Destination | absURL) -}}
{{- if (strings.HasPrefix .Destination "#") -}}<!-- if it's a fragment -->
<a href="{{ .Destination }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text | safeHTML }}</a>
{{- else if not (strings.HasPrefix .Destination $parsedDest.Scheme) -}}<!-- if it's a relative url -->
{{- $baseURL := trim .Page.Site.BaseURL "/" -}}
{{- $fragment := "" -}}
{{- with $parsedDest.Fragment -}}{{- $fragment = printf "#%s" . -}}{{- end -}}
{{- $href := printf "%s%s%s" $baseURL $parsedDest.Path $fragment | absURL -}}
<a href="{{ $href }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text | safeHTML }}</a>
{{- else -}}
<a href="{{ .Destination }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text | safeHTML }}</a>
{{- end -}}

View file

@ -0,0 +1,32 @@
{{- $pages := (where site.RegularPages "Section" .Section) -}}
{{- if .IsHome }}
{{- $pages = where .Site.RegularPages "Section" "" -}}
{{ end -}}
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ .Site.LanguageCode }}">
<title>{{ .Site.Title }}</title>
<link rel="self" type="application/atom+xml" href="{{ .Permalink }}atom.xml" />
<icon>{{ .Site.Params.icon | absURL }}</icon>
<subtitle>{{ .Site.Params.Description }}</subtitle>
<author>
<name>Rohan Kumar</name>
<uri>https://seirdy.one/</uri>
</author>
<updated>{{ now.Format "2006-01-02T15:04:05-07:00" | safeHTML }}</updated>
<id>{{ .Permalink }}</id>
{{ range $pages }}
<entry>
<title type="html"><![CDATA[{{ .Title | safeHTML }}]]></title>
<link href="{{ .Permalink }}" />
<published>{{ .Date.Format "2006-01-02T15:04:05-07:00" | safeHTML }}</published>
<updated>{{ .Lastmod.Format "2006-01-02T15:04:05-07:00" | safeHTML }}</updated>
<author>
<name>Rohan Kumar</name>
<uri>https://seirdy.one/</uri>
</author>
<id>{{ .Permalink }}</id>
<rights>CC-BY-SA 4.0 by Rohan Kumar</rights>
<content type="html"><![CDATA[{{ .Content | safeHTML }}]]></content>
</entry>
{{ end }}
</feed>

View file

@ -1,7 +1,8 @@
{{ define "main" }}
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/DataFeed">
<h1 class="p-name" itemprop="name headline" id="posts">Notes</h1>
<p>This is my microblog. These are my short informal posts, sorted by date (newest first). For longer posts, <a href="./posts.html">see my blog</a>.</p>
<h1 class="p-name" itemprop="name headline" id="notes">Notes</h1>
<p>This is my microblog. These are my short informal entries, sorted by date (newest first). For longer entries, <a href="../posts/">see my blog</a>.</p>
<p>An <a href="./atom.xml">Atom</a> and <a href="./index.xml">RSS</a> feed is availabe, containing the full text of all my notes.</p>
<p role="doc-tip">
Timestamp format: <code>YYYY-MM-DD HH:MM:SS</code>, as per <cite><a href="https://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a></cite>
</p>
@ -16,8 +17,8 @@
{{ .Title }}
</a>
</h2>
Posted <time itemprop="datePublished" class="dt-published published" datetime="{{ .Date.Format "2006-01-02 15:04:05Z07:00" }}">{{ .Date.Format "2006-01-02 15:04:05" }}</time>
{{- if lt .Date .Lastmod -}}
Noted <time itemprop="datePublished" class="dt-published published" datetime="{{ .Date.Format "2006-01-02 15:04:05Z07:00" }}">{{ .Date.Format "2006-01-02 15:04:05" }}</time>
{{ if gt (sub .Lastmod.Unix .Date.Unix) 3600 -}}
, updated <time{{ if not (.Params.evergreen) }} itemprop="dateModified" class="dt-updated updated"{{ end }} datetime="{{ .Lastmod.Format "2006-01-02 15:04:05Z07:00" }}">{{ .Lastmod.Format "2006-01-02 15:04:05" }}</time>
{{- end }}
<div class="e-content entry-content" itemprop="articleBody">{{ .Content }}</div>

View file

@ -10,6 +10,7 @@
{{- if ge $limit 1 -}}
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- $currentSection := .Section -}}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
@ -27,7 +28,7 @@
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{ end }}
{{ range where .Site.Pages "Kind" "page" }}
{{ if or (eq .Section "posts") (eq .Section "post") }}
{{ if (eq .Section $currentSection ) }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>

View file

@ -1,44 +0,0 @@
{{- $pctx := . -}}
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
{{- $pages := slice -}}
{{- if or $.IsHome $.IsSection -}}
{{- $pages = $pctx.RegularPages -}}
{{- else -}}
{{- $pages = $pctx.Pages -}}
{{- end -}}
{{- $limit := .Site.Config.Services.RSS.Limit -}}
{{- if ge $limit 1 -}}
{{- $pages = $pages | first $limit -}}
{{- end -}}
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Seirdy's Geminispace blog</title>
<link>gemini://seirdy.one</link>
<description>Seirdy's Geminispace</description>
<generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{ with .OutputFormats.Get "RSS" }}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{ end }}
{{ range $pages }}
{{- if .OutputFormats.Get "GEMTEXT" -}}
<item>
<title>{{ .Title }}</title>
{{ with .OutputFormats.Get "GEMTEXT" }}
<link>{{replace .Permalink "/gemini" "" 1}}</link>
{{ end }}
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
{{ with .OutputFormats.Get "GEMTEXT" }}
<guid>{{replace .Permalink "/gemini" "" 1}}</guid>
{{ end }}
</item>
{{- end -}}
{{ end }}
</channel>
</rss>

View file

@ -15,10 +15,10 @@
<a rel="alternate" href="http://wgq3bd2kqoybhstp77i3wrzbfnsyd27wt34psaja4grqiezqircorkyd.onion{{ .RelPermalink }}">Tor mirror</a>
</li>
<li>
<a href="{{ site.BaseURL }}privacy.html">Privacy</a>
<a href="{{ site.BaseURL }}privacy/">Privacy</a>
</li>
<li>
<a href="{{ site.BaseURL }}about.html#location-seirdy-online">Contact</a>
<a href="{{ site.BaseURL }}about/#location-seirdy-online">Contact</a>
</li>
</ul>
</nav>

View file

@ -9,15 +9,22 @@
<link href="{{ .Site.Params.WebmentionEndpoint }}" rel="webmention">
{{ $webmanifest := resources.Get "/manifest.webmanifest" | resources.ExecuteAsTemplate "manifest.webmanifest" . | resources.Minify | resources.Fingerprint "md5" -}}
{{- printf `<link href="%s" rel="manifest">` $webmanifest.RelPermalink | safeHTML }}
<link rel="alternate" type="application/rss+xml" href="{{ site.BaseURL }}posts/index.xml" title="{{ $.Site.Title }}">
<!--Feeds for both notes and posts; posts come first unless we're in the notes section.-->
{{- $isNotes := false -}}
{{- if or (eq .Section "notes") (eq .Title "Notes") -}}
{{- $isNotes = true -}}
<link rel="alternate" type="application/atom+xml" href="{{ site.BaseURL }}notes.xml" title="Notes">
{{- end }}
<link rel="alternate" type="application/atom+xml" href="{{ site.BaseURL }}posts.xml" title="Posts">
{{ if not $isNotes -}}
<link rel="alternate" type="application/atom+xml" href="{{ site.BaseURL }}notes.xml" title="Notes">
{{- end }}
<title>{{ .Title }}{{ if and (lt (len .Title) 54) (ne $canonicalRelPermalink "/") }} - Seirdy{{ end }}</title>
{{ $description := .Site.Params.Description -}}
{{- if .Params.description -}}
{{- $description = .Params.Description -}}
{{- else if .Summary -}}
{{- $description = .Summary | replaceRE `\n` ` ` | safeHTML -}}
{{- else if eq $canonicalRelPermalink "/posts.html" -}}
{{- $description = "All the posts on Seirdy's Home" -}}
{{- end -}}
<meta name="description" content="{{ $description }}">
<meta name="author" content="{{ .Site.Author.name }}">
@ -54,7 +61,7 @@
<style>{{ $css.Content | safeCSS }}</style>
<meta property="og:title" content="{{ .Title }}">
<meta property="og:site_name" content="{{ $.Site.Title }}">
{{- if not (or (ne "page" .Kind) (eq $canonicalRelPermalink "/bookmarks.html") (eq $canonicalRelPermalink "/posts.html")) }}
{{- if not (or (ne "page" .Kind) (eq $canonicalRelPermalink "/bookmarks/") (eq $canonicalRelPermalink "/posts/")) }}
<meta property="og:type" content="article">
{{- end -}}
<!-- ANOTHER meta image?! When will it end? -->

View file

@ -1,16 +1,20 @@
{{ $isNote := (eq .Page.Section "notes") -}}
{{- $canonicalRelPermalink := .RelPermalink | replaceRE "^/~seirdy/" "/" -}}
{{- $isNotes := false -}}
{{- $action := "Posted" -}}
{{- $logURL := printf "%scontent/%s" .Site.Params.logUrlPrefix .File.Path -}}
{{- if not $isNote -}}
{{- if or (eq .Page.Section "notes") (eq .Page.Title "Notes") -}}
{{- $isNotes = true -}}
{{- $action = "Noted" -}}
{{- else -}}
{{- $logURL = $logURL | strings.ReplaceRE `\.md` `.gmi` -}}
{{- end -}}
Posted <time{{ if not (.Params.evergreen) }} itemprop="dateCreated datePublished" class="dt-published published"{{ end }} datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}">{{ .Date.Format "2006-01-02" }}</time>
{{- $action }} <time{{ if not (.Params.evergreen) }} itemprop="dateCreated datePublished" class="dt-published published"{{ end }} datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}">{{ .Date.Format "2006-01-02" }}</time>
by {{- partial "indieweb-author.html" -}} on his <a rel="canonical" itemprop="mainEntityOfPage url" class="u-url url" href="{{ .Site.Params.CanonicalBaseURL }}{{ $canonicalRelPermalink }}">Website</a>{{- with .OutputFormats.Get "gemtext" -}}{{- printf " " -}}and <a rel="syndication" class="u-syndication" href="{{replace .Permalink "/gemini" "" 1 | safeURL}}">Gemini capsule</a>{{- end -}}.
{{ if lt .Date .Lastmod -}}
{{ if gt (sub .Lastmod.Unix .Date.Unix) 3600 -}}
<br>
Last updated <time itemprop="dateModified" class="dt-updated updated" datetime="{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}">{{ .Lastmod.Format "2006-01-02" }}</time>. <a href="{{ $logURL }}">Changelog</a>.
{{- end }}
{{ if not $isNote -}}
{{ if not $isNotes -}}
<br>
{{ partial "wordcount.html" . -}}
{{ end }}

View file

@ -6,10 +6,11 @@
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/CompleteDataFeed">
<h1 class="p-name" itemprop="name headline" id="posts">Posts</h1>
<p>These are all of my posts, sorted by date (newest first).</p>
<p>An <a href="./atom.xml">Atom</a> and <a href="./index.xml">RSS</a> feed is availabe, containing the full text of all my posts.</p>
{{- else -}}
<section class="h-feed hfeed" itemprop="hasPart" itemscope itemtype="https://schema.org/DataFeed">
<h2 class="p-name" itemprop="name" id="posts">Posts</h2>
<p>Here&rsquo;s a selection of my best posts, in featured order. To see the rest, visit <a href="/posts.html">my Posts page</a>.</p>
<p>Here&rsquo;s a selection of my best posts, in featured order. To see the rest, visit <a href="posts/">my Posts page</a>.</p>
{{- end }}
<p>I edit some of these posts quite often; some are updated indefinitely. Check the &ldquo;updated&rdquo; timestamps.</p>
<p role="doc-tip">

View file

@ -7,7 +7,7 @@
<h2 id="continue-hd">Continue reading</h2>
<ul>
{{- with .PrevInSection }}
<li>Previous {{ $name }} <a href="{{ .Permalink }}" rel="prev">{{ .Title }}</a></li>
<li>Previous {{ $name }}: <a href="{{ .Permalink }}" rel="prev">{{ .Title }}</a></li>
{{- end -}}
{{- with .NextInSection }}
<li>Next {{ $name }}: <a href="{{ .Permalink }}" rel="next">{{ .Title }}</a></li>

View file

@ -24,7 +24,7 @@
(btw this is all made of <span> cuz it is supposed to be inline)
-->
<span itemprop="author copyrightHolder" itemscope itemtype="https://schema.org/Person" itemid="https://seirdy.one/#seirdy" class="h-card p-author author vcard">
<a itemprop="url" href="https://seirdy.one" rel="author home cc:attributionURL" class="u-url url" property="cc:attributionName">
<a itemprop="url" href="https://seirdy.one/" rel="author home cc:attributionURL" class="u-url url" property="cc:attributionName">
{{ partial "indieweb-icon.html" -}}
<span itemprop="name" class="p-name fn n">
<span itemprop="givenName" class="p-given-name given-name">Rohan</span>