mirror of
https://git.sr.ht/~seirdy/seirdy.one
synced 2024-11-23 21:02:09 +00:00
Compare commits
No commits in common. "44336038996f3bda4d0d10cb6020ef4185c8d554" and "d6d88f1e921f0f479ecb9b3547b6d67719e8940a" have entirely different histories.
4433603899
...
d6d88f1e92
36 changed files with 227 additions and 291 deletions
1
Makefile
1
Makefile
|
@ -99,6 +99,7 @@ deploy-html:
|
||||||
.PHONY: deploy-gemini
|
.PHONY: deploy-gemini
|
||||||
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) --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
|
.PHONY: deploy
|
||||||
deploy: deploy-html deploy-gemini
|
deploy: deploy-html deploy-gemini
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
* background-color is all I need.
|
* background-color is all I need.
|
||||||
* This is the brightest background that still achieves an APCA
|
* This is the brightest background that still achieves an APCA
|
||||||
* contrast of 90 Lc.*/
|
* contrast of 90 Lc.*/
|
||||||
background-color: #191919;
|
background-color: #1a1919;
|
||||||
/* Dimming the default text color is not the same as reducing screen
|
/* Dimming the default text color is not the same as reducing screen
|
||||||
* brightness, since other colors in this stylesheet have brighter
|
* brightness, since other colors in this stylesheet have brighter
|
||||||
* red and blue channels than the default text. */
|
* red and blue channels than the default text. */
|
||||||
|
|
|
@ -106,9 +106,8 @@ html {
|
||||||
|
|
||||||
/* If we have a list of disclosure widgets, we need some
|
/* If we have a list of disclosure widgets, we need some
|
||||||
* non-interactive space on the screen that's safe to tap. */
|
* non-interactive space on the screen that's safe to tap. */
|
||||||
form,
|
|
||||||
li details {
|
li details {
|
||||||
margin: .5em 0;
|
margin: .5em .25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SC 2.5.5, Google a11y: Increase tap target size a bit
|
/* SC 2.5.5, Google a11y: Increase tap target size a bit
|
||||||
|
@ -179,37 +178,25 @@ nav ul li {
|
||||||
margin-right: .375em;
|
margin-right: .375em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make search box and submit button as wide as possible while keeping
|
/* Make search box and submit button wide enough */
|
||||||
* 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 {
|
form {
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%
|
width: 100%
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A text box should not look like a button */
|
|
||||||
input[type="search"] {
|
input[type="search"] {
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
width: 98%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
form > div {
|
form > div {
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
vertical-align: top; /* IE and some botique browsers need this */
|
|
||||||
width: 1%;
|
width: 1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't shrink the size of the text in forms. */
|
||||||
input {
|
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;
|
appearance: none;
|
||||||
|
|
||||||
/* Don't shrink the size of the text in forms. */
|
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
137
config.toml
137
config.toml
|
@ -7,66 +7,64 @@ summaryLength = 150
|
||||||
enableInlineShortcodes = true
|
enableInlineShortcodes = true
|
||||||
enableGitInfo = true
|
enableGitInfo = true
|
||||||
disableHugoGeneratorInject = true # I inject it explicitly at the BOTTOM of <head>
|
disableHugoGeneratorInject = true # I inject it explicitly at the BOTTOM of <head>
|
||||||
uglyurls = false
|
uglyurls = true
|
||||||
pygmentsCodeFences = false
|
pygmentsCodeFences = true
|
||||||
pygmentsUseClasses = false
|
pygmentsUseClasses = true
|
||||||
disableKinds = ["taxonomy", "term"]
|
disableKinds = ["taxonomy", "term"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
description = "Seirdy's Home: personal website and blog for Rohan Kumar, A.K.A. Seirdy"
|
description = "Seirdy's Home: personal website and blog for Rohan Kumar, A.K.A. Seirdy"
|
||||||
src = "https://sr.ht/~seirdy/seirdy.one/"
|
src = "https://sr.ht/~seirdy/seirdy.one/"
|
||||||
canonicalBaseURL = "https://seirdy.one" # I have mirrors with different baseURLs
|
canonicalBaseURL = "https://seirdy.one" # I have mirrors with different baseURLs
|
||||||
webmentionEndpoint = "https://seirdy.one/webmentions/receive"
|
webmentionEndpoint = "https://seirdy.one/webmentions/receive"
|
||||||
logUrlPrefix = "https://git.sr.ht/~seirdy/seirdy.one/log/master/item/"
|
logUrlPrefix = "https://git.sr.ht/~seirdy/seirdy.one/log/master/item/"
|
||||||
copyright = "Copyright © 2021 Rohan Kumar"
|
copyright = "Copyright © 2021 Rohan Kumar"
|
||||||
dark = "auto"
|
dark = "auto"
|
||||||
highlight = false
|
highlight = false
|
||||||
icon = "/favicon.svg"
|
|
||||||
|
|
||||||
[frontmatter]
|
[frontmatter]
|
||||||
lastmod = ['lastmod', ':git', 'date', 'publishDate']
|
lastmod = ['lastmod', ':git', 'date', 'publishDate']
|
||||||
|
|
||||||
[author]
|
[author]
|
||||||
name = "Rohan Kumar"
|
name = "Rohan Kumar"
|
||||||
url = "https://seirdy.one/"
|
first = "Rohan"
|
||||||
first = "Rohan"
|
last = "Kumar"
|
||||||
last = "Kumar"
|
nick = "Seirdy"
|
||||||
nick = "Seirdy"
|
|
||||||
|
|
||||||
[menu]
|
[menu]
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
identifier = "posts"
|
identifier = "posts"
|
||||||
name = "Posts"
|
name = "Posts"
|
||||||
title = "posts"
|
title = "posts"
|
||||||
url = "/posts/"
|
url = "/posts.html"
|
||||||
weight = 10
|
weight = 10
|
||||||
|
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
identifier = "notes"
|
identifier = "notes"
|
||||||
name = "Notes"
|
name = "Notes"
|
||||||
title = "notes"
|
title = "notes"
|
||||||
url = "/notes/"
|
url = "/notes.html"
|
||||||
weight = 15
|
weight = 15
|
||||||
|
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
identifier = "bookmarks"
|
identifier = "bookmarks"
|
||||||
name = "Bookmarks"
|
name = "Bookmarks"
|
||||||
title = "bookmarks"
|
title = "bookmarks"
|
||||||
url = "/bookmarks/"
|
url = "/bookmarks.html"
|
||||||
weight = 20
|
weight = 20
|
||||||
|
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
identifier = "about"
|
identifier = "about"
|
||||||
name = "About"
|
name = "About"
|
||||||
title = "about"
|
title = "about"
|
||||||
url = "/about/"
|
url = "/about.html"
|
||||||
weight = 30
|
weight = 30
|
||||||
|
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
identifier = "resume"
|
identifier = "resume"
|
||||||
name = "Resume"
|
name = "Resume"
|
||||||
title = "resume"
|
title = "resume"
|
||||||
url = "/resume/"
|
url = "/resume.html"
|
||||||
weight = 40
|
weight = 40
|
||||||
|
|
||||||
[[menu.main]]
|
[[menu.main]]
|
||||||
|
@ -77,81 +75,82 @@ disableKinds = ["taxonomy", "term"]
|
||||||
weight = 50
|
weight = 50
|
||||||
|
|
||||||
[permalinks]
|
[permalinks]
|
||||||
posts = "/posts/:year/:month/:day/:filename"
|
posts = "/:year/:month/:day/:filename"
|
||||||
notes = "/notes/:year/:month/:day/:filename"
|
notes = "/notes/:year/:month/:day/:filename"
|
||||||
|
|
||||||
[markup.goldmark.renderer]
|
[markup.goldmark.renderer]
|
||||||
unsafe = true
|
# Allows HTML in Markdown
|
||||||
|
unsafe = true
|
||||||
|
|
||||||
[markup.tableOfContents]
|
[markup.tableOfContents]
|
||||||
ordered = true
|
ordered = true
|
||||||
startLevel = 2
|
startLevel = 2
|
||||||
endLevel = 3
|
endLevel = 3
|
||||||
|
|
||||||
# lifted from https://git.sr.ht/~sircmpwn/drewdevault.com
|
# lifted from https://git.sr.ht/~sircmpwn/drewdevault.com
|
||||||
[mediaTypes]
|
[mediaTypes]
|
||||||
[mediaTypes."text/gemini"]
|
[mediaTypes."text/gemini"]
|
||||||
suffixes = ["gmi"]
|
suffixes = ["gmi"]
|
||||||
[mediaTypes."application/manifest+json"]
|
[mediaTypes."application/manifest+json"]
|
||||||
suffixes = ["webmanifest"]
|
suffixes = ["webmanifest"]
|
||||||
|
|
||||||
[outputFormats]
|
[outputFormats]
|
||||||
[outputFormats.Gemini]
|
[outputFormats.Gemini]
|
||||||
name = "GEMTEXT"
|
name = "GEMTEXT"
|
||||||
isPlainText = true
|
isPlainText = true
|
||||||
isHTML = false
|
isHTML = false
|
||||||
mediaType = "text/gemini"
|
mediaType = "text/gemini"
|
||||||
protocol = "gemini://"
|
protocol = "gemini://"
|
||||||
permalinkable = true
|
permalinkable = true
|
||||||
path = "gemini/"
|
path = "gemini/"
|
||||||
|
|
||||||
[outputFormats.atom]
|
[outputFormats.GEMRSS]
|
||||||
baseName="atom"
|
name = "GEMRSS"
|
||||||
isPlainText = true
|
isHTML = false
|
||||||
mediaType = "application/xml"
|
mediaType = "application/rss+xml"
|
||||||
|
protocol = "gemini://"
|
||||||
|
path = "gemini/"
|
||||||
|
|
||||||
[outputs]
|
[outputs]
|
||||||
home = ["HTML", "atom", "GEMTEXT", "RSS"]
|
section = ["HTML", "RSS", "GEMRSS"]
|
||||||
section = ["HTML", "atom", "RSS"]
|
|
||||||
posts = ["HTML", "atom", "RSS"]
|
|
||||||
notes = ["HTML", "atom", "RSS"]
|
|
||||||
|
|
||||||
# https://github.com/nekr0z/static-webmentions
|
# https://github.com/nekr0z/static-webmentions
|
||||||
[webmentions]
|
[webmentions]
|
||||||
newDir = "public"
|
newDir = "public"
|
||||||
oldDir = "old"
|
oldDir = "old"
|
||||||
webmentionsFile = "mentions.json"
|
webmentionsFile = "mentions.json"
|
||||||
excludeSources = [
|
excludeSources = [
|
||||||
"/tags/*", # only trailing * are supported at the moment
|
"/tags/*", # only trailing * are supported at the moment
|
||||||
"/posts/*", # this only excludes /posts/index.html, not /posts/somepost/
|
"/posts/*", # this only excludes /posts/index.html, not /posts/somepost/
|
||||||
"/", # same as "/index.html"
|
"/", # same as "/index.html"
|
||||||
]
|
]
|
||||||
|
|
||||||
# addresses that we don't want to send webmentions to
|
# addresses that we don't want to send webmentions to
|
||||||
# other schemes and stuff that I link to too often
|
# other schemes and stuff that I link to too often
|
||||||
excludeDestinations = [
|
excludeDestinations = [
|
||||||
"mailto:",
|
"mailto:",
|
||||||
"gemini:",
|
"gemini:",
|
||||||
"https://web.archive.org",
|
"https://web.archive.org",
|
||||||
"https://lists.sr.ht/~seirdy/seirdy.one-comments",
|
"https://lists.sr.ht/~seirdy/seirdy.one-comments",
|
||||||
|
"https://useplaintext.email/",
|
||||||
"https://seirdy.one",
|
"https://seirdy.one",
|
||||||
]
|
]
|
||||||
|
|
||||||
[imaging.exif]
|
[imaging.exif]
|
||||||
# Regexp matching the fields you want to Exclude from the (massive) set of Exif info
|
# 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
|
# available. As we cache this info to disk, this is for performance and
|
||||||
# disk space reasons more than anything.
|
# disk space reasons more than anything.
|
||||||
# If you want it all, put ".*" in this config setting.
|
# If you want it all, put ".*" in this config setting.
|
||||||
# Note that if neither this or ExcludeFields is set, Hugo will return a small
|
# 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
|
# default set: GPS|Exif|Exposure[M|P|B]|Contrast|Resolution|Sharp|JPEG|Metering|Sensing|Saturation|ColorSpace|Flash|WhiteBalance
|
||||||
includeFields = ""
|
includeFields = ""
|
||||||
|
|
||||||
# Regexp matching the Exif fields you want to exclude. This may be easier to use
|
# Regexp matching the Exif fields you want to exclude. This may be easier to use
|
||||||
# than IncludeFields above, depending on what you want.
|
# than IncludeFields above, depending on what you want.
|
||||||
excludeFields = ".*"
|
excludeFields = ".*"
|
||||||
|
|
||||||
# don't minify html but minify other resources, esp the fulltext rss/atom feeds
|
# don't minify html but minify other resources, esp the fulltext rss feed
|
||||||
[minify]
|
[minify]
|
||||||
minifyOutput = false
|
minifyOutput = true
|
||||||
disableXML = false
|
disableXML = false
|
||||||
disableHTML = true
|
disableHTML = true
|
||||||
|
|
|
@ -5,8 +5,8 @@ It me! I'm Rohan Kumar, a.k.a. Seirdy (online handle).
|
||||||
## Other versions of this site
|
## Other versions of this site
|
||||||
|
|
||||||
Canonical versions:
|
Canonical versions:
|
||||||
=> gemini://seirdy.one/ Canonical Gemini capsule
|
=> gemini://seirdy.one Canonical Gemini capsule
|
||||||
=> https://seirdy.one/ Canonical Web site
|
=> https://seirdy.one Canonical Web site
|
||||||
|
|
||||||
Staging/rough-draft Tildeverse mirror:
|
Staging/rough-draft Tildeverse mirror:
|
||||||
=> gemini://envs.net/~seirdy/ Tildeverse Gemini capsule
|
=> 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:
|
I don't collect anything except default server logs, purged regularly. More detail on a dedicated page:
|
||||||
|
|
||||||
=> gemini://seirdy.one/privacy/
|
=> gemini://seirdy.one/privacy.gmi
|
||||||
|
|
||||||
|
|
|
@ -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:
|
Generate passwords and analyze password strength given physical limits to computing. Based on a weblog/gemlog entry:
|
||||||
|
|
||||||
=> ../posts//2021/01/12/password-strength/ Becoming physically immune to brute-force attacks
|
=> gemini://seirdy.one/2021/01/12/password-strength.gmi Becoming physically immune to brute-force attacks
|
||||||
|
|
||||||
Written in Go.
|
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:
|
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:
|
||||||
|
|
||||||
=> ../posts/2020/11/23/website-best-practices/ Best practices for inclusive textual websites
|
=> gemini://seirdy.one/2020/11/23/website-best-practices.gmi 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
|
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:
|
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/ Whatsapp and the domestication of users
|
=> gemini://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.gmi 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.
|
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.
|
||||||
|
|
||||||
|
|
|
@ -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".
|
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.
|
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.
|
- 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.
|
- 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/)
|
### [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](../posts/2021/01/12/password-strength/). 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](https://seirdy.one/2021/01/12/password-strength.html). Written in Go.
|
||||||
|
|
||||||
Interests, preferences, et cetera
|
Interests, preferences, et cetera
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -68,7 +68,7 @@ I ought to come up with more interests than these, but that sounds hard.
|
||||||
|
|
||||||
### Inclusive design
|
### 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](../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.
|
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.
|
||||||
|
|
||||||
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".
|
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.
|
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](../posts/2021/01/27/whatsapp-and-the-domestication-of-users/).
|
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 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.
|
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
|
### 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.
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
template: "notes.html"
|
|
||||||
description: "All the notes on Seirdy's Home"
|
|
||||||
title: "Notes"
|
|
||||||
sitemap:
|
|
||||||
ChangeFreq: daily
|
|
||||||
Priority: 0.8
|
|
||||||
---
|
|
|
@ -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.
|
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="../../../../../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.
|
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.
|
||||||
|
|
||||||
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".
|
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".
|
||||||
|
|
||||||
|
|
|
@ -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.
|
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](../../../../../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.
|
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.
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
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.
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
template: "posts.html"
|
|
||||||
description: "All the posts on Seirdy's Home"
|
|
||||||
title: "Posts"
|
|
||||||
sitemap:
|
|
||||||
ChangeFreq: weekly
|
|
||||||
Priority: 0.7
|
|
||||||
---
|
|
|
@ -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:
|
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/ Whatsapp and the domestication of users
|
=> ./../../../2021/01/27/whatsapp-and-the-domestication-of-users.gmi Whatsapp and the domestication of users
|
||||||
=> ../../../../2021/02/23/keeping-platforms-open/ Keeping platforms open
|
=> ./../../../2021/02/23/keeping-platforms-open.gmi Keeping platforms open
|
||||||
|
|
||||||
After two posts spanning over 5000 words, I need to add some nuance.
|
After two posts spanning over 5000 words, I need to add some nuance.
|
||||||
|
|
||||||
|
|
|
@ -18,12 +18,11 @@ 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:
|
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:
|
||||||
|
|
||||||
<dl>
|
[Whatsapp and the domestication of users](./../../../2021/01/27/whatsapp-and-the-domestication-of-users.html "{itemprop='mentions'}")
|
||||||
<dt><a href="../../../../2021/01/27/whatsapp-and-the-domestication-of-users/" itemprop="mentions">Whatsapp and the domestication of users</a></dt>
|
: The phenomenon of a class of predatory businesses models I call "user domestication" and defense measures: FLOSS, open platforms, and simplicity.
|
||||||
<dd>The phenomenon of a class of predatory businesses models I call “user domestication” 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>
|
[Keeping platforms open](./../../../2021/02/23/keeping-platforms-open.html "{itemprop='mentions'}")
|
||||||
<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>
|
: 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>
|
|
||||||
|
|
||||||
After two posts spanning over 5000 words, I need to add some nuance.
|
After two posts spanning over 5000 words, I need to add some nuance.
|
||||||
|
|
||||||
|
@ -200,7 +199,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.
|
- 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/).
|
- 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).
|
||||||
|
|
||||||
- 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).
|
- 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).
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ I'll update this post as I add articles to the series.
|
||||||
|
|
||||||
Articles in this series:
|
Articles in this series:
|
||||||
|
|
||||||
=> ../../../../2020/11/18/git-workflow-1/ 1. Hydra Hosting
|
=> ../../../2020/11/18/git-workflow-1.gmi 1. Hydra Hosting
|
||||||
|
|
||||||
Articles yet to be written:
|
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.
|
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/ Next: Resilient Git, Part 1: Hydra Hosting
|
=> ../../../2020/11/18/git-workflow-1.gmi Next: Resilient Git, Part 1: Hydra Hosting
|
||||||
|
|
|
@ -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:
|
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/): repository hosting.
|
1. [Hydra Hosting](/2020/11/18/git-workflow-1.html): repository hosting.
|
||||||
|
|
||||||
2. Community feedback (issues, support, etc.)
|
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.
|
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/)
|
Next: Resilient Git, Part 1: [Hydra Hosting](/2020/11/18/git-workflow-1.html)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
This is Part 1 of a series called Resilient Git:
|
This is Part 1 of a series called Resilient Git:
|
||||||
|
|
||||||
=> ../../../../2020/11/17/git-workflow-0/ Resilient Git
|
=> ../../../2020/11/17/git-workflow-0.gmi 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.
|
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.
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ title: "Resilient Git, Part 1: Hydra Hosting"
|
||||||
---
|
---
|
||||||
<div role="note">
|
<div role="note">
|
||||||
|
|
||||||
This is Part 1 of a series called <a itemprop="relatedLink" href="../../../../2020/11/17/git-workflow-0/">Resilient Git</a>
|
This is Part 1 of a series called [Resilient Git](/2020/11/17/git-workflow-0.html "{itemprop='relatedLink'}").
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -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.
|
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/ Whatsapp and the Domestication of Users
|
=> ./../../../2021/01/27/whatsapp-and-the-domestication-of-users.gmi 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".
|
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:
|
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:
|
||||||
|
|
||||||
=> ../../../../2021/01/27/whatsapp-and-the-domestication-of-users/
|
=> gemini://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.gmi
|
||||||
|
|
||||||
Matrix is close to being a boxed platform because the official client and server can iterate independently of the greater ecosystem.
|
Matrix is close to being a boxed platform because the official client and server can iterate independently of the greater ecosystem.
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ This article is the second entry of series of posts exploring situations in whic
|
||||||
Intro­duction {#introduction}
|
Intro­duction {#introduction}
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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".
|
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.
|
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](../../../../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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
|
@ -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:
|
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/ A look at search engines with their own indexes
|
=> ./../../../2021/03/10/search-engines-with-own-indexes.gmi 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.
|
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:
|
The Web version of this page is an example application of Technique C25 and the similar G148:
|
||||||
|
|
||||||
=> https://seirdy.one/posts/2020/11/23/website-best-practices/ The Web mirror of this Gemlog post
|
=> https://seirdy.one/2020/11/23/website-best-practices.html 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
|
=> 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.
|
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:
|
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/posts/2020/11/23/website-best-practices/#toc Table of contents
|
=> https://seirdy.one/2020/11/23/website-best-practices.html#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:
|
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:
|
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/posts/2020/11/23/website-best-practices/#webmentions 1. The webmention list after this article separates links with timestamps and some paragraph spacing.
|
=> 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.
|
||||||
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,
|
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/#posts 3. The homepage posts list separates links with non-interactive text descriptions
|
||||||
=> 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.
|
=> 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.
|
||||||
|
|
||||||
### Line spacing
|
### 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:
|
For an example, check the HTML version of this article's code sample describing my PNG optimization pipeline:
|
||||||
|
|
||||||
=> https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/#png-pipeline PNG pipeline
|
=> https://seirdy.one/2021/03/10/search-engines-with-own-indexes.html#png-pipeline PNG pipeline
|
||||||
|
|
||||||
Most implementations do not yet support `translate="yes"` embedded inside untranslated blocks, but I'm counting on this changing.
|
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:
|
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/ The right thing for the wrong reasons: FLOSS doesn't imply security
|
=> gemini://seirdy.one/2022/02/02/floss-security.gmi The right thing for the wrong reasons: FLOSS doesn't imply security
|
||||||
|
|
||||||
### Automated tests
|
### Automated tests
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ tags:
|
||||||
- featured
|
- featured
|
||||||
- web
|
- web
|
||||||
sitemap:
|
sitemap:
|
||||||
ChangeFreq: weekly
|
ChangeFreq: daily
|
||||||
Priority: 0.7
|
Priority: 0.7
|
||||||
featured: 2
|
featured: 2
|
||||||
image: "serenity-4x.png"
|
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.
|
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/) 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.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.
|
||||||
|
|
||||||
{{<codefigure>}} {{< codecaption >}} this is the CSP for my main website, with hashes removed for readability. {{< /codecaption >}}
|
{{<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">
|
<figcaption itemprop="caption">
|
||||||
|
|
||||||
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>
|
Infinite-scroll means that accidental navigation to a link results in losing your place. From [xkcd](https://xkcd.com/1309/ "{itemprop='url'}").
|
||||||
|
|
||||||
</figcaption>
|
</figcaption>
|
||||||
{{< /transcribed-image-figure >}}
|
{{< /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>) 2.2</cite> describes how doing so can meet the WCAG 2.2's [Success Criterion 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.
|
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>) 2.2</cite> describes how doing so can meet the WCAG 2.2's [Success Criterion 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/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.
|
[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.
|
||||||
|
|
||||||
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]
|
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.">}}
|
{{<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">
|
<figcaption itemprop="caption">
|
||||||
I made sure to leave enough non-interactive space in <a href="../../../../#webrings">my homepage’s webring list</a> to accommodate a 48 px tap target, with extra space in between.
|
I made sure to leave enough non-interactive space in <a href="../../../#webrings">my homepage’s webring list</a> to accommodate a 48 px tap target, with extra space in between.
|
||||||
</figcaption>
|
</figcaption>
|
||||||
{{</image-figure>}}
|
{{</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,
|
- 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 [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
|
- 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
|
||||||
|
|
||||||
- This list separates two list-items containing links with a third list-item that lacks links.
|
- 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>.
|
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](../../../../2022/02/02/floss-security/).
|
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).
|
||||||
|
|
||||||
### Automated tests
|
### Automated tests
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Update: I wrote a follow-up; check it out if you found this article interesting:
|
Update: I wrote a follow-up; check it out if you found this article interesting:
|
||||||
=> ../../../../2021/02/23/keeping-platforms-open/ Keeping platforms open
|
=> ../../../2021/02/23/keeping-platforms-open.gmi 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.
|
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:
|
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/ Keeping platforms open
|
=> ../../../2021/02/23/keeping-platforms-open.gmi Keeping platforms open
|
||||||
|
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
|
@ -22,7 +22,7 @@ Intro­duction {#introduction}
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
<p role="note">
|
<p role="note">
|
||||||
<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>
|
<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>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p itemprop="backstory">
|
<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.
|
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/). 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.html). Check it out if you found this article interesting.
|
||||||
|
|
||||||
Translations
|
Translations
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -59,7 +59,7 @@ These logs are purged _every two days._
|
||||||
|
|
||||||
### How I use your information
|
### 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](../posts/2021/03/10/search-engines-with-own-indexes/).
|
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).
|
||||||
|
|
||||||
Information I share
|
Information I share
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
{{- $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 -}}
|
|
|
@ -1,32 +0,0 @@
|
||||||
{{- $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>
|
|
|
@ -1,8 +1,7 @@
|
||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/DataFeed">
|
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/DataFeed">
|
||||||
<h1 class="p-name" itemprop="name headline" id="notes">Notes</h1>
|
<h1 class="p-name" itemprop="name headline" id="posts">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>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>
|
||||||
<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">
|
<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>
|
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>
|
</p>
|
||||||
|
@ -17,8 +16,8 @@
|
||||||
{{ .Title }}
|
{{ .Title }}
|
||||||
</a>
|
</a>
|
||||||
</h2>
|
</h2>
|
||||||
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>
|
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 gt (sub .Lastmod.Unix .Date.Unix) 3600 -}}
|
{{- if lt .Date .Lastmod -}}
|
||||||
, 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>
|
, 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 }}
|
{{- end }}
|
||||||
<div class="e-content entry-content" itemprop="articleBody">{{ .Content }}</div>
|
<div class="e-content entry-content" itemprop="articleBody">{{ .Content }}</div>
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
{{- if ge $limit 1 -}}
|
{{- if ge $limit 1 -}}
|
||||||
{{- $pages = $pages | first $limit -}}
|
{{- $pages = $pages | first $limit -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $currentSection := .Section -}}
|
|
||||||
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
||||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
<channel>
|
<channel>
|
||||||
|
@ -28,7 +27,7 @@
|
||||||
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ range where .Site.Pages "Kind" "page" }}
|
{{ range where .Site.Pages "Kind" "page" }}
|
||||||
{{ if (eq .Section $currentSection ) }}
|
{{ if or (eq .Section "posts") (eq .Section "post") }}
|
||||||
<item>
|
<item>
|
||||||
<title>{{ .Title }}</title>
|
<title>{{ .Title }}</title>
|
||||||
<link>{{ .Permalink }}</link>
|
<link>{{ .Permalink }}</link>
|
||||||
|
|
44
layouts/_default/section.gemrss.xml
Normal file
44
layouts/_default/section.gemrss.xml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{{- $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>
|
|
@ -15,10 +15,10 @@
|
||||||
<a rel="alternate" href="http://wgq3bd2kqoybhstp77i3wrzbfnsyd27wt34psaja4grqiezqircorkyd.onion{{ .RelPermalink }}">Tor mirror</a>
|
<a rel="alternate" href="http://wgq3bd2kqoybhstp77i3wrzbfnsyd27wt34psaja4grqiezqircorkyd.onion{{ .RelPermalink }}">Tor mirror</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ site.BaseURL }}privacy/">Privacy</a>
|
<a href="{{ site.BaseURL }}privacy.html">Privacy</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ site.BaseURL }}about/#location-seirdy-online">Contact</a>
|
<a href="{{ site.BaseURL }}about.html#location-seirdy-online">Contact</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
@ -9,22 +9,15 @@
|
||||||
<link href="{{ .Site.Params.WebmentionEndpoint }}" rel="webmention">
|
<link href="{{ .Site.Params.WebmentionEndpoint }}" rel="webmention">
|
||||||
{{ $webmanifest := resources.Get "/manifest.webmanifest" | resources.ExecuteAsTemplate "manifest.webmanifest" . | resources.Minify | resources.Fingerprint "md5" -}}
|
{{ $webmanifest := resources.Get "/manifest.webmanifest" | resources.ExecuteAsTemplate "manifest.webmanifest" . | resources.Minify | resources.Fingerprint "md5" -}}
|
||||||
{{- printf `<link href="%s" rel="manifest">` $webmanifest.RelPermalink | safeHTML }}
|
{{- printf `<link href="%s" rel="manifest">` $webmanifest.RelPermalink | safeHTML }}
|
||||||
<!--Feeds for both notes and posts; posts come first unless we're in the notes section.-->
|
<link rel="alternate" type="application/rss+xml" href="{{ site.BaseURL }}posts/index.xml" title="{{ $.Site.Title }}">
|
||||||
{{- $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>
|
<title>{{ .Title }}{{ if and (lt (len .Title) 54) (ne $canonicalRelPermalink "/") }} - Seirdy{{ end }}</title>
|
||||||
{{ $description := .Site.Params.Description -}}
|
{{ $description := .Site.Params.Description -}}
|
||||||
{{- if .Params.description -}}
|
{{- if .Params.description -}}
|
||||||
{{- $description = .Params.Description -}}
|
{{- $description = .Params.Description -}}
|
||||||
{{- else if .Summary -}}
|
{{- else if .Summary -}}
|
||||||
{{- $description = .Summary | replaceRE `\n` ` ` | safeHTML -}}
|
{{- $description = .Summary | replaceRE `\n` ` ` | safeHTML -}}
|
||||||
|
{{- else if eq $canonicalRelPermalink "/posts.html" -}}
|
||||||
|
{{- $description = "All the posts on Seirdy's Home" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
<meta name="description" content="{{ $description }}">
|
<meta name="description" content="{{ $description }}">
|
||||||
<meta name="author" content="{{ .Site.Author.name }}">
|
<meta name="author" content="{{ .Site.Author.name }}">
|
||||||
|
@ -61,7 +54,7 @@
|
||||||
<style>{{ $css.Content | safeCSS }}</style>
|
<style>{{ $css.Content | safeCSS }}</style>
|
||||||
<meta property="og:title" content="{{ .Title }}">
|
<meta property="og:title" content="{{ .Title }}">
|
||||||
<meta property="og:site_name" content="{{ $.Site.Title }}">
|
<meta property="og:site_name" content="{{ $.Site.Title }}">
|
||||||
{{- if not (or (ne "page" .Kind) (eq $canonicalRelPermalink "/bookmarks/") (eq $canonicalRelPermalink "/posts/")) }}
|
{{- if not (or (ne "page" .Kind) (eq $canonicalRelPermalink "/bookmarks.html") (eq $canonicalRelPermalink "/posts.html")) }}
|
||||||
<meta property="og:type" content="article">
|
<meta property="og:type" content="article">
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
<!-- ANOTHER meta image?! When will it end? -->
|
<!-- ANOTHER meta image?! When will it end? -->
|
||||||
|
|
|
@ -1,20 +1,16 @@
|
||||||
|
{{ $isNote := (eq .Page.Section "notes") -}}
|
||||||
{{- $canonicalRelPermalink := .RelPermalink | replaceRE "^/~seirdy/" "/" -}}
|
{{- $canonicalRelPermalink := .RelPermalink | replaceRE "^/~seirdy/" "/" -}}
|
||||||
{{- $isNotes := false -}}
|
|
||||||
{{- $action := "Posted" -}}
|
|
||||||
{{- $logURL := printf "%scontent/%s" .Site.Params.logUrlPrefix .File.Path -}}
|
{{- $logURL := printf "%scontent/%s" .Site.Params.logUrlPrefix .File.Path -}}
|
||||||
{{- if or (eq .Page.Section "notes") (eq .Page.Title "Notes") -}}
|
{{- if not $isNote -}}
|
||||||
{{- $isNotes = true -}}
|
|
||||||
{{- $action = "Noted" -}}
|
|
||||||
{{- else -}}
|
|
||||||
{{- $logURL = $logURL | strings.ReplaceRE `\.md` `.gmi` -}}
|
{{- $logURL = $logURL | strings.ReplaceRE `\.md` `.gmi` -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{- $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>
|
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>
|
||||||
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 -}}.
|
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 gt (sub .Lastmod.Unix .Date.Unix) 3600 -}}
|
{{ if lt .Date .Lastmod -}}
|
||||||
<br>
|
<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>.
|
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 }}
|
{{- end }}
|
||||||
{{ if not $isNotes -}}
|
{{ if not $isNote -}}
|
||||||
<br>
|
<br>
|
||||||
{{ partial "wordcount.html" . -}}
|
{{ partial "wordcount.html" . -}}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
@ -6,11 +6,10 @@
|
||||||
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/CompleteDataFeed">
|
<main itemprop="mainEntity" class="h-feed hfeed" itemscope itemtype="https://schema.org/CompleteDataFeed">
|
||||||
<h1 class="p-name" itemprop="name headline" id="posts">Posts</h1>
|
<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>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 -}}
|
{{- else -}}
|
||||||
<section class="h-feed hfeed" itemprop="hasPart" itemscope itemtype="https://schema.org/DataFeed">
|
<section class="h-feed hfeed" itemprop="hasPart" itemscope itemtype="https://schema.org/DataFeed">
|
||||||
<h2 class="p-name" itemprop="name" id="posts">Posts</h2>
|
<h2 class="p-name" itemprop="name" id="posts">Posts</h2>
|
||||||
<p>Here’s a selection of my best posts, in featured order. To see the rest, visit <a href="posts/">my Posts page</a>.</p>
|
<p>Here’s a selection of my best posts, in featured order. To see the rest, visit <a href="/posts.html">my Posts page</a>.</p>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
<p>I edit some of these posts quite often; some are updated indefinitely. Check the “updated” timestamps.</p>
|
<p>I edit some of these posts quite often; some are updated indefinitely. Check the “updated” timestamps.</p>
|
||||||
<p role="doc-tip">
|
<p role="doc-tip">
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<h2 id="continue-hd">Continue reading</h2>
|
<h2 id="continue-hd">Continue reading</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{{- with .PrevInSection }}
|
{{- 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 -}}
|
{{- end -}}
|
||||||
{{- with .NextInSection }}
|
{{- with .NextInSection }}
|
||||||
<li>Next {{ $name }}: <a href="{{ .Permalink }}" rel="next">{{ .Title }}</a></li>
|
<li>Next {{ $name }}: <a href="{{ .Permalink }}" rel="next">{{ .Title }}</a></li>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
(btw this is all made of <span> cuz it is supposed to be inline)
|
(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">
|
<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" -}}
|
{{ partial "indieweb-icon.html" -}}
|
||||||
<span itemprop="name" class="p-name fn n">
|
<span itemprop="name" class="p-name fn n">
|
||||||
<span itemprop="givenName" class="p-given-name given-name">Rohan</span>
|
<span itemprop="givenName" class="p-given-name given-name">Rohan</span>
|
||||||
|
|
Loading…
Reference in a new issue