summaryrefslogtreecommitdiff
path: root/src/content
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc5
-rw-r--r--src/content/en/blog/index.adoc1
-rw-r--r--src/content/en/index.adoc4
-rw-r--r--src/content/en/pastebin/2021/06/22/curl-wget.adoc2
-rw-r--r--src/content/en/pastebin/index.adoc1
-rw-r--r--src/content/en/podcast/index.adoc1
-rw-r--r--src/content/en/screencast/2021/02/07/autoqemu.adoc1
-rw-r--r--src/content/en/screencast/index.adoc1
-rw-r--r--src/content/en/slide/2020/10/19/feature-flags.adoc234
-rw-r--r--src/content/en/slide/2020/10/19/feature-flags.eslaides235
-rw-r--r--src/content/en/slide/2020/11/14/local-first-hype.adoc208
-rw-r--r--src/content/en/slide/2020/11/14/local-first-hype.eslaides232
-rw-r--r--src/content/en/slide/categories.adoc2
-rw-r--r--src/content/en/slide/index.adoc2
-rw-r--r--src/content/en/til/2026/09/05/multiline-sh-comments.adoc66
-rw-r--r--src/content/en/til/index.adoc1
-rw-r--r--src/content/favicon.icobin1150 -> 1150 bytes
-rw-r--r--src/content/favicon.pngbin103 -> 88 bytes
-rw-r--r--src/content/img/envelope.svg (renamed from src/content/img/envelope/dark.svg)7
-rw-r--r--src/content/img/envelope/light.svg6
-rw-r--r--src/content/img/favicon.svg136
-rw-r--r--src/content/img/link.svg (renamed from src/content/img/link/dark.svg)11
-rw-r--r--src/content/img/link/light.svg7
-rw-r--r--src/content/img/lock.svg (renamed from src/content/img/lock/dark.svg)11
-rw-r--r--src/content/img/lock/light.svg6
-rw-r--r--src/content/img/logo.svg92
-rw-r--r--src/content/img/logo/dark.svg62
-rw-r--r--src/content/img/logo/light.svg62
-rw-r--r--src/content/img/monogram-filled-512.pngbin0 -> 2007 bytes
-rw-r--r--src/content/img/monogram-filled.svg28
-rw-r--r--src/content/img/thumb.svg68
-rw-r--r--src/content/img/wordmark-filled-1500x500.pngbin0 -> 3632 bytes
-rw-r--r--src/content/img/wordmark-filled-1584x396.pngbin0 -> 3045 bytes
-rw-r--r--src/content/img/wordmark-filled.svg1
-rw-r--r--src/content/img/wordmark.svg102
l---------src/content/l/multiline-sh1
-rw-r--r--src/content/pt/hea/2020/08/12/arquivo-datado.adoc29
-rw-r--r--src/content/pt/hea/categorias.adoc6
-rw-r--r--src/content/pt/hea/index.adoc11
-rw-r--r--src/content/pt/sobre.adoc12
-rw-r--r--src/content/public.asc.txt80
-rw-r--r--src/content/style.css220
42 files changed, 1196 insertions, 758 deletions
diff --git a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
index 76bd8e6..7c1e837 100644
--- a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
+++ b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
@@ -115,7 +115,8 @@ https://lernajs.io/[Lerna]footnote:lerna-package-lock[
was harder than I expected.
]:
-```bash
+[source,sh]
+----
cd /tmp/
git clone https://github.com/lerna/lerna.git
cd lerna/
@@ -127,7 +128,7 @@ npm ci
merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa
npm ci # test if it also works with an existing node_modules/ folder
merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa
-```
+----
Good job `npm ci` :)
diff --git a/src/content/en/blog/index.adoc b/src/content/en/blog/index.adoc
index afd64d4..e24d614 100644
--- a/src/content/en/blog/index.adoc
+++ b/src/content/en/blog/index.adoc
@@ -1 +1,2 @@
= Blog
+:type: collection
diff --git a/src/content/en/index.adoc b/src/content/en/index.adoc
index 275f7c4..5fde68a 100644
--- a/src/content/en/index.adoc
+++ b/src/content/en/index.adoc
@@ -1 +1,3 @@
-= index
+= Home
+
+The newest entry of each collection is listed below.
diff --git a/src/content/en/pastebin/2021/06/22/curl-wget.adoc b/src/content/en/pastebin/2021/06/22/curl-wget.adoc
index 97f55c7..02a9744 100644
--- a/src/content/en/pastebin/2021/06/22/curl-wget.adoc
+++ b/src/content/en/pastebin/2021/06/22/curl-wget.adoc
@@ -1,4 +1,4 @@
-= "cloc: curl and wget"
+= cloc: curl and wget
`curl`:
diff --git a/src/content/en/pastebin/index.adoc b/src/content/en/pastebin/index.adoc
index 433a2c1..a5a8657 100644
--- a/src/content/en/pastebin/index.adoc
+++ b/src/content/en/pastebin/index.adoc
@@ -1 +1,2 @@
= Pastebins
+:type: collection
diff --git a/src/content/en/podcast/index.adoc b/src/content/en/podcast/index.adoc
index 1f17da7..69f5cea 100644
--- a/src/content/en/podcast/index.adoc
+++ b/src/content/en/podcast/index.adoc
@@ -1 +1,2 @@
= Podcasts
+:type: collection
diff --git a/src/content/en/screencast/2021/02/07/autoqemu.adoc b/src/content/en/screencast/2021/02/07/autoqemu.adoc
index b20b092..15bac9a 100644
--- a/src/content/en/screencast/2021/02/07/autoqemu.adoc
+++ b/src/content/en/screencast/2021/02/07/autoqemu.adoc
@@ -10,7 +10,6 @@
:script: https://www.man7.org/linux/man-pages/man1/script.1.html
:klaatu: https://gnuworldorder.info/
-video: true
After reading begriffs "{begriffs-tips}[Tips for stable and portable software]",
the "Begriffs Buildfarm?" section caught my attention, as this is something I
diff --git a/src/content/en/screencast/index.adoc b/src/content/en/screencast/index.adoc
index 083adac..408b1d5 100644
--- a/src/content/en/screencast/index.adoc
+++ b/src/content/en/screencast/index.adoc
@@ -1 +1,2 @@
= Screencasts
+:type: collection
diff --git a/src/content/en/slide/2020/10/19/feature-flags.adoc b/src/content/en/slide/2020/10/19/feature-flags.adoc
index 553cf4c..1035903 100644
--- a/src/content/en/slide/2020/10/19/feature-flags.adoc
+++ b/src/content/en/slide/2020/10/19/feature-flags.adoc
@@ -1,230 +1,10 @@
----
-# Rollout, feature flag, experiment, operational toggle
+= Rollout, feature flag, experiment, operational toggle
+:deck: feature-flags.pdf
+:article: link:../../../../blog/2020/10/19/feature-flags.html
-@Different use cases for backend, frontend and mobile
+Different use cases for backend, frontend and mobile.
----
-.
-.
-.
-# "Feature flags" tend to come up when talking about continuous deployment
+link:{deck}[See the PDF].
----
-.
-.
-.
-.
-@CI: continuous integration
-.
-@CD: continuous delivery
-.
-@CD: continuous deployment
-
----
-## Types
-.
-.
-.
-1. rollout
-2. feature flag
-3. experiment
-4. operational toggle
-
-% {favicon.svg}
----
-## Rollout
-
-# For *rolling out* a new version of software
-
-Short-lived using percentages
-
-% FIXME: links
-- a new deployment of kubernetes
-- new APK released to the Play Store
-
----
-## Feature flag
-
-# For turning a feature *on* or *off*
-
-Medium-lived using allow list, A/B test, percentage, app version, etc.
-
-- :new-chargeback-flow
-- :new-debit-card-activation-screen
-
----
-## Experiment
-
-# For analysing behaviour
-
-Medium-lived using allow list and A/B test
-
-- :debit-withdrawal-test
-
----
-## Operational toggle
-
-# For disabling features in #crash-like situations
-
-Long-lived using percentage
-
-- :bank-barcode-payment
-- :savings-bank-barcode-query-provider
-
----
-.
-.
-@We know know about the types
-# But they have different relevance for backend, frontend and mobile
-
----
-## backend
-.
-.
-1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp
-2. feature flag: ~common-rollout~ common-xp and datasets
-3. experiment: common-xp
-4. operational toggle: ~common-rollout~ common-xp
-
----
-## frontend
-.
-.
-1. rollout: CDN and page refreshes
-2. feature flag: percentages and maybe IPs (no :customer/id on the website)
-3. experiment: via dynamic backend control
-4. operational toggle: via dynamic backend control
-
----
-## backend
-.
-.
-1. rollout: app stores
-2. feature flag: via dynamic backend control
-3. experiment: via dynamic backend control
-4. operational toggle: via dynamic backend control
-
----
-.
-.
-@Key differentiator is
-# how much *control* we have over the environment
-
----
-## backend
-# full control
-% FIXME: emoji
-% 🎉
-
----
-## frontend
-# partial control
-We choose when to make a new version available
-
----
-## mobile
-# very limited control
-- app stores can restrict updates (worse for iOS)
-- customers still have to download new versions
-
----
-# Costs
-- more complex code
-- compatibility with old app versions
-- nesting is exponential
-
----
-# Benefits
-- dynamicity
-
----
-## weighting costs × benefits
-# The less control we have, the more we value dynamicity
-
----
-## weighting costs × benefits
-.
-.
-.
-- backend: sometimes worth the cost
-- frontend: almost always worth the cost
-- mobile: *always* worth the cost
-
----
-.
-.
-.
-# Best practices
-
----
-# dynamic content > feature flag
-Always true for mobile, almost always for frontend
-
----
-# Use :include-list for named groups
-Always true for backend, frontend and mobile
-
- {:rules
- #{{:types :include-list
- :content {:filename "debit-team-members.txt"}}}}
-
----
-# Always use :app-version
-Only for mobile
-
- {:rules
- #{{:types :app-version
- :content {:min-version #{{:platform :android
- :code 1000000}
- {:platform :ios
- :code 2000000}}}}}}
-
----
-# Extend ~common-rollout~ common-xp if required
-
-That's how :include-list, :app-version, etc. were born
-
----
-# Beware of many nested feature flags
-True for backend, frontend and mobile
-
----
-# Don't delete app-facing feature flags
-True for mobile
-
----
-.
-.
-.
-# Include a feature flag on the whiteboarding phase
-
----
-.
-.
-.
-# Include deleting/retiring the feature flag at the end
-
----
-# Avoid renaming a feature flag
-Use :app-version with :min-version instead
-
----
-.
-.
-.
-# And most importantly...
-
----
-# *Always* rely on a feature flag on the app
-Never do a hotfix, avoid expedited releases at all costs
-
----
-## References
-.
-% FIXME: links
-1. "Feature Toggles (aka Feature Flags)", by Pete Hodgson
-2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet
-3. Accelerate, by N. Forsgren, J. Humble and G. Kim
-4. these slides: euandre.org/slide/
-5. prose version of this presentation
-6. view source
+_The prose version of this presentation is the article
+{article}[Feature flags: differences between backend, frontend and mobile]._
diff --git a/src/content/en/slide/2020/10/19/feature-flags.eslaides b/src/content/en/slide/2020/10/19/feature-flags.eslaides
new file mode 100644
index 0000000..3392e3e
--- /dev/null
+++ b/src/content/en/slide/2020/10/19/feature-flags.eslaides
@@ -0,0 +1,235 @@
+= Rollout, feature flag, experiment, operational toggle
+
+Different use cases for backend, frontend and mobile
+
+<<<
+
+== "Feature flags" tend to come up when talking about continuous deployment
+
+<<<
+
+[.lead]
+CI: continuous integration
+[.lead]
+CD: continuous delivery
+[.lead]
+CD: continuous deployment
+
+<<<
+
+== Types
+. rollout
+. feature flag
+. experiment
+. operational toggle
+
+// {favicon.svg}
+
+<<<
+
+== Rollout
+
+=== For *rolling out* a new version of software
+
+Short-lived using percentages
+
+// FIXME: links
+* a new deployment of kubernetes
+* new APK released to the Play Store
+
+<<<
+
+== Feature flag
+
+=== For turning a feature *on* or *off*
+
+Medium-lived using allow list, A/B test, percentage, app version, etc.
+
+* :new-chargeback-flow
+* :new-debit-card-activation-screen
+
+<<<
+
+== Experiment
+
+=== For analysing behaviour
+
+Medium-lived using allow list and A/B test
+
+* :debit-withdrawal-test
+
+<<<
+
+== Operational toggle
+
+=== For disabling features in #crash-like situations
+
+Long-lived using percentage
+
+* :bank-barcode-payment
+* :savings-bank-barcode-query-provider
+
+<<<
+
+[.lead]
+We know know about the types
+== But they have different relevance for backend, frontend and mobile
+
+<<<
+
+== backend
+. rollout: k8s blue/green, canary and [.line-through]#common-rollout# common-xp
+. feature flag: [.line-through]#common-rollout# common-xp and datasets
+. experiment: common-xp
+. operational toggle: [.line-through]#common-rollout# common-xp
+
+<<<
+
+== frontend
+. rollout: CDN and page refreshes
+. feature flag: percentages and maybe IPs (no :customer/id on the website)
+. experiment: via dynamic backend control
+. operational toggle: via dynamic backend control
+
+<<<
+
+== backend
+. rollout: app stores
+. feature flag: via dynamic backend control
+. experiment: via dynamic backend control
+. operational toggle: via dynamic backend control
+
+<<<
+
+[.lead]
+Key differentiator is
+== how much *control* we have over the environment
+
+<<<
+
+== backend
+=== full control
+// FIXME: emoji
+// 🎉
+
+<<<
+
+== frontend
+=== partial control
+We choose when to make a new version available
+
+<<<
+
+== mobile
+=== very limited control
+* app stores can restrict updates (worse for iOS)
+* customers still have to download new versions
+
+<<<
+
+== Costs
+* more complex code
+* compatibility with old app versions
+* nesting is exponential
+
+<<<
+
+== Benefits
+* dynamicity
+
+<<<
+
+== weighting costs × benefits
+=== The less control we have, the more we value dynamicity
+
+<<<
+
+== weighting costs × benefits
+* backend: sometimes worth the cost
+* frontend: almost always worth the cost
+* mobile: *always* worth the cost
+
+<<<
+
+== Best practices
+
+<<<
+
+== dynamic content > feature flag
+Always true for mobile, almost always for frontend
+
+<<<
+
+== Use :include-list for named groups
+Always true for backend, frontend and mobile
+
+----
+{:rules
+ #{{:types :include-list
+ :content {:filename "debit-team-members.txt"}}}}
+
+----
+
+<<<
+
+== Always use :app-version
+Only for mobile
+
+----
+{:rules
+ #{{:types :app-version
+ :content {:min-version #{{:platform :android
+ :code 1000000}
+ {:platform :ios
+ :code 2000000}}}}}}
+
+----
+
+<<<
+
+== Extend [.line-through]#common-rollout# common-xp if required
+
+That's how :include-list, :app-version, etc. were born
+
+<<<
+
+== Beware of many nested feature flags
+True for backend, frontend and mobile
+
+<<<
+
+== Don't delete app-facing feature flags
+True for mobile
+
+<<<
+
+== Include a feature flag on the whiteboarding phase
+
+<<<
+
+== Include deleting/retiring the feature flag at the end
+
+<<<
+
+== Avoid renaming a feature flag
+Use :app-version with :min-version instead
+
+<<<
+
+== And most importantly...
+
+<<<
+
+== *Always* rely on a feature flag on the app
+Never do a hotfix, avoid expedited releases at all costs
+
+<<<
+
+== References
+// FIXME: links
+. "Feature Toggles (aka Feature Flags)", by Pete Hodgson
+. "Continuous integration vs. delivery vs. deployment", by Sten Pittet
+. Accelerate, by N. Forsgren, J. Humble and G. Kim
+. these slides: euandre.org/slide/
+. prose version of this presentation
+. view source
diff --git a/src/content/en/slide/2020/11/14/local-first-hype.adoc b/src/content/en/slide/2020/11/14/local-first-hype.adoc
index fd83115..2aeaf3f 100644
--- a/src/content/en/slide/2020/11/14/local-first-hype.adoc
+++ b/src/content/en/slide/2020/11/14/local-first-hype.adoc
@@ -1,204 +1,10 @@
-# On "local-first"
+= On local-first
+:deck: local-first-hype.pdf
+:article: link:../../../../blog/2020/11/14/local-first-review.html
-@Beyond the CRDT silver bullet
+Beyond the CRDT silver bullet.
----
-## Part 1
-# Exposition
+link:{deck}[See the PDF].
----
-## Target
-...
-- documents
-- files
-- personal data repositories
-..
-Not: banking services, e-commerce, social networking, ride-sharing, etc.
-
----
-...
-# 7 ideals for local-first software
-
----
-...
-# 1 - no spinners: your work at your fingertips
-
----
-...
-# 2 - your work is not trapped on one device
-
----
-...
-# 3 - the network is optional
-
----
-...
-# 4 - seamless collaboration with your colleagues
-
----
-...
-# 5 - the long now
-
----
-...
-# 6 - security and privacy by default
-
----
-...
-# 7 - you retain ultimate ownership and control
-
----
-## Towards a better future
-....
-@ CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology
-
----
-## Use case
-.
- # in node A and node B
- s = "Hello, World"
-
- # in node A
- s = "Hello, Alice"
-
- # in node B
- s = "Hello, Bob"
-
-How to reconcile those?
-- Hello, ABloibce
-- Hello, AliceBob
-- Hello, BobAlice
-- Hello, Alice
-\...
-
----
-# Existing CRDTs differ
-- performance
-- storage
-- compression
-- metadata overhead
-
----
-...
-# Hint towards the "automerge" CRDT
-
----
-......
-@@show comparison table, page 9
-
----
-## Part 2
-# Critique
-
----
-## Software license
-...
-@@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source."
-
----
-## Example 1 - intentional restriction
-.
- #!/bin/sh
- TODAY="$(date +%s)"
- LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)"
- if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then
- echo 'License expired!'
- exit 1
- fi
- echo $((2 + 2))
-.
- # today
- $ ./useful-adder.sh
- 4
-
- # tomorrow
- $ ./useful-adder.sh
- License expired!
----
-## Example 2 - unintentional restriction
-.
- # today
- $ useful-program
- # ... useful output ...
-
- # tomorrow, with more data
- $ useful-program
- ERROR: Panic! Stack overflow!
-
----
-..
-# local-first *requires* free software
-
-Otherwise "The Long Now" (ideal nº5) is lost
-
----
-## Denial of existing solutions
-..
-@@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub."
-.
-Solution: either GitHub+CRDTs or git send-email
-
----
-## Plain-text formats
-.
-@@"Git is highly optimized for code and similar line-based text file"
-.
-It even pulls software to the plain text directtion, e.g.:
-- delivery-templates
-- common-core.protocols.config
-.
-Why not exploit that more?
-
----
-## Ditching of web applications
-..
-@@"The architecture of web apps remains fundamentally server-centric
-.
-% FIXME: links
-Disagree. Contrast PouchDB with Android Instant Apps
-
----
-## Costs are underrated
-.
-- storage
-- backups
-- maintenance
-.
-Example: blog vs vlog
-
----
-## Real-time collaboration a bit overrated
-.
-It is only possible on the presence of reliable, medium-quality network connection
-..
-@@"X also works when inside an elevator, subway or plane!"
-
----
-## On CRDTs and developer experience
-.
-@@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for?
-.
-@YES.
-.
-% FIXME: link
-See "A Note on Distributed Computing"
-
----
-## Conclusion
-.
-Why this is a "paper I love": it took offline-first and ran with it.
-.
-But a pinch of CRDT won't make the world local-first.
-.
-The tricky part is the end of the sentence: "in spite of the Cloud".
-
----
-## References
-.
-% FIXME: links
-1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan
-2. The Morning Paper article
-3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall
-4. these slides: euandre.org/slide/
-5. prose version of this presentation
-6. view source
+_The prose version of this presentation is the article
+{article}[Local-First Software: article review]._
diff --git a/src/content/en/slide/2020/11/14/local-first-hype.eslaides b/src/content/en/slide/2020/11/14/local-first-hype.eslaides
new file mode 100644
index 0000000..8f44ad2
--- /dev/null
+++ b/src/content/en/slide/2020/11/14/local-first-hype.eslaides
@@ -0,0 +1,232 @@
+= On "local-first"
+
+Beyond the CRDT silver bullet
+
+<<<
+
+== Part 1
+=== Exposition
+
+<<<
+
+== Target
+...
+* documents
+* files
+* personal data repositories
+..
+Not: banking services, e-commerce, social networking, ride-sharing, etc.
+
+<<<
+
+...
+== 7 ideals for local-first software
+
+<<<
+
+...
+== 1 - no spinners: your work at your fingertips
+
+<<<
+
+...
+== 2 - your work is not trapped on one device
+
+<<<
+
+...
+== 3 - the network is optional
+
+<<<
+
+...
+== 4 - seamless collaboration with your colleagues
+
+<<<
+
+...
+== 5 - the long now
+
+<<<
+
+...
+== 6 - security and privacy by default
+
+<<<
+
+...
+== 7 - you retain ultimate ownership and control
+
+<<<
+
+== Towards a better future
+....
+[.lead]
+CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology
+
+<<<
+
+== Use case
+----
+# in node A and node B
+s = "Hello, World"
+
+# in node A
+s = "Hello, Alice"
+
+# in node B
+s = "Hello, Bob"
+
+----
+How to reconcile those?
+* Hello, ABloibce
+* Hello, AliceBob
+* Hello, BobAlice
+* Hello, Alice
+\...
+
+<<<
+
+== Existing CRDTs differ
+* performance
+* storage
+* compression
+* metadata overhead
+
+<<<
+
+...
+== Hint towards the "automerge" CRDT
+
+<<<
+
+......
+[.lead]
+@show comparison table, page 9
+
+<<<
+
+== Part 2
+=== Critique
+
+<<<
+
+== Software license
+...
+[.lead]
+@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source."
+
+<<<
+
+== Example 1 - intentional restriction
+----
+#!/bin/sh
+TODAY="$(date +%s)"
+LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)"
+if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then
+ echo 'License expired!'
+ exit 1
+fi
+echo $((2 + 2))
+----
+----
+# today
+$ ./useful-adder.sh
+4
+
+# tomorrow
+$ ./useful-adder.sh
+License expired!
+----
+
+<<<
+
+== Example 2 - unintentional restriction
+----
+# today
+$ useful-program
+# ... useful output ...
+
+# tomorrow, with more data
+$ useful-program
+ERROR: Panic! Stack overflow!
+
+----
+
+<<<
+
+..
+== local-first *requires* free software
+
+Otherwise "The Long Now" (ideal nº5) is lost
+
+<<<
+
+== Denial of existing solutions
+..
+[.lead]
+@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub."
+Solution: either GitHub+CRDTs or git send-email
+
+<<<
+
+== Plain-text formats
+[.lead]
+@"Git is highly optimized for code and similar line-based text file"
+It even pulls software to the plain text directtion, e.g.:
+* delivery-templates
+* common-core.protocols.config
+Why not exploit that more?
+
+<<<
+
+== Ditching of web applications
+..
+[.lead]
+@"The architecture of web apps remains fundamentally server-centric
+// FIXME: links
+Disagree. Contrast PouchDB with Android Instant Apps
+
+<<<
+
+== Costs are underrated
+* storage
+* backups
+* maintenance
+Example: blog vs vlog
+
+<<<
+
+== Real-time collaboration a bit overrated
+It is only possible on the presence of reliable, medium-quality network connection
+..
+[.lead]
+@"X also works when inside an elevator, subway or plane!"
+
+<<<
+
+== On CRDTs and developer experience
+[.lead]
+@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for?
+[.lead]
+YES.
+// FIXME: link
+See "A Note on Distributed Computing"
+
+<<<
+
+== Conclusion
+Why this is a "paper I love": it took offline-first and ran with it.
+But a pinch of CRDT won't make the world local-first.
+The tricky part is the end of the sentence: "in spite of the Cloud".
+
+<<<
+
+== References
+// FIXME: links
+. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan
+. The Morning Paper article
+. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall
+. these slides: euandre.org/slide/
+. prose version of this presentation
+. view source
diff --git a/src/content/en/slide/categories.adoc b/src/content/en/slide/categories.adoc
new file mode 100644
index 0000000..feb64ff
--- /dev/null
+++ b/src/content/en/slide/categories.adoc
@@ -0,0 +1,2 @@
+= Articles by category
+:type: categories
diff --git a/src/content/en/slide/index.adoc b/src/content/en/slide/index.adoc
new file mode 100644
index 0000000..193c98a
--- /dev/null
+++ b/src/content/en/slide/index.adoc
@@ -0,0 +1,2 @@
+= Slides
+:type: collection
diff --git a/src/content/en/til/2026/09/05/multiline-sh-comments.adoc b/src/content/en/til/2026/09/05/multiline-sh-comments.adoc
new file mode 100644
index 0000000..13fef6d
--- /dev/null
+++ b/src/content/en/til/2026/09/05/multiline-sh-comments.adoc
@@ -0,0 +1,66 @@
+= Multiline comments in POSIX sh
+:categories: sh
+
+:posixsh: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_07_04
+
+
+I realized one can use heredocs for multiline comments in sh:
+
+[source,sh]
+----
+cat <<'COMMENT' > /dev/null
+if wip; then
+ unfinished and broken syntax >
+fii
+COMMENT
+----
+
+
+...instead of:
+
+[source,sh]
+----
+# if wip; then
+# unfinished and broken syntax >
+# fii
+----
+
+
+What is going on: the {posixsh}[language defines] `<<` as a redirect of the
+"here-document" type. After `<<` you can put anything, and sh will use that as
+a token to look for on the following lines:
+
+[source,sh]
+----
+cat <<'bleh'
+...
+bleh
+----
+
+Make sure to include the `'quotes'` around the word, otherwise anything with a
+`$` would get replaced just like a `"double-quoted"` string.
+
+"bleh" works fine, like any word would.
+
+But that example left as-is would print the string to stdout. To avoid that, we
+shove the contents to `/dev/null`. So it isn't technically a comment, its more
+like a constant string that gets emitted and discarded.
+
+Sure its hacky, but at this point what in sh isn't? It even supports nesting!
+
+[source,sh]
+----
+cat <<'COMMENT1' > /dev/null
+
+cat <<'COMMENT' > /dev/null
+
+# ... code ...
+
+COMMENT
+
+COMMENT1
+----
+
+
+I've never committed any code with this, just used while debugging sh code.
+Make sure to handle with care
diff --git a/src/content/en/til/index.adoc b/src/content/en/til/index.adoc
index 7e85335..2d100d0 100644
--- a/src/content/en/til/index.adoc
+++ b/src/content/en/til/index.adoc
@@ -1,4 +1,5 @@
= Today I Learned
+:type: collection
:anna-e-so: https://til.flourishing.stream/
diff --git a/src/content/favicon.ico b/src/content/favicon.ico
index 8f2130a..b35a439 100644
--- a/src/content/favicon.ico
+++ b/src/content/favicon.ico
Binary files differ
diff --git a/src/content/favicon.png b/src/content/favicon.png
index 136d8cb..bab901f 100644
--- a/src/content/favicon.png
+++ b/src/content/favicon.png
Binary files differ
diff --git a/src/content/img/envelope/dark.svg b/src/content/img/envelope.svg
index f521a8f..aba3a80 100644
--- a/src/content/img/envelope/dark.svg
+++ b/src/content/img/envelope.svg
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="22" height="22" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <style>
+ svg { fill: black }
+ @media (prefers-color-scheme: dark) {
+ svg { fill: white }
+ }
+ </style>
<path
- fill="white"
d="M1664 1504v-768q-32 36-69 66-268 206-426 338-51 43-83 67t-86.5 48.5-102.5 24.5h-2q-48 0-102.5-24.5t-86.5-48.5-83-67q-158-132-426-338-37-30-69-66v768q0 13 9.5 22.5t22.5 9.5h1472q13 0 22.5-9.5t9.5-22.5zm0-1051v-24.5l-.5-13-3-12.5-5.5-9-9-7.5-14-2.5h-1472q-13 0-22.5 9.5t-9.5 22.5q0 168 147 284 193 152 401 317 6 5 35 29.5t46 37.5 44.5 31.5 50.5 27.5 43 9h2q20 0 43-9t50.5-27.5 44.5-31.5 46-37.5 35-29.5q208-165 401-317 54-43 100.5-115.5t46.5-131.5zm128-37v1088q0 66-47 113t-113 47h-1472q-66 0-113-47t-47-113v-1088q0-66 47-113t113-47h1472q66 0 113 47t47 113z" />
</svg>
diff --git a/src/content/img/envelope/light.svg b/src/content/img/envelope/light.svg
deleted file mode 100644
index 12aba9f..0000000
--- a/src/content/img/envelope/light.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg width="22" height="22" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
- <path
- fill="black"
- d="M1664 1504v-768q-32 36-69 66-268 206-426 338-51 43-83 67t-86.5 48.5-102.5 24.5h-2q-48 0-102.5-24.5t-86.5-48.5-83-67q-158-132-426-338-37-30-69-66v768q0 13 9.5 22.5t22.5 9.5h1472q13 0 22.5-9.5t9.5-22.5zm0-1051v-24.5l-.5-13-3-12.5-5.5-9-9-7.5-14-2.5h-1472q-13 0-22.5 9.5t-9.5 22.5q0 168 147 284 193 152 401 317 6 5 35 29.5t46 37.5 44.5 31.5 50.5 27.5 43 9h2q20 0 43-9t50.5-27.5 44.5-31.5 46-37.5 35-29.5q208-165 401-317 54-43 100.5-115.5t46.5-131.5zm128-37v1088q0 66-47 113t-113 47h-1472q-66 0-113-47t-47-113v-1088q0-66 47-113t113-47h1472q66 0 113 47t47 113z" />
-</svg>
diff --git a/src/content/img/favicon.svg b/src/content/img/favicon.svg
index ce566b2..1916d84 100644
--- a/src/content/img/favicon.svg
+++ b/src/content/img/favicon.svg
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <style>
+ svg {
+ fill: #1f6f5b;
+ }
+ @media (prefers-color-scheme: dark) {
+ fill: 5cc2a2;
+ }
+ </style>
+ <path d="M 0 0 L 1 0 L 1 1 L 0 1 L 0 0 Z" />
+ <path d="M 0 15 L 1 15 L 1 16 L 0 16 L 0 15 Z" />
+ <path d="M 15 0 L 16 0 L 16 1 L 15 1 L 15 0 Z" />
+ <path d="M 1 0 L 2 0 L 2 1 L 1 1 L 1 0 Z" />
+ <path d="M 1 15 L 2 15 L 2 16 L 1 16 L 1 15 Z" />
+ <path d="M 0 1 L 1 1 L 1 2 L 0 2 L 0 1 Z" />
+ <path d="M 15 1 L 16 1 L 16 2 L 15 2 L 15 1 Z" />
+ <path d="M 2 0 L 3 0 L 3 1 L 2 1 L 2 0 Z" />
+ <path d="M 2 15 L 3 15 L 3 16 L 2 16 L 2 15 Z" />
+ <path d="M 0 2 L 1 2 L 1 3 L 0 3 L 0 2 Z" />
+ <path d="M 15 2 L 16 2 L 16 3 L 15 3 L 15 2 Z" />
+ <path d="M 3 0 L 4 0 L 4 1 L 3 1 L 3 0 Z" />
+ <path d="M 3 15 L 4 15 L 4 16 L 3 16 L 3 15 Z" />
+ <path d="M 0 3 L 1 3 L 1 4 L 0 4 L 0 3 Z" />
+ <path d="M 15 3 L 16 3 L 16 4 L 15 4 L 15 3 Z" />
+ <path d="M 4 0 L 5 0 L 5 1 L 4 1 L 4 0 Z" />
+ <path d="M 4 15 L 5 15 L 5 16 L 4 16 L 4 15 Z" />
+ <path d="M 0 4 L 1 4 L 1 5 L 0 5 L 0 4 Z" />
+ <path d="M 15 4 L 16 4 L 16 5 L 15 5 L 15 4 Z" />
+ <path d="M 5 0 L 6 0 L 6 1 L 5 1 L 5 0 Z" />
+ <path d="M 5 15 L 6 15 L 6 16 L 5 16 L 5 15 Z" />
+ <path d="M 0 5 L 1 5 L 1 6 L 0 6 L 0 5 Z" />
+ <path d="M 15 5 L 16 5 L 16 6 L 15 6 L 15 5 Z" />
+ <path d="M 6 0 L 7 0 L 7 1 L 6 1 L 6 0 Z" />
+ <path d="M 6 15 L 7 15 L 7 16 L 6 16 L 6 15 Z" />
+ <path d="M 0 6 L 1 6 L 1 7 L 0 7 L 0 6 Z" />
+ <path d="M 15 6 L 16 6 L 16 7 L 15 7 L 15 6 Z" />
+ <path d="M 7 0 L 8 0 L 8 1 L 7 1 L 7 0 Z" />
+ <path d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
+ <path d="M 0 7 L 1 7 L 1 8 L 0 8 L 0 7 Z" />
+ <path d="M 15 7 L 16 7 L 16 8 L 15 8 L 15 7 Z" />
+ <path d="M 8 0 L 9 0 L 9 1 L 8 1 L 8 0 Z" />
+ <path d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
<path d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
+ <path d="M 15 8 L 16 8 L 16 9 L 15 9 L 15 8 Z" />
+ <path d="M 9 0 L 10 0 L 10 1 L 9 1 L 9 0 Z" />
+ <path d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
+ <path d="M 0 9 L 1 9 L 1 10 L 0 10 L 0 9 Z" />
+ <path d="M 15 9 L 16 9 L 16 10 L 15 10 L 15 9 Z" />
+ <path d="M 10 0 L 11 0 L 11 1 L 10 1 L 10 0 Z" />
+ <path d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
+ <path d="M 0 10 L 1 10 L 1 11 L 0 11 L 0 10 Z" />
+ <path d="M 15 10 L 16 10 L 16 11 L 15 11 L 15 10 Z" />
+ <path d="M 11 0 L 12 0 L 12 1 L 11 1 L 11 0 Z" />
+ <path d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
+ <path d="M 0 11 L 1 11 L 1 12 L 0 12 L 0 11 Z" />
+ <path d="M 15 11 L 16 11 L 16 12 L 15 12 L 15 11 Z" />
+ <path d="M 12 0 L 13 0 L 13 1 L 12 1 L 12 0 Z" />
+ <path d="M 12 15 L 13 15 L 13 16 L 12 16 L 12 15 Z" />
+ <path d="M 0 12 L 1 12 L 1 13 L 0 13 L 0 12 Z" />
+ <path d="M 15 12 L 16 12 L 16 13 L 15 13 L 15 12 Z" />
+ <path d="M 13 0 L 14 0 L 14 1 L 13 1 L 13 0 Z" />
+ <path d="M 13 15 L 14 15 L 14 16 L 13 16 L 13 15 Z" />
<path d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
- <path d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" />
- <path d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" />
- <path d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" />
- <path d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" />
- <path d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
- <path d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" />
+ <path d="M 15 13 L 16 13 L 16 14 L 15 14 L 15 13 Z" />
+ <path d="M 14 0 L 15 0 L 15 1 L 14 1 L 14 0 Z" />
+ <path d="M 14 15 L 15 15 L 15 16 L 14 16 L 14 15 Z" />
+ <path d="M 0 14 L 1 14 L 1 15 L 0 15 L 0 14 Z" />
+ <path d="M 15 14 L 16 14 L 16 15 L 15 15 L 15 14 Z" />
+ <path d="M 15 15 L 16 15 L 16 16 L 15 16 L 15 15 Z" />
<path d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
- <path d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" />
- <path d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" />
- <path d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" />
<path d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
- <path d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" />
- <path d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
- <path d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
- <path d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" />
- <path d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" />
- <path d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" />
- <path d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
- <path d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" />
- <path d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" />
- <path d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" />
- <path d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" />
- <path d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" />
- <path d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
- <path d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" />
- <path d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" />
- <path d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
- <path d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
- <path d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" />
- <path d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" />
- <path d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" />
- <path d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" />
- <path d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" />
- <path d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
+ <path d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
+ <path d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" />
+ <path d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" />
+ <path d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" />
+ <path d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" />
+ <path d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" />
+ <path d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" />
+ <path d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" />
+ <path d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" />
+ <path d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" />
+ <path d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" />
<path d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
- <path d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
+ <path d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" />
+ <path d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" />
+ <path d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" />
<path d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
- <path d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" />
- <path d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" />
- <path d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
- <path d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" />
- <path d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" />
- <path d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" />
- <path d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" />
- <path d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" />
- <path d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" />
- <path d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" />
- <path d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" />
- <path d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" />
- <path d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" />
- <path d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" />
- <path d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
- <path d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" />
- <path d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" />
- <path d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" />
- <path d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" />
- <path d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" />
+ <path d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" />
+ <path d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" />
+ <path d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" />
</svg>
diff --git a/src/content/img/link/dark.svg b/src/content/img/link.svg
index fd6ca35..7a0aa14 100644
--- a/src/content/img/link/dark.svg
+++ b/src/content/img/link.svg
@@ -1,7 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="22" height="22" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+ <style>
+ svg {
+ fill: black;
+ }
+ @media (prefers-color-scheme: dark) {
+ svg {
+ fill: white;
+ }
+ }
+ </style>
<path
- fill="white"
fill-rule="evenodd"
d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" />
</svg>
diff --git a/src/content/img/link/light.svg b/src/content/img/link/light.svg
deleted file mode 100644
index fd9033f..0000000
--- a/src/content/img/link/light.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg width="22" height="22" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
- <path
- fill="black"
- fill-rule="evenodd"
- d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" />
-</svg>
diff --git a/src/content/img/lock/dark.svg b/src/content/img/lock.svg
index 98a36bc..faad538 100644
--- a/src/content/img/lock/dark.svg
+++ b/src/content/img/lock.svg
@@ -1,6 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<svg width="22" height="22" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
+ <style>
+ svg {
+ fill: black;
+ }
+ @media (prefers-color-scheme: dark) {
+ svg {
+ fill: white;
+ }
+ }
+ </style>
<path
- fill="white"
d="M640 768h512v-192q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28h-960q-40 0-68-28t-28-68v-576q0-40 28-68t68-28h32v-192q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z" />
</svg>
diff --git a/src/content/img/lock/light.svg b/src/content/img/lock/light.svg
deleted file mode 100644
index d449467..0000000
--- a/src/content/img/lock/light.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg width="22" height="22" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
- <path
- fill="black"
- d="M640 768h512v-192q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28h-960q-40 0-68-28t-28-68v-576q0-40 28-68t68-28h32v-192q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z" />
-</svg>
diff --git a/src/content/img/logo.svg b/src/content/img/logo.svg
new file mode 100644
index 0000000..662e0d5
--- /dev/null
+++ b/src/content/img/logo.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <style>
+ svg { fill: black }
+ .a { fill: #1F6F5B }
+ @media (prefers-color-scheme: dark) {
+ svg { fill: white }
+ .a { fill: #5CC2A2 }
+ }
+ </style>
+ <path d="M 0 0 L 1 0 L 1 1 L 0 1 L 0 0 Z" />
+ <path d="M 0 15 L 1 15 L 1 16 L 0 16 L 0 15 Z" />
+ <path d="M 15 0 L 16 0 L 16 1 L 15 1 L 15 0 Z" />
+ <path d="M 1 0 L 2 0 L 2 1 L 1 1 L 1 0 Z" />
+ <path d="M 1 15 L 2 15 L 2 16 L 1 16 L 1 15 Z" />
+ <path d="M 0 1 L 1 1 L 1 2 L 0 2 L 0 1 Z" />
+ <path d="M 15 1 L 16 1 L 16 2 L 15 2 L 15 1 Z" />
+ <path d="M 2 0 L 3 0 L 3 1 L 2 1 L 2 0 Z" />
+ <path d="M 2 15 L 3 15 L 3 16 L 2 16 L 2 15 Z" />
+ <path d="M 0 2 L 1 2 L 1 3 L 0 3 L 0 2 Z" />
+ <path d="M 15 2 L 16 2 L 16 3 L 15 3 L 15 2 Z" />
+ <path d="M 3 0 L 4 0 L 4 1 L 3 1 L 3 0 Z" />
+ <path d="M 3 15 L 4 15 L 4 16 L 3 16 L 3 15 Z" />
+ <path d="M 0 3 L 1 3 L 1 4 L 0 4 L 0 3 Z" />
+ <path d="M 15 3 L 16 3 L 16 4 L 15 4 L 15 3 Z" />
+ <path d="M 4 0 L 5 0 L 5 1 L 4 1 L 4 0 Z" />
+ <path d="M 4 15 L 5 15 L 5 16 L 4 16 L 4 15 Z" />
+ <path d="M 0 4 L 1 4 L 1 5 L 0 5 L 0 4 Z" />
+ <path d="M 15 4 L 16 4 L 16 5 L 15 5 L 15 4 Z" />
+ <path d="M 5 0 L 6 0 L 6 1 L 5 1 L 5 0 Z" />
+ <path d="M 5 15 L 6 15 L 6 16 L 5 16 L 5 15 Z" />
+ <path d="M 0 5 L 1 5 L 1 6 L 0 6 L 0 5 Z" />
+ <path d="M 15 5 L 16 5 L 16 6 L 15 6 L 15 5 Z" />
+ <path d="M 6 0 L 7 0 L 7 1 L 6 1 L 6 0 Z" />
+ <path d="M 6 15 L 7 15 L 7 16 L 6 16 L 6 15 Z" />
+ <path d="M 0 6 L 1 6 L 1 7 L 0 7 L 0 6 Z" />
+ <path d="M 15 6 L 16 6 L 16 7 L 15 7 L 15 6 Z" />
+ <path d="M 7 0 L 8 0 L 8 1 L 7 1 L 7 0 Z" />
+ <path d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
+ <path d="M 0 7 L 1 7 L 1 8 L 0 8 L 0 7 Z" />
+ <path d="M 15 7 L 16 7 L 16 8 L 15 8 L 15 7 Z" />
+ <path d="M 8 0 L 9 0 L 9 1 L 8 1 L 8 0 Z" />
+ <path d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
+ <path d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
+ <path d="M 15 8 L 16 8 L 16 9 L 15 9 L 15 8 Z" />
+ <path d="M 9 0 L 10 0 L 10 1 L 9 1 L 9 0 Z" />
+ <path d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
+ <path d="M 0 9 L 1 9 L 1 10 L 0 10 L 0 9 Z" />
+ <path d="M 15 9 L 16 9 L 16 10 L 15 10 L 15 9 Z" />
+ <path d="M 10 0 L 11 0 L 11 1 L 10 1 L 10 0 Z" />
+ <path d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
+ <path d="M 0 10 L 1 10 L 1 11 L 0 11 L 0 10 Z" />
+ <path d="M 15 10 L 16 10 L 16 11 L 15 11 L 15 10 Z" />
+ <path d="M 11 0 L 12 0 L 12 1 L 11 1 L 11 0 Z" />
+ <path d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
+ <path d="M 0 11 L 1 11 L 1 12 L 0 12 L 0 11 Z" />
+ <path d="M 15 11 L 16 11 L 16 12 L 15 12 L 15 11 Z" />
+ <path d="M 12 0 L 13 0 L 13 1 L 12 1 L 12 0 Z" />
+ <path d="M 12 15 L 13 15 L 13 16 L 12 16 L 12 15 Z" />
+ <path d="M 0 12 L 1 12 L 1 13 L 0 13 L 0 12 Z" />
+ <path d="M 15 12 L 16 12 L 16 13 L 15 13 L 15 12 Z" />
+ <path d="M 13 0 L 14 0 L 14 1 L 13 1 L 13 0 Z" />
+ <path d="M 13 15 L 14 15 L 14 16 L 13 16 L 13 15 Z" />
+ <path d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
+ <path d="M 15 13 L 16 13 L 16 14 L 15 14 L 15 13 Z" />
+ <path d="M 14 0 L 15 0 L 15 1 L 14 1 L 14 0 Z" />
+ <path d="M 14 15 L 15 15 L 15 16 L 14 16 L 14 15 Z" />
+ <path d="M 0 14 L 1 14 L 1 15 L 0 15 L 0 14 Z" />
+ <path d="M 15 14 L 16 14 L 16 15 L 15 15 L 15 14 Z" />
+ <path d="M 15 15 L 16 15 L 16 16 L 15 16 L 15 15 Z" />
+ <path class="a" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
+ <path class="a" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
+ <path class="a" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
+ <path class="a" d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" />
+ <path class="a" d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" />
+ <path class="a" d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" />
+ <path class="a" d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" />
+ <path class="a" d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" />
+ <path class="a" d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" />
+ <path class="a" d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" />
+ <path class="a" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" />
+ <path class="a" d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" />
+ <path class="a" d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" />
+ <path class="a" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
+ <path class="a" d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" />
+ <path class="a" d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" />
+ <path class="a" d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" />
+ <path class="a" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
+ <path class="a" d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" />
+ <path class="a" d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" />
+ <path class="a" d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" />
+</svg>
diff --git a/src/content/img/logo/dark.svg b/src/content/img/logo/dark.svg
deleted file mode 100644
index 96e0f87..0000000
--- a/src/content/img/logo/dark.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
- <path fill="white" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
- <path fill="white" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
- <path fill="white" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" />
- <path fill="white" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" />
- <path fill="white" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" />
- <path fill="white" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" />
- <path fill="white" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
- <path fill="white" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" />
- <path fill="white" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
- <path fill="white" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" />
- <path fill="white" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" />
- <path fill="white" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" />
- <path fill="white" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
- <path fill="white" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" />
- <path fill="white" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
- <path fill="white" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
- <path fill="white" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" />
- <path fill="white" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" />
- <path fill="white" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" />
- <path fill="white" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
- <path fill="white" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" />
- <path fill="white" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" />
- <path fill="white" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" />
- <path fill="white" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" />
- <path fill="white" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" />
- <path fill="white" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
- <path fill="white" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" />
- <path fill="white" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" />
- <path fill="white" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
- <path fill="white" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
- <path fill="white" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" />
- <path fill="white" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" />
- <path fill="white" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" />
- <path fill="white" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" />
- <path fill="white" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" />
- <path fill="white" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
- <path fill="white" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
- <path fill="white" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
- <path fill="white" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
- <path fill="white" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" />
- <path fill="white" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" />
- <path fill="white" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
- <path fill="white" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" />
- <path fill="white" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" />
- <path fill="white" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" />
- <path fill="white" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" />
- <path fill="white" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" />
- <path fill="white" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" />
- <path fill="white" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" />
- <path fill="white" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" />
- <path fill="white" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" />
- <path fill="white" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" />
- <path fill="white" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" />
- <path fill="white" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
- <path fill="white" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" />
- <path fill="white" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" />
- <path fill="white" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" />
- <path fill="white" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" />
- <path fill="white" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" />
-</svg>
diff --git a/src/content/img/logo/light.svg b/src/content/img/logo/light.svg
deleted file mode 100644
index ab6000b..0000000
--- a/src/content/img/logo/light.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
- <path fill="black" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
- <path fill="black" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
- <path fill="black" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" />
- <path fill="black" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" />
- <path fill="black" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" />
- <path fill="black" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" />
- <path fill="black" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
- <path fill="black" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" />
- <path fill="black" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
- <path fill="black" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" />
- <path fill="black" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" />
- <path fill="black" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" />
- <path fill="black" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
- <path fill="black" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" />
- <path fill="black" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
- <path fill="black" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
- <path fill="black" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" />
- <path fill="black" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" />
- <path fill="black" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" />
- <path fill="black" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
- <path fill="black" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" />
- <path fill="black" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" />
- <path fill="black" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" />
- <path fill="black" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" />
- <path fill="black" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" />
- <path fill="black" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
- <path fill="black" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" />
- <path fill="black" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" />
- <path fill="black" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
- <path fill="black" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
- <path fill="black" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" />
- <path fill="black" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" />
- <path fill="black" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" />
- <path fill="black" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" />
- <path fill="black" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" />
- <path fill="black" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
- <path fill="black" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
- <path fill="black" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
- <path fill="black" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
- <path fill="black" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" />
- <path fill="black" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" />
- <path fill="black" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
- <path fill="black" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" />
- <path fill="black" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" />
- <path fill="black" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" />
- <path fill="black" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" />
- <path fill="black" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" />
- <path fill="black" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" />
- <path fill="black" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" />
- <path fill="black" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" />
- <path fill="black" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" />
- <path fill="black" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" />
- <path fill="black" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" />
- <path fill="black" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
- <path fill="black" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" />
- <path fill="black" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" />
- <path fill="black" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" />
- <path fill="black" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" />
- <path fill="black" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" />
-</svg>
diff --git a/src/content/img/monogram-filled-512.png b/src/content/img/monogram-filled-512.png
new file mode 100644
index 0000000..0b8e36f
--- /dev/null
+++ b/src/content/img/monogram-filled-512.png
Binary files differ
diff --git a/src/content/img/monogram-filled.svg b/src/content/img/monogram-filled.svg
new file mode 100644
index 0000000..b7781b6
--- /dev/null
+++ b/src/content/img/monogram-filled.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <style>
+ svg { fill: #F3F5F3 }
+ </style>
+ <rect width="16" height="16" fill="#1F6F5B" />
+ <path class="a" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
+ <path class="a" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
+ <path class="a" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
+ <path class="a" d="M 6 8 L 7 8 L 7 9 L 6 9 L 6 8 Z" />
+ <path class="a" d="M 3 9 L 4 9 L 4 10 L 3 10 L 3 9 Z" />
+ <path class="a" d="M 4 9 L 5 9 L 5 10 L 4 10 L 4 9 Z" />
+ <path class="a" d="M 5 9 L 6 9 L 6 10 L 5 10 L 5 9 Z" />
+ <path class="a" d="M 3 10 L 4 10 L 4 11 L 3 11 L 3 10 Z" />
+ <path class="a" d="M 4 11 L 5 11 L 5 12 L 4 12 L 4 11 Z" />
+ <path class="a" d="M 5 11 L 6 11 L 6 12 L 5 12 L 5 11 Z" />
+ <path class="a" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" />
+ <path class="a" d="M 11 7 L 12 7 L 12 8 L 11 8 L 11 7 Z" />
+ <path class="a" d="M 8 8 L 9 8 L 9 9 L 8 9 L 8 8 Z" />
+ <path class="a" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
+ <path class="a" d="M 8 9 L 9 9 L 9 10 L 8 10 L 8 9 Z" />
+ <path class="a" d="M 11 9 L 12 9 L 12 10 L 11 10 L 11 9 Z" />
+ <path class="a" d="M 8 10 L 9 10 L 9 11 L 8 11 L 8 10 Z" />
+ <path class="a" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
+ <path class="a" d="M 9 11 L 10 11 L 10 12 L 9 12 L 9 11 Z" />
+ <path class="a" d="M 10 11 L 11 11 L 11 12 L 10 12 L 10 11 Z" />
+ <path class="a" d="M 11 11 L 12 11 L 12 12 L 11 12 L 11 11 Z" />
+</svg>
diff --git a/src/content/img/thumb.svg b/src/content/img/thumb.svg
new file mode 100644
index 0000000..ed73c18
--- /dev/null
+++ b/src/content/img/thumb.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <style>
+ svg { fill: #1F6F5B }
+ @media (prefers-color-scheme: dark) {
+ svg { fill: #5CC2A2 }
+ }
+ </style>
+ <path class="a" d="M 0 8 L 1 8 L 1 9 L 0 9 L 0 8 Z" />
+ <path class="a" d="M 0 13 L 1 13 L 1 14 L 0 14 L 0 13 Z" />
+ <path class="a" d="M 1 8 L 2 8 L 2 9 L 1 9 L 1 8 Z" />
+ <path class="a" d="M 1 13 L 2 13 L 2 14 L 1 14 L 1 13 Z" />
+ <path class="a" d="M 2 8 L 3 8 L 3 9 L 2 9 L 2 8 Z" />
+ <path class="a" d="M 2 13 L 3 13 L 3 14 L 2 14 L 2 13 Z" />
+ <path class="a" d="M 3 8 L 4 8 L 4 9 L 3 9 L 3 8 Z" />
+ <path class="a" d="M 3 13 L 4 13 L 4 14 L 3 14 L 3 13 Z" />
+ <path class="a" d="M 4 7 L 5 7 L 5 8 L 4 8 L 4 7 Z" />
+ <path class="a" d="M 4 8 L 5 8 L 5 9 L 4 9 L 4 8 Z" />
+ <path class="a" d="M 4 13 L 5 13 L 5 14 L 4 14 L 4 13 Z" />
+ <path class="a" d="M 5 6 L 6 6 L 6 7 L 5 7 L 5 6 Z" />
+ <path class="a" d="M 5 7 L 6 7 L 6 8 L 5 8 L 5 7 Z" />
+ <path class="a" d="M 5 13 L 6 13 L 6 14 L 5 14 L 5 13 Z" />
+ <path class="a" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
+ <path class="a" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
+ <path class="a" d="M 6 14 L 7 14 L 7 15 L 6 15 L 6 14 Z" />
+ <path class="a" d="M 7 1 L 8 1 L 8 2 L 7 2 L 7 1 Z" />
+ <path class="a" d="M 7 14 L 8 14 L 8 15 L 7 15 L 7 14 Z" />
+ <path class="a" d="M 7 15 L 8 15 L 8 16 L 7 16 L 7 15 Z" />
+ <path class="a" d="M 7 2 L 8 2 L 8 3 L 7 3 L 7 2 Z" />
+ <path class="a" d="M 7 3 L 8 3 L 8 4 L 7 4 L 7 3 Z" />
+ <path class="a" d="M 7 4 L 8 4 L 8 5 L 7 5 L 7 4 Z" />
+ <path class="a" d="M 7 5 L 8 5 L 8 6 L 7 6 L 7 5 Z" />
+ <path class="a" d="M 8 1 L 9 1 L 9 2 L 8 2 L 8 1 Z" />
+ <path class="a" d="M 8 15 L 9 15 L 9 16 L 8 16 L 8 15 Z" />
+ <path class="a" d="M 9 1 L 10 1 L 10 2 L 9 2 L 9 1 Z" />
+ <path class="a" d="M 9 2 L 10 2 L 10 3 L 9 3 L 9 2 Z" />
+ <path class="a" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
+ <path class="a" d="M 9 15 L 10 15 L 10 16 L 9 16 L 9 15 Z" />
+ <path class="a" d="M 10 2 L 11 2 L 11 3 L 10 3 L 10 2 Z" />
+ <path class="a" d="M 10 3 L 11 3 L 11 4 L 10 4 L 10 3 Z" />
+ <path class="a" d="M 10 4 L 11 4 L 11 5 L 10 5 L 10 4 Z" />
+ <path class="a" d="M 10 5 L 11 5 L 11 6 L 10 6 L 10 5 Z" />
+ <path class="a" d="M 10 6 L 11 6 L 11 7 L 10 7 L 10 6 Z" />
+ <path class="a" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
+ <path class="a" d="M 11 8 L 12 8 L 12 9 L 11 9 L 11 8 Z" />
+ <path class="a" d="M 10 15 L 11 15 L 11 16 L 10 16 L 10 15 Z" />
+ <path class="a" d="M 11 10 L 12 10 L 12 11 L 11 11 L 11 10 Z" />
+ <path class="a" d="M 11 12 L 12 12 L 12 13 L 11 13 L 11 12 Z" />
+ <path class="a" d="M 11 14 L 12 14 L 12 15 L 11 15 L 11 14 Z" />
+ <path class="a" d="M 11 15 L 12 15 L 12 16 L 11 16 L 11 15 Z" />
+ <path class="a" d="M 12 6 L 13 6 L 13 7 L 12 7 L 12 6 Z" />
+ <path class="a" d="M 12 8 L 13 8 L 13 9 L 12 9 L 12 8 Z" />
+ <path class="a" d="M 12 10 L 13 10 L 13 11 L 12 11 L 12 10 Z" />
+ <path class="a" d="M 12 12 L 13 12 L 13 13 L 12 13 L 12 12 Z" />
+ <path class="a" d="M 12 14 L 13 14 L 13 15 L 12 15 L 12 14 Z" />
+ <path class="a" d="M 13 6 L 14 6 L 14 7 L 13 7 L 13 6 Z" />
+ <path class="a" d="M 13 8 L 14 8 L 14 9 L 13 9 L 13 8 Z" />
+ <path class="a" d="M 13 10 L 14 10 L 14 11 L 13 11 L 13 10 Z" />
+ <path class="a" d="M 13 12 L 14 12 L 14 13 L 13 13 L 13 12 Z" />
+ <path class="a" d="M 13 13 L 14 13 L 14 14 L 13 14 L 13 13 Z" />
+ <path class="a" d="M 13 14 L 14 14 L 14 15 L 13 15 L 13 14 Z" />
+ <path class="a" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
+ <path class="a" d="M 14 8 L 15 8 L 15 9 L 14 9 L 14 8 Z" />
+ <path class="a" d="M 14 9 L 15 9 L 15 10 L 14 10 L 14 9 Z" />
+ <path class="a" d="M 14 10 L 15 10 L 15 11 L 14 11 L 14 10 Z" />
+ <path class="a" d="M 14 11 L 15 11 L 15 12 L 14 12 L 14 11 Z" />
+ <path class="a" d="M 14 12 L 15 12 L 15 13 L 14 13 L 14 12 Z" />
+</svg>
diff --git a/src/content/img/wordmark-filled-1500x500.png b/src/content/img/wordmark-filled-1500x500.png
new file mode 100644
index 0000000..5102180
--- /dev/null
+++ b/src/content/img/wordmark-filled-1500x500.png
Binary files differ
diff --git a/src/content/img/wordmark-filled-1584x396.png b/src/content/img/wordmark-filled-1584x396.png
new file mode 100644
index 0000000..e62ea6c
--- /dev/null
+++ b/src/content/img/wordmark-filled-1584x396.png
Binary files differ
diff --git a/src/content/img/wordmark-filled.svg b/src/content/img/wordmark-filled.svg
new file mode 100644
index 0000000..6082ca4
--- /dev/null
+++ b/src/content/img/wordmark-filled.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1500" height="500" viewBox="0 0 1500 500"><rect width="1500" height="500" fill="#1F6F5B"/><g transform="translate(382,178) scale(16)" shape-rendering="crispEdges"><path fill="#F3F5F3" d="M 2 3 L 3 3 L 3 4 L 2 4 L 2 3 Z"/><path fill="#F3F5F3" d="M 3 3 L 4 3 L 4 4 L 3 4 L 3 3 Z"/><path fill="#F3F5F3" d="M 1 4 L 2 4 L 2 5 L 1 5 L 1 4 Z"/><path fill="#F3F5F3" d="M 4 4 L 5 4 L 5 5 L 4 5 L 4 4 Z"/><path fill="#F3F5F3" d="M 1 5 L 2 5 L 2 6 L 1 6 L 1 5 Z"/><path fill="#F3F5F3" d="M 2 5 L 3 5 L 3 6 L 2 6 L 2 5 Z"/><path fill="#F3F5F3" d="M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 Z"/><path fill="#F3F5F3" d="M 1 6 L 2 6 L 2 7 L 1 7 L 1 6 Z"/><path fill="#F3F5F3" d="M 2 7 L 3 7 L 3 8 L 2 8 L 2 7 Z"/><path fill="#F3F5F3" d="M 3 7 L 4 7 L 4 8 L 3 8 L 3 7 Z"/><path fill="#F3F5F3" d="M 6 3 L 7 3 L 7 4 L 6 4 L 6 3 Z"/><path fill="#F3F5F3" d="M 9 3 L 10 3 L 10 4 L 9 4 L 9 3 Z"/><path fill="#F3F5F3" d="M 6 4 L 7 4 L 7 5 L 6 5 L 6 4 Z"/><path fill="#F3F5F3" d="M 9 4 L 10 4 L 10 5 L 9 5 L 9 4 Z"/><path fill="#F3F5F3" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z"/><path fill="#F3F5F3" d="M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 Z"/><path fill="#F3F5F3" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z"/><path fill="#F3F5F3" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z"/><path fill="#F3F5F3" d="M 7 7 L 8 7 L 8 8 L 7 8 L 7 7 Z"/><path fill="#F3F5F3" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z"/><path fill="#F3F5F3" d="M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 Z"/><path fill="#F3F5F3" d="M 12 3 L 13 3 L 13 4 L 12 4 L 12 3 Z"/><path fill="#F3F5F3" d="M 13 3 L 14 3 L 14 4 L 13 4 L 13 3 Z"/><path fill="#F3F5F3" d="M 14 4 L 15 4 L 15 5 L 14 5 L 14 4 Z"/><path fill="#F3F5F3" d="M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 Z"/><path fill="#F3F5F3" d="M 13 5 L 14 5 L 14 6 L 13 6 L 13 5 Z"/><path fill="#F3F5F3" d="M 14 5 L 15 5 L 15 6 L 14 6 L 14 5 Z"/><path fill="#F3F5F3" d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z"/><path fill="#F3F5F3" d="M 14 6 L 15 6 L 15 7 L 14 7 L 14 6 Z"/><path fill="#F3F5F3" d="M 12 7 L 13 7 L 13 8 L 12 8 L 12 7 Z"/><path fill="#F3F5F3" d="M 13 7 L 14 7 L 14 8 L 13 8 L 13 7 Z"/><path fill="#F3F5F3" d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z"/><path fill="#F3F5F3" d="M 16 3 L 17 3 L 17 4 L 16 4 L 16 3 Z"/><path fill="#F3F5F3" d="M 17 3 L 18 3 L 18 4 L 17 4 L 17 3 Z"/><path fill="#F3F5F3" d="M 18 3 L 19 3 L 19 4 L 18 4 L 18 3 Z"/><path fill="#F3F5F3" d="M 16 4 L 17 4 L 17 5 L 16 5 L 16 4 Z"/><path fill="#F3F5F3" d="M 19 4 L 20 4 L 20 5 L 19 5 L 19 4 Z"/><path fill="#F3F5F3" d="M 16 5 L 17 5 L 17 6 L 16 6 L 16 5 Z"/><path fill="#F3F5F3" d="M 19 5 L 20 5 L 20 6 L 19 6 L 19 5 Z"/><path fill="#F3F5F3" d="M 16 6 L 17 6 L 17 7 L 16 7 L 16 6 Z"/><path fill="#F3F5F3" d="M 19 6 L 20 6 L 20 7 L 19 7 L 19 6 Z"/><path fill="#F3F5F3" d="M 16 7 L 17 7 L 17 8 L 16 8 L 16 7 Z"/><path fill="#F3F5F3" d="M 19 7 L 20 7 L 20 8 L 19 8 L 19 7 Z"/><path fill="#F3F5F3" d="M 24 1 L 25 1 L 25 2 L 24 2 L 24 1 Z"/><path fill="#F3F5F3" d="M 24 2 L 25 2 L 25 3 L 24 3 L 24 2 Z"/><path fill="#F3F5F3" d="M 22 3 L 23 3 L 23 4 L 22 4 L 22 3 Z"/><path fill="#F3F5F3" d="M 23 3 L 24 3 L 24 4 L 23 4 L 23 3 Z"/><path fill="#F3F5F3" d="M 24 3 L 25 3 L 25 4 L 24 4 L 24 3 Z"/><path fill="#F3F5F3" d="M 21 4 L 22 4 L 22 5 L 21 5 L 21 4 Z"/><path fill="#F3F5F3" d="M 24 4 L 25 4 L 25 5 L 24 5 L 24 4 Z"/><path fill="#F3F5F3" d="M 21 5 L 22 5 L 22 6 L 21 6 L 21 5 Z"/><path fill="#F3F5F3" d="M 24 5 L 25 5 L 25 6 L 24 6 L 24 5 Z"/><path fill="#F3F5F3" d="M 21 6 L 22 6 L 22 7 L 21 7 L 21 6 Z"/><path fill="#F3F5F3" d="M 24 6 L 25 6 L 25 7 L 24 7 L 24 6 Z"/><path fill="#F3F5F3" d="M 22 7 L 23 7 L 23 8 L 22 8 L 22 7 Z"/><path fill="#F3F5F3" d="M 23 7 L 24 7 L 24 8 L 23 8 L 23 7 Z"/><path fill="#F3F5F3" d="M 24 7 L 25 7 L 25 8 L 24 8 L 24 7 Z"/><path fill="#F3F5F3" d="M 26 3 L 27 3 L 27 4 L 26 4 L 26 3 Z"/><path fill="#F3F5F3" d="M 28 3 L 29 3 L 29 4 L 28 4 L 28 3 Z"/><path fill="#F3F5F3" d="M 29 3 L 30 3 L 30 4 L 29 4 L 29 3 Z"/><path fill="#F3F5F3" d="M 26 4 L 27 4 L 27 5 L 26 5 L 26 4 Z"/><path fill="#F3F5F3" d="M 27 4 L 28 4 L 28 5 L 27 5 L 27 4 Z"/><path fill="#F3F5F3" d="M 26 5 L 27 5 L 27 6 L 26 6 L 26 5 Z"/><path fill="#F3F5F3" d="M 26 6 L 27 6 L 27 7 L 26 7 L 26 6 Z"/><path fill="#F3F5F3" d="M 26 7 L 27 7 L 27 8 L 26 8 L 26 7 Z"/><path fill="#F3F5F3" d="M 32 3 L 33 3 L 33 4 L 32 4 L 32 3 Z"/><path fill="#F3F5F3" d="M 33 3 L 34 3 L 34 4 L 33 4 L 33 3 Z"/><path fill="#F3F5F3" d="M 31 4 L 32 4 L 32 5 L 31 5 L 31 4 Z"/><path fill="#F3F5F3" d="M 34 4 L 35 4 L 35 5 L 34 5 L 34 4 Z"/><path fill="#F3F5F3" d="M 31 5 L 32 5 L 32 6 L 31 6 L 31 5 Z"/><path fill="#F3F5F3" d="M 32 5 L 33 5 L 33 6 L 32 6 L 32 5 Z"/><path fill="#F3F5F3" d="M 33 5 L 34 5 L 34 6 L 33 6 L 33 5 Z"/><path fill="#F3F5F3" d="M 31 6 L 32 6 L 32 7 L 31 7 L 31 6 Z"/><path fill="#F3F5F3" d="M 32 7 L 33 7 L 33 8 L 32 8 L 32 7 Z"/><path fill="#F3F5F3" d="M 33 7 L 34 7 L 34 8 L 33 8 L 33 7 Z"/><path fill="#F3F5F3" d="M 36 1 L 37 1 L 37 2 L 36 2 L 36 1 Z"/><path fill="#F3F5F3" d="M 36 2 L 37 2 L 37 3 L 36 3 L 36 2 Z"/><path fill="#F3F5F3" d="M 36 3 L 37 3 L 37 4 L 36 4 L 36 3 Z"/><path fill="#F3F5F3" d="M 37 3 L 38 3 L 38 4 L 37 4 L 37 3 Z"/><path fill="#F3F5F3" d="M 38 3 L 39 3 L 39 4 L 38 4 L 38 3 Z"/><path fill="#F3F5F3" d="M 36 4 L 37 4 L 37 5 L 36 5 L 36 4 Z"/><path fill="#F3F5F3" d="M 39 4 L 40 4 L 40 5 L 39 5 L 39 4 Z"/><path fill="#F3F5F3" d="M 36 5 L 37 5 L 37 6 L 36 6 L 36 5 Z"/><path fill="#F3F5F3" d="M 39 5 L 40 5 L 40 6 L 39 6 L 39 5 Z"/><path fill="#F3F5F3" d="M 36 6 L 37 6 L 37 7 L 36 7 L 36 6 Z"/><path fill="#F3F5F3" d="M 39 6 L 40 6 L 40 7 L 39 7 L 39 6 Z"/><path fill="#F3F5F3" d="M 36 7 L 37 7 L 37 8 L 36 8 L 36 7 Z"/><path fill="#F3F5F3" d="M 39 7 L 40 7 L 40 8 L 39 8 L 39 7 Z"/><path fill="#F3F5F3" d="M 42 7 L 43 7 L 43 8 L 42 8 L 42 7 Z"/><path fill="#F3F5F3" d="M 43 7 L 44 7 L 44 8 L 43 8 L 43 7 Z"/><path fill="#F3F5F3" d="M 44 7 L 45 7 L 45 8 L 44 8 L 44 7 Z"/></g></svg> \ No newline at end of file
diff --git a/src/content/img/wordmark.svg b/src/content/img/wordmark.svg
new file mode 100644
index 0000000..2afbb4d
--- /dev/null
+++ b/src/content/img/wordmark.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 9" width="46" height="9">
+ <style>
+ svg { fill: black }
+ .a { fill: #1F6F5B }
+ @media (prefers-color-scheme: dark) {
+ svg { fill: white }
+ .a { fill: #5CC2A2 }
+ }
+ </style>
+ <path class="a" d="M 2 3 L 3 3 L 3 4 L 2 4 L 2 3 Z" />
+ <path class="a" d="M 3 3 L 4 3 L 4 4 L 3 4 L 3 3 Z" />
+ <path class="a" d="M 1 4 L 2 4 L 2 5 L 1 5 L 1 4 Z" />
+ <path class="a" d="M 4 4 L 5 4 L 5 5 L 4 5 L 4 4 Z" />
+ <path class="a" d="M 1 5 L 2 5 L 2 6 L 1 6 L 1 5 Z" />
+ <path class="a" d="M 2 5 L 3 5 L 3 6 L 2 6 L 2 5 Z" />
+ <path class="a" d="M 3 5 L 4 5 L 4 6 L 3 6 L 3 5 Z" />
+ <path class="a" d="M 1 6 L 2 6 L 2 7 L 1 7 L 1 6 Z" />
+ <path class="a" d="M 2 7 L 3 7 L 3 8 L 2 8 L 2 7 Z" />
+ <path class="a" d="M 3 7 L 4 7 L 4 8 L 3 8 L 3 7 Z" />
+ <path class="a" d="M 6 3 L 7 3 L 7 4 L 6 4 L 6 3 Z" />
+ <path class="a" d="M 9 3 L 10 3 L 10 4 L 9 4 L 9 3 Z" />
+ <path class="a" d="M 6 4 L 7 4 L 7 5 L 6 5 L 6 4 Z" />
+ <path class="a" d="M 9 4 L 10 4 L 10 5 L 9 5 L 9 4 Z" />
+ <path class="a" d="M 6 5 L 7 5 L 7 6 L 6 6 L 6 5 Z" />
+ <path class="a" d="M 9 5 L 10 5 L 10 6 L 9 6 L 9 5 Z" />
+ <path class="a" d="M 6 6 L 7 6 L 7 7 L 6 7 L 6 6 Z" />
+ <path class="a" d="M 9 6 L 10 6 L 10 7 L 9 7 L 9 6 Z" />
+ <path class="a" d="M 7 7 L 8 7 L 8 8 L 7 8 L 7 7 Z" />
+ <path class="a" d="M 8 7 L 9 7 L 9 8 L 8 8 L 8 7 Z" />
+ <path class="a" d="M 9 7 L 10 7 L 10 8 L 9 8 L 9 7 Z" />
+ <path d="M 12 3 L 13 3 L 13 4 L 12 4 L 12 3 Z" />
+ <path d="M 13 3 L 14 3 L 14 4 L 13 4 L 13 3 Z" />
+ <path d="M 14 4 L 15 4 L 15 5 L 14 5 L 14 4 Z" />
+ <path d="M 12 5 L 13 5 L 13 6 L 12 6 L 12 5 Z" />
+ <path d="M 13 5 L 14 5 L 14 6 L 13 6 L 13 5 Z" />
+ <path d="M 14 5 L 15 5 L 15 6 L 14 6 L 14 5 Z" />
+ <path d="M 11 6 L 12 6 L 12 7 L 11 7 L 11 6 Z" />
+ <path d="M 14 6 L 15 6 L 15 7 L 14 7 L 14 6 Z" />
+ <path d="M 12 7 L 13 7 L 13 8 L 12 8 L 12 7 Z" />
+ <path d="M 13 7 L 14 7 L 14 8 L 13 8 L 13 7 Z" />
+ <path d="M 14 7 L 15 7 L 15 8 L 14 8 L 14 7 Z" />
+ <path d="M 16 3 L 17 3 L 17 4 L 16 4 L 16 3 Z" />
+ <path d="M 17 3 L 18 3 L 18 4 L 17 4 L 17 3 Z" />
+ <path d="M 18 3 L 19 3 L 19 4 L 18 4 L 18 3 Z" />
+ <path d="M 16 4 L 17 4 L 17 5 L 16 5 L 16 4 Z" />
+ <path d="M 19 4 L 20 4 L 20 5 L 19 5 L 19 4 Z" />
+ <path d="M 16 5 L 17 5 L 17 6 L 16 6 L 16 5 Z" />
+ <path d="M 19 5 L 20 5 L 20 6 L 19 6 L 19 5 Z" />
+ <path d="M 16 6 L 17 6 L 17 7 L 16 7 L 16 6 Z" />
+ <path d="M 19 6 L 20 6 L 20 7 L 19 7 L 19 6 Z" />
+ <path d="M 16 7 L 17 7 L 17 8 L 16 8 L 16 7 Z" />
+ <path d="M 19 7 L 20 7 L 20 8 L 19 8 L 19 7 Z" />
+ <path d="M 24 1 L 25 1 L 25 2 L 24 2 L 24 1 Z" />
+ <path d="M 24 2 L 25 2 L 25 3 L 24 3 L 24 2 Z" />
+ <path d="M 22 3 L 23 3 L 23 4 L 22 4 L 22 3 Z" />
+ <path d="M 23 3 L 24 3 L 24 4 L 23 4 L 23 3 Z" />
+ <path d="M 24 3 L 25 3 L 25 4 L 24 4 L 24 3 Z" />
+ <path d="M 21 4 L 22 4 L 22 5 L 21 5 L 21 4 Z" />
+ <path d="M 24 4 L 25 4 L 25 5 L 24 5 L 24 4 Z" />
+ <path d="M 21 5 L 22 5 L 22 6 L 21 6 L 21 5 Z" />
+ <path d="M 24 5 L 25 5 L 25 6 L 24 6 L 24 5 Z" />
+ <path d="M 21 6 L 22 6 L 22 7 L 21 7 L 21 6 Z" />
+ <path d="M 24 6 L 25 6 L 25 7 L 24 7 L 24 6 Z" />
+ <path d="M 22 7 L 23 7 L 23 8 L 22 8 L 22 7 Z" />
+ <path d="M 23 7 L 24 7 L 24 8 L 23 8 L 23 7 Z" />
+ <path d="M 24 7 L 25 7 L 25 8 L 24 8 L 24 7 Z" />
+ <path d="M 26 3 L 27 3 L 27 4 L 26 4 L 26 3 Z" />
+ <path d="M 28 3 L 29 3 L 29 4 L 28 4 L 28 3 Z" />
+ <path d="M 29 3 L 30 3 L 30 4 L 29 4 L 29 3 Z" />
+ <path d="M 26 4 L 27 4 L 27 5 L 26 5 L 26 4 Z" />
+ <path d="M 27 4 L 28 4 L 28 5 L 27 5 L 27 4 Z" />
+ <path d="M 26 5 L 27 5 L 27 6 L 26 6 L 26 5 Z" />
+ <path d="M 26 6 L 27 6 L 27 7 L 26 7 L 26 6 Z" />
+ <path d="M 26 7 L 27 7 L 27 8 L 26 8 L 26 7 Z" />
+ <path d="M 32 3 L 33 3 L 33 4 L 32 4 L 32 3 Z" />
+ <path d="M 33 3 L 34 3 L 34 4 L 33 4 L 33 3 Z" />
+ <path d="M 31 4 L 32 4 L 32 5 L 31 5 L 31 4 Z" />
+ <path d="M 34 4 L 35 4 L 35 5 L 34 5 L 34 4 Z" />
+ <path d="M 31 5 L 32 5 L 32 6 L 31 6 L 31 5 Z" />
+ <path d="M 32 5 L 33 5 L 33 6 L 32 6 L 32 5 Z" />
+ <path d="M 33 5 L 34 5 L 34 6 L 33 6 L 33 5 Z" />
+ <path d="M 31 6 L 32 6 L 32 7 L 31 7 L 31 6 Z" />
+ <path d="M 32 7 L 33 7 L 33 8 L 32 8 L 32 7 Z" />
+ <path d="M 33 7 L 34 7 L 34 8 L 33 8 L 33 7 Z" />
+ <path d="M 36 1 L 37 1 L 37 2 L 36 2 L 36 1 Z" />
+ <path d="M 36 2 L 37 2 L 37 3 L 36 3 L 36 2 Z" />
+ <path d="M 36 3 L 37 3 L 37 4 L 36 4 L 36 3 Z" />
+ <path d="M 37 3 L 38 3 L 38 4 L 37 4 L 37 3 Z" />
+ <path d="M 38 3 L 39 3 L 39 4 L 38 4 L 38 3 Z" />
+ <path d="M 36 4 L 37 4 L 37 5 L 36 5 L 36 4 Z" />
+ <path d="M 39 4 L 40 4 L 40 5 L 39 5 L 39 4 Z" />
+ <path d="M 36 5 L 37 5 L 37 6 L 36 6 L 36 5 Z" />
+ <path d="M 39 5 L 40 5 L 40 6 L 39 6 L 39 5 Z" />
+ <path d="M 36 6 L 37 6 L 37 7 L 36 7 L 36 6 Z" />
+ <path d="M 39 6 L 40 6 L 40 7 L 39 7 L 39 6 Z" />
+ <path d="M 36 7 L 37 7 L 37 8 L 36 8 L 36 7 Z" />
+ <path d="M 39 7 L 40 7 L 40 8 L 39 8 L 39 7 Z" />
+ <path d="M 42 7 L 43 7 L 43 8 L 42 8 L 42 7 Z" />
+ <path d="M 43 7 L 44 7 L 44 8 L 43 8 L 43 7 Z" />
+ <path d="M 44 7 L 45 7 L 45 8 L 44 8 L 44 7 Z" />
+</svg>
diff --git a/src/content/l/multiline-sh b/src/content/l/multiline-sh
new file mode 120000
index 0000000..77800c7
--- /dev/null
+++ b/src/content/l/multiline-sh
@@ -0,0 +1 @@
+../en/til/2026/09/05/multiline-sh-comments.html \ No newline at end of file
diff --git a/src/content/pt/hea/2020/08/12/arquivo-datado.adoc b/src/content/pt/hea/2020/08/12/arquivo-datado.adoc
deleted file mode 100644
index 42842ce..0000000
--- a/src/content/pt/hea/2020/08/12/arquivo-datado.adoc
+++ /dev/null
@@ -1,29 +0,0 @@
-= Nome de arquivo com dia e hora de forma simplificada
-:updatedat: 2025-04-30
-:categories: shell
-
-Quando vou escrever um artigo no Jekyll ou criar um arquivo de log com a data no nome, eu normalmente engasgo para achar um jeito direto de fazer isso. Há uma solução simples: `date -I`.
-
-[source, sh]
-----
-./meu-programa.sh > meu-programa.$(date -I).log
-cp template-de-artigo.md _posts/$(date -I)-slug-do-artigo.md
-----
-
-Usar essa ferramenta padrão do GNU/Linux permite que você simplesmente escreva `touch $(date -I).md` para criar um arquivo `2020-08-12.md`.
-
-Eu sempre tinha que para para reler o `man date` ou buscar na internet de novo e de novo como fazer isso, e depois de sempre chegar no mesmo resultado ficou claro para mim que tanto `date -I` quanto `date -Is` (`s` de segundos) são as respostas que eu estou procurando 95% do tempo:
-
-[source, sh]
-----
-# dentro do meu programa.sh
-echo "Programa começou em $(date -Is)"
-# saída é:
-# Programa começou em 2020-08-12T09:15:16-03:00
-----
-
-Ambos os formatos de data são hierárquicos, com intervalos de tempo maior à esquerda. Isso significa que você pode facilmente ordená-los (e até usar TAB para completar) sem esforço ou ferramenta extra.
-
-
-
-// Generated from po4a(1).
diff --git a/src/content/pt/hea/categorias.adoc b/src/content/pt/hea/categorias.adoc
deleted file mode 100644
index 19e7cb7..0000000
--- a/src/content/pt/hea/categorias.adoc
+++ /dev/null
@@ -1,6 +0,0 @@
-= Artigos por categoria
-:type: categories
-
-
-
-// Generated from po4a(1).
diff --git a/src/content/pt/hea/index.adoc b/src/content/pt/hea/index.adoc
deleted file mode 100644
index 77a035c..0000000
--- a/src/content/pt/hea/index.adoc
+++ /dev/null
@@ -1,11 +0,0 @@
-= Hoje Eu Aprendi
-
-:anna-e-so: https://til.flourishing.stream/
-
-**H**oje **E**u **A**prendi (do inglês, _**T**oday **I** **L**earned_): pequenas postagens de conhecimentos úteis.
-
-Cópia descarada da {anna-e-so}[Anna e só].
-
-
-
-// Generated from po4a(1).
diff --git a/src/content/pt/sobre.adoc b/src/content/pt/sobre.adoc
deleted file mode 100644
index 2d7ad20..0000000
--- a/src/content/pt/sobre.adoc
+++ /dev/null
@@ -1,12 +0,0 @@
-= Sobre
-
-:mailto: mailto:~euandreh/public-inbox@lists.sr.ht
-:archive: https://lists.sr.ht/~euandreh/public-inbox
-
-Oi, eu sou EuAndreh. Eu escrevo software e, ocasionalmente, música. Você encontra meu dados para entrar em contato no rodapé desta página, ou pode mandar também uma mensagem para minha {mailto}[caixa de entrada pública] ({archive}[arquivo]).
-
-Esse é o meu site pessoal onde eu escrevo artigos, publico software e outros trabalhos relacionados.
-
-
-
-// Generated from po4a(1).
diff --git a/src/content/public.asc.txt b/src/content/public.asc.txt
index d548547..2519d0f 100644
--- a/src/content/public.asc.txt
+++ b/src/content/public.asc.txt
@@ -11,45 +11,45 @@ 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
-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
+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
@@ -95,5 +95,5 @@ T0PAbuproAk2TXn8NDzsFJP6ERM+3c1ARNiwZ8wCjiNChxX5cEh4ciNltkQ54ZF/
rN/8i+o7WAE9xdIdVHZg0H+WPWa/lOs5yfsSXES3Y7wxOR8chW038/y82TECk7LP
+dZyFKJ26VSvqPHxMqmji/UJjOB+K5xaaCflnzsKzsaEf5fRCIrCp6ldIXh0/x0s
pqsEJPXPOb40oBnNzLOSv9X++wKq+oXWEX8OSqhr
-=bNun
+=mG9H
-----END PGP PUBLIC KEY BLOCK-----
diff --git a/src/content/style.css b/src/content/style.css
index dbd7967..6c69152 100644
--- a/src/content/style.css
+++ b/src/content/style.css
@@ -1,11 +1,20 @@
:root {
- --color-fg: black;
- --color-bg: white;
- --color-2nd-fg: #555555;
- --color-2nd-bg: #f5f5f5;
- --color-pre-border: hsla(0, 100%, 0%, 30%);
+ --color-fg: #171D1A;
+ --color-bg: #F3F5F3;
+ --color-2nd-fg: #4A5651;
+ --color-2nd-bg: #E9EDEA;
+ --color-3rd-fg: #6F7B76;
+ --color-line: #CBD3CE;
+ --color-line-soft: #DDE3DF;
+ --color-accent: #1F6F5B;
+ --color-accent-soft: #D8E9E2;
+ --color-ochre: #9A6B1F;
+ --color-code-bg: #E6EBE8;
+ --color-pre-border: #CBD3CE;
- --link-url: url(img/link/light.svg);
+ --font-body: sans-serif;
+ --font-display: serif;
+ --font-mono: monospace;
color: var(--color-fg);
background-color: var(--color-bg);
@@ -13,29 +22,59 @@
@media (prefers-color-scheme: dark) {
:root {
- --color-fg: white;
- --color-bg: black;
- --color-2nd-fg: #aaaaaa;
- --color-2nd-bg: #222222;
- --color-pre-border: hsla(50, 100%, 70%, 10%);
-
- --link-url: url(img/link/dark.svg);
+ --color-fg: #E4EAE7;
+ --color-bg: #121716;
+ --color-2nd-fg: #A7B3AE;
+ --color-2nd-bg: #19201E;
+ --color-3rd-fg: #7E8A85;
+ --color-line: #2C3733;
+ --color-line-soft: #222B28;
+ --color-accent: #5CC2A2;
+ --color-accent-soft: #1B3A31;
+ --color-ochre: #D9A85A;
+ --color-code-bg: #1C2522;
+ --color-pre-border: #2C3733;
}
+}
- a {
- color: hsl(211, 100%, 60%);
- &:visited {
- color: hsl(242, 100%, 80%);
- }
- }
+a {
+ color: var(--color-accent);
+}
+
+a:visited {
+ color: var(--color-accent);
}
+
/* General declarations */
body {
margin: 0px auto;
padding: 1%;
- max-width: 750px;
+ max-width: 68ch;
+ font-family: var(--font-body);
+ font-size: 17px;
+ line-height: 1.6;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: var(--font-display);
+ font-weight: 500;
+ line-height: 1.2;
+ text-wrap: balance;
+}
+
+h1 { font-size: 39px; }
+h2 { font-size: 31px; }
+h3 { font-size: 25px; }
+h4, h5, h6 { font-size: 20px; }
+
+code, pre, .mono {
+ font-family: var(--font-mono);
+}
+
+code {
+ background-color: var(--color-code-bg);
}
.icon {
@@ -52,28 +91,74 @@ header {
padding: 12px 0px 12px 0px;
}
-nav .nav-row {
+nav, nav ol {
display: flex;
flex-direction: row;
- justify-content: space-between;
flex-wrap: wrap;
+ align-items: center;
+}
+
+nav ol {
+ list-style: none;
+ margin: 0px;
+ padding: 0px;
}
+
nav a {
font-size: 18px;
margin: 12px;
text-decoration: none;
}
-nav ul, nav li {
- display: inline;
+nav a img {
+ width: 32px;
+ height: 32px;
+}
+
+nav ol.languages {
+ margin-left: auto;
}
-nav ul li a {
+nav ol.languages a, nav ol.languages li {
+ font-family: var(--font-mono);
font-size: 14px;
margin: 6px;
}
+nav ol.languages li {
+ color: var(--color-fg);
+}
+
+nav ol.languages a,
+nav ol.languages a:visited {
+ color: var(--color-2nd-fg);
+}
+
+nav ol.languages a:hover {
+ color: var(--color-fg);
+}
+
+#tagline {
+ margin: 0px 12px 6px 12px;
+ font-size: 14px;
+ color: var(--color-2nd-fg);
+}
+
+
+/* A published recording */
+
+#media video, #media audio {
+ width: 100%;
+ max-width: 100%;
+}
+
+#media-links {
+ font-family: var(--font-mono);
+ font-size: 14px;
+ color: var(--color-2nd-fg);
+}
+
/* Article bodies */
@@ -121,6 +206,28 @@ body > footer li a {
+table.tableblock {
+ border-collapse: collapse;
+ margin: 16px 0px;
+}
+
+table.tableblock td, table.tableblock th {
+ text-align: left;
+ vertical-align: top;
+ padding: 6px 24px 6px 0px;
+ border-bottom: 1px solid var(--color-line-soft);
+}
+
+table.tableblock th {
+ color: var(--color-2nd-fg);
+ font-size: 14px;
+}
+
+table.tableblock p {
+ margin: 0px;
+}
+
+
/* Code blocks */
/* The "lineno" class is the default generated by Rouge for table-row in code blocks, see:
@@ -138,7 +245,7 @@ pre.lineno {
border: 1px solid;
border-color: var(--color-pre-border);
border-radius: 10px;
- background-color: var(--color-2nd-bg);
+ background-color: var(--color-code-bg);
}
pre {
@@ -192,11 +299,11 @@ div.header-anchor:hover img {
.plaintext {
margin: auto auto 0 auto;
text-align: right;
- font-family: monospace;
+ font-family: var(--font-mono);
}
a.anchor {
- background: transparent var(--link-url) center right no-repeat;
+ background: transparent url(img/link.svg) center right no-repeat;
padding-right: 22px;
margin-left: 10px;
visibility: hidden;
@@ -212,3 +319,60 @@ h2:hover a.anchor {
.line-through {
text-decoration: line-through;
}
+
+
+#comments .message {
+ background-color: var(--color-2nd-bg);
+ border: 1px solid;
+ border-color: var(--color-pre-border);
+ border-radius: 10px;
+ padding: 0.5rem 1rem;
+ margin-bottom: 1rem;
+ margin-left: 9rem;
+}
+
+#comments .message[data-depth="0"] { margin-left: 0; }
+#comments .message[data-depth="1"] { margin-left: 1rem; }
+#comments .message[data-depth="2"] { margin-left: 2rem; }
+#comments .message[data-depth="3"] { margin-left: 3rem; }
+#comments .message[data-depth="4"] { margin-left: 4rem; }
+#comments .message[data-depth="5"] { margin-left: 5rem; }
+#comments .message[data-depth="6"] { margin-left: 6rem; }
+#comments .message[data-depth="7"] { margin-left: 7rem; }
+#comments .message[data-depth="8"] { margin-left: 8rem; }
+
+#comments .message-header {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 0 1rem;
+ font-size: 0.9em;
+}
+
+#comments .from {
+ font-weight: bold;
+}
+
+#comments .date, #comments .reply, #comments .handle {
+ color: var(--color-2nd-fg);
+}
+
+#comments .handle {
+ font-weight: normal;
+}
+
+#comments .message-body {
+ background-color: transparent;
+ border: none;
+ overflow-wrap: anywhere;
+ font-size: 0.9em;
+}
+
+#comments pre.message-body { white-space: pre-wrap; }
+#comments div.message-body p { margin: 0.5em 0; }
+#comments div.message-body p:first-child { margin-top: 0; }
+#comments div.message-body p:last-child { margin-bottom: 0; }
+
+@media (max-width: 40rem) {
+ #comments .message[data-depth] { margin-left: 0; }
+}