summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--en/index.org12
-rw-r--r--en/pgp.org71
-rw-r--r--fi/blog/post.org6
-rw-r--r--fi/blog/sivujen-uudistus.org6
-rw-r--r--generated/en/index.html (renamed from generated/fi/blog/post.html)33
-rw-r--r--generated/en/pgp.html300
-rw-r--r--generated/fi/blog/index.html10
-rw-r--r--generated/fi/blog/sivujen-uudistus.html14
-rw-r--r--generated/fi/index.html4
-rw-r--r--generated/fi/pgp.html4
-rw-r--r--lisp/org-publish-project-alist.el33
11 files changed, 440 insertions, 53 deletions
diff --git a/en/index.org b/en/index.org
new file mode 100644
index 0000000..9480e6f
--- /dev/null
+++ b/en/index.org
@@ -0,0 +1,12 @@
+#+TITLE: Joel Kronqvist
+
+Welcome to my website!
+
+I don't publish as much content in English on the web, except much of
+my programming related content. I've also got a gemini capsule for you
+all in English at gemini://cron4.fi. My contact information can be
+found there if you need it.
+
+Also, in case you want to send me encrypted messages or verify that I
+have indeed signed a file, you can find my public key & its
+fingerprint [[./pgp.org][here]].
diff --git a/en/pgp.org b/en/pgp.org
new file mode 100644
index 0000000..c9c348e
--- /dev/null
+++ b/en/pgp.org
@@ -0,0 +1,71 @@
+#+TITLE: Public key
+
+The fingerprint for my public PGP key is
+~24F59B15EB13A69D492C300601B3DAEDABD96CE1~. I made a new one because I
+wanted to change the email address of my key.
+
+The fingerprint for my old public PGP key is ~F22B A88D F67A FB49 8132
+AC53 69B8 EC65 C24F F905~. I'm keeping it around so that you can
+verify my old signatures too.
+
+I use a separate public key for email because I'm not in (total)
+control of my own inbox. I would maintain my own email if residential
+router IP:s weren't blacklisted so often. It's fingerprint is ~7A8C
+ECCF 8023 A9D8 D00D BC3B 4437 C378 B657 8281~.
+
+Download my public keys from the following links:
+
+pub.key
+
+My public key
+
+old.key
+
+My old public key
+
+email.key
+
+The public key I use with email
+
+Below there is proof that my new key is legitimate assuming you already trusted my old key.
+
+#+BEGIN_EXAMPLE
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+I am changing my public key, because the old public key is
+linked to my old email address. The new public key can be
+found below:
+- -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mDMEZivN8RYJKwYBBAHaRw8BAQdAHxQcAENh/OfG/3A/X+0Zs5nSOUjmTMpLHy7W
+2XRyqgq0JkpvZWwgS3JvbnF2aXN0IDxqb2VsLmtyb25xdmlzdEBpa2kuZmk+iJkE
+ExYKAEEWIQQk9ZsV6xOmnUksMAYBs9rtq9ls4QUCZivN8QIbAwUJBaOagAULCQgH
+AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRABs9rtq9ls4VmKAP4h7pxmb8lMgCio
+Sn6rn177lOcKQodsZcNzq8TyqXx6FAD9HIDS4jpGkPdTsNbXRxK1nBRsq5MPiyOI
+AbGPPbcjnQS4OARmK83xEgorBgEEAZdVAQUBAQdA7dkcebHE/H2249hFHUjrmPah
+nq65OK6rRwf4ieSlDGEDAQgHiH4EGBYKACYWIQQk9ZsV6xOmnUksMAYBs9rtq9ls
+4QUCZivN8QIbDAUJBaOagAAKCRABs9rtq9ls4ZloAP4o838aekHlVhFEUqa0gTPA
+LZ3/Renv/eY1GWIlcL5WVAD/fv1ODo8vWTo8X6h/WTOs0podVa15IPtNVEE6iy7x
+Zws=
+=7jRS
+- -----END PGP PUBLIC KEY BLOCK-----
+Its fingerprint is 24F59B15EB13A69D492C300601B3DAEDABD96CE1.
+The date today is 2024-04-26. If there is a newer public key
+somewhere signed by me (which I also state to be mine, with the
+statement signed too), use it.
+-----BEGIN PGP SIGNATURE-----
+
+iQGzBAEBCAAdFiEE8iuojfZ6+0mBMqxTabjsZcJP+QUFAmYr0BQACgkQabjsZcJP
++QWOVgwAkcKIwM9WE/cZrnFnIo1COZJ3e6ReCaiJojOJ/KYL1xY7wML3Kyd8aKM2
+Jr7Si8Ad8Be8KOZDrwNsyyoJt4/VIbXgvUJ2h7kHm0zBggzD8mZMYZ5Dll48hQXT
+nZ1SK4LPAqOJ7JBYsOOo/+3qCZo3Cgn5QtdO+Zy1QReelcKVnZkjloyl/YZi/cSc
+yCch3GT2PCVYPmDcc3+qUQaZwVqPG8ZjSwgIkQO+TfBD7PZ/Qdnj2XkjIVIbnfNC
+aEqTKjB8na9DiPWeWGHxHT0J2bKVlmxvAm+faEwKMjcn3Z8OPpDZUhIiRou+zSut
+opfZYGC5Jg1cay+4Qa/LoxVQkgTLgBveg3VKwz4aoTc8ClHGlWdrs8twQzRDz4mj
+v2SXO4gT+JWm0Ul25+IG4zDoLZcUN3XNJ6u0XyG3DPpq2FO+7RQu3KuvmtYWRpZj
+Aevs9Y8rJAMz16zA3GGYkwM7kc7TUsSZ5ROarg5YHA6Cmljui5mknjOQbrmcTt0r
++IsgrjIo
+=x97d
+-----END PGP SIGNATURE-----
+#+END_EXAMPLE
diff --git a/fi/blog/post.org b/fi/blog/post.org
deleted file mode 100644
index 3f385cd..0000000
--- a/fi/blog/post.org
+++ /dev/null
@@ -1,6 +0,0 @@
-#+TITLE: Test-post-title
-#+SUBTITLE: Test subtitle
-
-* Test post
-
-This is a test org post.
diff --git a/fi/blog/sivujen-uudistus.org b/fi/blog/sivujen-uudistus.org
index 9c81e5c..7a1932e 100644
--- a/fi/blog/sivujen-uudistus.org
+++ b/fi/blog/sivujen-uudistus.org
@@ -1,8 +1,10 @@
#+TITLE: Verkkosivujeni uudistus
+#+SUBTITLE: Mitä sivuilleni on tapahtunut ja miksi
-* TODO Päivitä sivut loppuun [0/5]
+* TODO Päivitä sivut loppuun [1/6]
- [ ] Lisää git-tietosäilöt, erityisesti sivujen koodi
- [ ] Selitä muutokset täällä ja englanninkielisellä puolella
-- [ ] Luo englanninkielinen puoli
+- [X] Luo englanninkielinen puoli
+- [ ] Lisää julkinen avain & linkkaa ne (sekä fi+en)
- [ ] Tyylittele linkkilistat
- [ ] Aseta blogin indeksi aikajärjestykseen
diff --git a/generated/fi/blog/post.html b/generated/en/index.html
index 575af71..e733e07 100644
--- a/generated/fi/blog/post.html
+++ b/generated/en/index.html
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(en . Skip to content)" xml:lang="(en . Skip to content)">
<head>
-<!-- 2026-06-14 Sun 12:20 -->
+<!-- 2026-06-14 Sun 15:06 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
-<title>Test-post-title</title>
+<title>Joel Kronqvist</title>
<meta name="author" content="Joel Kronqvist" />
<meta name="generator" content="Org Mode" />
<style type="text/css">
@@ -198,23 +198,28 @@
<body>
<div id="preamble" class="status">
<header>
-<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a id="skiptocontent" href="#content">Skip to content</a>
<a href="/fi/">FI</a> · <a href="/en/">EN</a>
</header>
</div>
<div id="content" class="content">
-<h1 class="title">Test-post-title
-<br />
-<span class="subtitle">Test subtitle</span>
-</h1>
-<div id="outline-container-orgbd54fd1" class="outline-2">
-<h2 id="orgbd54fd1">Test post</h2>
-<div class="outline-text-2" id="text-orgbd54fd1">
+<h1 class="title">Joel Kronqvist</h1>
<p>
-This is a test org post.
+Welcome to my website!
+</p>
+
+<p>
+I don't publish as much content in English on the web, except much of
+my programming related content. I've also got a gemini capsule for you
+all in English at gemini://cron4.fi. My contact information can be
+found there if you need it.
+</p>
+
+<p>
+Also, in case you want to send me encrypted messages or verify that I
+have indeed signed a file, you can find my public key &amp; its
+fingerprint <a href="./pgp.html">here</a>.
</p>
-</div>
-</div>
</div>
</body>
</html>
diff --git a/generated/en/pgp.html b/generated/en/pgp.html
new file mode 100644
index 0000000..af9e093
--- /dev/null
+++ b/generated/en/pgp.html
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(en . Skip to content)" xml:lang="(en . Skip to content)">
+<head>
+<!-- 2026-06-14 Sun 15:06 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Public key</title>
+<meta name="author" content="Joel Kronqvist" />
+<meta name="generator" content="Org Mode" />
+<style type="text/css">
+ #content { max-width: 60em; margin: auto; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ top: -8px;
+ right: 12px;
+ padding: 3px;
+ color: #555;
+ background-color: #f2f2f299;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { }
+</style>
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
+</head>
+<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Skip to content</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
+<div id="content" class="content">
+<h1 class="title">Public key</h1>
+<p>
+The fingerprint for my public PGP key is
+<code>24F59B15EB13A69D492C300601B3DAEDABD96CE1</code>. I made a new one because I
+wanted to change the email address of my key.
+</p>
+
+<p>
+The fingerprint for my old public PGP key is <code>F22B A88D F67A FB49 8132
+AC53 69B8 EC65 C24F F905</code>. I'm keeping it around so that you can
+verify my old signatures too.
+</p>
+
+<p>
+I use a separate public key for email because I'm not in (total)
+control of my own inbox. I would maintain my own email if residential
+router IP:s weren't blacklisted so often. It's fingerprint is <code>7A8C
+ECCF 8023 A9D8 D00D BC3B 4437 C378 B657 8281</code>.
+</p>
+
+<p>
+Download my public keys from the following links:
+</p>
+
+<p>
+pub.key
+</p>
+
+<p>
+My public key
+</p>
+
+<p>
+old.key
+</p>
+
+<p>
+My old public key
+</p>
+
+<p>
+email.key
+</p>
+
+<p>
+The public key I use with email
+</p>
+
+<p>
+Below there is proof that my new key is legitimate assuming you already trusted my old key.
+</p>
+
+<pre class="example" id="org8e8c24d">
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+I am changing my public key, because the old public key is
+linked to my old email address. The new public key can be
+found below:
+- -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mDMEZivN8RYJKwYBBAHaRw8BAQdAHxQcAENh/OfG/3A/X+0Zs5nSOUjmTMpLHy7W
+2XRyqgq0JkpvZWwgS3JvbnF2aXN0IDxqb2VsLmtyb25xdmlzdEBpa2kuZmk+iJkE
+ExYKAEEWIQQk9ZsV6xOmnUksMAYBs9rtq9ls4QUCZivN8QIbAwUJBaOagAULCQgH
+AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRABs9rtq9ls4VmKAP4h7pxmb8lMgCio
+Sn6rn177lOcKQodsZcNzq8TyqXx6FAD9HIDS4jpGkPdTsNbXRxK1nBRsq5MPiyOI
+AbGPPbcjnQS4OARmK83xEgorBgEEAZdVAQUBAQdA7dkcebHE/H2249hFHUjrmPah
+nq65OK6rRwf4ieSlDGEDAQgHiH4EGBYKACYWIQQk9ZsV6xOmnUksMAYBs9rtq9ls
+4QUCZivN8QIbDAUJBaOagAAKCRABs9rtq9ls4ZloAP4o838aekHlVhFEUqa0gTPA
+LZ3/Renv/eY1GWIlcL5WVAD/fv1ODo8vWTo8X6h/WTOs0podVa15IPtNVEE6iy7x
+Zws=
+=7jRS
+- -----END PGP PUBLIC KEY BLOCK-----
+Its fingerprint is 24F59B15EB13A69D492C300601B3DAEDABD96CE1.
+The date today is 2024-04-26. If there is a newer public key
+somewhere signed by me (which I also state to be mine, with the
+statement signed too), use it.
+-----BEGIN PGP SIGNATURE-----
+
+iQGzBAEBCAAdFiEE8iuojfZ6+0mBMqxTabjsZcJP+QUFAmYr0BQACgkQabjsZcJP
++QWOVgwAkcKIwM9WE/cZrnFnIo1COZJ3e6ReCaiJojOJ/KYL1xY7wML3Kyd8aKM2
+Jr7Si8Ad8Be8KOZDrwNsyyoJt4/VIbXgvUJ2h7kHm0zBggzD8mZMYZ5Dll48hQXT
+nZ1SK4LPAqOJ7JBYsOOo/+3qCZo3Cgn5QtdO+Zy1QReelcKVnZkjloyl/YZi/cSc
+yCch3GT2PCVYPmDcc3+qUQaZwVqPG8ZjSwgIkQO+TfBD7PZ/Qdnj2XkjIVIbnfNC
+aEqTKjB8na9DiPWeWGHxHT0J2bKVlmxvAm+faEwKMjcn3Z8OPpDZUhIiRou+zSut
+opfZYGC5Jg1cay+4Qa/LoxVQkgTLgBveg3VKwz4aoTc8ClHGlWdrs8twQzRDz4mj
+v2SXO4gT+JWm0Ul25+IG4zDoLZcUN3XNJ6u0XyG3DPpq2FO+7RQu3KuvmtYWRpZj
+Aevs9Y8rJAMz16zA3GGYkwM7kc7TUsSZ5ROarg5YHA6Cmljui5mknjOQbrmcTt0r
++IsgrjIo
+=x97d
+-----END PGP SIGNATURE-----
+</pre>
+</div>
+</body>
+</html>
diff --git a/generated/fi/blog/index.html b/generated/fi/blog/index.html
index a90b024..42efc62 100644
--- a/generated/fi/blog/index.html
+++ b/generated/fi/blog/index.html
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(fi . Siirry pääsisältöön)" xml:lang="(fi . Siirry pääsisältöön)">
<head>
-<!-- 2026-06-14 Sun 12:20 -->
+<!-- 2026-06-14 Sun 15:06 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Blogin sisällys</title>
@@ -212,11 +212,7 @@
</colgroup>
<tbody>
<tr>
-<td class="org-left"><a href="./post.html">Test-post-title</a> (2026-06-12) Test subtitle</td>
-</tr>
-
-<tr>
-<td class="org-left"><a href="./sivujen-uudistus.html">Verkkosivujeni uudistus</a> (2026-06-14) Alaotsikkoa ei saatavilla</td>
+<td class="org-left"><a href="./sivujen-uudistus.html">Verkkosivujeni uudistus</a> (2026-06-14) Mitä sivuilleni on tapahtunut ja miksi</td>
</tr>
<tr>
diff --git a/generated/fi/blog/sivujen-uudistus.html b/generated/fi/blog/sivujen-uudistus.html
index bdf59e4..bc61acd 100644
--- a/generated/fi/blog/sivujen-uudistus.html
+++ b/generated/fi/blog/sivujen-uudistus.html
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(fi . Siirry pääsisältöön)" xml:lang="(fi . Siirry pääsisältöön)">
<head>
-<!-- 2026-06-14 Sun 12:20 -->
+<!-- 2026-06-14 Sun 15:06 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Verkkosivujeni uudistus</title>
@@ -203,14 +203,18 @@
</header>
</div>
<div id="content" class="content">
-<h1 class="title">Verkkosivujeni uudistus</h1>
+<h1 class="title">Verkkosivujeni uudistus
+<br />
+<span class="subtitle">Mitä sivuilleni on tapahtunut ja miksi</span>
+</h1>
<div id="outline-container-org94b1e2e" class="outline-2">
-<h2 id="org94b1e2e"><span class="todo TODO">TODO</span> Päivitä sivut loppuun <code>[0/5]</code></h2>
+<h2 id="org94b1e2e"><span class="todo TODO">TODO</span> Päivitä sivut loppuun <code>[1/6]</code></h2>
<div class="outline-text-2" id="text-org94b1e2e">
<ul class="org-ul">
<li class="off"><code>[&#xa0;]</code> Lisää git-tietosäilöt, erityisesti sivujen koodi</li>
<li class="off"><code>[&#xa0;]</code> Selitä muutokset täällä ja englanninkielisellä puolella</li>
-<li class="off"><code>[&#xa0;]</code> Luo englanninkielinen puoli</li>
+<li class="on"><code>[X]</code> Luo englanninkielinen puoli</li>
+<li class="off"><code>[&#xa0;]</code> Lisää julkinen avain &amp; linkkaa ne (sekä fi+en)</li>
<li class="off"><code>[&#xa0;]</code> Tyylittele linkkilistat</li>
<li class="off"><code>[&#xa0;]</code> Aseta blogin indeksi aikajärjestykseen</li>
</ul>
diff --git a/generated/fi/index.html b/generated/fi/index.html
index f1a1013..a98bce3 100644
--- a/generated/fi/index.html
+++ b/generated/fi/index.html
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(fi . Siirry pääsisältöön)" xml:lang="(fi . Siirry pääsisältöön)">
<head>
-<!-- 2026-06-14 Sun 12:20 -->
+<!-- 2026-06-14 Sun 15:06 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Joel Kronqvist</title>
diff --git a/generated/fi/pgp.html b/generated/fi/pgp.html
index 32e3173..bcb281a 100644
--- a/generated/fi/pgp.html
+++ b/generated/fi/pgp.html
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="(fi . Siirry pääsisältöön)" xml:lang="(fi . Siirry pääsisältöön)">
<head>
-<!-- 2026-06-14 Sun 12:20 -->
+<!-- 2026-06-14 Sun 15:06 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Julkinen avaimeni</title>
diff --git a/lisp/org-publish-project-alist.el b/lisp/org-publish-project-alist.el
index c65f8f0..0461aed 100644
--- a/lisp/org-publish-project-alist.el
+++ b/lisp/org-publish-project-alist.el
@@ -18,22 +18,25 @@ org-html-publish-to-html, otherwise use org-pubish-attachment."
(let ((root "~/Documents/orgsite/") (generated "generated/"))
(setq org-publish-project-alist
(nconc
- `(("fi"
- :base-directory ,(concat root "fi")
- :publishing-directory ,(concat root generated "fi")
- :base-extension any
- :exclude ".*~"
- :recursive t
- :publishing-function org-html-publish-or-copy
- :html-head-extra "<link rel=\"stylesheet\"type=\"text/css\" href=\"../../static/global.css\">"
- :html-postamble nil
- :html-preamble "<header>
-<a id=\"skiptocontent\" href=\"#content\">Siirry pääsisältöön</a>
+ (seq-map (lambda (lang)
+ `(,(car lang)
+ :base-directory ,(concat root (car lang))
+ :publishing-directory ,(concat root generated (car lang))
+ :base-extension any
+ :exclude ".*~"
+ :recursive t
+ :publishing-function org-html-publish-or-copy
+ :html-head-extra "<link rel=\"stylesheet\"type=\"text/css\" href=\"../../static/global.css\">"
+ :html-postamble nil
+ :html-preamble ,(concat "<header>
+<a id=\"skiptocontent\" href=\"#content\">" (cdr lang) "</a>
<a href=\"/fi/\">FI</a> · <a href=\"/en/\">EN</a>
-</header>"
- :with-toc nil
- :section-numbers nil
- :language "fi"))
+</header>")
+ :with-toc nil
+ :section-numbers nil
+ :author "Joel Kronqvist"
+ :language ,lang))
+ '(("fi" . "Siirry pääsisältöön") ("en" . "Skip to content")))
(seq-map (lambda (ident)
`(,ident
:base-directory ,(concat root ident)