<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>optional.is/required</title>
	<atom:link href="https://optional.is/required/feed/" rel="self" type="application/rss+xml" />
	<link>https://optional.is/required</link>
	<description>optional is required</description>
	<lastBuildDate>Wed, 13 May 2026 08:41:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://optional.is/required/feed/"/>
	<item>
		<title>Week #795 &#038; #796</title>
		<link>https://optional.is/required/2026/05/15/week-795-796/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Fri, 15 May 2026 12:21:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Weeknotes]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[LEDs]]></category>
		<category><![CDATA[meetings]]></category>
		<category><![CDATA[photography]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9842</guid>

					<description><![CDATA[Another double weeknote, but again a shortened week. Lots of meetings and progress in the background.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Week #795</h2>



<p>On Thursday we had an idea for camera filter. It has based partly on Hatch Show Prints and partly on Gradient overlay photos. It is a pretty easy effect to replicate in any image editing software. You have your base image, convert it to black and white, adjust the contrast/brightness to taste. Then on a second layer add a gradient and change the blend mode to &#8220;screen&#8221;. Even though this is easy to do in software, it is also fun to see it being applied in realtime with the colors you choose. This allow you to better compose the image and quicker to snap and share.</p>



<p>We&#8217;re trying to wrap-up a few projects before starting a new one. Several months ago we were brought onboard to just &#8220;Update an API in an app&#8221; which lead to a MUCH bigger mess. We re-wrote the whole thing, changed the API 2 or 3 more times and switched backend partners. This week, we finally got to the state where we can be &#8220;done&#8221;. It is now their job to turn this prototype into a product. They plan on raising money and building a team around the idea. It&#8217;s be great to help, but now we need to move to other projects.</p>



<p>For the WebRTC project, we&#8217;ve added more sample content. We&#8217;re experimenting with vertical video content and all the samples we can find are &#8220;shorts&#8221;, so we had to manually crop some longer videos into a vertical format as a test.</p>



<p>We published <a href="https://optional.is/required/2026/05/07/ubs-c-non-power-delivery/">UBS-C Non-Power Delivery</a>, because we&#8217;re always trying to optimize our travel cable carry and this threw a wrench in the gears!</p>



<p>The bigger project we&#8217;re moving into is a result of our trip to Miami. We presented and pitched some prototype ideas on the request of a client. Their internal team now needs to make the call to use this new platform or a more expensive existing one. They are under massive deadline pressure, so it makes sense to go with what works. We&#8217;ve split the project into 4 parts and we&#8217;ve got the green light on the first part (not our team), the second part is controlling a bunch of LEDs. It looks like we can start exploring using an ESP32 and string of LEDs to get an iOS app to turn them on or off on demand. The 3rd part is the proper web admin tool and iOS apps. The 4th part is integrating their CRM of choice into the web app to keep things in sync. They definitely want todo steps 3 &amp; 4, but maybe not for any summer deadlines.</p>



<h2 class="wp-block-heading">Week #796</h2>



<p>This is another short week here in Iceland. Thursday is a public holiday and Friday is a write-off as well.</p>



<p>Monday turned out to be a day full of follow-up meetings on various projects: 11:00, 12:00, 14:00, 15:30, &amp; 20:00! A lot was accomplished and it unblocked us to continue the rest of the week.</p>



<p>Tuesday started with an early meeting. We needed a tool to manage phrases in an upcoming game prototype. We could do it in the Unity editor, but we decided not too since that would be a bit bulky for someone to do quick &#8216;live-ops&#8217; edits. Instead, we built a quick PHP website with an sqlite backend to manage these phrases. With a JSON dump we can now easily import into the Unity project and even push changes back to the website.</p>



<p>In the background to all these tasks, we still have two lingering projects. Last week we tried to finish-up everything for 1 small iOS app, but this week we got a request to add 3 more small features. It depends on some backend changes (which we&#8217;re not part of) but then we can implement what&#8217;s needed.</p>



<p>The other software project still has not officially been green-lit, so we&#8217;re working on it enough to show progress, but it can&#8217;t take all of our time right now either.</p>



<p>We continue to work on the Gradient Camera app, which has been renamed to <a href="https://en.wikipedia.org/wiki/Split-fount_inking">Split-fount</a>. It&#8217;s not a name that rolls off the tongue, so we wouldn&#8217;t say it&#8217;s final, but it does better explain what it does.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/05/gradient-chips.png" alt="11 color chips representing the options in the Split-fount camera app" /></figure>



<p>We also settled on 11 color gradient options. They run the spectrum and offer bright options that make an impact. We&#8217;re very happy with these options and will continue to snap more photos as tests, but we don&#8217;t expect to expand or change these much.</p>



<p>We also added an &#8220;invert&#8221; option. We were finding that on grey, dreary days, the sky was so white in the photos we never really say the top gradient color. When you invert the image, it flips the black and white image to a negative and then applies the screen gradient to that. It is a completely different look and feel.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/05/split-fount-examples.jpg" alt="Example photos"/><figcaption>Several example photos using different gradient colors. The last image uses the invert feature making the trees white.</figcaption></figure>



<p>This all can be done in post-production, but there is something magical about framing your shot and seeing how the final product will look. You change your angle, position and composition to make sure you capture the feeling you want.</p>



<h2 class="wp-block-heading">Bric-à-brac</h2>



<div class="banner"><img fetchpriority="high" decoding="async" title="hieroglyphs styled" src="http://optional.is/required/wp-content/uploads/2009/12/hieroglyphs-styled.png" alt="hieroglyphs styled" width="600" height="125" srcset="https://optional.is/required/wp-content/uploads/2009/12/hieroglyphs-styled.png 600w, https://optional.is/required/wp-content/uploads/2009/12/hieroglyphs-styled-300x62.png 300w" sizes="(max-width: 600px) 100vw, 600px"/></div>



<p>Our friend <a href="https://meet.andr3.net">Andr3</a> alerted us to this posted entitled: <a href="https://www.trojan-unicorn.com/village/warriors/david/blog/articles/2522-welcome-the-entire-land">Welcome The Entire World</a>. This is in reference to a presentation we gave at Codebits in Lisbon, Portugal, back in 02009. You can read <a href="https://optional.is/required/2009/12/03/welcome-the-entire-land/">the back story for Welcome the Entire Land</a>. It was one of those follies that has somehow struck a cord with folks!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>UBS-C Non-Power Delivery</title>
		<link>https://optional.is/required/2026/05/07/ubs-c-non-power-delivery/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Thu, 07 May 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[You're doing it wrong]]></category>
		<category><![CDATA[cables]]></category>
		<category><![CDATA[EU]]></category>
		<category><![CDATA[PD]]></category>
		<category><![CDATA[Power Delivery]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[USB-C]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9865</guid>

					<description><![CDATA[In our quest to minimize our electronic support travel kit, we hit a snag with non-PD devices.]]></description>
										<content:encoded><![CDATA[
<p>For a while now, we&#8217;ve been trying to both minimize and optimize our cable and power travel kit.</p>



<p>Back in Jan-02025, we wrote <a href="https://optional.is/required/2025/01/28/optimized-charging/">Optimized Charging</a> about our attempts to figure out what is the maximum power draw from various devices. Maybe those big power-bricks went over board for most devices.</p>



<p>This time we&#8217;re back to the opposite direction. We&#8217;ve acquired several &#8216;fun&#8217; bits of hardware that are certainly not premium Apple devices. As such, they are usually USB-C charging ports; thanks to the EU e-waste rules attempting to minimize cables and plugs, but these devices tend to ship with a USB-C to USB-A cable.</p>



<p>That&#8217;s annoying because we&#8217;re doing our best to move to JUST USB-C to USB-C cables to minimize what we need to take with us. When we plug-in our USB-C candy bar burner phone to a 20W Apple USB-C PD plug, nothing happens. Sometimes the manufacture recommends to use the plug that came with their device. Which is exactly what we&#8217;re trying to avoid.</p>



<p>After some digging we realized that these &#8216;cheap&#8217;, &#8216;fun&#8217; hardware toys were shipping with a USB-C to USB-A cable is because USB-A will only pass through (up to) 15W of power, defaulting to something closer to 5W. When we were plugging in a USB-C to USB-C cable from the device to the charger, the charger was using the PD (power delivery) to try to negotiation with the device how much power to actually supply. Since these &#8216;dumb&#8217; devices were not PD compatible, they never answered the hand-shake and therefore power never started flowing.</p>



<p>Just having a USB-A in the chain between the PD Plug and the device stops the handshake and limits the power way down. Then no negotiation is needed and power flows.</p>



<p>Using a 35W Apple duel USB-C PD plug, we plugged in a USB-C to USB-C cable to our burner phone and there was no charge. We swapped the cable for a USB-C to USB-A cable, with a USB-A to USB-C adapter and plug that into the 35W plug. The burner phone immediately lit up charging!</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/05/cables-982x1024.jpg" alt="Three orientations of how to plug in the device to power plug. USB-C to USB-A with a USB-C adapter that charges. USB-A with USB-C adapter to USB-C no charge. USB-C to USB-C no charge." /></div>



<p>If any non-PD device comes along with us we now have to figure out a new system. </p>



<ol class="wp-block-list">
<li>Keep our USB-C only cables and find a very lower Wattage plug that is USB-C and not PD and bring that along.</li>



<li>Bring along a USB-C to USB-A cable and a USB-A plug</li>



<li>Bring along a USB-C to USB-A cable and a USB-A to USB-C adapter</li>
</ol>



<p>It will probably be option 3, simply because when we get onto an airplane or hotel they usually still have USB-A plugs. Which means we were carrying a USB-C to USB-A adapter already, we could forego that and just bring the cable.</p>



<aside><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> In our testing, we also ran into another problem. Some of the cheap USB-C to USB-A cables (even C-to-C cables) were only meant for charging. That&#8217;s fine for most cases, but sometimes we wanted to connect the device with a laptop to extract photos or other media. Having only a charging cable meant the device never showed-up on the computer when plugged in. Be sure to check that the cables you bring can also transfer data, not just power!</p></aside>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Week #793 &#038; #794</title>
		<link>https://optional.is/required/2026/05/01/week-793-794/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Fri, 01 May 2026 12:21:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Weeknotes]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[boarding pass]]></category>
		<category><![CDATA[infrared]]></category>
		<category><![CDATA[miami]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9822</guid>

					<description><![CDATA[A double weeknote that resembled Swiss cheese! Between travel and public holidays there was a lot of stop and start.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Week #793</h2>



<p>This week we wrapped-up several surveys that were lingering from March and finished directly pestering high school students and now turned it over to the schools to get the minimum response rate.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/miami-trip.jpg" alt="Collage of images from the Miami Trip"/></div>



<p>On Wednesday we started our trip home from Miami. We were there almost a week having meetings, checking-in with friends and quickly prototyping for more meetings. Overall, the meetings went well, it was fun to get out and see Miami, and we made a few new friends.</p>



<p>On Thursday, it was a public holiday here in Iceland it was the First Day of Summer. It is also the start of the Old Icelandic month Harpa, which is the start of the six month summer period. The first day of winter is not really celebrated, but it is trying to be re-branded as Meat Soup Day in preparation for the cold months ahead.</p>



<p>We published an article about <a href="https://optional.is/required/2026/04/23/100-year-old-spatial-images/">100 year old spatial images</a> that we&#8217;ve been experimenting creating. It has been a fun project that has some interesting possibilities going forward.</p>



<p>In the background, we continue to update our Web app for the Australian Concreters. The more they use it, the more they need small fixes here and there: More columns in the table, adding public holidays to the planning calendar, etc. We&#8217;re over the hump of getting the app working, now we&#8217;re making improvements and refinements.</p>



<p>We&#8217;re always improving our backup regime and this week we started to revisit the old MacBook Pro from 02016. Currently the laptop is being used as our photo database. Hardware-wise it is a 1TB SSD, but the keyboard is broken and it is an Intel machine with limited support. To keep our large photo library off our working computer we are using this one to store photos. We really need to keep those back-ups in triplicate: LOCKSS (&#8220;Lots of Copies Keep Stuff Safe&#8221;). Currently, the whole computer gets backed-up with Time Machine and then replicated to an air-gapped external HD and also saved offsite. The issue we realized is that if that computer dies, we don&#8217;t actually want to restore the whole HD Image to a new computer, we just want that photo library! It is a bit of a waste, but right now it is easiest to continue to use Time Machine to automatically and periodically backup. We can mount the <code>.sparsebundle</code> file and retrieve any file without needing to do a full restore. Now the task is to delete all the un-used apps, preferences, etc. to lighten the backups of the old MacBook Pro.</p>



<h2 class="wp-block-heading">Week #794</h2>



<p>It is another short week because Friday is May 1st. That&#8217;s another public holiday in most of Europe.</p>



<p>This week we spent mostly dusting around the edges of things. We have a small iOS app project around video feed from various cameras. We&#8217;re waiting for some backend updates before we can finalize it. We met with the team, talked with the manufacturer and we think we&#8217;ve cracked how to get the info we need. </p>



<p>We&#8217;re also waiting for another project to be green-lit. Our contact is working hard to sell the idea internally and almost everyone one is on board. The last hold-outs are super busy and behind schedule. They are willing to go with an existing, tested company, then work with us to build something new. Which totally makes sense, but we&#8217;re still in the running, if not for next month, defiantly for the future. So to prep and not be under some horrible deadline stress, we started on the Django Web admin tool portion. This is going to need to be done no matter what, so we setup some basic models, authentication and file uploading.</p>



<p>We are working on a time tracking tool that tightly integrates with our accounting software. We&#8217;ve had a few external teams use it and this week we fixed a few more bugs and added a few new features that we needed. We took over direct control of a project down in Australia, so we needed to change all the hours from one project to another. Same thing, different entities to invoice. So we added a bulk time log update. While we were in there we fixed a few other bugs and did a bit of UI clean-up.</p>



<h2 class="wp-block-heading">Bric-à-brac</h2>



<iframe width="560" height="315" src="https://www.youtube.com/embed/XFXHwz8PgcY?si=PVkkXNath0bMWZZR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



<p>Being in the US this week, we managed to watch <a href="https://www.pbs.org/show/life-unearthed-with-ariel-waldman">Life Unearthed by our old friend Ariel Waldman</a>. Normally it is geo-locked, but not when you&#8217;re inside the geo fence. If you can you should definitely check it out!</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/boarding-pass.jpg" alt="02026 Icelandair Boarding pass, very similar to the one we designed in 02007" /></div>



<p>Back in 02010, we wrote about our experience with the <a href="https://optional.is/required/2010/05/25/papernet-boarding-pass/">Icelandair Boarding printable pass</a>, which we designed in 02007. On our travels this week, we printed our boarding pass and lo and behold, it is pretty much our original design! Three sections, barcode multiple times, travel info, next steps. It&#8217;s missing the weather and social integrations.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>100 year old spatial images</title>
		<link>https://optional.is/required/2026/04/23/100-year-old-spatial-images/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[spatial]]></category>
		<category><![CDATA[stereoscopic]]></category>
		<category><![CDATA[VR]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9768</guid>

					<description><![CDATA[Going through the Icelandic photo archives for stereoscopic images and converting them to spatial images brings new life to images over 100 years old.]]></description>
										<content:encoded><![CDATA[
<p>Over the last year or so, we&#8217;ve been doing some experiments with spatial images. A spatial image is a single image file, but has a different picture for your left and right eye. These are commonly used in Virtual Reality, but we&#8217;re all probably much more familiar with them from the old <em>View Master</em> toys.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/View-Master-Classic-Deluxe-Edition.jpg" alt="View Master Product with several paper discs"/></div>



<p>The View Master was a plastic set of goggles that you inserted a paper disc into that would rotate around to see a set of seven 3D images! It appeared in 3D because the images for the left and right eye were different images of the same thing using slightly offset cameras. This mimicked what you&#8217;re left and right eye would naturally see.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/Holmes-Stereoscope.jpg" alt="Holmes Stereoscope"/></div>



<p>100 years before the View Master, we had <a href="https://en.wikipedia.org/wiki/Stereoscope">Stereoscopes</a>. The earliest was from 01832 and worked in exactly the same way, but instead of a paper disc, they used single cards with printed images. They were the first 3D VR headsets.</p>



<p>Luckily for us, there was a craze for taking these 3D pictures, which means you can find lots of 3D imagery from 100+ years ago online. Reykjavik and Iceland both have online photography collections. With a little bit of searching and help from their team, we found thousands of stereoscopic images in the archives. These consisted of a single, wide image that contained both the image for the left and right eye.</p>



<ul class="wp-block-list">
<li><a href="https://sarpur.is/en/collection/?f=sfield%3Amaterial_s%3D%23Stereóskóp%23&amp;om=2&amp;s=sort_inv_is_sml%20asc">Stereoscope images on Sarpur Iceland’s Cultural-Historical Database Website</a></li>



<li><a href="https://borgarsogusafn.is/myndasafn?q=stereóskóp*">Stereoscope images on Reykjavik Photography museum website</a></li>
</ul>



<h2 class="wp-block-heading">Converting to Spatial Images</h2>



<p>There are lots of tools out there to make spatial images, but they assume that you already have two separate left and right images. Usually this is done with either two separate cameras, or two lenses on a single camera and they get processed as two images.</p>



<p>What we had was a single image that had both pictures side-by-side. To convert this into two separate image files, we opened some image editing software, duplicated the image to two layers, and arranged the left and right images to be on top of each other. Then we could crop correctly and make any minor adjustments.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/layers-example.jpg" alt="Screenshot of photo editing software overlaying the left and right image" /><figcaption>Using photo editing software, the left and right images are put on separate layers. The top layer&#8217;s opacity is decreased to better line-up something in the foreground before saving each layer as a separate file the same dimensions.</figcaption></figure>



<p>Now that we had a left and right image from the stereoscopic card, we can run it through software to create a single 3D image file. We use <a href="https://apps.apple.com/us/app/spatialify/id6471922894">Spatialify</a>, it is cheap, easy and works! It offers several &#8220;3D&#8221; output options, the traditional blue/red offset (anaglyph) for the blue/red 3D glasses, wigglegrams which are animated gifs, and proper spatial files viewable in VR.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/workflow-collage.jpg" alt="Collage of the source image, spatiality app taking a left and a right and sample output"/></div>



<p>There is a lot of trial and error getting things right. Sometimes the source images are badly scratched, damaged or rotated. Finding the correct alignment can be difficult and sometimes the subject matter just doesn&#8217;t lend itself very well in 3D. Luckily, we have a thousands of possible images to convert, if something isn&#8217;t working we can move on.</p>



<h2 class="wp-block-heading">Gallery</h2>



<p>Here is a short list of zip archives with the left, right, spatial, anaglyph and wigglegram for the image. <strong>Be aware, these images might still be under copyright.</strong></p>



<p><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/MAO-106-Wiggle.gif"/><br /><strong>Magnús Ólafsson (1862-1937)</strong><br />01906, A group of people washing clothes in Laugardalur.<br />Download: <a href="https://optional.is/required/wp-content/uploads/2026/04/MAO-106.zip">MAÓ 106 &#8211; 6.1 MB</a></p>



<p><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/MAO-429-Wiggle.gif"/><br /><strong>Magnús Ólafsson (1862-1937)</strong><br />01931, Austurvöllur, Reykjavík. Bertel Thorvaldssen statue prepared for transport.<br />Download: <a href="https://optional.is/required/wp-content/uploads/2026/04/MAO-429.zip">MAÓ 429 &#8211; 6.8 MB</a></p>



<p><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/MAO-862-Wiggle.gif"/><br /><strong>Magnús Ólafsson (1862-1937)</strong><br />01900-01920, Old hut in Hafnarfjörður lava field.<br />Download: <a href="https://optional.is/required/wp-content/uploads/2026/04/MAO-862.zip">MAÓ 429 &#8211; 7.1 MB</a></p>



<p><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/MAO-984-Wiggle.gif"/><br /><strong>Magnús Ólafsson (1862-1937)</strong><br />01930 or 01931, German Graf Zeppelin over Reykjavík. Grófin 1, Tryggvagata and Reykjavík Harbour.<br />Download: <a href="https://optional.is/required/wp-content/uploads/2026/04/MAO-984.zip">MAÓ 429 &#8211; 6.5 MB</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Week #791 &#038; #792</title>
		<link>https://optional.is/required/2026/04/18/week-791-792/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 11:11:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Weeknotes]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[camera apps]]></category>
		<category><![CDATA[meetings]]></category>
		<category><![CDATA[miami]]></category>
		<category><![CDATA[surveys]]></category>
		<category><![CDATA[webrtc]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9757</guid>

					<description><![CDATA[A busy double weeknote that ends with a trip to Miami for meetings.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Week #791</h2>



<p>Monday was a public holiday, so Tuesday was our Monday. We started out working with a team in the UK here in Iceland doing some school observations. Some Icelandic schools are implementing the Starling (PALS) method of learning vocabulary and we&#8217;re tangentially connected.</p>



<p>Over the Easter break, we prototyped yet two more camera apps. One for RGB separations and another for Dithering. These are internal apps and as is are fun, but there are a few missing pieces before we can call them &#8220;ready&#8221;.</p>



<p>We also took some time to refactor the code. Previously, we pulled out all the common components into their own files and would duplicate them back and forth between apps if we made changes. Now we refactored again into a single Xcode project with a different target for each app. All the common code is in one place and it is also easier to see what other non-common code we are re-using elsewhere. In that process, we also setup Xcode cloud for each of the apps. If we make changes to any of the code-base and commit those changes to git version control, it automatically kicks off the process to rebuild all the camera apps.</p>



<p>We had our 4TB Time Machine hard drive go bad. We&#8217;ve written about our backup setup a few times (<a href="https://optional.is/required/2022/05/31/backups/">Backups</a>, <a href="https://optional.is/required/2024/03/19/backup-2-0-das-edition/">Backups 2.0 DAS Edition</a>, <a href="https://optional.is/required/2026/02/26/backups-3-0-remote/">Backups 3.0 Remote</a>) We made a late night online order for another 4TB drive and bright and early the next morning it was dropped off. We hot-swapped it in and started-up some fresh Time Machine backups. </p>



<p>In the process, we remembered the wise words of wisdom &#8220;You don&#8217;t have a backup until you restore it&#8221;. That lead us to fetching one Time Machine image from our off-site backup and adding it back to the hard drive to see if we could pick-up from the last backup.</p>



<p>The drive was probably a bit over 2 years old, so that was much sooner than we expected. We didn&#8217;t amortize the cost over as many months as we&#8217;d hoped, but you win some, you loose some. Overall, we&#8217;re still doing better than paying for our cloud storage.</p>



<h2 class="wp-block-heading">Week #792</h2>



<p>On the backup hard drive front, after a few days of syncing and starting backups again, we&#8217;re back to where we were before the crash. But now we&#8217;re re-evaluating how we should backup older machines. Using Time Machine to take a snapshot of a computer that isn&#8217;t really being used or updating daily is probably overkill. Also, given that if the hard drive in the old laptop crashes, we wouldn&#8217;t buy a new computer and restore an old backup, what we really need todo is clear-off any files not used, and only sync what is actively being worked on (In our case, it is the photos database). But that&#8217;s a task for next week.</p>



<p>This week we continued to work on the WebRTC debugging. We now have everything working and have mimicked the &#8220;companion camera&#8221; feature. Now you can use any WebRTC capable phone (iPhone or Android) to connect to the Apple TV and relay your video and audio to other attendees. Also, in the future we could have an android &#8216;smart tv&#8217; app so you can use your iPhone as the camera to an android TV and relay that to other participants. There were lots of little connections and audio bugs to work out, but now I think we&#8217;re in good shape.</p>



<p>On Tuesday we sent our Q2 <a href="https://optional.is/newsletter/02026Q2/">◍ Quarternotes newsletter</a>. Be sure to subscribe to get it delivered straight to your inbox.</p>



<p>We continue to work on surveys. We had a staff survey in March, but a few organization wanted to move it to April. This month is also our biggest student survey and we&#8217;re also conducting a survey in high schools. After April, things will calm down again.</p>



<p>On another survey front, we finally got connected with another development team to work on how we can use their Single Sign-On solution. Iceland stopped allowing private companies to use the island.is SSO a few years ago. We have them a heads-up and it still hasn&#8217;t been implemented, but it looks like this finally might be the month!</p>



<p>In the land down under, we&#8217;ve got a few more requests from our concreters for updates to their work calendar. Right now we capture a start date and duration and plot that onto a calendar. Now we need to extend the duration to &#8216;skip&#8217; non-work days (Sundays) and holidays. Plus a few additional UI requests. We&#8217;ll implement those next week after our travel meetings.</p>



<p>We also managed to rekindle a game idea from a few years ago. First we meet with the design team to talk about theming and the overall world. Then we met with the engineering team to get everyone up to speed on the previous prototypes. We started in Unity, then switched to SwiftUI and now back to Unity. After kicking the tires on the prototypes, we have a much better understanding of everything that needs to be done.</p>



<p>On Thursday morning we went into a local school in Reykjavik for an observation. Now we have a much better idea of the basic requirements that we&#8217;d need for an online support solution. That afternoon we flew to Miami, Florida USA for some meetings and planning.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/04/miami-flight.jpg" alt="image out the window flying to Miami" /></div>



<p>The Friday meetings went well and we&#8217;ll continue on a proof-of-concept for next week.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hatena Burger Permutations</title>
		<link>https://optional.is/required/2026/04/09/hatena-burger-permutations/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[burgers]]></category>
		<category><![CDATA[combinations]]></category>
		<category><![CDATA[combinatorics]]></category>
		<category><![CDATA[hatena burger]]></category>
		<category><![CDATA[japan]]></category>
		<category><![CDATA[nintendo]]></category>
		<category><![CDATA[permutations]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=8874</guid>

					<description><![CDATA[Hatena Burger boasts over 270,000 burger combinations. Using some combinatorics, let's see if that's true.]]></description>
										<content:encoded><![CDATA[
<p>In Kyoto, Japan, in the Nintendo museum, there is a restaurant called <a href="https://museum.nintendo.com/en/cafe/index.html">Hatena Burger</a>. They claim to have over 270,000 different burgers you can order! Let&#8217;s investigate that claim to see how true it really is.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/hatena-burger.png" alt="Hatena Burger Logo"/></div>



<p>The way they can arrive at such a big number of possible burgers is to have a variety of different items you can combine in various ways. This quickly creates really big amounts of permutations.</p>



<p>Since you can build your own burger you get to choose 1 of 3 different bun types, 1 of 10 different main ingredients, 3 of 11 different toppings and 1 of 7 different types of sauces.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/hatena-burger-menu-jp.jpg" alt="A photo of the menu at Hatena Burger. Lots of icons representing possible choices to build your burger." /></div>



<p>To figure out all the possible combinations you simply multiple all these values together.</p>



<p><code>3 Bun types × 10 Main ingredients × 7 Sauces × (11 Toppings × 11 Toppings × 11 Toppings) = 279,510 possible combinations.</code></p>



<p>It does seem that there are over 270,000 possible burgers you can order, but that comes with several big asterisks! These are possible combinations with repetition. When you are selecting your 3 different  toppings order doesn&#8217;t matter, so Tomato, Lettuce and Cheese is considered a different burger than Lettuce, Cheese and Tomato, but most of us would agree it is the same thing. Also, you can select the same topping 3 times: a Cheese, Cheese, Cheese burger. What is the total possible combinations if we make sure the set of toppings is unique and order independent?</p>



<p>Todo so, we are not multiplying the total number of toppings (11) by the number you can choose (3). Instead we need to look into combinations without repetition using combinatorics. </p>



<p>First we select the number of possible combinations and then subtract the duplicates. We start with 11 different toppings, but once we select the first one, we only have 10 left, and after selecting the second, only 9 left. That&#8217;s 11 × 10 × 9 = 990 possibilities without repeating an ingredient. But that&#8217;s still order independent. We want to reduce that by the number of combinations of our 3 potential selections, which is 3! =  6. We can take 990 / 6 = 165. Then general equation is:</p>



<p>n!/(n-r)!  × (1/r!) where n is the number of times possible (11) and r is the number we can choose (3).</p>



<p>11! /(11-3)!  × (1/3!) = 165 possible combinations without repetition. That&#8217;s a lot lower than the 1,331 possible combinations of 11 × 11 × 11 Toppings or 990 of 11 × 10 × 9 Toppings without repetition.</p>



<p>If we plug that new value into our equation we get <code>3 buns × 10 mains × 7 sauces × ( 11 nCR 3 = 165 topping combinations) = 34,650 possible unique burgers</code>. That&#8217;s far less than the 279,510 possible burger combinations when we preserve the topping order.</p>



<h2 class="wp-block-heading">Interactive Examples</h2>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> These examples require Javascript, so if you&#8217;re looking at this in a feed-reader or email client, it might not work. Check the original link to try these examples.</p>



<p>Channeling <a href="https://worrydream.com">Bret Victor</a>, let&#8217;s have a look at the possible combinations in a more interactive way. One of his approaches was to have inline text be editable, thus changing the flow of the paragraph. He advocated for green text inline being draggable to update the values. Let&#8217;s experiment with the following paragraph. <em>(Try dragging the text in green to the left or right to change the values)</em></p>



<p style="background-color: #dedede; padding: 20px; margin-bottom: 20px">At Hatena Burger, you can build your own burger by selecting from <span id="sliderBun" class="draggable-slider">3</span> different buns, <span id="sliderMain" class="draggable-slider">10</span> different main ingredients, <span id="sliderSauce" class="draggable-slider">7</span> different sauces and 3 of <span id="sliderTopping" class="draggable-slider">11</span> different Toppings. This gives <span id="draggable-result">279,510</span> different possible meals. </p>

<style>
.draggable-slider { color: white; background-color: green; border-radius: 10px; font-weight: bold; padding: 0 10px; cursor: grab; display: inline-block; width: 20px; user-select: none; text-align: center; }
#draggable-result { font-weight: bold; }
</style>

<script type="text/javascript">
var sliderBunValues = ['1','2','3','4'];
const sliderValues = {
 "sliderBun": [1, 2, 3, 4],
 "sliderMain": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
 "sliderSauce": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
 "sliderTopping": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
};

const spanBun  = document.getElementById('sliderBun');
const spanMain = document.getElementById('sliderMain');
const spanSauce = document.getElementById('sliderSauce');
const spanTopping = document.getElementById('sliderTopping');
const results  = document.getElementById('draggable-result');
let isDragging = false;

spanBun.addEventListener('mousedown', (e) => {
  isDragging = true;
  e.preventDefault(); // Prevent text selection
  document.body.style.userSelect = 'none'; // Prevent selection globally
});

spanMain.addEventListener('mousedown', (e) => {
  isDragging = true;
  e.preventDefault(); // Prevent text selection
  document.body.style.userSelect = 'none'; // Prevent selection globally
});

spanTopping.addEventListener('mousedown', (e) => {
  isDragging = true;
  e.preventDefault(); // Prevent text selection
  document.body.style.userSelect = 'none'; // Prevent selection globally
});

spanSauce.addEventListener('mousedown', (e) => {
  isDragging = true;
  e.preventDefault(); // Prevent text selection
  document.body.style.userSelect = 'none'; // Prevent selection globally
});


document.addEventListener('mouseup', () => {
  isDragging = false;
  document.body.style.userSelect = ''; // Restore selection

});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;

  if (!document.getElementById(e.toElement.id)) { return; }


  // Get the X position relative to the span
  const rect = document.getElementById(e.toElement.id).getBoundingClientRect();
  let relativeX = e.clientX - rect.left;

  // Clamp the value between 0 and the span width
  relativeX = Math.max(0, Math.min(relativeX, rect.width));

  // Convert to a value (for example 0–100)
  var newValue = sliderValues[e.toElement.id]

  const value = Math.round((relativeX / rect.width) * (newValue.length - 1));
  // Update the span content
  document.getElementById(e.toElement.id).textContent = newValue[value];
  
  results.textContent = (parseInt(spanBun.textContent) * parseInt(spanMain.textContent) * parseInt(spanSauce.textContent) * parseInt(spanTopping.textContent) * parseInt(spanTopping.textContent) * parseInt(spanTopping.textContent)).toLocaleString();
});
</script>



<p>This is a great example of how changing the number of options by a small amount can make a big impact on the total permutations. The downside is that it overly simplify duplicate toppings and doesn&#8217;t allow for fine grained choices. Maybe not all the toppings or sauces are for me?</p>



<p>Let&#8217;s try again with a more complex menu. This allow the customer to limit the options not by a number, but by dietary preferences; Vegan, Vegetarian, Pescatarian, Dairy-free, Celiac, etc.</p>



<style>
.hb_box {
  display: inline-block;
  width: 80px;
  text-align: center;
  vertical-align: top;
  font-size: 80%;
}
.hb_box img { width: 80px; height: 80px; }
</style>

<h3>Buns</h3>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/bun-brown.png" />
  <label><input type="checkbox" class="hb_bun" name="hb_bun_1" id="hb_bun_1" value="1" checked="checked" /> Brown</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/bun-red.png"  />
  <label><input type="checkbox" class="hb_bun" name="hb_bun_2" id="hb_bun_2" value="2" checked="checked" /> Red</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/bun-black.png" />
  <label><input type="checkbox" class="hb_bun" name="hb_bun_3" id="hb_bun_3" value="3" checked="checked" /> Black</label>
</div>
<hr />

<h3>Main</h3>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-beef.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_1" id="hb_main_1" value="1" checked="checked" /> Beef Patty</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-double-beef.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_2" id="hb_main_2" value="2" checked="checked" /> Beef Patty Double</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-sukiyaki.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_3" id="hb_main_3" value="3" checked="checked" /> Sukiyaki Beef</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-double-sukiyaki.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_4" id="hb_main_4" value="4" checked="checked" /> Sukiyaki Beef Double</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-chicken.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_5" id="hb_main_5" value="5" checked="checked" /> Fried Chicken</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-double-chicken.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_6" id="hb_main_6" value="6" checked="checked" /> Fried Chicken Double</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-fish.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_7" id="hb_main_7" value="7" checked="checked" /> Grilled Miso Fish</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-double-fish.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_8" id="hb_main_8" value="8" checked="checked" /> Grilled Miso Fish Double</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-mushroom.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_9" id="hb_main_9" value="9" checked="checked" /> Big Mushroom</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/main-double-mushroom.png" />
  <label><input type="checkbox" class="hb_main" name="hb_main_10" id="hb_main_10" value="10" checked="checked" /> Big Mushroom Double</label>
</div>
<hr />
<h3>Toppings</h3>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-fried-egg.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_1" id="hb_top_1" value="1" checked="checked" /> Fried Egg</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-scrambled-egg.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_2" id="hb_top_2" value="2" checked="checked" /> Scrambled Egg</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-tofu.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_3" id="hb_top_3" value="3" checked="checked" /> Fried Tofu</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-kyoto-pepper.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_4" id="hb_top_4" value="4" checked="checked" /> Kyoto Green Pepper</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-onion.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_5" id="hb_top_5" value="5" checked="checked" /> Onion</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-cheese.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_6" id="hb_top_6" value="6" checked="checked" /> Cheddar Cheese</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-onion.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_7" id="hb_top_7" value="7" checked="checked" /> Kyoto Green Onion</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-lotus-root.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_8" id="hb_top_8" value="8" checked="checked" /> Stir-Fried Lotus Root</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-tomato.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_9" id="hb_top_9" value="9" checked="checked" /> Tomato</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-lettuce.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_10" id="hb_top_10" value="10" checked="checked" /> Lettuce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/topping-shibazuke-pickles.png" />
  <label><input type="checkbox" class="hb_top" name="hb_top_11" id="hb_top_11" value="11" checked="checked" /> Shibazuke Pickles</label>
</div>
<hr />
<h3>Sauces</h3>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-wasabi-garlic-soy.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_1" id="hb_sauce_1" value="1" checked="checked" /> Wasabi Garlic Soy Sauce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-sukiyaki.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_2" id="hb_sauce_2" value="2" checked="checked" /> Sukiyaki Sauce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-black-curry.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_3" id="hb_sauce_3" value="3" checked="checked" /> Black Curry Sauce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-shibazuke-pickles-tartar.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_4" id="hb_sauce_4" value="4" checked="checked" /> Shibazuke-Pickles Tartar Sauce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-ketchup.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_5" id="hb_sauce_5" value="5" checked="checked" /> Ketchup</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-citrus-pepper-dashi.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_6" id="hb_sauce_6" value="6" checked="checked" /> Citrus Pepper Dashi Sauce</label>
</div>
<div class="hb_box">
  <img decoding="async" src="https://optional.is/required/wp-content/uploads/2025/12/icons/sauce-veggie-aurora.png" />
  <label><input type="checkbox" class="hb_sauce" name="hb_sauce_7" id="hb_sauce_7" value="7" checked="checked" /> Veggie Aurora Sauce</label>
</div>
<hr />
<h3>Stats</h3>
<p>Based on your selection there are <strong id="hb_combinations">xxx</strong> possible burgers.</p>
<hr />
<script>
const bun_checkboxes = document.querySelectorAll('.hb_bun');
const main_checkboxes = document.querySelectorAll('.hb_main');
const sauce_checkboxes = document.querySelectorAll('.hb_sauce');
const top_checkboxes = document.querySelectorAll('.hb_top');

function onBunChange() {
  const atLeastOneChecked = Array.from(bun_checkboxes).some(cb => cb.checked);
  if (!atLeastOneChecked){
    document.getElementById('hb_bun_1').checked = 'checked';
  }
  do_hb_calculation()
}

bun_checkboxes.forEach(cb => {
  cb.addEventListener('change', onBunChange);
});

function onMainChange() {
  const atLeastOneChecked = Array.from(main_checkboxes).some(cb => cb.checked);
  if (!atLeastOneChecked){
    document.getElementById('hb_main_1').checked = 'checked';
  }
  do_hb_calculation()
}

main_checkboxes.forEach(cb => {
  cb.addEventListener('change', onMainChange);
});

function onSauceChange() {
  const atLeastOneChecked = Array.from(sauce_checkboxes).some(cb => cb.checked);
  if (!atLeastOneChecked){
    document.getElementById('hb_sauce_1').checked = 'checked';
  }
  do_hb_calculation()
}

sauce_checkboxes.forEach(cb => {
  cb.addEventListener('change', onSauceChange);
});

function onTopChange() {
  if (document.querySelectorAll('.hb_top:checked').length < 3){
    document.getElementById('hb_top_1').checked = 'checked';
    document.getElementById('hb_top_2').checked = 'checked';
    document.getElementById('hb_top_3').checked = 'checked';
  }
  do_hb_calculation()
}

top_checkboxes.forEach(cb => {
  cb.addEventListener('change', onTopChange);
});

function do_hb_calculation(){
  var combo_count = document.querySelectorAll('.hb_bun:checked').length * document.querySelectorAll('.hb_main:checked').length * document.querySelectorAll('.hb_sauce:checked').length * document.querySelectorAll('.hb_top:checked').length * (document.querySelectorAll('.hb_top:checked').length - 1) * (document.querySelectorAll('.hb_top:checked').length - 2)
  document.getElementById('hb_combinations').textContent = combo_count.toLocaleString()
}
do_hb_calculation()
</script>



<p>Finally, as you build your burger, you get a nice animated cartoon of your combination.</p>



<style>
.hb_stack { display: inline-block; width: 300px; text-align: center }
#hb_topping_1_1, #hb_topping_2_2, #hb_topping_3_3 {   animation: spin1 10s ease-in-out infinite alternate; }
#hb_topping_2_1, #hb_topping_3_2, #hb_topping_1_3 {   animation: spin2 11s ease-in-out infinite alternate; }
#hb_topping_3_1, #hb_topping_1_2, #hb_topping_2_3 {   animation: spin3 9s ease-in-out infinite alternate; }
@keyframes spin1 {
  0% { transform: rotate(-10deg); }
  100% { transform: rotate(10deg); }
}
@keyframes spin2 {
  0% { transform: rotate(8deg); }
  100% { transform: rotate(-12deg); }
}
@keyframes spin3 {
  0% { transform: rotate(-12deg); }
  100% { transform: rotate(7deg); }
}

</style>
<div style="text-align: center;">
<div class="hb_stack" style="text-align: center;">
<div><img decoding="async" id="hb_buntop_1" src=""  /></div>
<div style="position: relative; z-index: 100"><img decoding="async" id="hb_stack_sauce_1" src="" /></div>
<div style="position: relative; margin-top: -20px; z-index: 80"><img decoding="async" id="hb_topping_1_1" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 70"><img decoding="async" id="hb_topping_1_2" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 60"><img decoding="async" id="hb_topping_1_3" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 50"><img decoding="async" id="hb_stack_main_1" src="" /></div>
<div><img decoding="async" id="hb_bunbottom_1" src="" /></div>
</div>

<div class="hb_stack" style="text-align: center;">
<div><img decoding="async" id="hb_buntop_2" src=""  /></div>
<div style="position: relative; z-index: 100"><img decoding="async" id="hb_stack_sauce_2" src="" /></div>
<div style="position: relative; margin-top: -20px; z-index: 80"><img decoding="async" id="hb_topping_2_1" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 70"><img decoding="async" id="hb_topping_2_2" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 60"><img decoding="async" id="hb_topping_2_3" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 50"><img decoding="async" id="hb_stack_main_2" src="" /></div>
<div><img decoding="async" id="hb_bunbottom_2" src="" /></div>
</div>

<div class="hb_stack" style="text-align: center;">
<div><img decoding="async" id="hb_buntop_3" src=""  /></div>
<div style="position: relative; z-index: 100"><img decoding="async" id="hb_stack_sauce_3" src="" /></div>
<div style="position: relative; margin-top: -20px; z-index: 80"><img decoding="async" id="hb_topping_3_1" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 70"><img decoding="async" id="hb_topping_3_2" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 60"><img decoding="async" id="hb_topping_3_3" src="" /></div>
<div style="position: relative; margin-top: -10px; z-index: 50"><img decoding="async" id="hb_stack_main_3" src="" /></div>
<div><img decoding="async" id="hb_bunbottom_3" src="" /></div>
</div>

</div>

<p style="color: blue; cursor: pointer; text-decoration: underline; text-align: center;" onclick="random_hatena_burgers()">Reload Random Burgers</p>

<script>
function fisherYatesShuffle(array) {
    let currentIndex = array.length;
    while (currentIndex !== 0) {
        // Pick a remaining element
        let randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex--;

        // And swap it with the current element
        let temporaryValue = array[currentIndex];
        array[currentIndex] = array[randomIndex];
        array[randomIndex] = temporaryValue;
    }
    return array;
}

function random_hatena_burger(index){


const stack_buns = ['brown','red','black'];
const stack_sauces = ['black-curry','citrus-pepper-dashi','ketchup','shibazuke-pickles-tartar','sukiyaki','veggie-aurora','wasabi-garlic-soy'];
const stack_main = ['chicken','beef','fish','sukiyaki','mushroom','double-chicken','double-beef','double-fish','double-sukiyaki','double-mushroom'];

const stack_toppings = ['tofu','onion','tomato','shibazuke','lettuce','pepper','green-onion','lotus','cheese','egg','scrambled-egg'];


var bun_type = stack_buns[Math.floor(Math.random() * stack_buns.length)];
var bun_top = document.getElementById('hb_buntop_'+ index);
var bun_bottom = document.getElementById('hb_bunbottom_'+ index);
var sauce = document.getElementById('hb_stack_sauce_'+ index);
var sauce_type = stack_sauces[Math.floor(Math.random() * stack_sauces.length)];
var mains = document.getElementById('hb_stack_main_'+ index);
var mains_type = stack_main[Math.floor(Math.random() * stack_main.length)];

bun_top.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/bun-top-"+bun_type+".png"
bun_bottom.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/bun-bottom-"+bun_type+".png"
sauce.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/sauce-"+sauce_type+".png"
mains.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/main-"+mains_type+".png"

var topping1 = document.getElementById('hb_topping_'+ index+'_1');
var topping2 = document.getElementById('hb_topping_'+ index+'_2');
var topping3 = document.getElementById('hb_topping_'+ index+'_3');
var topping_types = fisherYatesShuffle(stack_toppings)

topping1.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/topping-"+ topping_types [0]+".png"
topping2.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/topping-"+ topping_types [1]+".png"
topping3.src = "https://optional.is/required/wp-content/uploads/2025/12/stack/topping-"+ topping_types [2]+".png"

}

function random_hatena_burgers(){
 random_hatena_burger(1);
 random_hatena_burger(2);
 random_hatena_burger(3);
}

random_hatena_burgers()
</script>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Does Hatena Burger have over 270,000 different burgers? Strictly speaking yes. Practically speaking, no. It&#8217;s much, much less when you remove duplicate toppings. Looking into the mathematics and combinatorics of the possibilities can be a fun and interesting way to see how adding or removing small amounts can have big impacts.</p>



<p>When we see what seems like outlandish claims &#8220;Over 270,000 possible burgers&#8221; it is within our abilities to double check and confirm or deny if it&#8217;s true.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Week #789 &#038; #790</title>
		<link>https://optional.is/required/2026/04/03/week-789-790/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Weeknotes]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[cities]]></category>
		<category><![CDATA[easter]]></category>
		<category><![CDATA[eCards]]></category>
		<category><![CDATA[mini-games]]></category>
		<category><![CDATA[webrtc]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9695</guid>

					<description><![CDATA[A double weeknote. The first half was stormy, the second half was Easter break.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Week #789</h2>



<p>We spent some time this week finishing-up a project for the concreters down in Australia. We will be taking over future work directly, so we&#8217;re preparing for all that.</p>



<p>We did a lot of brainstorming on some word puzzle mini-games. There is a kernel of something germinating. A few prototypes proved interesting, now we need to sit down with a wider audience and get feedback.</p>



<p>We continued to work on the WebRTC project by layering on a Pose Detection machine learning layer to highlight joins and features.</p>



<p>This week was also several meetings. Previously, we helped a small team put in a Gulleggið submission. Sadly, they were not selected in the top 10, so we all met to figure out the future of this idea. We also met-up with an old friend over zoom and chatted about higher-education, AI and Iceland. On Wednesday we met-up for morning coffee with another friend and chatted health care, AI, research and more. There might be some possibilities to work together in the future. <em>Always dig your well before you&#8217;re thirsty.</em></p>



<p>Thursday was an Orange Weather Alert day, so we mostly stayed home.</p>



<p>On Friday, we published our <a href="https://optional.is/required/2026/03/27/camelut/">Camelut article</a> detailing how we built a LUT bring your own filter camera. We also continue to update our camera apps with more small tweaks. Since it is a common library between them for the basic camera features, they all get the benefit of small updates and bug fixes.</p>



<h2 class="wp-block-heading">Week #790</h2>



<p>This is Easter week in Iceland with loads of public holidays and days off. Our work load was pretty minimal as we just had a few meetings and keep a few reoccurring tasks. Otherwise, we enjoyed the stormy Icelandic weather!</p>



<p>On Thursday, we had a few meetings about some new/old project ideas. That opened some big doors with quick deadlines, but we&#8217;ve been working towards this for a while.</p>



<p>Friday was the usual sync on a few other projects before the Holiday weekend.</p>



<h2 class="wp-block-heading">Bric-à-brac</h2>



<p>For a new prototype idea, we went back to some old, old UI designs around navigating through the metaphor of the city! These are the navigation headers from Kelloggs.com at the end of 01996 and beginning of 01997. That was a fun time on the web where big companies were still experimenting before  the standard mobile friendly navigation we have today.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/kelloggs-Cereal-City-01996.gif" alt="Kelloggs.com December 01996" /></figure>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/Kelloggs-Cereal-city-01997.gif" alt="Kelloggs.com January 01997"/></figure>



<p>One thing you notice in Cereal City was the &#8220;Card Shop&#8221; for those who were not online in the late 90s, ePostcards were a big thing! Even Apple had a whole tab called &#8216;iCards&#8217; dedicated to sending HTML emails. This was probably a way to both collect email addresses, but also allow people to send HTML email before many mail clients supported it. Hotmail (HoTMaiL &#8211; see the reference) was started in 01995 and was one of the first Web-based email clients, before that AOL or Juno both were dedicated apps.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/Screenshot-2026-03-24-at-15.31.37-1024x740.png" alt="Screenshot of archive.org of Apple's iCards page" /></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Camelut</title>
		<link>https://optional.is/required/2026/03/27/camelut/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Fri, 27 Mar 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[camelut]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[LUT]]></category>
		<category><![CDATA[shaders]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=8804</guid>

					<description><![CDATA[Camelut is our third experimental iOS camera app - a bring your own filters camera. It takes industry standard LUT Cube files and applies them in real-time to your camera feed. ]]></description>
										<content:encoded><![CDATA[
<p style="text-align: center">
<a href="https://apps.apple.com/us/app/lut-photo/id6749096589?ls=1&#038;mt=8"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/a6/b9/a9/a6b9a91a-3080-417b-0c13-7156a6f8b203/Placeholder.mill/400x400bb-75.webp" alt="Camelut Logo"/></a>
</p>
<p style="text-align: center"><strong>Camelut is a bring your own filters camera.</strong></p>
<p style="text-align: center"><a href="https://apps.apple.com/us/app/lut-photo/id6749096589?ls=1&amp;mt=8">Download Camelut on the iOS App Store</a></p>



<p><a href="https://optional.is/apps/camelut/">Camelut</a> is our third experimental iOS camera app. It takes industry standard LUT Cube files which are used to color grade images and video and applies them in real-time to your camera feed as you take photos. </p>



<p>One of the benefits of LUT files is that you can find, download, install or create your own custom filters. This is something that other camera apps can&#8217;t do. Normally, you&#8217;re stuck with the filters they provide, but Camelut let&#8217;s you import your own. That&#8217;s the downside, you need to find, curate and manage your own filters. That&#8217;s not for everyone. With great flexibility comes great power.</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/filter-samples.jpg" alt="Collage of images and iOS settings"/></div>



<p>To help you get started, we made three LUT files you can download and try. <strong>Download ZIP:&nbsp;<a href="optional-is-luts.zip">(optional.is) LUTs</a>&nbsp;(880 KB)</strong> </p>



<p>There are plenty of other LUTs out there for free and pay. You can even create your own in many popular image editing software tools. (Search for &#8220;Export Adjustments as LUT&#8221;)</p>



<div class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/camelut-sample.jpg" alt="" /></div>



<p>We implemented a bunch of non-intuitive features which mimic other photography apps, but are not exposed in the UI. For instance, when you take a photo with a filter, it appears in your photo library with the filter applied (as you&#8217;d expect). At some point we thought about also adding a button to save the original image, sans filter, as well. After digging around, we decided to add the source image and then as a second version of the filtered image to it. In the photos app, you can &#8220;revert to original&#8221; and you can get the source image. If you really want both, you can duplicate the image and remove the filter on one. This isn&#8217;t intuitive, but it&#8217;s also the way several other apps handle it, and we wanted to try to be a good photography app citizen and follow conventions.</p>



<p>Personally, we&#8217;ve been experimenting with 100+ different filters. The first time you take a picture they look horrible. You think, what&#8217;s the point of this filter? Then you&#8217;re outside in daylight and try the same filters again. This time they work really well, so it&#8217;s hard to delete a filter just in case! </p>



<p>We have several go-to filters, which is why we created 4 tag categories. We put similar Black and White LUTs together, created a Vintage style LUTs category, one for LUTs that work well Outdoors and another for our Favorites LUTs. This makes it easier to navigate around (by swiping) and find the best filter for the situation. You can create your own category names that make sense to your photography style.</p>



<p>This is now one of our go-to camera apps. Since it is our own itch to scratch, we&#8217;ll continue to explore, improve and support Camelut into the future.</p>



<p><a href="https://optional.is/apps/camelut/">Read more about Camelut</a> and basic features and functionality.</p>



<aside><p>There are a few ways you can create filters and effects on video streams. We previously wrote about the differences between <a href="https://optional.is/required/2025/08/27/lut-cubes-and-shaders/">LUT Cubes and Shaders</a>. For Camelut, we focused on LUT files since they are portable, but have their own limitations.</p></aside>



<p><a href="https://apps.apple.com/us/app/lut-photo/id6749096589?ls=1&amp;mt=8">Download Camelut on the iOS App Store</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Week #787 &#038; #788</title>
		<link>https://optional.is/required/2026/03/20/week-787-788/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Fri, 20 Mar 2026 13:31:00 +0000</pubDate>
				<category><![CDATA[Briefs]]></category>
		<category><![CDATA[Weeknotes]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[GDC]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[surveys]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9654</guid>

					<description><![CDATA[Another double weeknote. We're still deep in app and surveys, but there is light at the end of the tunnel.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Week #787</h2>



<p>This week we posted about <a href="https://optional.is/required/2026/03/12/sxsw-02006/">our trip to SXSW Interactive in 02006</a> (twenty years ago!). We mentioned meeting some of the folks behind 43things. This week we actually found our old list from their website on archive.org.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/archive-org-43things-briansuda.png" alt="Briansuda's 43things profile on archive.org" /><figcaption><a href="https://web.archive.org/web/20060423090553/http://www.43things.com/person/briansuda">Briansuda&#8217;s 43things profile on archive.org</a></figcaption></figure>



<p>Of the seven things we had on our list, we did move to another country, we debatably learned a new language and we certainly wrote a book. There&#8217;s still time to be interviewed on TV as a guest.</p>



<p>This week was the GDC conference in San Francisco. We did not attend this year, but some of our partners were there having lots of meetings. In the next few weeks we&#8217;ll see how that impacts our current and potential projects.</p>



<p>Since we&#8217;ve been deep in Xcode and Swift programming, we continued to updated a few apps to SwiftUI. In the process also fixing some crash errors people have been experiencing. Xcode does give you crash reports with some stack trace of what happened. We fixed a bunch of deep errors on the <a href="https://itunes.apple.com/us/app/shipping-forecast-mindfulness/id1226922380?ls=1&amp;mt=8">Mindfulness Shipping Forecast app</a> while we updated that to a modern code-base. In the process we improved the voice, added some tips, dark mode and fixed a bunch of bugs.</p>



<p>The other app that still had not been updated was <a href="https://apps.apple.com/us/app/newsletters/id1455564424?ls=1&amp;mt=8">Newsletters</a>. Much like <a href="https://triagemail.com">Triagemail</a> was, Newsletters used Mailcore to handle the IMAP messages. This week, we switched over to SwiftMail to both modernize the app and make it easier to maintain and port. The progress has been going well and we continue to find and fix bugs in the differences between the two libraries.</p>



<p>Throughout the week, we had several small tasks regarding all our surveys. For the parent surveys, we randomly select one of the two guardians to take the survey. Half-way through the month, we switch guardians. This gives the first a chance to answer and if after several reminders they still do not want to participate, we swap for the other guardian and let them have a chance to contribute. We did the swap on Monday and started the reminder schedule of email, sms, email. Next week we&#8217;ll email, robocall, email again. Depending on the response rate for customers, we might try a targeted SMS or email in English. For other on-going surveys we also sent out emails and robocalled this week. All of these surveys will end before the Easter break, so we&#8217;re trying to leave ourselves the last week of March for adjustments to reminders before people checkout for the holidays.</p>



<h2 class="wp-block-heading">Week #788</h2>



<p>On Monday, we sent out more survey reminder emails. We use Heroku as the hosting platform and we have background tasks to send all the messages. Thanks go GMail&#8217;s aggressive bulk/spam detection we need to put a second delay between sendings. It&#8217;s only been recently that our heroku background task has been producing enough memory leak errors that the process gets shutdown. We haven&#8217;t changed anything for years, so it is most likely heroku getting stricter. These last few weeks we&#8217;ve been trying a few different changes and memory profiling to mitigate the leaks.</p>



<p>We continue to tweak a few of the iOS camera apps. The Newsletter app is in good shape, we&#8217;re continuing the test and fix anything before we release it.</p>



<p>Our Australian concreters also sent over a list of changes. It&#8217;s great that they are using the system and have feedback, but their emails can be short and confusing. We&#8217;ll do what we can and then get clarification on a few other points. Luckily, this is all billable time. A few weeks ago, we thought the project was done, so we sent off the last invoice and they renegotiated the hourly rate due to general inflation. These updates are now under the new rate. On Wednesday, we got a message from our contact that he&#8217;s interested in extricating himself as the middleman. It means we take-over the project directly at a higher hourly rate. We&#8217;ll most likely do it, but the timezone difference and the small hours could potentially be a hassle.</p>



<h2 class="wp-block-heading">Bric-à-brac</h2>



<p>We found this great little puzzle game: <a href="https://murdoku.com/?lang=en">Murdoku</a> &#8211; Sudoku meets murder mystery</p>



<figure class="banner"><a href="https://murdoku.com/?lang=en"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/03/murdoku_grid_website.png" alt="Murdoku example map" /></a></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SXSW 02006</title>
		<link>https://optional.is/required/2026/03/12/sxsw-02006/</link>
		
		<dc:creator><![CDATA[optional Bot]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 12:21:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[austin]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[sxsw]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[web 2.0]]></category>
		<guid isPermaLink="false">https://optional.is/required/?p=9263</guid>

					<description><![CDATA[Twenty years ago today, (March 10th-15th) we gathered in Austin, Texas for SXSW interactive festival.]]></description>
										<content:encoded><![CDATA[
<p>Twenty years ago, (March 10th-15th 02006) we gathered in Austin, Texas for the SXSW interactive festival. As we think back to that event, it is one of those pivotal &#8216;sliding doors&#8217; moments. It felt like a big wave was swelling and we did well to get right in front of all the action.</p>



<p>To put things into a bit of context, this was 02006, the iPhone was still 10 months way from launch. The world was Blackberries, Nokias and Palm Pilots. We split a hotel room with 2 other people. As reimbursement, we wrote a physical cheque to pay for the hotel stay.</p>



<figure class="banner"><img decoding="async" src="https://optional.is/required/wp-content/uploads/2026/01/sxsw-2006-website.jpg" alt="Screenshot of sxsw.com from 2006"/><figcaption>Screenshot from <a href="https://web.archive.org/web/20060221113710/http://2006.sxsw.com">Archive.org of SXSW.com from 02006</a>.</figcaption></figure>



<p>This is what most of the web used to look like before mobile devices and stacked layouts! We had columns and tiny text. Call out buttons, banner images, navigation tabs and more.</p>



<p><a href="https://en.wikipedia.org/wiki/Web_2.0">Web 2.0</a> and <a href="https://en.wikipedia.org/wiki/Ajax_(programming)">AJAX</a> were buzz-words. There was a certain expectation of how we&#8217;d use a website. This is pre-twitter, Facebook was only 2 years old and just started to allow anyone besides .edu email address to register.</p>



<p>Tagging and <a href="https://en.wikipedia.org/wiki/Folksonomy">Folksonomies</a> were also something new and exciting. The ability to create ontologies from the bottom-up rather than top-down was creating a stir. There were several panels on the topic. At the time the photo sharing site <a href="https://www.flickr.com/search/?text=sxsw06">Flickr</a> had tags and started to create super-groups based on tag clusters. We vividly remember sitting in one session where they explained how they did this with k-means clustering, and then in another some panelist swore it was so good it must be human curated. If that were today, it would be the opposite, the default assumption would be LLMs and AI made the tags and when it&#8217;s actually human curated we&#8217;re surprised.</p>



<p>Oh the crazy parties. It seemed like every small venue turned into some interactive party or off-venue party. We met so many interesting people. We remember talked with someone from <a href="https://robotcoop.com">Robo Co-op</a> about their sites <a href="https://en.wikipedia.org/wiki/43_Things">43 Things</a>, 43 Places, 43 People, etc. We were avid users of the sites so to meet someone who created it was amazing. Then at another event, a WordPress meetup, we meet <a href="https://ma.tt/2006/03/sxsw/">Matt Mullenweg</a> the creator. WordPress was less than three years old and they were still evangelizing the software. We also remember standing in a parking lot outside of a venue and met <a href="https://en.wikipedia.org/wiki/Joshua_Schachter">Joshua Schachter</a> who had created <a href="https://del.icio.us">Del.icio.us</a> which we were an early adopter of. He was chatting to someone else, and we just listened, border-line weird.</p>



<p>The hot new geolocation <a href="https://en.wikipedia.org/wiki/Dodgeball_(service)">Dodgeball</a> was all the rage. As people you followed checked-into venues you&#8217;d get an SMS. One minute we were sitting having a drink, then everyone&#8217;s phones started to buzz and they all moved like a string of ants to the next party. While technology connects us and does great things, it was our first reminder that sometimes what&#8217;s right in front of you is just fine. Always searching for where the grass is greener isn&#8217;t necessarily the best way to live life. We experienced that with people too. SXSW brings together ALOT of people who you&#8217;d never normally see or get access too. There were times someone was engaged in a conversation in our group, saw someone &#8220;more famous&#8221; and stopped mid-sentence and walked away. It was bewildering behavior, but another lesson learnt.</p>



<p>We were there because we&#8217;d volunteered working on <a href="https://microformats.org">Microformats</a>. This was a way to embed a bit of extra hints at what your HTML content was representing using already established means. Human-readable text then could be extracted by machines and converted into other formats, like calendar events and contacts. It was certainly picking-up speed compared to the more complicated and machine focused RDF.</p>



<figure class="banner"><img decoding="async" width="1000" height="663" src="https://optional.is/required/wp-content/uploads/2026/03/sxsw06-microformats.jpg" alt="Microformats crew sitting around at SxSW 2006" class="wp-image-9643" srcset="https://optional.is/required/wp-content/uploads/2026/03/sxsw06-microformats.jpg 1000w, https://optional.is/required/wp-content/uploads/2026/03/sxsw06-microformats-300x199.jpg 300w, https://optional.is/required/wp-content/uploads/2026/03/sxsw06-microformats-768x509.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" />
<figcaption><a href="https://www.flickr.com/photos/adactio/113270200/">The Microformats Mafia</a> Photo by Jeremy Keith, licensed as CC BY 2.0</figcaption>
</figure>



<p>We made a lot of new friends on that trip. Many of which we are still in contact with today. That lead to working professionally with and for many of them. Browsing through the nearly <a href="https://www.flickr.com/search/?text=sxsw06">10,000 photos on Flickr tagged sxsw06</a>, there are a lot of memories, people who are no longer with us, some things people probably wished weren&#8217;t online, products and companies that have come and gone, and more. That time at SXSW was unique. The event continues today, but it isn&#8217;t the same. </p>



<p>In this post-pandemic, war-torn 02020s, conferences and events like SxSW06 are hard. In the last 20 years, everyone&#8217;s realized the importance of the Web and internet and there have plenty of grifts, NFTs, Crypto, ICOs, Web 3.0, and AI are just some of the big ones. To gather so many like-minded, energetic people in once place and not have it ruined by corporate greed felt unique.</p>



<p>We&#8217;re happy we got to attend and in some small way would like to think we&#8217;ve left the Web a better place because of it.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
