<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>wissel.net Usability - Productivity - Business - The web - Singapore and Twins</title>
	<link>https://wissel.net/blog/stories.rss</link>
	<description>Thoughts, Insights and Opinions of Stephan H. Wissel. Topics included: Salesforce, Lotus Notes and Domino, IBM Websphere, NodeJS, JavaScript,  J2EE, .Net, Software Archtecture, Personcentric Development, Agile Software, SDLC, Singapore and my Twins</description>
	<language>en,de</language>
	<copyright>(C) 2003 - 2021 Stephan H. Wissel, All rights reserved</copyright>
	<pubdate>Sun, 20 Sep 2026 03:05:15 +0000</pubdate>
<item>
	<title>JWT for machine to machine communication</title>
	<description>&lt;p&gt;There are plenty of &lt;a href="https://en.wikipedia.org/wiki/Identity_provider"&gt;IdP&lt;/a&gt; available that provide &lt;a href="https://openid.net/developers/how-connect-works/"&gt;OIDC&lt;/a&gt; flows for your users, including &lt;a href="https://www.hcl-software.com/domino"&gt;Domino&lt;/a&gt;, even if some can't read &lt;a href="https://www.rfc-editor.org/info/rfc6749/#page-23"&gt;RFC 6749&lt;/a&gt;) properly (I'm looking at you &lt;a href="https://www.okta.com/"&gt;Okta&lt;/a&gt; and &lt;a href="https://www.pingidentity.com/en.html"&gt;Ping&lt;/a&gt;)*&lt;/p&gt;
&lt;p&gt;When it comes to machine identity the situation becomes murkier. Machines might or might not be in your directory, directory admins might be reluctant to add machines etc. etc. So some utility needs to help out here&lt;/p&gt;
&lt;h2&gt;Generating access_token&lt;/h2&gt;
&lt;p&gt;I wrote about about &lt;a href="/blog/2020/01/generating-jwt-tokens-for-tests.html"&gt;generating JWT before&lt;/a&gt;, but in needs more context. So lets have a look what is actually needed:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;a means to identify the machine&lt;/li&gt;
 &lt;li&gt;the shape of the access token required&lt;/li&gt;
 &lt;li&gt;the trusted key pair to sign and validate the key&lt;/li&gt;
&lt;/ul&gt;</description>
	<link>2026/09/jwt-for-machine-to-machine-communication.html</link>
	<author>Stephan H. Wissel</author>
	<guid>e2cdbe90-b494-11f1-bb1f-5db4d7e49fbd</guid>
	<pubDate>20 September 2026</pubDate>

</item>
<item>
	<title>How we trained Lotus Notes</title>
	<description>&lt;p&gt;A recent post on &lt;a href="https://vowe.net/2026/09/10/lotus-notes-and-the-dangers-of-starting-from-scratch/"&gt;vowe.net&lt;/a&gt; pointing to &lt;a href="https://buttondown.com/blog/lotus-notes-email"&gt;Lotus Notes and the dangers of starting from scratch&lt;/a&gt; sent me down &lt;a href="https://digicomp.ch/en"&gt;the memory lane&lt;/a&gt; into the 1990ties.&lt;/p&gt;
&lt;h2&gt;Collaboration training&lt;/h2&gt;
&lt;p&gt;Companies would send regular employees in groups of 10 -20 to a full day training to learn about that new thing "collaboration" (which gave the word collaborator a less perilous meaning). This is how it would go down in four modules:&lt;/p&gt;
&lt;p&gt;In the first module the Notes discussion database gets introduced. Participants would learn about topics, responses and response-to-responses. Without seeding lively discussions would emerge.&lt;/p&gt;
&lt;p&gt;The second module would focus on eMail, inbox, signature, encryption, richtext and - everybody's favorite - permanent pen.&lt;/p&gt;
&lt;p&gt;Followed by the lunch break&lt;/p&gt;
&lt;p&gt;The trainer would have prepared individual emails to all participants. Most of them with harmless request like "What's your favorite color" or "Ask your colleague about the last holiday". Two emails however had &lt;strong&gt;loaded&lt;/strong&gt; requests: "Stand up and put your one hand on your head" and "stand up and sing or hum &lt;a href="https://www.youtube.com/watch?v=ZfDpRzN2SBI"&gt;the national anthem&lt;/a&gt; (considered unproblematic in Switzerland)"&lt;/p&gt;
&lt;p&gt;Unsurprisingly hardly any of the recipients of such a message complied. The trainer would then ask a random participant to join in front to face the class, followed by the explanation: "You can't expect email to transport requests that a better issued in person (paraphrasing here)".&lt;/p&gt;
&lt;p&gt;Time for a coffee break with &lt;a href="https://tarasmulticulturaltable.com/gipfeli-swiss-crescent-shaped-pastries/"&gt;gipfeli&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The trainer then introduced module four "&lt;em&gt;Imagine you are all distributed in regional offices, so you can't show paper documents to each other, solve the problem I'll hand out&lt;/em&gt;". I then would hand out sheets of paper with the sentence "&lt;strong&gt;Every capital letter is part of the solution&lt;/strong&gt;". The sheets were all different with different letters capitalized, so the task was to collect the capital letters and form the solution &lt;strong&gt;LOTUS NOTES&lt;/strong&gt;. This wasn't explained to the participants though.&lt;/p&gt;
&lt;p&gt;Typically a barrage of emails would follow with different levels of speculation, curiosity, acceptance or ridicule. After 20-30 minutes the task would have been figured out at the "cost" of 100+ emails. The winning team (we informally tracked completion time) however took less that three minutes: One participant created a discussion entry "Please share all capital letters on your sheets" and sent a doc link (hyper link in today's lingo) to the rest. 10 response documents later they were done.&lt;/p&gt;
&lt;p&gt;Participant reported a better understanding of "Zusammenarbeit (collaboration)" and "Benachrichtigung (notification)" which made them appreciate the shiny new tool.&lt;/p&gt;
&lt;p&gt;I loved this sessions since the showed not only how to use the tools, but why and when and when not.&lt;/p&gt;</description>
	<link>2026/09/how-we-trained-lotus-notes.html</link>
	<author>Stephan H. Wissel</author>
	<guid>596e9380-ae7d-11f1-a336-d390c483f8d5</guid>
	<pubDate>12 September 2026</pubDate>

</item>
<item>
	<title>HCL opensources CouchCompanion</title>
	<description>&lt;p&gt;I'm a big fan of &lt;a href="https://couchdb.apache.org/"&gt;Apache CouchDB&lt;/a&gt;, so I was very pleased when I got the permission to opensource (is that even a verb) a R&amp;amp;D project we were working on for a while, meet &lt;a href="https://github.com/HCL-TECH-SOFTWARE/couch-companion-ui"&gt;CouchCompanion&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Fauxton as role model&lt;/h2&gt;
&lt;p&gt;We were asking us, how would CouchDB's admin ui &lt;a href="https://github.com/apache/couchdb-fauxton"&gt;Fauxton&lt;/a&gt; look like when you rebuild today, what would be the tech stack and new or enhanced features. This is what we can up with:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;build with webcomponents, namely &lt;a href="https://webawesome.com/"&gt;Webawesome&lt;/a&gt; and &lt;a href="https://lit.dev/"&gt;Lit&lt;/a&gt;, no big framework like react or angular&lt;/li&gt;
 &lt;li&gt;Native &lt;code&gt;fetch()&lt;/code&gt;&lt;/li&gt;
 &lt;li&gt;All JSON and JS Code editable with the Monaco editor (the one used in VSCode)&lt;/li&gt;
 &lt;li&gt;Support to build Mango queries and indici&lt;/li&gt;
 &lt;li&gt;Sync with version control (Github for the moment, fighting with CORS and CSP)&lt;/li&gt;
 &lt;li&gt;dark/lght mode&lt;/li&gt;
 &lt;li&gt;UI to configure OIDC IdP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... and more. There is a &lt;a href="https://github.com/HCL-TECH-SOFTWARE/couch-companion-ui/tree/main/docs/walkthrough"&gt;capability walkthrough&lt;/a&gt; available. But to really get a feel, just run the container:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;docker run -d --name couch-companion -p 5984:5984 \
  -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=&amp;lt;choose one&amp;gt; \
  -v couchdb_data:/opt/couchdb/data \
  ghcr.io/hcl-tech-software/couch-companion:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The container is based on the official CouchDB image with Fauxton swapped out for CouchCompanion. Give it a spin!&lt;/p&gt;</description>
	<link>2026/09/hcl-opensources-couchcompanion.html</link>
	<author>Stephan H. Wissel</author>
	<guid>ddda6a40-ac61-11f1-9ae8-ab82d9ffb6c8</guid>
	<pubDate>09 September 2026</pubDate>

</item>
<item>
	<title>Using age in Github actions</title>
	<description>&lt;p&gt;In the &lt;a href="/blog/2026/08/harden-your-developer-setup-with-age-and-direnv.html"&gt;last article&lt;/a&gt; I introduced &lt;a href="https://age-encryption.org/v1"&gt;age&lt;/a&gt; and a working setup for macOS. Now let's look at &lt;a href="https://github.com/features/actions"&gt;Github actions&lt;/a&gt; integration&lt;/p&gt;
&lt;h2&gt;TL/DR&lt;/h2&gt;
&lt;p&gt;In a nutshell: create an age key just for GitHub actions, commit it to secrets, add the public key to recipients.txt and add it to your github job.&lt;/p&gt;</description>
	<link>2026/08/using-age-in-github-actions.html</link>
	<author>Stephan H. Wissel</author>
	<guid>8935a740-9f9e-11f1-a017-d3bd802fd9ca</guid>
	<pubDate>24 August 2026</pubDate>

</item>
<item>
	<title>Harden your developer setup with age and direnv</title>
	<description>&lt;p&gt;Credential stealing &lt;a href="https://www.google.com/search?q=credential+stealing+news"&gt;is rampant&lt;/a&gt;, so some diligence in guarding API keys, passphrases and secrets is warranted.&lt;/p&gt;
&lt;p&gt;Stop wondering &lt;strong&gt;if&lt;/strong&gt; it could happen to you, but prepare for &lt;strong&gt;when&lt;/strong&gt; it might happen. Here is one arrow in your defense portfolio.&lt;/p&gt;
&lt;h2&gt;Limit the blast radius&lt;/h2&gt;
&lt;p&gt;When an attacker sneaks by your &lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication"&gt;2FA&lt;/a&gt; using e.g a &lt;a href="https://en.wikipedia.org/wiki/Supply_chain_attack"&gt;supply chain attack&lt;/a&gt; your next line of defense is "How much can they see?"&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;For starters no key (other than public ones), token or credential shall live on disk unencrypted.&lt;/li&gt;
 &lt;li&gt;Loaded evn variables should be limited to their projects, when in &lt;code&gt;~/Code/someproject&lt;/code&gt; there must not be any env variable from &lt;code&gt;~/Code/otherproject&lt;/code&gt; be loaded.&lt;/li&gt;
 &lt;li&gt;The day-2-day use must be easy and convenient&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Three components&lt;/h2&gt;
&lt;p&gt;To make this work we need three components:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;a href="https://support.apple.com/en-gb/guide/keychain-access/welcome/mac"&gt;macOS keychain&lt;/a&gt;: holds the AGE key(s), (Other operating systems is another story for another time).&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://age-encryption.org/v1"&gt;age&lt;/a&gt; "Actually good encryption": to encrypt your secrets and &lt;code&gt;.env&lt;/code&gt; variables.&lt;/li&gt;
 &lt;li&gt;&lt;a href="https://direnv.net/"&gt;direnv&lt;/a&gt;: Loads and unloads environment variables depending on the current directory.&lt;/li&gt;
&lt;/ul&gt;</description>
	<link>2026/08/harden-your-developer-setup-with-age-and-direnv.html</link>
	<author>Stephan H. Wissel</author>
	<guid>f18ef260-9d14-11f1-ba45-6f0c0374234d</guid>
	<pubDate>21 August 2026</pubDate>

</item>
<item>
	<title>Use tmux to automate your developer setup</title>
	<description>&lt;svg xmlns="http://www.w3.org/2000/svg" class="adm-hidden"&gt;
 &lt;symbol id="adm-info"&gt;
  &lt;svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
   &lt;path d="m20.5 11.8c0 4.5-3.7 8.2-8.2 8.2s-8.2-3.7-8.2-8.2 3.7-8.2 8.2-8.2 8.2 3.7 8.2 8.2zm-6.7 4c-.1-.1-.2-.2-.2-.3v-4.5c0-.1.1-.2.2-.4s.2-.3.2-.3 0-.1-.1-.1c-.1-.1-.5-.2-1.2-.4-.7-.1-1.2-.2-1.5-.2-.5 0-.7 0-.7.1s.1.3.2.6v4.7c0 .3-.1.5-.2.6-.2.2-.2.3-.2.3.1.1.5.3 1.2.4.6.1 1.2.2 1.6.2h.3c.4-.1.5-.2.5-.5.1 0 .1-.1-.1-.2zm-.9-8.6c-.7-.1-1.2-.2-1.5-.2-.2 0-.5.2-.7.4s-.3.4-.3.6c0 .1 0 .1.1.2s.6.2 1.5.4c1 .3 1.5.4 1.6.3.1 0 .2-.2.3-.5s.2-.5.2-.6v-.1c-.1-.1-.5-.3-1.2-.5z" fill="currentColor" /&gt;
  &lt;/svg&gt;
 &lt;/symbol&gt;
&lt;/svg&gt;
&lt;p&gt;For my development setup I typically rely on &lt;a href="https://containers.dev/"&gt;Development Containers&lt;/a&gt; which works very UI centric. Your Ide discovers the &lt;code&gt;.devcontainer&lt;/code&gt; folder and boots an edit container and starts whatever you have defined in your &lt;code&gt;docker-compose.yml&lt;/code&gt; file. This is great for sharing, I &lt;a href="/blog/2024/05/devcontainers-the-fine-print.html"&gt;wrote about it&lt;/a&gt;, read for a refresher.&lt;/p&gt;
&lt;p&gt;In a terminal centric world this is a heavy approach and I want options&lt;/p&gt;
&lt;h2&gt;Multiplex your terminal&lt;/h2&gt;
&lt;p&gt;My goal: with a single script start &lt;code&gt;quarkus dev&lt;/code&gt;, twice &lt;code&gt;npm run dev&lt;/code&gt; and a database (&lt;a href="https://couchdb.apache.org/"&gt;Apache CouchDB&lt;/a&gt;, glad you asked). They all need to run in the foreground, so I can keep an eye on them. This precludes simply using &lt;code&gt;&amp;amp;&lt;/code&gt; to run them in the background.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://github.com/tmux/tmux/wiki"&gt;tmux&lt;/a&gt;. The wiki describes it: "&lt;em&gt;tmux is a terminal multiplexer. It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal.&lt;/em&gt;" Claude described it like this (might contain emscripten):&lt;/p&gt;
&lt;div class="adm-block adm-info"&gt;
 &lt;div class="adm-heading"&gt;
  &lt;svg class="adm-icon"&gt;
   &lt;use xlink:href="#adm-info" /&gt;
  &lt;/svg&gt;&lt;span&gt;Claude's take on tmux&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="adm-body"&gt;
  &lt;p&gt;Old habits die hard: you open a terminal, start a long running task, your SSH (Secure Shell) connection drops and your task dies with it. Enter tmux, the terminal multiplexer. It sits between your terminal and your shell sessions, so the sessions live on the server (or your machine), not in the window you happen to be looking at. Close the laptop, reconnect from the coffee shop, run tmux attach and everything is exactly where you left it.&lt;br&gt;
    Multiplexing is the second trick: one terminal window hosts multiple sessions, each with multiple windows (think tabs), each split into panes. API server on the left, logs on the right, a shell at the bottom — all navigated by keyboard, no mouse gymnastics required. Everything hangs off a prefix key, Ctrl-b by default, which the seasoned crowd promptly remaps to Ctrl-a (a habit inherited from GNU screen, tmux's venerable predecessor).&lt;br&gt;
    The price of admission is a modest set of keyboard shortcuts and, optionally, a &lt;code&gt;~/.tmux.conf&lt;/code&gt; to bend it to your will. The payoff: sessions that survive disconnects, scripted development environments that launch your entire workspace with one command, and even pair programming by attaching two people to the same session. As usual YMMV.&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</description>
	<link>2026/08/use-tmux-to-automate-your-developer-setup.html</link>
	<author>Stephan H. Wissel</author>
	<guid>eb1cf600-95e1-11f1-9eae-8bf640f2554e</guid>
	<pubDate>12 August 2026</pubDate>

</item>
<item>
	<title>Signing your git commits</title>
	<description>&lt;p&gt;Code pedigree is more important than ever with the ever increasing rate of supply chain attacks. Setting up code signing are a few steps, recorded here for reference.&lt;/p&gt;
&lt;h2&gt;Choice of key formats&lt;/h2&gt;
&lt;p&gt;While you could pick an &lt;code&gt;ssh&lt;/code&gt; or &lt;code&gt;x509&lt;/code&gt; key, I shall stick to &lt;code&gt;gpg&lt;/code&gt; and the &lt;code&gt;Ed25519&lt;/code&gt; algorythm.&lt;/p&gt;
&lt;h3&gt;Act 1 - get macOS ready&lt;/h3&gt;
&lt;p&gt;When you followed &lt;a href="blog/2025/08/installing-a-macos-developer-workstation.html"&gt;earlier advice&lt;/a&gt; you are good to go. If not, install &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; and dependencies&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;brew install gh gpg pinentry-mac

# setup pinentry
mkdir -p ~/.gnupg
chmod 700 ~/.gnupg
echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" &amp;gt;&amp;gt; ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Act 2 - create the key&lt;/h3&gt;
&lt;p&gt;This creates a signing key that lasts for 2 years. Make sure to get the eMail right. After creation we extract the key id.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gpg --batch --quick-generate-key "John Doe &amp;lt;john.doe@example.com&amp;gt;" ed25519 sign
TARGET_EMAIL="john.doe@example.com"
GPG_KEY_ID=$(gpg --list-secret-keys --with-colons "$TARGET_EMAIL" 2&amp;gt;/dev/null \
             | awk -F: '$1=="sec" {print $5; exit}')
echo Your key id is $GPG_KEY_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You also can do that manually running &lt;code&gt;gpg --list-secret-keys --keyid-format=long&lt;/code&gt; and look for the string after the &lt;code&gt;/&lt;/code&gt; in the line starting with &lt;code&gt;sec&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Act 3 - configure your local git&lt;/h3&gt;
&lt;p&gt;Make sure to get the eMail right&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;git config --global user.name "John Doe"
git config --global user.email "$TARGET_EMAIL"
git config --global user.signingkey "$GPG_KEY_ID"
git config --global commit.gpgsign true
git config --global tag.gpgsign true
git config --global pull.rebase true

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Act 4 - Let github know&lt;/h3&gt;
&lt;p&gt;Display the public key:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gpg --armor --export $GPG_KEY_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go to your &lt;a href="https://github.com/settings/keys"&gt;Github key settings&lt;/a&gt;, click on "&lt;strong&gt;New GPG key&lt;/strong&gt;" and paste it&lt;/p&gt;
&lt;h3&gt;Act 5 - overwrite for individual repos (optional)&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;git config user.name "John Doe"
git config user.email "$TARGET_EMAIL"
git config user.signingkey "$GPG_KEY_ID"
git config commit.gpgsign true
git config tag.gpgsign true
git config pull.rebase true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For adventurous souls there is a &lt;a href="https://gist.github.com/Stwissel/1186dae6832f438a0d533e5770cbcced"&gt;setup script&lt;/a&gt; available to automate this. Use at your own risk.&lt;/p&gt;
&lt;p&gt;As usual YMMV&lt;/p&gt;</description>
	<link>2026/08/signing-your-git-commits.html</link>
	<author>Stephan H. Wissel</author>
	<guid>4c48f1f0-9131-11f1-bf74-5f1da76d7425</guid>
	<pubDate>06 August 2026</pubDate>

</item>
<item>
	<title>welcome http query</title>
	<description>&lt;p&gt;In 2026, after a 16 years pause, HTTP gained a new keyword &lt;a href="https://datatracker.ietf.org/doc/html/rfc10008"&gt;QUERY&lt;/a&gt;. Much &lt;a href="https://www.theregister.com/devops/2026/07/13/http-gets-a-query-method-so-complex-searches-can-stop-pretending-to-be-post/5270192"&gt;has been said&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/webdev/comments/1ummfyr/rfc_10008_is_official_the_http_query_method_is/?rdt=34595"&gt;said&lt;/a&gt; about the &lt;code&gt;GET&lt;/code&gt; with a body. But why did it take so long?&lt;/p&gt;
&lt;h2&gt;Agreement not implementation&lt;/h2&gt;
&lt;p&gt;I'll share a secret: QUERY has been &lt;a href="https://github.com/Stwissel/httpfun"&gt;supported&lt;/a&gt; by HTTP for a long time. So has &lt;code&gt;HTTP UNIVERSE&lt;/code&gt; or &lt;code&gt;HTTP TANGO&lt;/code&gt; The protocol doesn't care for the keyword. Your client an server care. &lt;code&gt;HTTP GET&lt;/code&gt; can't contain a body - nonsense. Of course it can. And you can expect, unless you control both sides, that it will fail in one way or another.&lt;/p&gt;
&lt;p&gt;So the &lt;a href="https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force"&gt;IETF&lt;/a&gt; standards are the etiquette of interaction, not the laws. They are the gentlemen agreement stating "If we both follow the RFC, we can have the reasonable expectation that this exchange of information could work".&lt;/p&gt;
&lt;p&gt;Hammering out agreements that don't break previous ones it time consuming and tedious, especially in venerable, foundational standards like http. just see how time tested the standards surrounding http are:&lt;/p&gt;
&lt;h3&gt;Standards&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Method&lt;/th&gt;
   &lt;th align="center"&gt;Standardized&lt;/th&gt;
   &lt;th&gt;Document&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;td&gt;GET&lt;/td&gt;
   &lt;td align="center"&gt;1991&lt;/td&gt;
   &lt;td&gt;HTTP/0.9&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;GET, HEAD, POST&lt;/td&gt;
   &lt;td align="center"&gt;1996&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc1945"&gt;RFC 1945&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;OPTIONS, PUT, DELETE, TRACE, CONNECT&lt;/td&gt;
   &lt;td align="center"&gt;1997&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc2068"&gt;RFC 2068&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;/td&gt;
   &lt;td align="center"&gt;refined 1999&lt;/td&gt;
   &lt;td&gt;(HTTP/1.1) &lt;a href="https://datatracker.ietf.org/doc/html/rfc26116"&gt;RFC 2616&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;PATCH&lt;/td&gt;
   &lt;td align="center"&gt;2010&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5789"&gt;RFC 5789&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Summarized HTTP semantics&lt;/td&gt;
   &lt;td align="center"&gt;2022&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/9110"&gt;RFC 9110&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;QUERY&lt;/td&gt;
   &lt;td align="center"&gt;2026&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/10008"&gt;RFC 10008&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Extensions&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Extension&lt;/th&gt;
   &lt;th&gt;Since&lt;/th&gt;
   &lt;th&gt;Document&lt;/th&gt;
   &lt;th&gt;Methods added&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;td&gt;WebDAV (core)&lt;/td&gt;
   &lt;td&gt;1999&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/2518"&gt;RFC 2518&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;/td&gt;
   &lt;td&gt;revised 2007&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/4918"&gt;RFC 4918&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;DeltaV (versioning)&lt;/td&gt;
   &lt;td&gt;2002&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3253"&gt;RFC 3253&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;CHECKOUT, CHECKIN, VERSION-CONTROL, REPORT, MERGE, …&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;Ordered Collections&lt;/td&gt;
   &lt;td&gt;2003&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3648"&gt;RFC 3648&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;ORDERPATCH&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;ACL (Access Control List)&lt;/td&gt;
   &lt;td&gt;2004&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/3477"&gt;RFC 3744&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;ACL&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;CalDAV (calendaring)&lt;/td&gt;
   &lt;td&gt;2007&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/4791"&gt;RFC 4791&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;MKCALENDAR&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;SEARCH&lt;/strong&gt;&lt;/td&gt;
   &lt;td&gt;2008&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5323"&gt;RFC 5323&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;SEARCH&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;BIND (bindings)&lt;/td&gt;
   &lt;td&gt;2010&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/5842"&gt;RFC 5842&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;BIND, UNBIND, REBIND&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;CardDAV (contacts)&lt;/td&gt;
   &lt;td&gt;2011&lt;/td&gt;
   &lt;td&gt;&lt;a href="https://datatracker.ietf.org/doc/html/6352"&gt;RFC 6352&lt;/a&gt;&lt;/td&gt;
   &lt;td&gt;(reuses WebDAV methods)&lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The WebDAV SEARCH method (2008) was the early inspiration for QUERY — drafts even used the name SEARCH before the working group settled on QUERY to avoid the WebDAV baggage and map cleanly onto the URI query component.&lt;/p&gt;
&lt;h3&gt;HTTP anything&lt;/h3&gt;
&lt;p&gt;Don't believe &lt;code&gt;HTTP TANGO&lt;/code&gt; would work? Just clone my &lt;a href="https://github.com/Stwissel/httpfun"&gt;little fun project&lt;/a&gt;, run it and open the developer tools to watch the network.&lt;br&gt;
  Works, since it controls both ends.&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/images/2026/httpfun.png" alt="Fun with HTTP methods"&gt;&lt;/p&gt;
&lt;h3&gt;Tooling needs to catch up&lt;/h3&gt;
&lt;p&gt;Now &lt;code&gt;QUERY&lt;/code&gt; is a standard, tooling needs to catch up. Enums need extension and adjacent standards updated. E.g &lt;a href="https://spec.openapis.org/oas/v3.0.3.html"&gt;OpenAPI 3.x&lt;/a&gt; has no provision for new HTTP syntax, while &lt;a href="https://www.usebruno.com/"&gt;Bruno&lt;/a&gt; and &lt;a href="https://curl.se/"&gt;curl&lt;/a&gt; do just fine.&lt;/p&gt;
&lt;p&gt;As usual YMMV&lt;/p&gt;</description>
	<link>2026/07/welcome-http-query.html</link>
	<author>Stephan H. Wissel</author>
	<guid>b6c47f10-81e9-11f1-b253-db3fcfbe8199</guid>
	<pubDate>17 July 2026</pubDate>

</item>
<item>
	<title>sharing vs routing</title>
	<description>&lt;p&gt;Common to all collaboration platforms is the ability to define what items (files, emails, chats, videos) get shared with whom and how (read-only, read-write, comment). What is missing is sharing the intend or purpose. There is what, who, how but not why.&lt;/p&gt;
&lt;p&gt;Formal workflow systems on the other hand, while rigid in the way they operate, thrive on intend: "&lt;em&gt;for review&lt;/em&gt;", "&lt;em&gt;for approval&lt;/em&gt;", "&lt;em&gt;for risk analysis&lt;/em&gt;" and so on.&lt;/p&gt;
&lt;h2&gt;Finding the middle ground&lt;/h2&gt;
&lt;p&gt;Capturing the purpose or intend allows to uncover actual (soft) workflows. The challenge to solve is to make it worthwhile to the regular users to declare their intend (which by itself is hilarious: how to declare the intend "&lt;em&gt;cover-my-backside&lt;/em&gt;" in office compatible lingo?)&lt;/p&gt;
&lt;p&gt;A few ideas how to implement this:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;make it easy, the dialogue defining the share includes a field for intend. Most sharing dialogues allow notifications, so it is half way there&lt;/li&gt;
 &lt;li&gt;adjust the language in the UX: add a "route to" capability&lt;/li&gt;
 &lt;li&gt;integrate it into a task management system (I'd favour &lt;a href="https://en.wikipedia.org/wiki/Getting_Things_Done"&gt;GTD&lt;/a&gt;)&lt;/li&gt;
 &lt;li&gt;add a fancy dashboard to visualize flows&lt;/li&gt;
 &lt;li&gt;find promoters who are keen to try that way of work&lt;/li&gt;
 &lt;li&gt;use machine learning to predict the routing (been there, &lt;a href="https://github.com/OpenNTF/AFSfNC"&gt;done that&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is this a good idea, what do you think?&lt;/p&gt;</description>
	<link>2026/07/sharing-vs-routing.html</link>
	<author>Stephan H. Wissel</author>
	<guid>ca6b1290-750f-11f1-a809-e92464b7e3f5</guid>
	<pubDate>01 July 2026</pubDate>

</item>
<item>
	<title>My AI coding workflow</title>
	<description>&lt;p&gt;There are &lt;a href="https://www.google.com/search?q=How+to+best+code+with+AI"&gt;infinite opinions&lt;/a&gt; available how to use AI in software development. I haven't formed one, so I'm documenting what, so far has worked for me. I distinguish between the ideation phase, which's output is a set of specs, issues, tickets, whatever you call it and the implementation phase, which's output is working code.&lt;/p&gt;
&lt;p&gt;The two phases run in sequence (doh), but not exclusive. E.g. while feature one and two run through implementation, feature three and four csn be in ideation. This post is about the implementation phase.&lt;/p&gt;
&lt;h2&gt;Chinese whispers (AI edition)&lt;/h2&gt;
&lt;p&gt;Based on the ideation phase I start with a set of github issues. They tend to be more than single sentence descriptions of an desired outcome. I launch multiple instances of Claude using &lt;code&gt;claude -w&lt;/code&gt;, to enable the &lt;a href="https://git-scm.com/docs/git-worktree"&gt;git worktree&lt;/a&gt; support. The exact number depends on your willingness to endure frequent context switching, I'm old so I stick to 2-4.&lt;/p&gt;
&lt;p&gt;In each instance I follow the same prompt: "&lt;em&gt;Plan and implement issue &lt;code&gt;#42&lt;/code&gt;, share your assumptions, ask clarifying questions, outline options and seek approvals&lt;/em&gt;"&lt;/p&gt;
&lt;p&gt;AI goes through a round of questions and challenges until we reach consensus and it implements the task at hand. Once done it creates a pull request. The creation of the pull request triggers code reviews. Currently that's &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review"&gt;GitHub Copilot review&lt;/a&gt; and &lt;a href="https://coderabbit.link/stephan-h-wissel"&gt;CodeRabbit AI&lt;/a&gt; (disclaimer: the link is a referral link). Both agents review the code, come to conclusions and share them in conversations in the pull request. What's interesting is that they both highlight different issues with limited overlap. I'm particularly fond of CodeRabbit's "nitpick" level of feedback.&lt;/p&gt;
&lt;p&gt;Once their review is completed, I let the PR merge, most of the time more that one from the various work trees. To close the feedback loop I then prompt: "&lt;em&gt;Visit all pull requests [timeframe] and look for unresolved conversations. Assess each claim for merit and decide if it is still valid. When no longer valid, post your justification as comment. When still valid, create a new issue with detailed explanation and options, so any developer can understand and act on it, then add a comment linking to the issue. In both cases, mark the conversation as resolved.&lt;/em&gt;"&lt;/p&gt;
&lt;p&gt;This approach strikes a balance between "let the agent do its thing" and "keep the development transparent". If your source of truth for development tasks isn't GitHub issues, you need to adjust my approach.&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/images/2026/CodingWorkflow.jpg" alt="Coding Workflow"&gt;&lt;/p&gt;
&lt;p&gt;All of this gets supported by &lt;code&gt;CLAUDE.md&lt;/code&gt;, MCP, Skills, Tools etc, but that's another story for another time.&lt;/p&gt;
&lt;p&gt;As usual YMMV&lt;/p&gt;</description>
	<link>2026/05/my-ai-coding-workflow.html</link>
	<author>Stephan H. Wissel</author>
	<guid>b2f58350-52a2-11f1-ab41-6f3251288c92</guid>
	<pubDate>08 May 2026</pubDate>

</item>

</channel>
</rss>
