add files - www.codemadness.org - www.codemadness.org saait content files
 (HTM) git clone git://git.codemadness.org/www.codemadness.org
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 47022e7faf705fa6125141b4c287ad0cd6b33b2a
 (DIR) parent b161469566524336ec669af12ec1fd5c312dfdf0
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Thu, 11 Aug 2022 13:43:59 +0200
       
       add files
       
       Diffstat:
         A output/2fa-totp.html                |      98 +++++++++++++++++++++++++++++++
         A output/2fa-totp.md                  |      57 +++++++++++++++++++++++++++++++
         A output/downloads/2fa/qr.png         |       0 
         A output/openbsd-riscv64-vm.html      |     128 +++++++++++++++++++++++++++++++
         A output/openbsd-riscv64-vm.md        |      79 +++++++++++++++++++++++++++++++
         A output/phlog/2fa-totp               |      65 +++++++++++++++++++++++++++++++
         A output/phlog/openbsd-riscv64-vm     |      87 +++++++++++++++++++++++++++++++
         A output/phlog/rss                    |     252 +++++++++++++++++++++++++++++++
         A output/phlog/todo                   |       2 ++
         A output/phlog/todo-application       |     104 +++++++++++++++++++++++++++++++
         A output/phlog/totp                   |      65 +++++++++++++++++++++++++++++++
         A output/todo-application.html        |     126 +++++++++++++++++++++++++++++++
         A output/todo-application.md          |      96 +++++++++++++++++++++++++++++++
         A output/todo.html                    |       2 ++
         A output/totp.html                    |      98 +++++++++++++++++++++++++++++++
         A output/totp.md                      |      57 +++++++++++++++++++++++++++++++
         A pages/todo-application.cfg          |       6 ++++++
         A pages/todo-application.md           |      96 +++++++++++++++++++++++++++++++
         A pages/totp.cfg                      |       6 ++++++
         A pages/totp.md                       |      57 +++++++++++++++++++++++++++++++
       
       20 files changed, 1481 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/output/2fa-totp.html b/output/2fa-totp.html
       @@ -0,0 +1,98 @@
       +<!DOCTYPE html>
       +<html dir="ltr" lang="en">
       +<head>
       +        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       +        <meta http-equiv="Content-Language" content="en" />
       +        <meta name="viewport" content="width=device-width" />
       +        <meta name="keywords" content="oauthtool, zbarimg, totp, 2FA, authenticator" />
       +        <meta name="description" content="Using 2FA TOTP without crappy authenticator apps" />
       +        <meta name="author" content="Hiltjo" />
       +        <meta name="generator" content="Static content generated using saait: https://codemadness.org/saait.html" />
       +        <title>2FA TOTP without crappy authenticator apps - Codemadness</title>
       +        <link rel="stylesheet" href="style.css" type="text/css" media="screen" />
       +        <link rel="stylesheet" href="print.css" type="text/css" media="print" />
       +        <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Codemadness Atom Feed" />
       +        <link rel="alternate" href="atom_content.xml" type="application/atom+xml" title="Codemadness Atom Feed with content" />
       +        <link rel="icon" href="/favicon.png" type="image/png" />
       +</head>
       +<body>
       +        <nav id="menuwrap">
       +                <table id="menu" width="100%" border="0">
       +                <tr>
       +                        <td id="links" align="left">
       +                                <a href="index.html">Blog</a> |
       +                                <a href="/git/" title="Git repository with some of my projects">Git</a> |
       +                                <a href="/releases/">Releases</a> |
       +                                <a href="gopher://codemadness.org">Gopherhole</a>
       +                        </td>
       +                        <td id="links-contact" align="right">
       +                                <span class="hidden"> | </span>
       +                                <a href="feeds.html">Feeds</a> |
       +                                <a href="pgp.asc">PGP</a> |
       +                                <a href="mailto:hiltjo@AT@codemadness.DOT.org">Mail</a>
       +                        </td>
       +                </tr>
       +                </table>
       +        </nav>
       +        <hr class="hidden" />
       +        <main id="mainwrap">
       +                <div id="main">
       +                        <article>
       +<header>
       +        <h1>2FA TOTP without crappy authenticator apps</h1>
       +        <p>
       +        <strong>Last modification on </strong> <time>2022-03-23</time>
       +        </p>
       +</header>
       +
       +<p>This describes how to use 2FA without using crappy authenticator "apps" or a
       +mobile device.</p>
       +<h2>Install</h2>
       +<p>On OpenBSD:</p>
       +<pre><code>pkg_add oath-toolkit zbar
       +</code></pre>
       +<ul>
       +<li>oath-toolkit is used to generate the digits based on the secret key.</li>
       +<li>zbar is used to scan the QR code text.</li>
       +</ul>
       +<h2>Steps</h2>
       +<p>Save the QR code image from the authenticator app, website to an image file.
       +Scan the QR code text from the image:</p>
       +<pre><code>zbarimg image.png
       +</code></pre>
       +<p>An example QR code:</p>
       +<p><img src="downloads/2fa/qr.png" alt="QR code example" /></p>
       +<p>The output is typically something like:</p>
       +<pre><code>QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&amp;issuer=Codemadness
       +</code></pre>
       +<p>You only need to scan this QR-code for the secret key once.
       +Make sure to store the secret key in a private safe place and don't show it to
       +anyone else.</p>
       +<p>Using the secret key the following command outputs a 6-digit code by default.
       +In this example we also assume the key is base32-encoded.
       +There can be other parameters and options, this is documented in the Yubico URI
       +string format reference below.</p>
       +<p>Command:</p>
       +<pre><code>oathtool --totp -b SOMEKEY
       +</code></pre>
       +<ul>
       +<li>The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.</li>
       +<li>The -b option use base32 encoding of KEY instead of hex.</li>
       +</ul>
       +<p>Tip: you can create a script that automatically puts the digits in the
       +clipboard, for example:</p>
       +<pre><code>oathtool --totp -b SOMEKEY | xclip
       +</code></pre>
       +<h2>References</h2>
       +<ul>
       +<li><a href="https://linux.die.net/man/1/zbarimg">zbarimg(1) man page</a></li>
       +<li><a href="https://www.nongnu.org/oath-toolkit/man-oathtool.html">oathtool(1) man page</a></li>
       +<li><a href="https://datatracker.ietf.org/doc/html/rfc6238">RFC6238 - TOTP: Time-Based One-Time Password Algorithm</a></li>
       +<li><a href="https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html">Yucibo.com - otpauth URI string format</a></li>
       +</ul>
       +
       +                        </article>
       +                </div>
       +        </main>
       +</body>
       +</html>
 (DIR) diff --git a/output/2fa-totp.md b/output/2fa-totp.md
       @@ -0,0 +1,57 @@
       +This describes how to use 2FA without using crappy authenticator "apps" or a
       +mobile device.
       +
       +
       +## Install
       +
       +On OpenBSD:
       +
       +        pkg_add oath-toolkit zbar
       +
       +* oath-toolkit is used to generate the digits based on the secret key.
       +* zbar is used to scan the QR code text.
       +
       +
       +## Steps
       +
       +Save the QR code image from the authenticator app, website to an image file.
       +Scan the QR code text from the image:
       +
       +        zbarimg image.png
       +
       +An example QR code:
       +
       +![QR code example](https://codemadness.org/downloads/2fa/qr.png)
       +
       +The output is typically something like:
       +
       +        QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&issuer=Codemadness
       +
       +You only need to scan this QR-code for the secret key once.
       +Make sure to store the secret key in a private safe place and don't show it to
       +anyone else.
       +
       +Using the secret key the following command outputs a 6-digit code by default.
       +In this example we also assume the key is base32-encoded.
       +There can be other parameters and options, this is documented in the Yubico URI
       +string format reference below.
       +
       +Command:
       +
       +        oathtool --totp -b SOMEKEY
       +
       +* The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.
       +* The -b option use base32 encoding of KEY instead of hex.
       +
       +Tip: you can create a script that automatically puts the digits in the
       +clipboard, for example:
       +
       +        oathtool --totp -b SOMEKEY | xclip
       +
       +
       +## References
       +
       +* [zbarimg(1) man page](https://linux.die.net/man/1/zbarimg)
       +* [oathtool(1) man page](https://www.nongnu.org/oath-toolkit/man-oathtool.html)
       +* [RFC6238 - TOTP: Time-Based One-Time Password Algorithm](https://datatracker.ietf.org/doc/html/rfc6238)
       +* [Yucibo.com - otpauth URI string format](https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html)
 (DIR) diff --git a/output/downloads/2fa/qr.png b/output/downloads/2fa/qr.png
       Binary files differ.
 (DIR) diff --git a/output/openbsd-riscv64-vm.html b/output/openbsd-riscv64-vm.html
       @@ -0,0 +1,128 @@
       +<!DOCTYPE html>
       +<html dir="ltr" lang="en">
       +<head>
       +        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       +        <meta http-equiv="Content-Language" content="en" />
       +        <meta name="viewport" content="width=device-width" />
       +        <meta name="keywords" content="OpenBSD, RISCV64, RISC-V, QEMU, vm" />
       +        <meta name="description" content="Setup an OpenBSD RISCV-64 VM in QEMU" />
       +        <meta name="author" content="Hiltjo" />
       +        <meta name="generator" content="Static content generated using saait: https://codemadness.org/saait.html" />
       +        <title>Setup an OpenBSD RISCV64 VM in QEMU - Codemadness</title>
       +        <link rel="stylesheet" href="style.css" type="text/css" media="screen" />
       +        <link rel="stylesheet" href="print.css" type="text/css" media="print" />
       +        <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Codemadness Atom Feed" />
       +        <link rel="alternate" href="atom_content.xml" type="application/atom+xml" title="Codemadness Atom Feed with content" />
       +        <link rel="icon" href="/favicon.png" type="image/png" />
       +</head>
       +<body>
       +        <nav id="menuwrap">
       +                <table id="menu" width="100%" border="0">
       +                <tr>
       +                        <td id="links" align="left">
       +                                <a href="index.html">Blog</a> |
       +                                <a href="/git/" title="Git repository with some of my projects">Git</a> |
       +                                <a href="/releases/">Releases</a> |
       +                                <a href="gopher://codemadness.org">Gopherhole</a>
       +                        </td>
       +                        <td id="links-contact" align="right">
       +                                <span class="hidden"> | </span>
       +                                <a href="feeds.html">Feeds</a> |
       +                                <a href="pgp.asc">PGP</a> |
       +                                <a href="mailto:hiltjo@AT@codemadness.DOT.org">Mail</a>
       +                        </td>
       +                </tr>
       +                </table>
       +        </nav>
       +        <hr class="hidden" />
       +        <main id="mainwrap">
       +                <div id="main">
       +                        <article>
       +<header>
       +        <h1>Setup an OpenBSD RISCV64 VM in QEMU</h1>
       +        <p>
       +        <strong>Last modification on </strong> <time>2021-10-26</time>
       +        </p>
       +</header>
       +
       +<p>This describes how to setup an OpenBSD RISCV64 VM in QEMU.</p>
       +<p>The shellscript below does the following:</p>
       +<ul>
       +<li>Set up the disk image (raw format).</li>
       +<li>Patch the disk image with the OpenBSD miniroot file for the installation.</li>
       +<li>Downloads the opensbi and u-boot firmware files for qemu.</li>
       +<li>Run the VM with the supported settings.</li>
       +</ul>
       +<p>The script is tested on the host GNU/Void Linux and OpenBSD-current.</p>
       +<p><strong>IMPORTANT!: The signature and checksum for the miniroot, u-boot and opensbi
       +files are not verified. If the host is OpenBSD make sure to instead install the
       +packages (pkg_add u-boot-riscv64 opensbi) and adjust the firmware path for the
       +qemu -bios and -kernel options. </strong></p>
       +<h2>Shellscript</h2>
       +<pre><code>#!/bin/sh
       +# mirror list: https://www.openbsd.org/ftp.html
       +mirror="https://ftp.bit.nl/pub/OpenBSD/"
       +release="7.0"
       +minirootname="miniroot70.img"
       +
       +miniroot() {
       +        test -f "${minirootname}" &amp;&amp; return # download once
       +
       +        url="${mirror}/${release}/riscv64/${minirootname}"
       +        curl -o "${minirootname}" "${url}"
       +}
       +
       +createrootdisk() {
       +        test -f disk.raw &amp;&amp; return # create once
       +        qemu-img create disk.raw 10G # create 10 GB disk
       +        dd conv=notrunc if=${minirootname} of=disk.raw # write miniroot to disk
       +}
       +
       +opensbi() {
       +        f="opensbi.tgz"
       +        test -f "${f}" &amp;&amp; return # download and extract once.
       +
       +        url="${mirror}/${release}/packages/amd64/opensbi-0.9p0.tgz"
       +        curl -o "${f}" "${url}"
       +
       +        tar -xzf "${f}" share/opensbi/generic/fw_jump.bin
       +}
       +
       +uboot() {
       +        f="uboot.tgz"
       +        test -f "${f}" &amp;&amp; return # download and extract once.
       +
       +        url="${mirror}/${release}/packages/amd64/u-boot-riscv64-2021.07p0.tgz"
       +        curl -o "${f}" "${url}"
       +
       +        tar -xzf "${f}" share/u-boot/qemu-riscv64_smode/u-boot.bin
       +}
       +
       +setup() {
       +        miniroot
       +        createrootdisk
       +        opensbi
       +        uboot
       +}
       +
       +run() {
       +        qemu-system-riscv64 \
       +                -machine virt \
       +                -nographic \
       +                -m 2048M \
       +                -smp 2 \
       +                -bios share/opensbi/generic/fw_jump.bin \
       +                -kernel share/u-boot/qemu-riscv64_smode/u-boot.bin \
       +                -drive file=disk.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
       +                -netdev user,id=net0,ipv6=off -device virtio-net-device,netdev=net0
       +}
       +
       +setup
       +run
       +</code></pre>
       +
       +                        </article>
       +                </div>
       +        </main>
       +</body>
       +</html>
 (DIR) diff --git a/output/openbsd-riscv64-vm.md b/output/openbsd-riscv64-vm.md
       @@ -0,0 +1,79 @@
       +This describes how to setup an OpenBSD RISCV64 VM in QEMU.
       +
       +The shellscript below does the following:
       +
       +* Set up the disk image (raw format).
       +* Patch the disk image with the OpenBSD miniroot file for the installation.
       +* Downloads the opensbi and u-boot firmware files for qemu.
       +* Run the VM with the supported settings.
       +
       +The script is tested on the host GNU/Void Linux and OpenBSD-current.
       +
       +**IMPORTANT!: The signature and checksum for the miniroot, u-boot and opensbi
       +files are not verified. If the host is OpenBSD make sure to instead install the
       +packages (pkg_add u-boot-riscv64 opensbi) and adjust the firmware path for the
       +qemu -bios and -kernel options. **
       +
       +
       +## Shellscript
       +
       +        #!/bin/sh
       +        # mirror list: https://www.openbsd.org/ftp.html
       +        mirror="https://ftp.bit.nl/pub/OpenBSD/"
       +        release="7.0"
       +        minirootname="miniroot70.img"
       +        
       +        miniroot() {
       +                test -f "${minirootname}" && return # download once
       +        
       +                url="${mirror}/${release}/riscv64/${minirootname}"
       +                curl -o "${minirootname}" "${url}"
       +        }
       +        
       +        createrootdisk() {
       +                test -f disk.raw && return # create once
       +                qemu-img create disk.raw 10G # create 10 GB disk
       +                dd conv=notrunc if=${minirootname} of=disk.raw # write miniroot to disk
       +        }
       +        
       +        opensbi() {
       +                f="opensbi.tgz"
       +                test -f "${f}" && return # download and extract once.
       +        
       +                url="${mirror}/${release}/packages/amd64/opensbi-0.9p0.tgz"
       +                curl -o "${f}" "${url}"
       +        
       +                tar -xzf "${f}" share/opensbi/generic/fw_jump.bin
       +        }
       +        
       +        uboot() {
       +                f="uboot.tgz"
       +                test -f "${f}" && return # download and extract once.
       +        
       +                url="${mirror}/${release}/packages/amd64/u-boot-riscv64-2021.07p0.tgz"
       +                curl -o "${f}" "${url}"
       +        
       +                tar -xzf "${f}" share/u-boot/qemu-riscv64_smode/u-boot.bin
       +        }
       +        
       +        setup() {
       +                miniroot
       +                createrootdisk
       +                opensbi
       +                uboot
       +        }
       +        
       +        run() {
       +                qemu-system-riscv64 \
       +                        -machine virt \
       +                        -nographic \
       +                        -m 2048M \
       +                        -smp 2 \
       +                        -bios share/opensbi/generic/fw_jump.bin \
       +                        -kernel share/u-boot/qemu-riscv64_smode/u-boot.bin \
       +                        -drive file=disk.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
       +                        -netdev user,id=net0,ipv6=off -device virtio-net-device,netdev=net0
       +        }
       +        
       +        setup
       +        run
 (DIR) diff --git a/output/phlog/2fa-totp b/output/phlog/2fa-totp
       @@ -0,0 +1,65 @@
       +1<- Back        /        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# 2FA TOTP without crappy authenticator apps                codemadness.org        70
       +i                codemadness.org        70
       +iLast modification on 2022-03-23                codemadness.org        70
       +i                codemadness.org        70
       +iThis describes how to use 2FA without using crappy authenticator "apps" or a                codemadness.org        70
       +imobile device.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Install                codemadness.org        70
       +i                codemadness.org        70
       +iOn OpenBSD:                codemadness.org        70
       +i                codemadness.org        70
       +i        pkg_add oath-toolkit zbar                codemadness.org        70
       +i                codemadness.org        70
       +i* oath-toolkit is used to generate the digits based on the secret key.                codemadness.org        70
       +i* zbar is used to scan the QR code text.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Steps                codemadness.org        70
       +i                codemadness.org        70
       +iSave the QR code image from the authenticator app, website to an image file.                codemadness.org        70
       +iScan the QR code text from the image:                codemadness.org        70
       +i                codemadness.org        70
       +i        zbarimg image.png                codemadness.org        70
       +i                codemadness.org        70
       +iAn example QR code:                codemadness.org        70
       +i                codemadness.org        70
       +IQR code example        /downloads/2fa/qr.png        codemadness.org        70
       +i                codemadness.org        70
       +iThe output is typically something like:                codemadness.org        70
       +i                codemadness.org        70
       +i        QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&issuer=Codemadness                codemadness.org        70
       +i                codemadness.org        70
       +iYou only need to scan this QR-code for the secret key once.                codemadness.org        70
       +iMake sure to store the secret key in a private safe place and don't show it to                codemadness.org        70
       +ianyone else.                codemadness.org        70
       +i                codemadness.org        70
       +iUsing the secret key the following command outputs a 6-digit code by default.                codemadness.org        70
       +iIn this example we also assume the key is base32-encoded.                codemadness.org        70
       +iThere can be other parameters and options, this is documented in the Yubico URI                codemadness.org        70
       +istring format reference below.                codemadness.org        70
       +i                codemadness.org        70
       +iCommand:                codemadness.org        70
       +i                codemadness.org        70
       +i        oathtool --totp -b SOMEKEY                codemadness.org        70
       +i                codemadness.org        70
       +i* The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.                codemadness.org        70
       +i* The -b option use base32 encoding of KEY instead of hex.                codemadness.org        70
       +i                codemadness.org        70
       +iTip: you can create a script that automatically puts the digits in the                codemadness.org        70
       +iclipboard, for example:                codemadness.org        70
       +i                codemadness.org        70
       +i        oathtool --totp -b SOMEKEY | xclip                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## References                codemadness.org        70
       +i                codemadness.org        70
       +h* zbarimg(1) man page        URL:https://linux.die.net/man/1/zbarimg        codemadness.org        70
       +h* oathtool(1) man page        URL:https://www.nongnu.org/oath-toolkit/man-oathtool.html        codemadness.org        70
       +h* RFC6238 - TOTP: Time-Based One-Time Password Algorithm        URL:https://datatracker.ietf.org/doc/html/rfc6238        codemadness.org        70
       +h* Yucibo.com - otpauth URI string format        URL:https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html        codemadness.org        70
       +.
 (DIR) diff --git a/output/phlog/openbsd-riscv64-vm b/output/phlog/openbsd-riscv64-vm
       @@ -0,0 +1,87 @@
       +1<- Back        /        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# Setup an OpenBSD RISCV64 VM in QEMU                codemadness.org        70
       +i                codemadness.org        70
       +iLast modification on 2021-10-26                codemadness.org        70
       +i                codemadness.org        70
       +iThis describes how to setup an OpenBSD RISCV64 VM in QEMU.                codemadness.org        70
       +i                codemadness.org        70
       +iThe shellscript below does the following:                codemadness.org        70
       +i                codemadness.org        70
       +i* Set up the disk image (raw format).                codemadness.org        70
       +i* Patch the disk image with the OpenBSD miniroot file for the installation.                codemadness.org        70
       +i* Downloads the opensbi and u-boot firmware files for qemu.                codemadness.org        70
       +i* Run the VM with the supported settings.                codemadness.org        70
       +i                codemadness.org        70
       +iThe script is tested on the host GNU/Void Linux and OpenBSD-current.                codemadness.org        70
       +i                codemadness.org        70
       +i**IMPORTANT!: The signature and checksum for the miniroot, u-boot and opensbi                codemadness.org        70
       +ifiles are not verified. If the host is OpenBSD make sure to instead install the                codemadness.org        70
       +ipackages (pkg_add u-boot-riscv64 opensbi) and adjust the firmware path for the                codemadness.org        70
       +iqemu -bios and -kernel options. **                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Shellscript                codemadness.org        70
       +i                codemadness.org        70
       +i        #!/bin/sh                codemadness.org        70
       +i        # mirror list: https://www.openbsd.org/ftp.html                codemadness.org        70
       +i        mirror="https://ftp.bit.nl/pub/OpenBSD/"                codemadness.org        70
       +i        release="7.0"                codemadness.org        70
       +i        minirootname="miniroot70.img"                codemadness.org        70
       +i                        codemadness.org        70
       +i        miniroot() {                codemadness.org        70
       +i                test -f "${minirootname}" && return # download once                codemadness.org        70
       +i                        codemadness.org        70
       +i                url="${mirror}/${release}/riscv64/${minirootname}"                codemadness.org        70
       +i                curl -o "${minirootname}" "${url}"                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        createrootdisk() {                codemadness.org        70
       +i                test -f disk.raw && return # create once                codemadness.org        70
       +i                qemu-img create disk.raw 10G # create 10 GB disk                codemadness.org        70
       +i                dd conv=notrunc if=${minirootname} of=disk.raw # write miniroot to disk                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        opensbi() {                codemadness.org        70
       +i                f="opensbi.tgz"                codemadness.org        70
       +i                test -f "${f}" && return # download and extract once.                codemadness.org        70
       +i                        codemadness.org        70
       +i                url="${mirror}/${release}/packages/amd64/opensbi-0.9p0.tgz"                codemadness.org        70
       +i                curl -o "${f}" "${url}"                codemadness.org        70
       +i                        codemadness.org        70
       +i                tar -xzf "${f}" share/opensbi/generic/fw_jump.bin                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        uboot() {                codemadness.org        70
       +i                f="uboot.tgz"                codemadness.org        70
       +i                test -f "${f}" && return # download and extract once.                codemadness.org        70
       +i                        codemadness.org        70
       +i                url="${mirror}/${release}/packages/amd64/u-boot-riscv64-2021.07p0.tgz"                codemadness.org        70
       +i                curl -o "${f}" "${url}"                codemadness.org        70
       +i                        codemadness.org        70
       +i                tar -xzf "${f}" share/u-boot/qemu-riscv64_smode/u-boot.bin                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        setup() {                codemadness.org        70
       +i                miniroot                codemadness.org        70
       +i                createrootdisk                codemadness.org        70
       +i                opensbi                codemadness.org        70
       +i                uboot                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        run() {                codemadness.org        70
       +i                qemu-system-riscv64 \                codemadness.org        70
       +i                        -machine virt \                codemadness.org        70
       +i                        -nographic \                codemadness.org        70
       +i                        -m 2048M \                codemadness.org        70
       +i                        -smp 2 \                codemadness.org        70
       +i                        -bios share/opensbi/generic/fw_jump.bin \                codemadness.org        70
       +i                        -kernel share/u-boot/qemu-riscv64_smode/u-boot.bin \                codemadness.org        70
       +i                        -drive file=disk.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \                codemadness.org        70
       +i                        -netdev user,id=net0,ipv6=off -device virtio-net-device,netdev=net0                codemadness.org        70
       +i        }                codemadness.org        70
       +i                        codemadness.org        70
       +i        setup                codemadness.org        70
       +i        run                codemadness.org        70
       +.
 (DIR) diff --git a/output/phlog/rss b/output/phlog/rss
       @@ -0,0 +1,252 @@
       +1<- Back        /        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# Using RSS/Atom feeds                codemadness.org        70
       +i                codemadness.org        70
       +iLast modification on 2022-04-18                codemadness.org        70
       +i                codemadness.org        70
       +iTODO:                codemadness.org        70
       +ix link to sfeed and sfeed_curses page                codemadness.org        70
       +ix link to curl page                codemadness.org        70
       +ix link to iconv manual or POSIX page?                codemadness.org        70
       +i- link to RSS2 latest adhoc spec?                codemadness.org        70
       +i- change luke smith links to eevblog or so?                codemadness.org        70
       +i- OPML: change links to codemadness and some youtube channels?                codemadness.org        70
       +i- change dxvk github link to yt-dlp or maybe openbsd?                codemadness.org        70
       +i                codemadness.org        70
       +i- peertube/oddyssee change link from luke smith?                codemadness.org        70
       +i- change OPML feed links.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i- section for website authors:                codemadness.org        70
       +i  - add an option for the full content Atom feed if possible.                codemadness.org        70
       +i  - please keep RSS/Atom alive.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## What is RSS/Atom and what problems does it solve?                codemadness.org        70
       +i                codemadness.org        70
       +iBoth are data formats in XML to store a list of feed entries, such as text or                codemadness.org        70
       +imedia items in a structured manner.                codemadness.org        70
       +i                codemadness.org        70
       +h* RSS is an evolving standard (and it is a bit vaguely defined sometimes).        URL:https://www.rssboard.org/rss-specification        codemadness.org        70
       +h* Atom is a RFC standardized format: "RFC4287 - The Atom Syndication Format"        URL:https://tools.ietf.org/html/rfc4287        codemadness.org        70
       +i                codemadness.org        70
       +iRSS/Atom is commonly used for:                codemadness.org        70
       +i* Keeping track of news from newssites (headlines and content).                codemadness.org        70
       +i* Keeping track of software releases.                codemadness.org        70
       +i* Listings of podcasts with maybe some .mp3 file attachment aka an enclosure.                codemadness.org        70
       +i* Bittorrent listings with a .torrent or magnet link.                codemadness.org        70
       +i                codemadness.org        70
       +iIn general this makes organizing and keeping track of content more structured                codemadness.org        70
       +iand convenient.  As a user you can more quickly filter interesting news and                codemadness.org        70
       +idon't have to use all the different site navigations.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## RSS/Atom formats and extensions                codemadness.org        70
       +i                codemadness.org        70
       +i* Atom 1.0 (RFC 4287): https://datatracker.ietf.org/doc/html/rfc4287                codemadness.org        70
       +i* Atom 0.3 (draft, historic): rarely used anymore.                codemadness.org        70
       +i* RSS 0.91+.                codemadness.org        70
       +i* RDF (when used with RSS).                codemadness.org        70
       +i* MediaRSS extensions (media:).                codemadness.org        70
       +i* Dublin Core extensions (dc:).                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Atom XML example                codemadness.org        70
       +i                codemadness.org        70
       +iThis is an example of the XML data format of an Atom feed. Typically there is                codemadness.org        70
       +iatleast a title, link and a timestamp, for example for the xkcd.com Atom feed                codemadness.org        70
       +iat https://xkcd.com/atom.xml:                codemadness.org        70
       +i                        codemadness.org        70
       +i        <?xml version="1.0" encoding="utf-8"?>                codemadness.org        70
       +i        <feed xml:lang="en">                codemadness.org        70
       +i                <title>xkcd.com</title> <!-- feed title -->                codemadness.org        70
       +i                <link href="https://xkcd.com/" rel="alternate"/>                codemadness.org        70
       +i                <id>https://xkcd.com/</id>                codemadness.org        70
       +i                <updated>2020-09-04T00:00:00Z</updated>                codemadness.org        70
       +i                        codemadness.org        70
       +i                <!-- items -->                codemadness.org        70
       +i                <entry>                codemadness.org        70
       +i                        <title>University COVID Model</title>                codemadness.org        70
       +i                        <link href="https://xkcd.com/2355/" />                codemadness.org        70
       +i                        <updated>2020-09-04T00:00:00Z</updated>                codemadness.org        70
       +i                        <id>https://xkcd.com/2355/</id>                codemadness.org        70
       +i                        <summary type="html">                codemadness.org        70
       +i                                <img src="https://imgs.xkcd.com/comics/somename.png "/>                codemadness.org        70
       +i                        </summary>                codemadness.org        70
       +i                </entry>                codemadness.org        70
       +i                <!-- ... more items. -->                codemadness.org        70
       +i        </feed>                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## General way to get a RSS/Atom feed                codemadness.org        70
       +i                codemadness.org        70
       +iA common way for websites to indicate they have RSS/Atom feeds is to have a                codemadness.org        70
       +ilink reference in the HTML code.                codemadness.org        70
       +i                codemadness.org        70
       +iFor Atom:                codemadness.org        70
       +i                codemadness.org        70
       +i        <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Codemadness Atom Feed" />                codemadness.org        70
       +i                codemadness.org        70
       +ior for RSS:                codemadness.org        70
       +i                codemadness.org        70
       +i        <link rel="alternate" href="rss.xml" type="application/rss+xml" title="Codemadness RSS Feed" />                codemadness.org        70
       +i                codemadness.org        70
       +hThe »sfeed_web« tool can also help with these sort of feeds and        /sfeed.html        codemadness.org        70
       +iextract the URLs from a HTML page:                codemadness.org        70
       +i                codemadness.org        70
       +i        url="https://codemadness.org"; curl -s "$url" | sfeed_web "$url"                codemadness.org        70
       +i                codemadness.org        70
       +iThe Firefox webbrowser used to show an icon to indicate it has a RSS/Atom.                codemadness.org        70
       +iUnfortunately browsers nowadays don't show this anymore by default.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Websites                codemadness.org        70
       +i                codemadness.org        70
       +i### Github                codemadness.org        70
       +i                codemadness.org        70
       +iGithub offers an Atom feed of releases and of commits.                codemadness.org        70
       +i                codemadness.org        70
       +h* Releases        URL:https://github.com/yt-dlp/yt-dlp/releases.atom        codemadness.org        70
       +h* Tags        URL:https://github.com/yt-dlp/yt-dlp/tags.atom        codemadness.org        70
       +h* »Commits«: by adding        URL:https://github.com/yt-dlp/yt-dlp/commits/master.atom        codemadness.org        70
       +i  ".atom" to the URI you can get the Atom feed.                codemadness.org        70
       +i                codemadness.org        70
       +iUnfortunately it doesn't offer a way to get a feed of issues directly. It can                codemadness.org        70
       +ihowever be done using the public API and a conversion script:                codemadness.org        70
       +i                codemadness.org        70
       +1https://git.codemadness.org/randomcrap/file/config/sfeed/connectors/github.html        /git/randomcrap/file/config/sfeed/connectors/github.gph        codemadness.org        70
       +i                codemadness.org        70
       +iGithub API documentation reference:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://docs.github.com/en/rest/reference/issues        URL:https://docs.github.com/en/rest/reference/issues        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Peertube                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://videos.lukesmith.xyz/feeds/videos.xml?videoChannelId=2        URL:https://videos.lukesmith.xyz/feeds/videos.xml?videoChannelId=2        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Odysee / LBRY                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://odysee.com/$/rss/@Luke/70        URL:https://odysee.com/$/rss/@Luke/70        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Reddit                codemadness.org        70
       +i                codemadness.org        70
       +iBy adding ".rss" to the URI you can get the RSS feed:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://old.reddit.com/r/openbsd/.rss        URL:https://old.reddit.com/r/openbsd/.rss        codemadness.org        70
       +i                codemadness.org        70
       +iSome parameters can be changed. This is described in the Reddit API                codemadness.org        70
       +hdocumentation: »https://www.reddit.com/dev/api/«        URL:https://www.reddit.com/dev/api/        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Vimeo                codemadness.org        70
       +i                codemadness.org        70
       +iHere is a Vimeo connector script that converts data from the public JSON API to                codemadness.org        70
       +ian Atom feed:                codemadness.org        70
       +i                codemadness.org        70
       +1https://git.codemadness.org/randomcrap/file/config/sfeed/connectors/vimeo.html        /git/randomcrap/file/config/sfeed/connectors/vimeo.gph        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Wordpress                codemadness.org        70
       +i                codemadness.org        70
       +iMany news websites use Wordpress. Some don't offer a RSS/Atom feed in the HTML                codemadness.org        70
       +iheader code.  Some still allow to fetch them using the common URI: "/feed/".                codemadness.org        70
       +i                codemadness.org        70
       +hLike: »https://www.pine64.org/feed/«        URL:https://www.pine64.org/feed/        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Youtube                codemadness.org        70
       +i                codemadness.org        70
       +iTo get the latest videos by channel ID:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://www.youtube.com/feeds/videos.xml?channel_id=UC45N5D3dvAFvLEby-XOn4og        URL:https://www.youtube.com/feeds/videos.xml?channel_id=UC45N5D3dvAFvLEby-XOn4og        codemadness.org        70
       +i                codemadness.org        70
       +iOr the latest videos by username:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://www.youtube.com/feeds/videos.xml?user=AwesomeSauceNews        URL:https://www.youtube.com/feeds/videos.xml?user=AwesomeSauceNews        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +iMy minimalistic Youtube front-end idiotbox shows the Atom feed of channels, for                codemadness.org        70
       +iexample using the search "gunther":                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://idiotbox.codemadness.org/?q=gunther        URL:https://idiotbox.codemadness.org/?q=gunther        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Wikipedia                codemadness.org        70
       +i                codemadness.org        70
       +iIt's possible to view the edit history of a page, for example:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://en.wikipedia.org/w/index.php?title=Frikandel&feed=atom&action=history        URL:https://en.wikipedia.org/w/index.php?title=Frikandel&feed=atom&action=history        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Services and proxies                codemadness.org        70
       +i                codemadness.org        70
       +i### RSSBridge                codemadness.org        70
       +i                codemadness.org        70
       +iI have not used this program myself and it seems a bit bloated but it offers a                codemadness.org        70
       +iway of converting some websites to RSS. However for some sites an API key is                codemadness.org        70
       +irequired.                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://github.com/RSS-Bridge/rss-bridge        URL:https://github.com/RSS-Bridge/rss-bridge        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i### Twitter / Nitter                codemadness.org        70
       +i                codemadness.org        70
       +iHere is a proxy website for Twitter called Nitter that offers RSS feeds:                codemadness.org        70
       +i                codemadness.org        70
       +hhttps://nitter.net/ID_AA_Carmack/rss        URL:https://nitter.net/ID_AA_Carmack/rss        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## OPML                codemadness.org        70
       +i                codemadness.org        70
       +iOPML is a XML-based format typically used for importing or exporting a list of feeds.                codemadness.org        70
       +iSome programs that support it are newsboat, sfeed, rss2email, Mozilla Thunderbird.                codemadness.org        70
       +i                codemadness.org        70
       +iThe format typically looks like this:                codemadness.org        70
       +i                codemadness.org        70
       +i        <?xml version="1.0" encoding="UTF-8"?>                codemadness.org        70
       +i        <opml version="1.0">                codemadness.org        70
       +i        <body>                codemadness.org        70
       +i                <outline type="rss" title="suckless sites" text="suckless sites" xmlUrl="https://git.suckless.org/sites/atom.xml"/>                codemadness.org        70
       +i                <outline type="rss" title="scc compiler" text="scc compiler" xmlUrl="https://git.simple-cc.org/scc/atom.xml"/>                codemadness.org        70
       +i        </body>                codemadness.org        70
       +i        </opml>                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +iFor sfeed to export to OPML:                codemadness.org        70
       +i                codemadness.org        70
       +i        sfeed_opml_export > file.opml                codemadness.org        70
       +i                codemadness.org        70
       +iFor sfeed to import and convert OPML to an sfeed rc file:                codemadness.org        70
       +i                codemadness.org        70
       +i        sfeed_opml_import < file.opml > ~/.sfeed/sfeedrc                codemadness.org        70
       +i                codemadness.org        70
       +iTo export in newsboat:                codemadness.org        70
       +i                codemadness.org        70
       +i        newsboat -e > file.opml                codemadness.org        70
       +i                codemadness.org        70
       +iFor RSS2email:                codemadness.org        70
       +i                        codemadness.org        70
       +i        r2e opmlexport > file.opml                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Tools                codemadness.org        70
       +i                codemadness.org        70
       +h* sfeed: RSS/Atom parser and tool to convert from XML to a simple TAB-separated format.        URL:https://codemadness.org/sfeed.html        codemadness.org        70
       +i  It contains various RSS/Atom-related helper programs and formatting programs aswell.                codemadness.org        70
       +h* curl: swiss-army-knife tool to get data from many protocols, like HTTP, HTTPS, gopher.        URL:https://curl.se/        codemadness.org        70
       +h* alternatively: hurl: a HTTP, HTTPS and gopher file grabber        URL:https://codemadness.org/hurl.html        codemadness.org        70
       +h* iconv: useful to convert text-encoding to UTF-8.        URL:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html        codemadness.org        70
       +h* youtube-dl to download videos by URL from Youtube (or many other sites).        URL:https://youtube-dl.org/        codemadness.org        70
       +h* alternatively: yt-dlp which is a fork of youtube-dl and more actively maintained at the moment.        URL:https://github.com/yt-dlp/yt-dlp        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## The end                codemadness.org        70
       +i                codemadness.org        70
       +iI hope this is useful.                codemadness.org        70
       +.
 (DIR) diff --git a/output/phlog/todo b/output/phlog/todo
       @@ -0,0 +1 @@
       +todo-application
       +\ No newline at end of file
 (DIR) diff --git a/output/phlog/todo-application b/output/phlog/todo-application
       @@ -0,0 +1,104 @@
       +1<- Back        /        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# A simple TODO application                codemadness.org        70
       +i                codemadness.org        70
       +iLast modification on 2022-07-01                codemadness.org        70
       +i                codemadness.org        70
       +iThis article describes a TODO application or workflow.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Workflow                codemadness.org        70
       +i                codemadness.org        70
       +iIt works like this:                codemadness.org        70
       +i                codemadness.org        70
       +i* Open any text editor.                codemadness.org        70
       +i* Edit the text.                codemadness.org        70
       +i* Save it in a file (probably named "TODO").                codemadness.org        70
       +i* Feel happy about it.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## The text format                codemadness.org        70
       +i                codemadness.org        70
       +iThe text format I use is this:                codemadness.org        70
       +i                codemadness.org        70
       +i        [indendations]<symbol><SPACE><item text><NEWLINE>                codemadness.org        70
       +i                codemadness.org        70
       +iMost of the time an item is just one line.                codemadness.org        70
       +iThis format is just a general guideline to keep the items somewhat structured.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Symbols                codemadness.org        70
       +i                codemadness.org        70
       +iItems are prefixed with a symbol.                codemadness.org        70
       +i                codemadness.org        70
       +i* - is an item which is planned to be done at some point.                codemadness.org        70
       +i* x is an item which is done.                codemadness.org        70
       +i* ? is an item which I'm not (yet) sure about. It can also be an idea.                codemadness.org        70
       +i                codemadness.org        70
       +iI use an indendation with a TAB before an item to indicate item dependencies.                codemadness.org        70
       +iThe items can be nested.                codemadness.org        70
       +i                codemadness.org        70
       +iFor the prioritization I put the most important items and sections from the top                codemadness.org        70
       +ito the bottom. These can be reshuffled as you wish of course.                codemadness.org        70
       +i                codemadness.org        70
       +iTo delete an item you remove the line. To archive an item you keep the line.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Sections                codemadness.org        70
       +i                codemadness.org        70
       +iA section is a line which has no symbol. This is like a header to group items.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Example                codemadness.org        70
       +i                codemadness.org        70
       +i        Checklist for releasing project 0.1:                codemadness.org        70
       +i        - Test project with different compilers and check for warnings.                codemadness.org        70
       +i        - Documentation:                codemadness.org        70
       +i                - Proofread and make sure it matches all program behaviour.                codemadness.org        70
       +i                - Run mandoc -Tlint on the man pages.                codemadness.org        70
       +i                ? Copy useful examples from the README file to the man page?                codemadness.org        70
       +i        - Run testsuite and check for failures before release.                codemadness.org        70
       +i                        codemadness.org        70
       +i                        codemadness.org        70
       +i        project 0.2:                codemadness.org        70
       +i        ? Investigate if feature mentioned by some user is worth adding.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# Example: secure remote cloud-encrypted edit session(tm)                codemadness.org        70
       +i                codemadness.org        70
       +i        ssh -t host 'ed TODO'                codemadness.org        70
       +i                codemadness.org        70
       +i# Example: multi-user secure remote cloud-encrypted edit session(tm)                codemadness.org        70
       +i                codemadness.org        70
       +i        ssh host                codemadness.org        70
       +i        tmux or tmux a                codemadness.org        70
       +i        ed TODO                codemadness.org        70
       +i                codemadness.org        70
       +i# Example: version-controlled multi-user secure remote cloud-encrypted edit session(tm)                codemadness.org        70
       +i                codemadness.org        70
       +i        ssh host                codemadness.org        70
       +i        tmux or tmux a                codemadness.org        70
       +i        ed TODO                codemadness.org        70
       +i        git add TODO                codemadness.org        70
       +i        git commit -m 'TODO: update'                codemadness.org        70
       +i                codemadness.org        70
       +i## Pros                codemadness.org        70
       +i                codemadness.org        70
       +i* When you open the TODO file the most important items are at the top.                codemadness.org        70
       +i* The items are easy to read and modify with any text editor.                codemadness.org        70
       +i* It is easy to extend the format and use with other text tools.                codemadness.org        70
       +i* The format is portable: it works on sticky-notes on your CRT monitor too!                codemadness.org        70
       +i* No monthly online subscription needed and full NO-money-back guarantee.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Cons                codemadness.org        70
       +i                codemadness.org        70
       +i* Complex lists with interconnected dependencies might not work, maybe.                codemadness.org        70
       +i* It's assumed there is one person maintaining the TODO file. Merging items                codemadness.org        70
       +i  from multiple people at the same time in this workflow is not recommended.                codemadness.org        70
       +i* It is too simple: noone will be impressed by it.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +iI hope this is inspirational or something,                codemadness.org        70
       +.
 (DIR) diff --git a/output/phlog/totp b/output/phlog/totp
       @@ -0,0 +1,65 @@
       +1<- Back        /        codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i# 2FA TOTP without crappy authenticator apps                codemadness.org        70
       +i                codemadness.org        70
       +iLast modification on 2022-03-24                codemadness.org        70
       +i                codemadness.org        70
       +iThis describes how to use 2FA without using crappy authenticator "apps" or a                codemadness.org        70
       +imobile device.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Install                codemadness.org        70
       +i                codemadness.org        70
       +iOn OpenBSD:                codemadness.org        70
       +i                codemadness.org        70
       +i        pkg_add oath-toolkit zbar                codemadness.org        70
       +i                codemadness.org        70
       +i* oath-toolkit is used to generate the digits based on the secret key.                codemadness.org        70
       +i* zbar is used to scan the QR barcode text from the image.                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## Steps                codemadness.org        70
       +i                codemadness.org        70
       +iSave the QR code image from the authenticator app, website to an image file.                codemadness.org        70
       +iScan the QR code text from the image:                codemadness.org        70
       +i                codemadness.org        70
       +i        zbarimg image.png                codemadness.org        70
       +i                codemadness.org        70
       +iAn example QR code:                codemadness.org        70
       +i                codemadness.org        70
       +IQR code example        /downloads/2fa/qr.png        codemadness.org        70
       +i                codemadness.org        70
       +iThe output is typically something like:                codemadness.org        70
       +i                codemadness.org        70
       +i        QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&issuer=Codemadness                codemadness.org        70
       +i                codemadness.org        70
       +iYou only need to scan this QR-code for the secret key once.                codemadness.org        70
       +iMake sure to store the secret key in a private safe place and don't show it to                codemadness.org        70
       +ianyone else.                codemadness.org        70
       +i                codemadness.org        70
       +iUsing the secret key the following command outputs a 6-digit code by default.                codemadness.org        70
       +iIn this example we also assume the key is base32-encoded.                codemadness.org        70
       +iThere can be other parameters and options, this is documented in the Yubico URI                codemadness.org        70
       +istring format reference below.                codemadness.org        70
       +i                codemadness.org        70
       +iCommand:                codemadness.org        70
       +i                codemadness.org        70
       +i        oathtool --totp -b SOMEKEY                codemadness.org        70
       +i                codemadness.org        70
       +i* The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.                codemadness.org        70
       +i* The -b option uses base32 encoding of KEY instead of hex.                codemadness.org        70
       +i                codemadness.org        70
       +iTip: you can create a script that automatically puts the digits in the                codemadness.org        70
       +iclipboard, for example:                codemadness.org        70
       +i                codemadness.org        70
       +i        oathtool --totp -b SOMEKEY | xclip                codemadness.org        70
       +i                codemadness.org        70
       +i                codemadness.org        70
       +i## References                codemadness.org        70
       +i                codemadness.org        70
       +h* zbarimg(1) man page        URL:https://linux.die.net/man/1/zbarimg        codemadness.org        70
       +h* oathtool(1) man page        URL:https://www.nongnu.org/oath-toolkit/man-oathtool.html        codemadness.org        70
       +h* RFC6238 - TOTP: Time-Based One-Time Password Algorithm        URL:https://datatracker.ietf.org/doc/html/rfc6238        codemadness.org        70
       +h* Yubico.com - otpauth URI string format        URL:https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html        codemadness.org        70
       +.
 (DIR) diff --git a/output/todo-application.html b/output/todo-application.html
       @@ -0,0 +1,126 @@
       +<!DOCTYPE html>
       +<html dir="ltr" lang="en">
       +<head>
       +        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       +        <meta http-equiv="Content-Language" content="en" />
       +        <meta name="viewport" content="width=device-width" />
       +        <meta name="keywords" content="todo, simple solutions(tm)" />
       +        <meta name="description" content="A simple TODO application workflow" />
       +        <meta name="author" content="Hiltjo" />
       +        <meta name="generator" content="Static content generated using saait: https://codemadness.org/saait.html" />
       +        <title>A simple TODO application - Codemadness</title>
       +        <link rel="stylesheet" href="style.css" type="text/css" media="screen" />
       +        <link rel="stylesheet" href="print.css" type="text/css" media="print" />
       +        <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Codemadness Atom Feed" />
       +        <link rel="alternate" href="atom_content.xml" type="application/atom+xml" title="Codemadness Atom Feed with content" />
       +        <link rel="icon" href="/favicon.png" type="image/png" />
       +</head>
       +<body>
       +        <nav id="menuwrap">
       +                <table id="menu" width="100%" border="0">
       +                <tr>
       +                        <td id="links" align="left">
       +                                <a href="index.html">Blog</a> |
       +                                <a href="/git/" title="Git repository with some of my projects">Git</a> |
       +                                <a href="/releases/">Releases</a> |
       +                                <a href="gopher://codemadness.org">Gopherhole</a>
       +                        </td>
       +                        <td id="links-contact" align="right">
       +                                <span class="hidden"> | </span>
       +                                <a href="feeds.html">Feeds</a> |
       +                                <a href="pgp.asc">PGP</a> |
       +                                <a href="mailto:hiltjo@AT@codemadness.DOT.org">Mail</a>
       +                        </td>
       +                </tr>
       +                </table>
       +        </nav>
       +        <hr class="hidden" />
       +        <main id="mainwrap">
       +                <div id="main">
       +                        <article>
       +<header>
       +        <h1>A simple TODO application</h1>
       +        <p>
       +        <strong>Last modification on </strong> <time>2022-07-01</time>
       +        </p>
       +</header>
       +
       +<p>This article describes a TODO application or workflow.</p>
       +<h2>Workflow</h2>
       +<p>It works like this:</p>
       +<ul>
       +<li>Open any text editor.</li>
       +<li>Edit the text.</li>
       +<li>Save it in a file (probably named "TODO").</li>
       +<li>Feel happy about it.</li>
       +</ul>
       +<h2>The text format</h2>
       +<p>The text format I use is this:</p>
       +<pre><code>[indendations]&lt;symbol&gt;&lt;SPACE&gt;&lt;item text&gt;&lt;NEWLINE&gt;
       +</code></pre>
       +<p>Most of the time an item is just one line.
       +This format is just a general guideline to keep the items somewhat structured.</p>
       +<h2>Symbols</h2>
       +<p>Items are prefixed with a symbol.</p>
       +<ul>
       +<li>- is an item which is planned to be done at some point.</li>
       +<li>x is an item which is done.</li>
       +<li>? is an item which I'm not (yet) sure about. It can also be an idea.</li>
       +</ul>
       +<p>I use an indendation with a TAB before an item to indicate item dependencies.
       +The items can be nested.</p>
       +<p>For the prioritization I put the most important items and sections from the top
       +to the bottom. These can be reshuffled as you wish of course.</p>
       +<p>To delete an item you remove the line. To archive an item you keep the line.</p>
       +<h2>Sections</h2>
       +<p>A section is a line which has no symbol. This is like a header to group items.</p>
       +<h2>Example</h2>
       +<pre><code>Checklist for releasing project 0.1:
       +- Test project with different compilers and check for warnings.
       +- Documentation:
       +        - Proofread and make sure it matches all program behaviour.
       +        - Run mandoc -Tlint on the man pages.
       +        ? Copy useful examples from the README file to the man page?
       +- Run testsuite and check for failures before release.
       +
       +
       +project 0.2:
       +? Investigate if feature mentioned by some user is worth adding.
       +</code></pre>
       +<h1>Example: secure remote cloud-encrypted edit session(tm)</h1>
       +<pre><code>ssh -t host 'ed TODO'
       +</code></pre>
       +<h1>Example: multi-user secure remote cloud-encrypted edit session(tm)</h1>
       +<pre><code>ssh host
       +tmux or tmux a
       +ed TODO
       +</code></pre>
       +<h1>Example: version-controlled multi-user secure remote cloud-encrypted edit session(tm)</h1>
       +<pre><code>ssh host
       +tmux or tmux a
       +ed TODO
       +git add TODO
       +git commit -m 'TODO: update'
       +</code></pre>
       +<h2>Pros</h2>
       +<ul>
       +<li>When you open the TODO file the most important items are at the top.</li>
       +<li>The items are easy to read and modify with any text editor.</li>
       +<li>It is easy to extend the format and use with other text tools.</li>
       +<li>The format is portable: it works on sticky-notes on your CRT monitor too!</li>
       +<li>No monthly online subscription needed and full NO-money-back guarantee.</li>
       +</ul>
       +<h2>Cons</h2>
       +<ul>
       +<li>Complex lists with interconnected dependencies might not work, maybe.</li>
       +<li>It's assumed there is one person maintaining the TODO file. Merging items
       +from multiple people at the same time in this workflow is not recommended.</li>
       +<li>It is too simple: noone will be impressed by it.</li>
       +</ul>
       +<p>I hope this is inspirational or something,</p>
       +
       +                        </article>
       +                </div>
       +        </main>
       +</body>
       +</html>
 (DIR) diff --git a/output/todo-application.md b/output/todo-application.md
       @@ -0,0 +1,96 @@
       +This article describes a TODO application or workflow.
       +
       +
       +## Workflow
       +
       +It works like this:
       +
       +* Open any text editor.
       +* Edit the text.
       +* Save it in a file (probably named "TODO").
       +* Feel happy about it.
       +
       +
       +## The text format
       +
       +The text format I use is this:
       +
       +        [indendations]<symbol><SPACE><item text><NEWLINE>
       +
       +Most of the time an item is just one line.
       +This format is just a general guideline to keep the items somewhat structured.
       +
       +
       +## Symbols
       +
       +Items are prefixed with a symbol.
       +
       +* - is an item which is planned to be done at some point.
       +* x is an item which is done.
       +* ? is an item which I'm not (yet) sure about. It can also be an idea.
       +
       +I use an indendation with a TAB before an item to indicate item dependencies.
       +The items can be nested.
       +
       +For the prioritization I put the most important items and sections from the top
       +to the bottom. These can be reshuffled as you wish of course.
       +
       +To delete an item you remove the line. To archive an item you keep the line.
       +
       +
       +## Sections
       +
       +A section is a line which has no symbol. This is like a header to group items.
       +
       +
       +## Example
       +
       +        Checklist for releasing project 0.1:
       +        - Test project with different compilers and check for warnings.
       +        - Documentation:
       +                - Proofread and make sure it matches all program behaviour.
       +                - Run mandoc -Tlint on the man pages.
       +                ? Copy useful examples from the README file to the man page?
       +        - Run testsuite and check for failures before release.
       +        
       +        
       +        project 0.2:
       +        ? Investigate if feature mentioned by some user is worth adding.
       +
       +
       +# Example: secure remote cloud-encrypted edit session(tm)
       +
       +        ssh -t host 'ed TODO'
       +
       +# Example: multi-user secure remote cloud-encrypted edit session(tm)
       +
       +        ssh host
       +        tmux or tmux a
       +        ed TODO
       +
       +# Example: version-controlled multi-user secure remote cloud-encrypted edit session(tm)
       +
       +        ssh host
       +        tmux or tmux a
       +        ed TODO
       +        git add TODO
       +        git commit -m 'TODO: update'
       +
       +## Pros
       +
       +* When you open the TODO file the most important items are at the top.
       +* The items are easy to read and modify with any text editor.
       +* It is easy to extend the format and use with other text tools.
       +* The format is portable: it works on sticky-notes on your CRT monitor too!
       +* No monthly online subscription needed and full NO-money-back guarantee.
       +
       +
       +## Cons
       +
       +* Complex lists with interconnected dependencies might not work, maybe.
       +* It's assumed there is one person maintaining the TODO file. Merging items
       +  from multiple people at the same time in this workflow is not recommended.
       +* It is too simple: noone will be impressed by it.
       +
       +
       +I hope this is inspirational or something,
 (DIR) diff --git a/output/todo.html b/output/todo.html
       @@ -0,0 +1 @@
       +todo-application.html
       +\ No newline at end of file
 (DIR) diff --git a/output/totp.html b/output/totp.html
       @@ -0,0 +1,98 @@
       +<!DOCTYPE html>
       +<html dir="ltr" lang="en">
       +<head>
       +        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       +        <meta http-equiv="Content-Language" content="en" />
       +        <meta name="viewport" content="width=device-width" />
       +        <meta name="keywords" content="oauthtool, zbarimg, totp, 2FA, authenticator" />
       +        <meta name="description" content="Using 2FA TOTP without crappy authenticator apps" />
       +        <meta name="author" content="Hiltjo" />
       +        <meta name="generator" content="Static content generated using saait: https://codemadness.org/saait.html" />
       +        <title>2FA TOTP without crappy authenticator apps - Codemadness</title>
       +        <link rel="stylesheet" href="style.css" type="text/css" media="screen" />
       +        <link rel="stylesheet" href="print.css" type="text/css" media="print" />
       +        <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Codemadness Atom Feed" />
       +        <link rel="alternate" href="atom_content.xml" type="application/atom+xml" title="Codemadness Atom Feed with content" />
       +        <link rel="icon" href="/favicon.png" type="image/png" />
       +</head>
       +<body>
       +        <nav id="menuwrap">
       +                <table id="menu" width="100%" border="0">
       +                <tr>
       +                        <td id="links" align="left">
       +                                <a href="index.html">Blog</a> |
       +                                <a href="/git/" title="Git repository with some of my projects">Git</a> |
       +                                <a href="/releases/">Releases</a> |
       +                                <a href="gopher://codemadness.org">Gopherhole</a>
       +                        </td>
       +                        <td id="links-contact" align="right">
       +                                <span class="hidden"> | </span>
       +                                <a href="feeds.html">Feeds</a> |
       +                                <a href="pgp.asc">PGP</a> |
       +                                <a href="mailto:hiltjo@AT@codemadness.DOT.org">Mail</a>
       +                        </td>
       +                </tr>
       +                </table>
       +        </nav>
       +        <hr class="hidden" />
       +        <main id="mainwrap">
       +                <div id="main">
       +                        <article>
       +<header>
       +        <h1>2FA TOTP without crappy authenticator apps</h1>
       +        <p>
       +        <strong>Last modification on </strong> <time>2022-03-24</time>
       +        </p>
       +</header>
       +
       +<p>This describes how to use 2FA without using crappy authenticator "apps" or a
       +mobile device.</p>
       +<h2>Install</h2>
       +<p>On OpenBSD:</p>
       +<pre><code>pkg_add oath-toolkit zbar
       +</code></pre>
       +<ul>
       +<li>oath-toolkit is used to generate the digits based on the secret key.</li>
       +<li>zbar is used to scan the QR barcode text from the image.</li>
       +</ul>
       +<h2>Steps</h2>
       +<p>Save the QR code image from the authenticator app, website to an image file.
       +Scan the QR code text from the image:</p>
       +<pre><code>zbarimg image.png
       +</code></pre>
       +<p>An example QR code:</p>
       +<p><img src="downloads/2fa/qr.png" alt="QR code example" /></p>
       +<p>The output is typically something like:</p>
       +<pre><code>QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&amp;issuer=Codemadness
       +</code></pre>
       +<p>You only need to scan this QR-code for the secret key once.
       +Make sure to store the secret key in a private safe place and don't show it to
       +anyone else.</p>
       +<p>Using the secret key the following command outputs a 6-digit code by default.
       +In this example we also assume the key is base32-encoded.
       +There can be other parameters and options, this is documented in the Yubico URI
       +string format reference below.</p>
       +<p>Command:</p>
       +<pre><code>oathtool --totp -b SOMEKEY
       +</code></pre>
       +<ul>
       +<li>The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.</li>
       +<li>The -b option uses base32 encoding of KEY instead of hex.</li>
       +</ul>
       +<p>Tip: you can create a script that automatically puts the digits in the
       +clipboard, for example:</p>
       +<pre><code>oathtool --totp -b SOMEKEY | xclip
       +</code></pre>
       +<h2>References</h2>
       +<ul>
       +<li><a href="https://linux.die.net/man/1/zbarimg">zbarimg(1) man page</a></li>
       +<li><a href="https://www.nongnu.org/oath-toolkit/man-oathtool.html">oathtool(1) man page</a></li>
       +<li><a href="https://datatracker.ietf.org/doc/html/rfc6238">RFC6238 - TOTP: Time-Based One-Time Password Algorithm</a></li>
       +<li><a href="https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html">Yubico.com - otpauth URI string format</a></li>
       +</ul>
       +
       +                        </article>
       +                </div>
       +        </main>
       +</body>
       +</html>
 (DIR) diff --git a/output/totp.md b/output/totp.md
       @@ -0,0 +1,57 @@
       +This describes how to use 2FA without using crappy authenticator "apps" or a
       +mobile device.
       +
       +
       +## Install
       +
       +On OpenBSD:
       +
       +        pkg_add oath-toolkit zbar
       +
       +* oath-toolkit is used to generate the digits based on the secret key.
       +* zbar is used to scan the QR barcode text from the image.
       +
       +
       +## Steps
       +
       +Save the QR code image from the authenticator app, website to an image file.
       +Scan the QR code text from the image:
       +
       +        zbarimg image.png
       +
       +An example QR code:
       +
       +![QR code example](https://codemadness.org/downloads/2fa/qr.png)
       +
       +The output is typically something like:
       +
       +        QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&issuer=Codemadness
       +
       +You only need to scan this QR-code for the secret key once.
       +Make sure to store the secret key in a private safe place and don't show it to
       +anyone else.
       +
       +Using the secret key the following command outputs a 6-digit code by default.
       +In this example we also assume the key is base32-encoded.
       +There can be other parameters and options, this is documented in the Yubico URI
       +string format reference below.
       +
       +Command:
       +
       +        oathtool --totp -b SOMEKEY
       +
       +* The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.
       +* The -b option uses base32 encoding of KEY instead of hex.
       +
       +Tip: you can create a script that automatically puts the digits in the
       +clipboard, for example:
       +
       +        oathtool --totp -b SOMEKEY | xclip
       +
       +
       +## References
       +
       +* [zbarimg(1) man page](https://linux.die.net/man/1/zbarimg)
       +* [oathtool(1) man page](https://www.nongnu.org/oath-toolkit/man-oathtool.html)
       +* [RFC6238 - TOTP: Time-Based One-Time Password Algorithm](https://datatracker.ietf.org/doc/html/rfc6238)
       +* [Yubico.com - otpauth URI string format](https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html)
 (DIR) diff --git a/pages/todo-application.cfg b/pages/todo-application.cfg
       @@ -0,0 +1,6 @@
       +title = A simple TODO application
       +id = todo
       +description = A simple TODO application workflow
       +keywords = todo, simple solutions(tm)
       +created = 2022-07-01
       +updated = 2022-07-01
 (DIR) diff --git a/pages/todo-application.md b/pages/todo-application.md
       @@ -0,0 +1,96 @@
       +This article describes a TODO application or workflow.
       +
       +
       +## Workflow
       +
       +It works like this:
       +
       +* Open any text editor.
       +* Edit the text.
       +* Save it in a file (probably named "TODO").
       +* Feel happy about it.
       +
       +
       +## The text format
       +
       +The text format I use is this:
       +
       +        [indendations]<symbol><SPACE><item text><NEWLINE>
       +
       +Most of the time an item is just one line.
       +This format is just a general guideline to keep the items somewhat structured.
       +
       +
       +## Symbols
       +
       +Items are prefixed with a symbol.
       +
       +* - is an item which is planned to be done at some point.
       +* x is an item which is done.
       +* ? is an item which I'm not (yet) sure about. It can also be an idea.
       +
       +I use an indendation with a TAB before an item to indicate item dependencies.
       +The items can be nested.
       +
       +For the prioritization I put the most important items and sections from the top
       +to the bottom. These can be reshuffled as you wish of course.
       +
       +To delete an item you remove the line. To archive an item you keep the line.
       +
       +
       +## Sections
       +
       +A section is a line which has no symbol. This is like a header to group items.
       +
       +
       +## Example
       +
       +        Checklist for releasing project 0.1:
       +        - Test project with different compilers and check for warnings.
       +        - Documentation:
       +                - Proofread and make sure it matches all program behaviour.
       +                - Run mandoc -Tlint on the man pages.
       +                ? Copy useful examples from the README file to the man page?
       +        - Run testsuite and check for failures before release.
       +        
       +        
       +        project 0.2:
       +        ? Investigate if feature mentioned by some user is worth adding.
       +
       +
       +# Example: secure remote cloud-encrypted edit session(tm)
       +
       +        ssh -t host 'ed TODO'
       +
       +# Example: multi-user secure remote cloud-encrypted edit session(tm)
       +
       +        ssh host
       +        tmux or tmux a
       +        ed TODO
       +
       +# Example: version-controlled multi-user secure remote cloud-encrypted edit session(tm)
       +
       +        ssh host
       +        tmux or tmux a
       +        ed TODO
       +        git add TODO
       +        git commit -m 'TODO: update'
       +
       +## Pros
       +
       +* When you open the TODO file the most important items are at the top.
       +* The items are easy to read and modify with any text editor.
       +* It is easy to extend the format and use with other text tools.
       +* The format is portable: it works on sticky-notes on your CRT monitor too!
       +* No monthly online subscription needed and full NO-money-back guarantee.
       +
       +
       +## Cons
       +
       +* Complex lists with interconnected dependencies might not work, maybe.
       +* It's assumed there is one person maintaining the TODO file. Merging items
       +  from multiple people at the same time in this workflow is not recommended.
       +* It is too simple: noone will be impressed by it.
       +
       +
       +I hope this is inspirational or something,
 (DIR) diff --git a/pages/totp.cfg b/pages/totp.cfg
       @@ -0,0 +1,6 @@
       +title = 2FA TOTP without crappy authenticator apps
       +id = totp
       +description = Using 2FA TOTP without crappy authenticator apps
       +keywords = oauthtool, zbarimg, totp, 2FA, authenticator
       +created = 2022-03-23
       +updated = 2022-03-24
 (DIR) diff --git a/pages/totp.md b/pages/totp.md
       @@ -0,0 +1,57 @@
       +This describes how to use 2FA without using crappy authenticator "apps" or a
       +mobile device.
       +
       +
       +## Install
       +
       +On OpenBSD:
       +
       +        pkg_add oath-toolkit zbar
       +
       +* oath-toolkit is used to generate the digits based on the secret key.
       +* zbar is used to scan the QR barcode text from the image.
       +
       +
       +## Steps
       +
       +Save the QR code image from the authenticator app, website to an image file.
       +Scan the QR code text from the image:
       +
       +        zbarimg image.png
       +
       +An example QR code:
       +
       +![QR code example](downloads/2fa/qr.png)
       +
       +The output is typically something like:
       +
       +        QR-Code:otpauth://totp/Example:someuser@codemadness.org?secret=SECRETKEY&issuer=Codemadness
       +
       +You only need to scan this QR-code for the secret key once.
       +Make sure to store the secret key in a private safe place and don't show it to
       +anyone else.
       +
       +Using the secret key the following command outputs a 6-digit code by default.
       +In this example we also assume the key is base32-encoded.
       +There can be other parameters and options, this is documented in the Yubico URI
       +string format reference below.
       +
       +Command:
       +
       +        oathtool --totp -b SOMEKEY
       +
       +* The --totp option uses the time-variant TOTP mode, by default it uses HMAC SHA1.
       +* The -b option uses base32 encoding of KEY instead of hex.
       +
       +Tip: you can create a script that automatically puts the digits in the
       +clipboard, for example:
       +
       +        oathtool --totp -b SOMEKEY | xclip
       +
       +
       +## References
       +
       +* [zbarimg(1) man page](https://linux.die.net/man/1/zbarimg)
       +* [oathtool(1) man page](https://www.nongnu.org/oath-toolkit/man-oathtool.html)
       +* [RFC6238 - TOTP: Time-Based One-Time Password Algorithm](https://datatracker.ietf.org/doc/html/rfc6238)
       +* [Yubico.com - otpauth URI string format](https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html)