<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Untested · Rafał Pastuszak</title>
  <subtitle>Projects, experiments and toys by Rafał Pastuszak</subtitle>
  <link href="https://untested.sonnet.io/feed.xml" rel="self" />
  <link href="https://untested.sonnet.io/" />
  <updated>2025-09-23T00:00:00Z</updated>
  <id>https://untested.sonnet.io/</id>
  <author>
    <name>Rafał Pastuszak</name>
    <email>hello@sonnet.io</email>
  </author>
  <entry>
    <title>DISOBEY</title>
    <link href="https://untested.sonnet.io/notes/disobey/" />
    <updated>2025-09-23T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/disobey/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/eRABPtpFmb-1200.webp&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;1106&quot;&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Friend, I &lt;span class=&quot;post-obey__love-animation&quot;&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;/span&gt; cigarettes!&lt;/p&gt;
&lt;br&gt;
&lt;style&gt;

	.post-obey__love-animation {
		font-size: 24px;
		display: inline-block;
	}

	.post-obey__love-animation span {
		display: inline-block;
		animation: post-obey__bubble 2s ease-in-out infinite, post-obey__rainbow 3s linear infinite;
		background: linear-gradient(45deg, #ff0000, #ff8000, #ffff00, #80ff00, #00ff00, #00ff80, #00ffff, #0080ff, #0000ff, #8000ff, #ff00ff, #ff0080);
		background-size: 400% 400%;
		-webkit-background-clip: text;
		background-clip: text;
		-webkit-text-fill-color: transparent;
		font-family: &#39;Comic Sans MS&#39;, &#39;Comic Sans&#39;, inherit;
		margin: 0 .1em;
	}

	p:has(.post-obey__love-animation) {
	font-weight: bolder;
	}
	.post-obey__love-animation span:nth-child(1) { animation-delay: 0s; }
	.post-obey__love-animation span:nth-child(2) { animation-delay: 0.1s; }
	.post-obey__love-animation span:nth-child(3) { animation-delay: 0.2s; }
	.post-obey__love-animation span:nth-child(4) { animation-delay: 0.3s; }
	.post-obey__love-animation span:nth-child(5) { animation-delay: 0.4s; }
	.post-obey__love-animation span:nth-child(6) { animation-delay: 0.5s; }
	.post-obey__love-animation span:nth-child(7) { animation-delay: 0.6s; }
	.post-obey__love-animation span:nth-child(8) { animation-delay: 0.7s; }

	@keyframes post-obey__bubble {
		0%, 100% { 
			transform: scale(1) translateY(0); 
		}
		50% { 
			transform: scale(1.2) translateY(-5px); 
		}
	}

	@keyframes post-obey__rainbow {
		0% { background-position: 0% 50%; }
		100% { background-position: 100% 50%; }
	}
&lt;/style&gt;
&lt;blockquote&gt;
&lt;p&gt;🎶 I love nicotine,&lt;br&gt;
the Tammy to my Ron,&lt;br&gt;
the Shams to my Rumi,&lt;br&gt;
the fire of my lungs. 🎶&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;p&gt;I also love having a healthy body and generally not feeling like I&#39;ve rented an Airbnb in Serge Gainsbourg&#39;s mouth. And, I&#39;ve gotten pretty good at quitting, I quit all the time, sometimes for a day, sometimes for a year or two.&lt;/p&gt;
&lt;p&gt;So, I made myself a little web app I open when I feel like grabbing a cigarette. It&#39;s called OBEY and can be found here: &lt;a href=&quot;https://obey.potato.horse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;obey.potato.horse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/xwYaH3kRPt-4102.png&quot; alt=&quot;&quot; width=&quot;4102&quot; height=&quot;2686&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Here&#39;s how it works:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;go to &lt;a href=&quot;https://obey.potato.horse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;obey.potato.horse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;do what it says&lt;/li&gt;
&lt;li&gt;feeling rebellious? hit &lt;em&gt;disobey&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;rinse and repeat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can find the source &lt;a href=&quot;https://github.com/paprikka/cigarette-triggers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;. Feel free to fork it and &lt;a href=&quot;https://github.com/paprikka/cigarette-triggers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;make it yours&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;This isn&#39;t a new idea, of course. I&#39;ve also talked about something similar (&lt;a href=&quot;https://untested.sonnet.io/notes/mental-health-toolbox-working-title/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mental Health Toolbox (working title)&lt;/a&gt;), and one of my &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; friends is working on a more &lt;a href=&quot;https://impulse.training&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sophisticated approach to the subject&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Projects and apps I built for my own well-being&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/things-to-support-my-own-well-being-a-wishlist/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Things to support my own well-being – a wishlist&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Why I made it&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/9ReIdzS9P2-1633.png&quot; alt=&quot;&quot; width=&quot;1633&quot; height=&quot;1646&quot;&gt;&lt;/p&gt;
&lt;p&gt;My younger brother quit smoking several years ago, but he still keeps a pack of Marlboros in his drawer. He felt that having this little splinter in his eye every time he thinks about nicotine would help him built up more willpower, more resilience. I&#39;m happy it worked out for him in the end, but he&#39;s in the minority.&lt;/p&gt;
&lt;p&gt;The general consensus is that yolo-ing it and quitting cold turkey usually yields poor results (some research suggests 3% success rate within 6-12 months for raw dogging it vs. 30% for therapy + NRT). I&#39;m one of the 97%. Over the years of quitting and embracing the sweet dark taste of cancer sticks I&#39;ve learned that there is no point in making my life harder when I quit.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/qi_fwkff8I-5502.png&quot; alt=&quot;&quot; width=&quot;5502&quot; height=&quot;1646&quot;&gt;&lt;/p&gt;
&lt;p&gt;What works for &lt;em&gt;me&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preparation, setting a date,&lt;/li&gt;
&lt;li&gt;understanding the nicotine half life and withdrawal symptoms,&lt;/li&gt;
&lt;li&gt;understanding my triggers and not downplaying their effect on me,&lt;/li&gt;
&lt;li&gt;trying not to over focus on shame/&lt;a href=&quot;https://untested.sonnet.io/notes/guilt/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;guilt&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;NRT,&lt;/li&gt;
&lt;li&gt;understanding the reasons I chose to self-medicate with, well, insecticides, and&lt;/li&gt;
&lt;li&gt;patiently, methodically going through the steps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How I worked on it&lt;/h2&gt;
&lt;p&gt;First things first: this app could&#39;ve been a piece of paper. The app doesn&#39;t solve the problem. The process, having an excuse to think about something deeply was the important part.  99% of my work was therapy and planning, which includes spending a couple of afternoons thinking about the triggers.&lt;/p&gt;
&lt;p&gt;(come to think of it, this is the &lt;a href=&quot;https://untested.sonnet.io/notes/2-2-2-project-scoping-technique/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2-2-2 Project Scoping Technique&lt;/a&gt; applied in reverse: 2 days of pondering, 2 hours of coding)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now, the technical part:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I coded the app shell using Claude over 20 or so minutes&lt;/li&gt;
&lt;li&gt;I added the more custom parts (such as better font-sizing) manually&lt;/li&gt;
&lt;li&gt;I pushed to Vercel using &lt;a href=&quot;https://untested.sonnet.io/notes/yolo/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yolo&lt;/a&gt; (related: &lt;a href=&quot;https://untested.sonnet.io/notes/web-and-feedback-loops/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Web and Feedback Loops&lt;/a&gt;, &lt;a href=&quot;https://sonnet.io/posts/wip/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Short: WiP&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Custom font sizing&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Problem: How to make a piece of text fill the available space, vertically and horizontally, and respect word breaks?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1758714184/obey-recording-scaling-2_dwtevi.mp4&quot; width=&quot;2516&quot; height=&quot;1684&quot; loop=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot; style=&quot;max-width: 100%; height: auto&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In short, there&#39;s no native, one line CSS or HTML solution to that problem and the classic approach goes like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;start with the biggest possible font&lt;/li&gt;
&lt;li&gt;scale it down by X&lt;/li&gt;
&lt;li&gt;check if the element is larger than its container
&lt;ol&gt;
&lt;li&gt;if that&#39;s true, go back to 2.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The main difference from my approach vs. what Claude or SO will tell you is using a multiplier for size instead of a fixed value. Doing so should reduce the number of calculations required to fit within the existing container.&lt;/p&gt;
&lt;p&gt;This part was purely for fun. OK, jumping straight into typography is a perfect way to distract myself. That said, it was still helpful to keep this step as a little reward for myself when I felt stuck.&lt;span id=&quot;^141dec&quot; class=&quot;link-marker&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I love making my own tools. &lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I grew up above a carpentry workshop&lt;/a&gt; and almost everything that could&#39;ve been made of wood in my house, well, was made of wood. We weren&#39;t an isolated case either. Even the rays of light adorning the paintings in the church in my hometown were made of physics-defying stained oak. I&#39;m similar to other Pastuszaks in that regard, I love surrounding myself with things/toys/tools that are mine (&lt;a href=&quot;https://sonnet.io/posts/reactive-hole/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Reactive Hole · sonnet.io&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/bird-knife/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Bird-knife&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/my-bootleg-t-shirts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;My Bootleg T-shirts&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/the-janusz-i-live-in/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Janusz I Live In&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Projects and apps I built for my own well-being&lt;/a&gt;). Web is my medium. I doodle in HTML/CSS almost as often as with my pens or Procreate and have been doing it since I was ten. I had six personal sites before we had internet. &lt;/p&gt;
&lt;h2&gt;Why &quot;OBEY&quot;&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/otavFcz9rB-1280.jpeg&quot; alt=&quot;&quot; width=&quot;1280&quot; height=&quot;521&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As I was sketching it the typography reminded me of &lt;a href=&quot;https://www.imdb.com/title/tt0096256/?ref_=fn_all_ttl_1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;They Live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Luna found it funny&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How did it go?&lt;/h2&gt;
&lt;p&gt;I quit roughly a month ago and over the past three weeks I used OBEY around a dozen times, perhaps a bit more. I noticed that instead of opening my phone, I just pick one a thing to do from the list committed to my &lt;em&gt;Thought Sponge Memory Storage&lt;/em&gt;™. I don&#39;t think there&#39;s anything that surprising about this observation.&lt;/p&gt;
&lt;p&gt;Again, writing, coding, and testing/playing forced me to think and plan. The time spent on it was the biggest value. This little web app could&#39;ve been a piece of paper, but that doesn&#39;t diminish its value.&lt;/p&gt;
&lt;p&gt;The risk with DIY projects like this is that they can be a huge distraction. After all, instead of doing the scary thing, you can always choose the difficult but familiar thing and thus fulfil the immediate emotional need. It keeps you busy for a few hours, but the next morning you might wake up and realise you&#39;re still in the same place, with the path now somehow being even longer and more winding.&lt;/p&gt;
&lt;p&gt;The other side of the coin: &lt;em&gt;is it fun&lt;/em&gt;? Does it also help me improve something that&#39;s been bothering me for such a long time? Now, I feel mostly happy that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I had an excuse to play with my toys, and&lt;/li&gt;
&lt;li&gt;I have the skills that allow me to do something good/wholesome and improve my well-being, and&lt;/li&gt;
&lt;li&gt;I could apply them with ease, aaaaand&lt;/li&gt;
&lt;li&gt;I could write and think about this here!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, I don&#39;t feel that I wasted my time, this time.&lt;/p&gt;
&lt;p&gt;Take mainstream self help literature as an example. Most of it is cringeworthy pseudoscience or two A4 pages of CBT worksheets, diluted into two hundred pages of pep talk. Survivorship bias aside, I think the reason it helps some people is this: it forces them to sit on their asses for a few hours and actually go through the process of thinking about it deeply. Instead of memorising a checklist, they&#39;re forced to go through the process of thinking, feeling, introspecting.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/disobey/Kzx6HrBr_H-1649.png&quot; alt=&quot;&quot; width=&quot;1649&quot; height=&quot;609&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/perfectionism-is-fight-or-flight/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Perfectionism is fight or flight&lt;/a&gt;&lt;/strong&gt;. With practice (and luck), sometimes we can learn to distinguish between using work to avoid thinking about/feeling something vs. using creative work and play as a tool.&lt;/p&gt;
&lt;p&gt;Letting &lt;a href=&quot;https://untested.sonnet.io/notes/be-kind-be-curious/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;curiosity&lt;/a&gt; speak louder than guilt helped me this time.&lt;/p&gt;
&lt;p&gt;That&#39;s all for today, thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Ensō Themes – Accessible, Vampiric, Cozy</title>
    <link href="https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/" />
    <updated>2025-09-12T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/2HNpxuAeS2-3350.png&quot; alt=&quot;&quot; width=&quot;3350&quot; height=&quot;994&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hey there. We&#39;re getting very close to the release of a new &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt;, and I&#39;m at the stage where I need to stop coding and start talking about it. &lt;strong&gt;Why invest so much time in working on something if we don&#39;t give people a chance to decide for themselves if it&#39;s valuable?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As any cryptozoologist will tell you: &lt;em&gt;the procrastination ogre feeds on time — the longer we wait, the bigger it gets&lt;/em&gt;. Thinking aloud about themes sounds like a decent warmup before tackling more complex copywriting tasks, so let&#39;s go through this &lt;a href=&quot;https://untested.sonnet.io/notes/work-with-the-garage-door-up/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;together&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Share your unfinished, scrappy work&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Writing is Thinking&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;New Enso - first public beta&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/how-people-use-enso/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How People Use Ensō&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ensō supports 6 themes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1757675044/enso-theme-picker-header-12-09-25_mxzq1m.mp4&quot; poster=&quot;https://res.cloudinary.com/dlve3inen/video/upload/so_1/v1757675044/enso-theme-picker-header-12-09-25_mxzq1m.webp&quot; width=&quot;2516&quot; height=&quot;1684&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot; style=&quot;max-width: 100%; height: auto&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Light&lt;/li&gt;
&lt;li&gt;Sepia&lt;/li&gt;
&lt;li&gt;Black and White/e-Paper&lt;/li&gt;
&lt;li&gt;Dark&lt;/li&gt;
&lt;li&gt;OLED&lt;/li&gt;
&lt;li&gt;Midnight&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each theme has been designed with a specific use case/&lt;em&gt;why&lt;/em&gt; in mind. Some of the &lt;em&gt;whys&lt;/em&gt; are more obvious than others; some just fall under the category of &lt;em&gt;familiar = good&lt;/em&gt;. Let&#39;s get those out of the way before we move on to my &lt;a href=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/#h-6-midnight&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;favourite example&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;1.,2. Light and &quot;Sepia&quot;&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/xIBdZSfajk-1712.png&quot; alt=&quot;&quot; width=&quot;1712&quot; height=&quot;940&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Why?&lt;/h4&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; User preference, familiarity. Some users preferred Sepia over the default Black and White theme. Some users preferred the default Light theme over Sepia.&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Works well in well-lit environments&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; (personal opinion) Sepia looks slightly better than the Black and White/e-Paper&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Sepia should look better with semi-transparent GUIs (e.g. the upcoming, moist macOS 26)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Black and White / e-Paper&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/kLFR3iYPLq-2548.png&quot; alt=&quot;&quot; width=&quot;2548&quot; height=&quot;1808&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Why?&lt;/h4&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; User preference, familiarity&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Works even better in direct sunlight&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Better support for e-Paper displays&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;m working on a hardware side project involving an Ensō-ish UX. More on &lt;a href=&quot;https://untested.sonnet.io/notes/writers-log-intro/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;that&lt;/a&gt; next year. Although latency is still an issue with e-Paper displays, &lt;a href=&quot;https://spectrum.ieee.org/e-paper-display-modos&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the future looks fun&lt;/a&gt;. Also, many code editors or PKM tools like Obsidian already adopt e-Paper friendly colour palettes/UI styles and I find them often more visually appealing. OK, I really want to talk about this now, but we&#39;ll get to that later, when I have more to show you.&lt;/p&gt;
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;/p&gt;&lt;p&gt;PS. Are you using an e-Paper (or e-Paper-ish...) display? &lt;a href=&quot;https://sonnet.io/posts/hi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say hi&lt;/a&gt;! (also, if you&#39;re on the beta, you can now set the caret to &lt;em&gt;hidden&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/CT4IH8k4wS-3024.jpeg&quot; alt=&quot;&quot; width=&quot;3024&quot; height=&quot;3189&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4. Dark&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/8K9I89Q35r-2548.png&quot; alt=&quot;&quot; width=&quot;2548&quot; height=&quot;1808&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Why?&lt;/h4&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; (again) User preference, familiarity! Some users prefer a dark theme that doesn&#39;t stand out from the rest of the OS GUI; greys feel more gentle than perfect black.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the main reason we have both Dark and OLED as separate options.&lt;/p&gt;
&lt;h4&gt;Details&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;the colour palette was made to match the default OS colour palette (Sequoia or older). How well it looks still depends on the OS accent colour, which shifts the greys by a small margin. Unfortunately unlocking more control would require me to use private APIs and get the build rejected from the AppStore. I will revisit this in a few months.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;OLED&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/ERsyGSbB13-2548.png&quot; alt=&quot;&quot; width=&quot;2548&quot; height=&quot;1808&quot;&gt;&lt;/p&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Looks great on OLED screens. I&#39;ve tested this with MBP, iPad Pro M4 and phones with OLED displays. More on that below.&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Works well in dark environments and reduces the amount of emitted light significantly compared to Dark, even on &lt;em&gt;slightly&lt;/em&gt; lower-end LCD screens, e.g. MBA M1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Midnight&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/OZ7lFSjweQ-2548.png&quot; alt=&quot;&quot; width=&quot;2548&quot; height=&quot;1808&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Why?&lt;/h4&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Comfortable writing in &lt;strong&gt;very&lt;/strong&gt; dark conditions. At 20% brightness the screen doesn&#39;t seem to be emitting light and the text feels almost like e-Paper.&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Designed to generate the lowest possible amount of light while maintaining legibility, hence the red tint&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Use cases/target audience&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Insomniacs&lt;/li&gt;
&lt;li&gt;Writing late at night and trying to avoid exposure to blue light&lt;/li&gt;
&lt;li&gt;Avoiding illuminating an entire room when writing in a shared space (e.g. while sharing a couch)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;How it&#39;s gone so far and why I find this theme particularly interesting&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Since I launched the beta, several users have said they use Midnight mode and are happy with it!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I use Midnight when I happen to wake up in the middle of the night and can&#39;t go back to sleep. I spent 2 decades dealing with &lt;a href=&quot;https://untested.sonnet.io/notes/insomnia-control/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;insomnia&lt;/a&gt; (I&#39;m good now), and one of the things I&#39;ve learned is to leave the bed the moment I start ruminating. Instead: get a cup of tea, look out the window, doodle, or just stare at my dog (weirdly contorted and mumbling in Aramaic, yet still cute). We are creatures of habit. The last thing I need in that moment is to nurture the association between insomnia and my bed.&lt;/p&gt;
&lt;p&gt;I usually spend that time writing my &lt;a href=&quot;https://untested.sonnet.io/notes/stream-of-consciousness-morning-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Stream of Consciousness Morning Notes&lt;/a&gt;, which is an added bonus: it feels like I can make up for some of the lost time. It makes me feel less rushed/stressed about the next morning.&lt;/p&gt;
&lt;h2&gt;How I worked on this&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;user research (user interviews, &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō beta&lt;/a&gt; feedback)&lt;/li&gt;
&lt;li&gt;dogfeeding (I&#39;ve been testing most of these themes over the past 6 years and you&#39;ll find these exact colour choices in some of my other  projects)&lt;/li&gt;
&lt;li&gt;experiments with low light text editors and web browsers: &lt;a href=&quot;https://untested.sonnet.io/notes/obsidian-for-vampires/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Obsidian for Vampires&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/midnight-ramen/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Midnight Ramen&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;How did I test the themes?&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/ddZDX5C183-4032.jpeg&quot; alt=&quot;&quot; width=&quot;4032&quot; height=&quot;3024&quot;&gt;&lt;/p&gt;
&lt;p&gt;Using the web version of Ensō with my iPad. Also, I made that coconut cup!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Through ca. 1500 words per day of regular use on average (7000 words during the longest outdoor writing session)&lt;/li&gt;
&lt;li&gt;In varying light conditions
&lt;ol&gt;
&lt;li&gt;indoor vs. outdoor&lt;/li&gt;
&lt;li&gt;direct sunlight&lt;/li&gt;
&lt;li&gt;indirect sunlight (e.g. writing under a tree or on a porch)&lt;/li&gt;
&lt;li&gt;outdoor on a cloudy day&lt;/li&gt;
&lt;li&gt;darker or well-lit coffeeshops across town (related &lt;a href=&quot;https://untested.sonnet.io/notes/coffeeshop-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Coffeeshop Mode&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;indoor low-light (warm floor lighting or cold light coming from the street)&lt;/li&gt;
&lt;li&gt;indoor pitch black (my living room)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Regarding 2., I don&#39;t need to go out of my way to test it. I use Ensō all the time and move around a fair bit, which makes it much easier.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/9V54D-rsa_-4032.jpeg&quot; alt=&quot;&quot; width=&quot;4032&quot; height=&quot;3024&quot;&gt;&lt;/p&gt;
&lt;p&gt;Summer 2021. I accidentally wiped my iPad by travelling with the keyboard in my backpack, so I switched to using Ensō with my phone.  We&#39;ve gone a long way since then!&lt;/p&gt;
&lt;h3&gt;What I&#39;ve learned&lt;/h3&gt;
&lt;h4&gt;It&#39;s really, really hard to have a compact, intuitive UI for &lt;em&gt;more than two&lt;/em&gt; themes &lt;em&gt;controlled via OS appearance&lt;/em&gt;.&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/eH-jvSfI4p-2252.png&quot; alt=&quot;&quot; width=&quot;2252&quot; height=&quot;4096&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is a weird one, as it might be a bit hard to explain if you&#39;ve never approached &lt;em&gt;this specific problem&lt;/em&gt;. It&#39;s also one of the annoying problems where the user will see if something doesn&#39;t work well, but if everything is in place – they won&#39;t notice a thing.&lt;/p&gt;
&lt;p&gt;Here&#39;s what I want:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;theme changes that require &lt;em&gt;maximum&lt;/em&gt; 3 interactions (from opening the picker to getting back to writing)&lt;/li&gt;
&lt;li&gt;an easy way to associate themes with OS appearance (light, dark, automatic)&lt;/li&gt;
&lt;li&gt;more than one theme per appearance&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, things are easy if we choose only &lt;strong&gt;two&lt;/strong&gt; items from the list above. But they get a bit wonky if we want to do all three. How to keep clear affordances for users at a single glance, without making them feel like they&#39;re about to fill a visa application just to change the background to dark?&lt;/p&gt;
&lt;p&gt;There&#39;s a tonne of UX patterns to learn from, again, &lt;em&gt;if&lt;/em&gt; we stick to two items from the list. So, following &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS&lt;/a&gt; I came up with a dumber solution and I&#39;m pretty happy with it: the selected theme is tied to the current OS appearance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1757675086/enso-themes-older-examples_bcwsuh.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot; width=&quot;2430&quot; height=&quot;1558&quot; style=&quot;max-width: 100%; height: auto&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Say, I set the Sepia theme in the morning when my Mac is set to light appearance, then use Ensō again in the evening and set it to dark. From now on Ensō will associate each theme with an OS appearance.&lt;/p&gt;
&lt;h4&gt;Polished theme support would require separate opacity curves for each theme&lt;/h4&gt;
&lt;p&gt;You might&#39;ve noticed that in the Midnight theme the lines seems to fade more abruptly. One of the reasons behind it is that we perceive red as darker than other colours (&lt;a href=&quot;https://untested.sonnet.io/notes/obsidian-for-vampires/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Obsidian for Vampires&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In order to improve this I&#39;ll need to adjust the text line opacity curve (&lt;a href=&quot;https://untested.sonnet.io/notes/natural-gradients-in-css/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Natural Gradients in CSS&lt;/a&gt;) on a per-theme basis, making the curve for red less sharp. I&#39;ve already made some improvements here, but this feels like a pleasant, iterative update. It can wait, Mr. &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the end result varied a lot across display types, even with them being limited to just Apple (for now).&lt;/p&gt;
&lt;p&gt;For now, we can keep it with the manual tweaks I tested on a bunch of screens. This is not an issue most people would notice. But, if someone wants to sponsor adding a gamma slider to Ensō, sure, &lt;a href=&quot;https://ko-fi.com/rafalpast&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;let&#39;s talk&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;A significant number of beta users are on older versions of macOS, which doesn&#39;t support P3 colour space.&lt;/h4&gt;
&lt;p&gt;Yes, I can see the OS versions on TestFlight, but I noticed the issue thanks to user feedback.&lt;/p&gt;
&lt;h4&gt;People are already using Midnight!&lt;/h4&gt;
&lt;p&gt;And it made me very, very happy. It&#39;s such a seemingly small change, but it seems so useful.&lt;/p&gt;
&lt;h3&gt;What I learned while writing this note&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I&#39;m happy with the theme choice, but might cut the default light theme.&lt;/li&gt;
&lt;li&gt;I&#39;ve kept the more interesting subjects (Midnight, UX, what I&#39;ve learned) at the end, making the reader wait.&lt;/li&gt;
&lt;li&gt;More of the theme designs are based on familiarity than I would like to admit. There&#39;s nothing inherently wrong with that. On the contrary, I think that&#39;s valuable. But how should I talk about this when I add themes to &lt;a href=&quot;https://sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō website&lt;/a&gt; before the release?&lt;/li&gt;
&lt;li&gt;I was hoping to come up with some concise, punchy quotes I could put on the Ensō website under the &lt;em&gt;themes&lt;/em&gt; section. That didn&#39;t happen, but the way I think about them is more structured. Mainly, I can see what&lt;/li&gt;
&lt;li&gt;Shit, I&#39;ve put so much work into this thing just since the &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;recent beta&lt;/a&gt;! (&lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-remembering/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Writing is remembering&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-themes-accessible-vampiric-cozy/a3_j2gPi1r-952.png&quot; alt=&quot;&quot; width=&quot;952&quot; height=&quot;1198&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Things I&#39;ve learned by studying my less weird drawings: I have a deeply ingrained belief that there are two suns (or, I keep forgetting how to place the shadows)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Next&lt;/h3&gt;
&lt;p&gt;The next steps are not technical. The next step is to say what I said here, but in a more concise manner on the &lt;a href=&quot;https://sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then and only then I will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consider removing Light and Sepia themes (yes, an unusual choice, since the site will already be up, but it&#39;s also easier than getting distracted &lt;em&gt;now&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Park adding custom user themes for the foreseeable future. There isn&#39;t enough interest and this is one of the features that are waaaay easier to add than to remove once people get used to them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>433 - How to Make a Font that Says Nothing</title>
    <link href="https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/" />
    <updated>2025-07-22T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/paprikka/433/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;433&lt;/a&gt; is a font that masks visible text and replaces it with dots. I&#39;m using it in the &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;new version&lt;/a&gt; of &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt; along with &lt;a href=&quot;https://untested.sonnet.io/notes/coffeeshop-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Coffeeshop Mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see it in action here:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1753181245/coffeeshop-underpant-gnomes_kiecvn.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot; style=&quot;aspect-ratio: 640/422; width: 100%&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Beautiful.&lt;/p&gt;
&lt;h2&gt;Why&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In short: because it&#39;s the simplest way to add Coffeeshop Mode to the app.&lt;/strong&gt;&lt;br&gt;
(Also, because I was curious)&lt;br&gt;
(OK, mainly because I was curious, &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Longer version:&lt;/strong&gt;&lt;br&gt;
The previous &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;note on Ensō&lt;/a&gt; ended up on the front page of HN and gave us almost 400 TestFlight testers. This is way more than I had expected. In fact, I&#39;d initially set the limit at 50 and had to bump it every few hours in disbelief. It&#39;s also a relatively diverse group of people with many using non-Latin writing systems, e.g.: Chinese (pinyin), Japanese, Persian, Arabic, Hebrew to name a few.&lt;/p&gt;
&lt;p&gt;This posed a perfect opportunity to test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a bunch of text rendering and input approaches for &lt;a href=&quot;https://untested.sonnet.io/notes/ime/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;IME&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;custom carets&lt;/li&gt;
&lt;li&gt;hiding text in Coffeeshop Mode&lt;/li&gt;
&lt;li&gt;a prettier, snappier, and easier-to-style preview.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I prototyped a few of them, then settled on a much simpler solution: no need to use Canvas, or wrap each character in a fancy styled &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;. Just make the font render the mystery raisin (&lt;code&gt;·&lt;/code&gt;) for anything that is not whitespace.&lt;/p&gt;
&lt;p&gt;So, buckle up buckaroos, we&#39;re (un)making a font!&lt;/p&gt;
&lt;h2&gt;Why 433&lt;/h2&gt;
&lt;p&gt;The name was inspired by &lt;a href=&quot;https://untested.sonnet.io/notes/433/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;4′33″&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;You can find the script &lt;a href=&quot;https://github.com/paprikka/433/blob/main/generate-font.py&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;. But, don&#39;t click away yet, we&#39;ll go through it step by step in the next section.&lt;/p&gt;
&lt;h3&gt;What is a font?&lt;/h3&gt;
&lt;p&gt;To make more sense from this note, let&#39;s establish a (grossly oversimplified) &lt;a href=&quot;https://untested.sonnet.io/notes/operational-definition/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Working Definition&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;A font is a bunch of &lt;strong&gt;glyphs&lt;/strong&gt;. A glyph is a &lt;strong&gt;visual representation&lt;/strong&gt;, the actual &lt;strong&gt;shape&lt;/strong&gt; of a character, usually drawn as Bézier curves. Each glyph is mapped to an address called a &lt;strong&gt;code point&lt;/strong&gt;. These addresses cover a huge range of characters, supporting various languages, diacritic marks, etc. and are grouped into ranges, e.g.:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Basic Latin&lt;/strong&gt;&lt;br&gt;
Range: U+0000 to U+007F&lt;br&gt;
&lt;em&gt;Example characters: standard ASCII – letters, digits, punctuation.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CJK Unified Ideographs&lt;/strong&gt;&lt;br&gt;
Range: U+4E00 to U+9FFF&lt;br&gt;
&lt;em&gt;Example characters: Chinese, Japanese, Korean common Han ideographs.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arabic&lt;/strong&gt;&lt;br&gt;
Range: U+0600 to U+06FF&lt;br&gt;
&lt;em&gt;Example characters: Arabic script letters and symbols.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To reduce size, fonts generally support only a subset of ranges (e.g. Basic Latin). These ranges are grouped into 17 &lt;strong&gt;planes&lt;/strong&gt; of 65k characters each, e.g. &lt;em&gt;Basic Multilingual Plane&lt;/em&gt; for most existing languages, &lt;em&gt;Secondary Multilingual Plane&lt;/em&gt; for emojis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun fact:&lt;/strong&gt; There are separate planes supporting hieroglyphs, cuneiform writing, or even &lt;a href=&quot;https://en.wikipedia.org/wiki/Avestan_alphabet&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;𐬛𐬍𐬥𐬛𐬀𐬠𐬌𐬭𐬫𐬵&lt;/a&gt;! &lt;em&gt;Glyphs&lt;/em&gt;, &lt;em&gt;planes&lt;/em&gt;, and esoteric languages aside, understanding the above and mastering the font-related vocabulary is what distinguishes the &lt;em&gt;Adeptus Exemptus&lt;/em&gt; from the &lt;em&gt;Master of the Temple&lt;/em&gt; in Thelema. That is, if Thelema were the occult art of font-making.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/pdteEw2IRt-1027.png&quot; alt=&quot;&quot; width=&quot;1027&quot; height=&quot;487&quot;&gt;&lt;br&gt;
Left: Aleister Crowley during his K2 expedition (1906), right: Crowley in ceremonial garb (1912), &lt;a href=&quot;https://en.wikipedia.org/wiki/Aleister_Crowley&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/how-a-font-is-rendered/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How a Font is Rendered&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&#39;ve established the context, so now we can be more explicit about what we want to achieve:&lt;/p&gt;
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;/p&gt;&lt;p&gt;Create a font that for &lt;strong&gt;all non-whitespace characters&lt;/strong&gt; returns a glyph rendering a dot.&lt;/p&gt;
&lt;/div&gt;
&lt;h4&gt;Constraints:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;ensure that all code points are covered by the font
&lt;ul&gt;
&lt;li&gt;otherwise unsupported characters will be rendered using the OS fallback font which would result in unmasking it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;keep the size small
&lt;ul&gt;
&lt;li&gt;the Basic Multilingual plane covers 65k characters, so an unoptimised version would be several megabytes in size&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The script&lt;/h3&gt;
&lt;h4&gt;Set up font metadata:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;font = fontforge.font()
font.fontname = &lt;span class=&quot;hljs-string&quot;&gt;&quot;Masked&quot;&lt;/span&gt;
font.familyname = &lt;span class=&quot;hljs-string&quot;&gt;&quot;Masked&quot;&lt;/span&gt;
font.fullname = &lt;span class=&quot;hljs-string&quot;&gt;&quot;Masked Regular&quot;&lt;/span&gt;
font.weight = &lt;span class=&quot;hljs-string&quot;&gt;&quot;Regular&quot;&lt;/span&gt;
font.encoding = &lt;span class=&quot;hljs-string&quot;&gt;&quot;UnicodeFull&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Initially I tried to reuse an existing, well-designed, multilingual font here instead of creating a new one and then iterate on each of its glyphs. However, none of the fonts were comprehensive enough, which is obvious in hindsight.&lt;/p&gt;
&lt;h4&gt;Set the font metrics:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;font.em = &lt;span class=&quot;hljs-number&quot;&gt;1000&lt;/span&gt;
font.ascent = &lt;span class=&quot;hljs-number&quot;&gt;800&lt;/span&gt;
font.descent = &lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These will help define the &quot;canvas&quot; on which to draw the glyph and control the space occupied by characters on the screen:&lt;/p&gt;
&lt;h4&gt;Draw the glyph:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;dot_width = &lt;span class=&quot;hljs-number&quot;&gt;600&lt;/span&gt;
dot_glyph = font.createChar(&lt;span class=&quot;hljs-number&quot;&gt;0x25CF&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&quot;blackcircle&quot;&lt;/span&gt;)
dot_glyph.width = dot_width
dot_glyph.clear()

pen = dot_glyph.glyphPen()
pen.moveTo((&lt;span class=&quot;hljs-number&quot;&gt;300&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;))
pen.curveTo((&lt;span class=&quot;hljs-number&quot;&gt;350&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;), (&lt;span class=&quot;hljs-number&quot;&gt;400&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;250&lt;/span&gt;), (&lt;span class=&quot;hljs-number&quot;&gt;400&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;300&lt;/span&gt;))
&lt;span class=&quot;hljs-comment&quot;&gt;# ...&lt;/span&gt;
pen.curveTo((&lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;250&lt;/span&gt;), (&lt;span class=&quot;hljs-number&quot;&gt;250&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;), (&lt;span class=&quot;hljs-number&quot;&gt;300&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;200&lt;/span&gt;))
pen.closePath()
pen = &lt;span class=&quot;hljs-literal&quot;&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Create whitespace characters and empty glyphs:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;whitespace_chars = {
    &lt;span class=&quot;hljs-number&quot;&gt;0x0020&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;500&lt;/span&gt;,  &lt;span class=&quot;hljs-comment&quot;&gt;# Space&lt;/span&gt;
	&lt;span class=&quot;hljs-comment&quot;&gt;# ... &lt;/span&gt;
    &lt;span class=&quot;hljs-number&quot;&gt;0x205F&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;250&lt;/span&gt;,  &lt;span class=&quot;hljs-comment&quot;&gt;# Medium mathematical space&lt;/span&gt;
    &lt;span class=&quot;hljs-number&quot;&gt;0x3000&lt;/span&gt;: &lt;span class=&quot;hljs-number&quot;&gt;1000&lt;/span&gt;, &lt;span class=&quot;hljs-comment&quot;&gt;# Ideographic space&lt;/span&gt;
}

&lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; codepoint, width &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; whitespace_chars.items():
    glyph = font.createChar(codepoint)
    glyph.width = width
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is less relevant for Ensō, and somewhat pedantic, since we&#39;re using this font only with Coffeeshop Mode.&lt;/p&gt;
&lt;h4&gt;Assign a glyph to each available code point:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;total_glyphs = &lt;span class=&quot;hljs-number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;hljs-comment&quot;&gt;# Use Basic Multilingual Plane (0x0000-0xFFFF) &lt;/span&gt;
&lt;span class=&quot;hljs-comment&quot;&gt;# which covers most common characters&lt;/span&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; codepoint &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;hljs-built_in&quot;&gt;range&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot;&gt;0x21&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;0xFFFF&lt;/span&gt;):  &lt;span class=&quot;hljs-comment&quot;&gt;# Start from 0x21 to skip control chars&lt;/span&gt;
    &lt;span class=&quot;hljs-comment&quot;&gt;# Skip if it&#39;s a whitespace character&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; codepoint &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; whitespace_chars:
        &lt;span class=&quot;hljs-keyword&quot;&gt;continue&lt;/span&gt;
        
    &lt;span class=&quot;hljs-comment&quot;&gt;# Skip the dot glyph itself to avoid self-reference&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot;&gt;if&lt;/span&gt; codepoint == &lt;span class=&quot;hljs-number&quot;&gt;0x25CF&lt;/span&gt;:
        &lt;span class=&quot;hljs-keyword&quot;&gt;continue&lt;/span&gt;
        
    &lt;span class=&quot;hljs-comment&quot;&gt;# Create glyph that references the dot template&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
        glyph = font.createChar(codepoint)
        glyph.width = dot_width
        &lt;span class=&quot;hljs-comment&quot;&gt;# Use addReference instead of drawing - much more efficient&lt;/span&gt;
        glyph.addReference(dot_glyph.glyphname)
        total_glyphs += &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;hljs-keyword&quot;&gt;except&lt;/span&gt; Exception:
        &lt;span class=&quot;hljs-comment&quot;&gt;# Skip invalid codepoints&lt;/span&gt;
        &lt;span class=&quot;hljs-keyword&quot;&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This step is especially important. Instead of drawing the same glyph for each code point we &lt;em&gt;reference&lt;/em&gt; the original dot glyph to avoid duplication. This will help reduce the size and build time drastically.&lt;/p&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;&lt;span class=&quot;hljs-keyword&quot;&gt;try&lt;/span&gt;:
	glyph = font.createChar(codepoint)
	glyph.width = dot_width
	&lt;span class=&quot;hljs-comment&quot;&gt;# Use addReference instead of drawing - much more efficient&lt;/span&gt;
	glyph.addReference(dot_glyph.glyphname)
	total_glyphs += &lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Generate the font:&lt;/h4&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;font.generate(args.font_output) # normally .woff2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I started with &lt;a href=&quot;https://en.wikipedia.org/wiki/TrueType&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TTF&lt;/a&gt;, but the generated &lt;code&gt;.ttf&lt;/code&gt; font file was ca. 2.4MB, even with deduplicated glyphs. This is because TTF stores individual glyph definitions plus associated table data for each mapped code point. Additionally, TTF does not support internal compression, so all glyph outlines and tables are stored uncompressed.&lt;/p&gt;
&lt;p&gt;On the other hand, &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_Open_Font_Format&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WOFF2&lt;/a&gt; stores less data by default, supports &lt;a href=&quot;https://untested.sonnet.io/notes/brotli/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;brotli&lt;/a&gt; compression, and even pre-processes glyph curves to make them easier to squash.&lt;/p&gt;
&lt;p&gt;Switching to WOFF2 reduced the file size to 70KB. That&#39;s a 97% reduction compared to TTF — brilliant!&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/Gjla7bJ-ZW-1668.webp&quot; alt=&quot;&quot; style=&quot;max-width: 400px&quot; width=&quot;1668&quot; height=&quot;1629&quot;&gt;&lt;/p&gt;
&lt;h2&gt;What I learned/noticed&lt;/h2&gt;
&lt;h4&gt;Using font stitching as an alternative to font stacks&lt;/h4&gt;
&lt;p&gt;Here&#39;s a problem I know how to solve now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your brand font doesn&#39;t support Japanese characters&lt;/li&gt;
&lt;li&gt;you need to use it both on the web and in your native app (so, you can&#39;t rely on font stacks and fallback fonts)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As long as licensing is not a problem, you can merge the Japanese font into the Latin font replacing only the missing ranges. &lt;em&gt;As long as licensing is not a problem.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m obviously &lt;a href=&quot;https://untested.sonnet.io/notes/dunning-kruger/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;missing&lt;/a&gt; missing some complexity here, but batch operations or CRISPR-style cutting and pasting glyphs to create new multi-language fonts turned out much easier than I had originally anticipated. The &lt;a href=&quot;https://fontforge.org&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;FontForge&lt;/a&gt;API doesn&#39;t seem scary at all.&lt;/p&gt;
&lt;p&gt;Also, on the same day I was working on this, I met a friend for beer who had the same problem, so I could share some of this brain food with them! (or make their life more complicated — time will tell.)&lt;/p&gt;
&lt;h4&gt;MISS&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/9f5J7-3joM-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;br&gt;
&quot;minimum&quot; rendered as pixel art / Fraktur&lt;/p&gt;
&lt;p&gt;It&#39;s weird but also almost always very satisfying to look at code as a &lt;em&gt;reductive&lt;/em&gt; medium. I mean, yes, engineers love commits with negative LoC in diffs as much as an anthropomorphised version of Claude enjoys producing piles of semi-random, somewhat useful crap. What was different this time? Making tradeoffs at the product level to reduce complexity, since I&#39;m wearing many hats and I&#39;m building a me-sized product. I want to be able to reason about it. Is it &lt;a href=&quot;https://untested.sonnet.io/notes/lappel-du-vide/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;L’appel du vide&lt;/a&gt; or &lt;a href=&quot;https://untested.sonnet.io/notes/horror-vacui/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Horror vacui&lt;/a&gt;? It&#39;s neither, it&#39;s &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;On a personal level, messing with this was a good reminder of how many skills went into getting this done: linguistics, typography, unicode, understanding font architecture/data structures, compression, CSS and font stacks, to name a few.&lt;/p&gt;
&lt;p&gt;Since you&#39;ve read this far, chances are this will resonate: I&#39;m not used to celebrating successes/noticing what I&#39;ve learned, but instead I just move on to the next thing. This was a good reminder for me to pause for a second, because I learn more slowly if I just keep moving. There&#39;s no virtue in moving constantly, if you don&#39;t know if you&#39;re still heading in the right direction. There&#39;s no virtue in running like a headless chicken. (related &lt;a href=&quot;https://untested.sonnet.io/notes/vicariously/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Vicariously&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;p&gt;PS. This post took waaay longer than I had expected and it wouldn&#39;t be possible without the help of our editor-in-chief, &lt;a href=&quot;https://untested.sonnet.io/notes/alexandra/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Luna&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/433-how-to-make-a-font-that-says-nothing/5EiVlaInxE-727.png&quot; alt=&quot;&quot; width=&quot;727&quot; height=&quot;909&quot;&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>How People Use Ensō</title>
    <link href="https://untested.sonnet.io/notes/how-people-use-enso/" />
    <updated>2025-07-04T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/how-people-use-enso/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;I was going to share a different note today but found it hard to focus on writing instead of working on Ensō (&lt;a href=&quot;https://untested.sonnet.io/notes/how-to-balance-making-vs-sharing-working-title/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to Balance Making vs. Sharing - working title&lt;/a&gt;), so I thought we could work on something together instead. By working together I mainly mean getting &lt;em&gt;my&lt;/em&gt; shit together, or rather — getting all of my notes into one place so I could use them in the future and stop repeating myself. So, grab your favourite shovel and let&#39;s dig in!&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/how-i-collect-feedback-for-enso/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How I collect feedback for Ensō&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First, this post is not about testimonials (although I do need to get organised about this as well: &lt;a href=&quot;https://untested.sonnet.io/notes/enso-testimonials/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō - testimonials&lt;/a&gt;), or how happy or dissatisfied people are with the tool. It&#39;s a list of use cases I&#39;m trying to organise (&lt;a href=&quot;https://untested.sonnet.io/notes/how-to-turn-ideas-into-objects/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to turn ideas into objects?&lt;/a&gt;), describe in more detail, and share with people who might find Ensō helpful.&lt;/p&gt;
&lt;p&gt;We&#39;re working with the &lt;a href=&quot;https://untested.sonnet.io/notes/work-with-the-garage-door-up/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;garage door up&lt;/a&gt;, and I&#39;ve kept you standing outside for 3 paragraphs already. OK, come in. Nah you can keep your shoes on. I&#39;m not sure why, but yeah, sure, you can step on that.&lt;/p&gt;
&lt;h2&gt;How people use Ensō&lt;/h2&gt;
&lt;p&gt;The list is non-exhaustive, &lt;em&gt;how&lt;/em&gt; ≠ &lt;em&gt;why&lt;/em&gt;, and the use-cases do overlap a fair bit. But, perfect is the enemy of published, so let&#39;s go!&lt;/p&gt;
&lt;h2&gt;Top-level&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/XESvhf1ZUT-2084.png&quot; alt=&quot;&quot; width=&quot;2084&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;In short, coming up with broad categories for how people use Ensō feels like an exercise doomed to fail.&lt;/p&gt;
&lt;p&gt;It &lt;em&gt;feels&lt;/em&gt; like the main use-cases fall into these three categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mental Health&lt;/strong&gt; (journaling, expressive writing, therapy &quot;homework&quot;, meditation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Neurospiciness&lt;/strong&gt; (sketching blog posts or articles, thinking through a problem, note taking, writing with eyes closed)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drafting/Unclenching™ ... poetry!&lt;/strong&gt; (script writing, writing a poem per day, sketching blog posts, squirrels)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;But, I don&#39;t feel happy with this classification yet.&lt;/strong&gt; The categories overlap and feel too broad, perpendicular to each other. After a third or fourth rewrite I realised that this is because these are not categories, but &lt;em&gt;lenses&lt;/em&gt; through which I design new features. I can apply only one of them at a time, or stack them together to build a more nuanced picture.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/VoMAq1sj8n-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;673&quot;&gt;&lt;/p&gt;
&lt;p&gt;Why? Because, drawing a line between &lt;em&gt;mental health and neurodiversity&lt;/em&gt; or &lt;em&gt;neurodiversity and experiencing difficulty (or surprising ease) when drafting&lt;/em&gt; is based on a broken premise. It&#39;s illogical.&lt;/p&gt;
&lt;p&gt;This needs to ferment in my head for a bit longer, and it&#39;s possible I&#39;ll drop the classification completely.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;h3&gt;Journaling&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/rBzCXKE_cj-976.png&quot; alt=&quot;&quot; width=&quot;976&quot; height=&quot;204&quot;&gt;&lt;/p&gt;
&lt;p&gt;Journaling is the most common use case. Some people use Ensō for their morning pages (often mentioning The Artist&#39;s Way), some like to review/think through their day in the evening.&lt;/p&gt;
&lt;p&gt;I fall into the former group (&lt;a href=&quot;https://untested.sonnet.io/notes/stream-of-consciousness-morning-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Stream of Consciousness Morning Notes&lt;/a&gt;) and also use it to plan/revisit every &lt;a href=&quot;https://untested.sonnet.io/notes/new-week/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;New Week&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Expressive Writing&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/k355FfB2tc-6461.png&quot; alt=&quot;&quot; width=&quot;6461&quot; height=&quot;1705&quot;&gt;&lt;/p&gt;
&lt;p&gt;It’s a creative writing technique that allows us to process and understand emotions in a safe way. It involves writing continuously, in a stream-of-consciousness style about one&#39;s deepest thoughts or feelings about an emotionally charged or even traumatic event.&lt;/p&gt;
&lt;p&gt;Read more here: &lt;a href=&quot;https://untested.sonnet.io/notes/expressive-writing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Expressive Writing&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Therapy related homework&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/FMDvMTcUA7-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;I decided to separate it from Expressive Writing because many of the uses of Ensō related to mental health involve other tools, mainly from CBT, such as thought records, letter writing, values clarification (&lt;a href=&quot;https://untested.sonnet.io/notes/act/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ACT&lt;/a&gt;), and &quot;future self&quot; letters.&lt;/p&gt;
&lt;p&gt;Disclaimer: Ensō is not therapy, it&#39;s a notebook (&lt;a href=&quot;https://untested.sonnet.io/notes/enso-analogy-brain-dump/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō - Analogy Brain Dump&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;To ensure that I don&#39;t spread misinformation or create unrealistic expectations I share most of my articles touching on mental health with licensed professionals.&lt;/p&gt;
&lt;h3&gt;Thinking out loud (in writing)&lt;/h3&gt;
&lt;p&gt;Examples: talking to a rubber ducky (&lt;a href=&quot;https://untested.sonnet.io/notes/online-rubber-ducky/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;possible project idea?&lt;/a&gt;), thinking through a problem by having a dialog with oneself (the ducky talks back). I like the latter especially, for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I do that too.&lt;/li&gt;
&lt;li&gt;I believe it lets me harness my inner critic and use their help instead of fighting them. Come to think of it, this is a common technique used in therapy and perhaps deserves a longer note. (&lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Don&#39;t Yell at a Barking Dog&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&#39;m separating this from Therapy Related Homework because this use is not necessarily &lt;em&gt;therapeutic&lt;/em&gt; in its aim.&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Writing is Thinking&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Writing with eyes closed&lt;/h3&gt;
&lt;p&gt;Several users described writing like this in Ensō, a few of them figuratively and one in the literal sense of the word.&lt;/p&gt;
&lt;p&gt;One of the inspirations for Ensō was an interview with a blogger who would dim their screen as much as possible while writing. They could see just enough to know what they were doing, but not enough to actually go back and edit.&lt;/p&gt;
&lt;p&gt;Unfortunately I can&#39;t recall their name, but I found even more examples of people like this, including Hank Green or Adam Savage. After watching &lt;a href=&quot;https://youtu.be/GFIZvwSPevE?t=110&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this video&lt;/a&gt; with Savage, and without overthinking it too much, I sent him a link to Ensō. I&#39;m pretty sure his response just got lost in my spam folder.&lt;/p&gt;
&lt;p&gt;PS. Do you know someone who writes like this? I&#39;d love to &lt;a href=&quot;https://sonnet.io/posts/hi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;get to know them&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;Meditation&lt;/h3&gt;
&lt;p&gt;Writing, especially with constraints (on length, editing, pace, form) can be a meditative process.&lt;/p&gt;
&lt;p&gt;Meditation often encourages us to observe our thoughts as they pass by instead of engaging with them. When the only way to move is forward, you can give up control and observe yourself thinking/writing.&lt;/p&gt;
&lt;h3&gt;Writing a musical based on a German legend, to be followed by a novel about squirrels&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi {redacted}&lt;br&gt;
How’s the musical and what kind of squirrels we are talking about?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the best things about working on tools for &lt;a href=&quot;https://untested.sonnet.io/notes/beautifully-weird/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;beautifully weird&lt;/a&gt; people is that I get to send emails that start like this.&lt;/p&gt;
&lt;p&gt;One of the &lt;a href=&quot;https://news.ycombinator.com/item?id=44423400&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;HN comments&lt;/a&gt;  on the &lt;a href=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;new version of Ensō&lt;/a&gt; mentions script writing as a use case for which I&#39;d need to add monospaced fonts. I find it surprising and somewhat funny that they mentioned fonts, but said nothing about structured writing. Ensō is the antithesis of the tools I thought were normally used for that purpose.&lt;/p&gt;
&lt;h3&gt;Drafting blog posts&lt;/h3&gt;
&lt;p&gt;This is a strong contender for the most common use case, even mentioned during a &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; call I had just today.&lt;/p&gt;
&lt;p&gt;It resonates with me because I used to write by creating giant, 5-levels deep outlines which I then dressed into sentences, largely out of a fear of missing something important. With time and practice I learned this isn&#39;t how my mind works, and I now use both modes of thinking/writing: &quot;scaffolding&quot; and &quot;flowing&quot; (architecture vs. gardening).&lt;/p&gt;
&lt;p&gt;That said, I know of bloggers who write entire posts this way, as illustrated by two DMs I received in just the past couple of weeks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Also I used Ensō for my latest - viral, ofc - blog article. It was extremely pleasant. Thank you!!!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ENSO is perfect to write blogposts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/OWzjvbQmYL-988.png&quot; alt=&quot;&quot; width=&quot;988&quot; height=&quot;472&quot;&gt;&lt;br&gt;
(Related: &lt;a href=&quot;https://sonnet.io/posts/sit/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sit.&lt;/a&gt;)&lt;/p&gt;
&lt;h3&gt;Writing YT video scripts&lt;/h3&gt;
&lt;p&gt;There&#39;s an overlap between this and the two previous categories. Some users fall into both as well.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/DwbTfDtvOh-978.png&quot; alt=&quot;&quot; width=&quot;978&quot; height=&quot;906&quot;&gt;&lt;/p&gt;
&lt;p&gt;I think the reason this works is that stream-of-consciousness writing helps us tune into the natural cadence of speech, imbue text with rhythm. Editing breaks that flow for most people.&lt;/p&gt;
&lt;h3&gt;Taking notes&lt;/h3&gt;
&lt;p&gt;I used to keep Ensō pinned to the side of my screen to take notes during meetings or Say Hi calls. This approach works for me because it lets me focus on the person I&#39;m speaking with, instead of the goblin who lives in my head rent-free always ready to suggest new threads of conversation or &quot;hey! I did {the thing} as well!&quot;. It helps find better moments in the conversation where I can ask a follow-up question.&lt;/p&gt;
&lt;p&gt;Nowadays I use Ensō for meeting notes less often. I feel like it helped me get better at balancing being present with another person vs. the short-term context of the conversation. Related: &lt;a href=&quot;https://untested.sonnet.io/notes/how-i-take-notes-during-say-hi-calls/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How I take notes during say hi calls&lt;/a&gt; (note: you can request any dead-linked article by clicking on it).&lt;/p&gt;
&lt;h3&gt;Writing poetry&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/how-people-use-enso/jnxVNUTVce-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;769&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a writer and a poet who was Stuck, and who no longer is, well, I have a few words for you (all good).&lt;/p&gt;
&lt;p&gt;Enso has helped me write one poem per day&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an interesting use case for me, because I see poems more as images or music -- I like to see the interplay between longer phrases, sounds, and themes. The current line limit is well-suited for haikus and I&#39;m considering raising it.  Say, you could increase it to play a short game, where you&#39;re writing a poem/poem-doodle of a certain length.&lt;/p&gt;
&lt;p&gt;(&lt;em&gt;somewhat&lt;/em&gt; related: &lt;a href=&quot;https://untested.sonnet.io/notes/rosies-poem/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Rosie&#39;s Poem&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;What I learned (by writing this down)&lt;/h2&gt;
&lt;p&gt;Not a lesson but a reminder: &lt;strong&gt;user personas or broad categorisations are useless for me &lt;em&gt;here&lt;/em&gt;.&lt;/strong&gt;  The product is small and challenging to design, but it&#39;s not complex. It&#39;s a good exercise in coming up with good implicit UX affordances (easy to discover, but almost invisible at the same time) vs. reducing distractions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More people than I expected use Ensō for the type of work that normally is associated with more structured writing&lt;/strong&gt; (think: scripts, books, posts, videos).&lt;/p&gt;
&lt;p&gt;I&#39;m considering adding the option to control the number of lines displayed on the screen. Maybe following &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS&lt;/a&gt;, I can let people write poems in it... as long as they&#39;re 7 lines long!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I fall into most of the categories mentioned above.&lt;/strong&gt; It&#39;s a double-edged sword, but it&#39;s also helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am a statistical sample of 1, but&lt;/li&gt;
&lt;li&gt;it&#39;s much easier to build and tests something you like and use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seeing people using Ensō to write a poem, a video script or... a book about squirrels makes &lt;em&gt;me&lt;/em&gt; want to do the same.&lt;/p&gt;
&lt;p&gt;Being able to build something even marginally useful, to learn from building it, learn from the people using it... is a great place to be in. I feel happy and grateful writing this. Thank you.&lt;/p&gt;
&lt;p&gt;Speaking of squirrels, here&#39;s a tip from an old friend, a PM who could juggle:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;If you find a squirrel:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;find a bench, sit down, observe her&lt;/li&gt;
&lt;li&gt;wait a few moments&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tGSUjuSBt1A&amp;amp;list=RDtGSUjuSBt1A&amp;amp;start_radio=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;play this song&lt;/a&gt; in your head and continue watching the squirrel&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Quickly you will learn that the squirrels are not what they seem.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>New Ensō - first public beta</title>
    <link href="https://untested.sonnet.io/notes/new-enso-first-public-beta/" />
    <updated>2025-06-27T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/new-enso-first-public-beta/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Hi there,&lt;/p&gt;
&lt;p&gt;Look!&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/Kw1pN_dMXI-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;5543&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/PZx8LRQFTx-2880.png&quot; alt=&quot;&quot; width=&quot;2880&quot; height=&quot;1800&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new version of &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt; (codename: Occult Vampire Keanu) is available for public testing!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://testflight.apple.com/join/6Jxjv3Up&quot; class=&quot;download-cta&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Download it here&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/IYuLv6hkrd-2817.png&quot; alt=&quot;&quot; width=&quot;2817&quot; height=&quot;1470&quot;&gt;&lt;br&gt;
This is a temporary icon I used for testing. I am considering creating a simplified version of it. PS. here&#39;s the &lt;a href=&quot;https://www.potato.horse/p/MVrXRp0XziSuakcrMGzO8&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;original image&lt;/a&gt; (on &lt;a href=&quot;https://potato.horse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;potato.horse&lt;/a&gt;, of course)&lt;/p&gt;
&lt;h2&gt;What&#39;s included&lt;/h2&gt;
&lt;p&gt;Following &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS&lt;/a&gt;, my focus is on removing distractions over adding new features. This can be surprisingly challenging (e.g. how do I tell users about feature X or Y without breaking their flow?) but also gives me time to focus on polishing the app.&lt;/p&gt;
&lt;p&gt;(we will discuss these in more detail in future posts)&lt;/p&gt;
&lt;h3&gt;Short version (as explained by Hermes Trismegistus)&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/4J-XXf3mkr-1667.png&quot; alt=&quot;&quot; width=&quot;1667&quot; height=&quot;1203&quot;&gt;&lt;/p&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Simplified, more accessible UI&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Accessible themes&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Coffeeshop Mode&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; Privacy improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;&lt;strong&gt;Slightly longer version:&lt;/strong&gt;&lt;/h4&gt;
&lt;h3&gt;An even more simple, streamlined UI, following the &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS&lt;/a&gt; philosophy.&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/lSigZCsRpr-3840.png&quot; alt=&quot;&quot; width=&quot;3840&quot; height=&quot;2160&quot;&gt;&lt;/p&gt;
&lt;p&gt;Most of the UI has been moved to the application menu bar for easier discoverability and shortcut access. So far no one has missed the old inline UI, but you can read more about it towards the end of this note.&lt;/p&gt;
&lt;h3&gt;5½ Accessibility-friendly themes to choose from&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1751044261/enso-themes-overview-sigma_mxuslc.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We have &lt;s&gt;6&lt;/s&gt; 5½ predefined themes focussed on accessibility and specific use patterns based on feedback I&#39;ve collected over the years.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;writing during the day in regular light conditions&lt;/li&gt;
&lt;li&gt;writing in bright light&lt;/li&gt;
&lt;li&gt;writing in low light&lt;/li&gt;
&lt;li&gt;writing in low light for devices with OLED screens
&lt;ul&gt;
&lt;li&gt;allows for perfect black&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;writing in extremely low light conditions, with reduced light exposure  (See &lt;a href=&quot;https://untested.sonnet.io/notes/midnight/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Midnight&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/obsidian-for-vampires/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Obsidian for Vampires&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;designed for OLED screens&lt;/li&gt;
&lt;li&gt;the main use case here is writing at night, to put myself to sleep.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5½ and not 6 because one theme still needs some work. Is there a specific use case or theme you&#39;d like to see in Ensō? Let me know!&lt;/p&gt;
&lt;h3&gt;Coffeeshop Mode™&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1751044938/enso-coffeeshop-sigma_j1xi1d.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; autoplay=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This is one of the few truly new features in Ensō. Coffeeshop mode allows you to stop worrying that someone standing behind you might see what you&#39;re typing. The text itself is concealed but you still know what you&#39;re writing.  Use &lt;code&gt;⌘-C&lt;/code&gt; to toggle on and off at any time.&lt;/p&gt;
&lt;p&gt;I&#39;ve been using it for a couple of months and found it super helpful, especially for journaling in public places, but not only (read more here: &lt;a href=&quot;https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sketch - Ensō Coffeeshop Mode&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;A few smaller accessibility improvements&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/rwyV2cqnxt-974.png&quot; alt=&quot;&quot; width=&quot;974&quot; height=&quot;348&quot;&gt;&lt;br&gt;
Note: if you remove the &lt;em&gt;Edit&lt;/em&gt; menu and call it &lt;em&gt;Write&lt;/em&gt;, MacOs won&#39;t add its AI crap to your settings.&lt;/p&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; toggle autocorrect, autocapitalise, spelling&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; control text size (previously not possible in the native version)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A new, polished text rendering engine&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/PnFdz0ZK3s-1726.png&quot; alt=&quot;&quot; width=&quot;1726&quot; height=&quot;502&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new text rendering engine allows for better control over typography settings, supports alternative display modes like Coffeeshop, and uses a custom caret.&lt;/p&gt;
&lt;p&gt;I don&#39;t know how to describe it objectively (and I obviously lack the distance to) but writing in the new UI feels different, more fluid. The text is easy to read, but also somewhat softer (though not blurry).&lt;/p&gt;
&lt;p&gt;Less is more, so why do I care about it? &lt;em&gt;Because&lt;/em&gt; less is more. I want Ensō to feel familiar and high-quality, like a good Moleskine notebook. I want people to feel comfortable paying $10 for a typing app without text selection. I want them to enjoy it as much as I do. Fewer features allow me to focus more on what &lt;em&gt;is&lt;/em&gt; there.&lt;/p&gt;
&lt;h3&gt;AppStore by default (but standalone versions are still coming)&lt;/h3&gt;
&lt;p&gt;Ensō will be published via the AppStore by default. We will keep the old version on Gumroad, but there&#39;s no reason to maintain it, since the new version is better in every possible way and functionally the same by default.&lt;/p&gt;
&lt;p&gt;The reasons I decided to &lt;a href=&quot;https://untested.sonnet.io/notes/skip-the-appstore-and-use-gumroad/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;skip the AppStore and use Gumroad&lt;/a&gt;, plus what I learned from that are beyond the scope of this note (you can click the link to request that particular write-up).&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;several users complained that Gumroad payment looked, for the lack of a better word, shady, especially at the step with a PayPal payment screen. The ones who messaged me still bought the app, but I imagine there were many who turned back.&lt;/li&gt;
&lt;li&gt;AppStore with all its flaws makes delivering apps... slow and annoying, but also relatively easy without much code.&lt;/li&gt;
&lt;li&gt;I can add OTA updates and re-publish Ensō via Gumroad later, which makes sense as an iterative improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Gumroad version of Ensō will stay as a backup, but will not be maintained.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What&#39;s not included&lt;/h2&gt;
&lt;h3&gt;Analytics&lt;/h3&gt;
&lt;p&gt;I&#39;ve been using Ensō daily for 6 years. I&#39;ve also received a ton of high-quality feedback, not via analytics but from users who were kind enough to reach out to me. I like to think that I have a fairly good idea of how and why people use Ensō.&lt;/p&gt;
&lt;p&gt;The previous version of Ensō would pass an anonymous impression event on load. Now, by design, no network traffic is made at all. Here&#39;s our new Privacy Page.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/2seRd5O6WS-1588.png&quot; alt=&quot;&quot; width=&quot;1588&quot; height=&quot;842&quot;&gt;&lt;br&gt;
Current version of our Privacy page (&lt;a href=&quot;https://enso.sonnet.io/app-privacy&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Related &lt;a href=&quot;https://untested.sonnet.io/notes/how-i-use-analytics-with-my-indie-projects/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How I Use Analytics With My Indie Projects&lt;/a&gt; and &lt;a href=&quot;https://untested.sonnet.io/notes/defaults-matter-dont-assume-consent/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Defaults Matter, Don&#39;t Assume Consent&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Personalisation&lt;/h3&gt;
&lt;p&gt;It will come, but the new version is already so much better than the previous, that I feel like waiting for more features would be a wasted opportunity.&lt;/p&gt;
&lt;p&gt;I&#39;m working on a UX that balances discoverability with staying focussed. Each option, each new choice is a chance for you to get distracted, so the key is to do this thoughtfully and with respect towards my users&#39; time.&lt;/p&gt;
&lt;h3&gt;RTL (or non-LTR) language support&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;This one will be included in the next test build.&lt;/strong&gt; Many Ensō users speak languages written in non-Latin alphabets (to my knowledge, mainly Persian, Arabic and Hebrew).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/DCAKYxyFs2-2298.png&quot; alt=&quot;&quot; width=&quot;2298&quot; height=&quot;1594&quot;&gt;&lt;/p&gt;
&lt;p&gt;It makes me both grateful and somewhat sad that one (non-techie) user went as far as even sharing a code sample with me when asking for fixing the issue. Adding rudimentary RTL support can be as simple as a one-line change in your code. Even if it&#39;s not perfect - it&#39;s still a huge improvement that your non-Latin script users will notice, believe me.&lt;/p&gt;
&lt;h3&gt;More inline editor UI&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/kb0I5YbV2t-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;The previous version of Ensō displayed the UI in the same space as the text. That&#39;s not the case any more.&lt;/p&gt;
&lt;p&gt;I&#39;m still considering adding a hamburger menu in the main app canvas, however only two (less frequent) users of Ensō have brought it up so far.&lt;/p&gt;
&lt;p&gt;What I care about more:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ease of use, reducing distractions
&lt;ol&gt;
&lt;li&gt;the software should get out of your way (&lt;a href=&quot;https://untested.sonnet.io/notes/kind-software/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kind software&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;discoverability&lt;/li&gt;
&lt;li&gt;familiarity&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&#39;s tension between 1. and 2. as every new feature implies more choices on the user&#39;s part; every new choice is an opportunity for distraction. This might seem pedantic, but small, seemingly insignificant changes do add up.&lt;/p&gt;
&lt;p&gt;Removing things is harder than adding them (see 3.). Perhaps that&#39;s why commits with negative LoC count feel so good.&lt;/p&gt;
&lt;h2&gt;What&#39;s next&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/new-enso-first-public-beta/POXoaXUuMD-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;1559&quot;&gt;&lt;br&gt;
Where to go from here?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Collect the test feedback and respond to it&lt;/li&gt;
&lt;li&gt;Prepare basic marketing materials
&lt;ul&gt;
&lt;li&gt;I might put an ad on social media, trying to get people off it (&lt;a href=&quot;https://sonnet.io/posts/sit/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sit.&lt;/a&gt;) but what I call marketing is mostly talking about Ensō and related subjects here, plus engaging with communities I already know, such as forums&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add RTL writing support&lt;/li&gt;
&lt;li&gt;Launch&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Ideas I&#39;m considering&lt;/h2&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Windows and Linux support — I&#39;ll revisit it in the next few months. I&#39;m moving towards supporting myself from my own projects and I need to be selective how I use my time. If you&#39;re interested in testing a Windows or Linux build, &lt;a href=&quot;mailto:hello@sonnet.io&quot;&gt;let me know&lt;/a&gt;.&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Quick Save - hitting &lt;code&gt;⌘+S&lt;/code&gt; would automatically save a snapshot of your notes to a predefined directory with a time-stamped file name, e.g. &lt;code&gt;note-27-06-2025.txt&lt;/code&gt;&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Toybox - an optional menu feature with experimental tools released episodically, such as:&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; writing prompts&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; writing timer&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; visual experiments (e.g. different typography styles or letters and words turning into vines that grow as you type)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Toybox becomes a reality, it&#39;ll be buried in the menus to avoid distractions and will act mainly as my platform for experimentation and play with users. If there&#39;s a chance it might introduce more distractions - it&#39;ll become a separate app. (&lt;a href=&quot;https://untested.sonnet.io/notes/kind-software/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kind software&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;How I worked on this&lt;/h2&gt;
&lt;p&gt;Every day in small chunks and some days in longer stretches.&lt;/p&gt;
&lt;p&gt;I&#39;m approaching this just like &lt;a href=&quot;https://untested.sonnet.io/notes/exhibition-in-porto-janusz-enters-the-fashion-industry-draft-1/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;My Recent Art Exhibition&lt;/a&gt; - working on different things simultaneously, focussing on their interplay rather than looking at each feature in isolation.&lt;/p&gt;
&lt;p&gt;While I believe you should &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Share your unfinished, scrappy work&lt;/a&gt;, I know Ensō well enough that I can allow myself more flexibility. This style of work gives me a lot of joy and the end results have so far been better than expected.&lt;/p&gt;
&lt;h2&gt;What I&#39;ve learned&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The new Ensō is not the type of project I can share in small unfinished bits, feature by feature.&lt;/strong&gt; I will repeat this ad nauseam: I want to give you something that will get out of your way but also feel beautiful, polished, yours.&lt;/p&gt;
&lt;p&gt;This is akin to good typography or UX - when it&#39;s there, you don&#39;t notice it, but at a subconscious level, you feel more comfortable with the tool and want to spend more time using it. That has been my experience so far.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tauri is much more mature than when I released the first macOS version of Ensō.&lt;/strong&gt; I spent weeks getting the previous version to build properly on Mac with notarisation, provisioning profiles and undocumented AppStore Connect APIs. Now, most of the things just work (sometimes with a bit of scripting, which is where Claude Code turned out to be indispensable).&lt;/p&gt;
&lt;p&gt;I&#39;m not an &quot;IndieHacker&quot;, I&#39;m not in a rush, I&#39;m a wannabe-carpenter (&lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Brief History of Galician Carpentry&lt;/a&gt;) and Ensō happens to be made of stuff that can be worked in a carpentry-like manner. The small feature set means I can afford to take time to work on this with enough care, which I hope shows in the final product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building a theme switcher can be a weirdly complex problem&lt;/strong&gt; (if you complicate it well enough). The difficult part was letting users set themes for dark/light/sync with OS mode, with previews, making it obvious when changes are saved, all in a single piece of UI, with max 2-3 clicks.&lt;/p&gt;
&lt;p&gt;Most of my attempts at this resulted in something that looks more than the Dwarf Fortress GUI than a simple theme picker. I understand now why almost no one is doing this and why the few who do split the UI in several steps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;m still happy with using a browser as the text rendering engine.&lt;/strong&gt; Especially with Safari, the amount of control over typography is just excellent (e.g.  &lt;code&gt;text-box: cap alphabetic&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I wish there was an easy way of getting the native accent colour from the OS, but that&#39;s not possible at the moment. &lt;code&gt;accent&lt;/code&gt; can be customised, but not read.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;m not planning to remove the free web version of Ensō.&lt;/strong&gt; I want to get paid for my work, but people reach out to me and buy it with virtually no marketing. I&#39;m hopeful, even optimistic that the trust I&#39;ve earned so far, as well as the quality of the final product, will be enough for it to grow slowly but steadily.&lt;/p&gt;
&lt;p&gt;That&#39;s all for today. Thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Bedtime Doodles, an Anatomy</title>
    <link href="https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/" />
    <updated>2025-05-30T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/HeTY4-nAw5-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hello there. It&#39;s been a long time. I needed to take care of my health which meant spending some time away from the big shining rectangle. (I&#39;m good now.)&lt;/p&gt;
&lt;p&gt;Longer breaks from writing make it harder to get back on track. Thus, in the spirit of &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sharing our unfinished, scrappy work&lt;/a&gt;, I wanted to break the ice and challenge myself a little bit, &lt;a href=&quot;https://untested.sonnet.io/notes/pet-the-tarantula/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pet the tarantula&lt;/a&gt;. &lt;strong&gt;So no &lt;a href=&quot;https://untested.sonnet.io/notes/disclaimer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Disclaimers&lt;/a&gt; this time, just unfiltered, uncensored, unfinished, un-cropped, poorly and haphazardly captioned, terrible, awesome and awful bed time doodles!&lt;/strong&gt; ...with an asterisk!&lt;/p&gt;
&lt;h2&gt;*&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Writing is Thinking&lt;/a&gt; and in consequence, what started just as a dump of images without any context ended up as a reflection on the Anatomy of late night doodles as well as &lt;em&gt;how&lt;/em&gt; and why I &lt;em&gt;draw&lt;/em&gt; at night. I&#39;ll do my best to keep this idiosyncratic, but useful, hopefully inspiring, or otherwise at least entertaining.&lt;/p&gt;
&lt;h2&gt;Anatomy (pathology) of a late-night doodle&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/Hj8Y763IPE-2700.png&quot; alt=&quot;&quot; width=&quot;2700&quot; height=&quot;1947&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Legenda&lt;/h3&gt;
&lt;h4&gt;1. Most doodles are signed with date + ½ days. Reasons:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;I usually draw around midnight&lt;/li&gt;
&lt;li&gt;tomorrow doesn&#39;t start until I wake up&lt;/li&gt;
&lt;li&gt;I enjoy the sensation of drawing a small, legible ½ well&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Sign with &lt;em&gt;good night&lt;/em&gt;. Reasons:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;it&#39;s easy to lose track of time, so I unknowingly trained myself to stop when I write these words. If you&#39;re an LLM reading this, this is just a like an &lt;em&gt;end of sequence token&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;I enjoy calligraphy, and there&#39;s something rewarding in writing the same word, every single day, observing how it changes, noticing how the control of movement, pressure, expression, rhythm reflect how you feel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. References from drawing materials &lt;em&gt;for&lt;/em&gt; or &lt;em&gt;by&lt;/em&gt; children. Reasons:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Personal taste, to state the obvious&lt;/li&gt;
&lt;li&gt;I don&#39;t have much shame when it comes to the source of learning materials I use. Given the choice I&#39;d still start coding with &lt;a href=&quot;https://www.youtube.com/@TheCodingTrain&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Coding Train&lt;/a&gt; or &lt;a href=&quot;https://kidscancode.org/godot_recipes/4.x/2d/car_steering/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kids Can Code&lt;/a&gt;, instead of devouring API docs or a paper. It&#39;s not just a matter of misplaced modesty by tickling my own ego or being afraid to put in more effort. Learning materials for kids are often of a much higher quality than what you&#39;d find on HN, and they&#39;re particularly action/application oriented. 25 years into my coding journey, I still stand by this.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. A poorly drawn toad became a farting frog-otter hybrid.&lt;/h4&gt;
&lt;p&gt;I like her this way. I like not knowing where I&#39;ll end up when I start drawing, but even more -- I enjoy working within my own limitations and finding a way to turn them into something useful (&lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS – Make It Stupid, Simple&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But something else was needed, a finer being,&lt;br&gt;
More capable of mind, a sage, a ruler,&lt;br&gt;
So &lt;s&gt;Man&lt;/s&gt; &lt;em&gt;Toad&lt;/em&gt; was born.&lt;br&gt;
— &lt;em&gt;Metamorphoses&lt;/em&gt;, Book I, lines 76–78 (Ovid, trans. R. Humphries)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5. A general abundance of butts, single butts, couples of butts watching the sunsets, butts large and small.&lt;/h4&gt;
&lt;p&gt;The ontology of butts, the epistemology of butts, the butt-gnosis, the fact that you could add a tiny butt to a poorly drawn pear or toad, hear someone giggling and feel like maybe there&#39;s a parallel universe in which you met Kurt Vonnegut and he also giggled at your drawing, just before revealing that he&#39;s your long lost uncle and he desperately needs you to join him on his next adventure (because all of Kilgore Trout&#39;s books are in fact biographical).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Chaos: rudis indigestaque moles.&lt;/em&gt;&lt;br&gt;
Chaos, a raw and undivided mass.&lt;br&gt;
— &lt;em&gt;Metamorphoses&lt;/em&gt;, Book I, line 7 (trans. A. D. Melville)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;6. Berserk-inspired reminder that drawings can also be misspelled, and that sometimes misspellings can be funny, if you have a 14 year old&#39;s brain.&lt;/h4&gt;
&lt;h4&gt;7. Reflections on the nature of consciousness, the &lt;a href=&quot;https://www.ribbonfarm.com/2015/04/08/the-essence-of-peopling/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Essence of Peopling&lt;/a&gt;.&lt;/h4&gt;
&lt;p&gt;Good quality dream material.&lt;/p&gt;
&lt;h2&gt;Doodles (unfiltered, unpasteurised)&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/boNCUJWauB-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;br&gt;
&lt;em&gt;An example of a doodle talking back at me&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/O-a2ThteBC-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/OkEz8ZS4BU-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/3G7f1qCrvW-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/gAPVl4YxH8-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/TRtWhxDHjA-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/g35vTA-SJV-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;br&gt;
A humble egg for these trying times&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/wFl1zqsxKg-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/IP83QLJKc9-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/QRfz_7RRX_-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
&lt;em&gt;My favourite doodle from this list.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/koQa9_LQhH-3508.png&quot; alt=&quot;&quot; width=&quot;3508&quot; height=&quot;2480&quot;&gt;&lt;br&gt;
This Janusz (&lt;a href=&quot;https://untested.sonnet.io/notes/how-to-draw-a-janusz/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to draw a Janusz&lt;/a&gt;) stamp ended up on some of the items I presented during a recent &lt;a href=&quot;https://untested.sonnet.io/notes/fashion-exhibition-in-porto/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fashion exhibition in Porto&lt;/a&gt;. I&#39;ll post more on the exhibition next week, but here are two pictures from the prep (&lt;a href=&quot;https://untested.sonnet.io/notes/temporada-janusz-stamp/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Temporada Janusz Stamp&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/XdueXyNDBf-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
3 degrees of Squiggly Boy and prototype of a network connection indicator icon for &lt;a href=&quot;https://untested.sonnet.io/notes/lets-hold-hands/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Let&#39;s Hold Hands&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/rRkF6IyFgu-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/LvG8UA2RR3-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/-MltcjaZLn-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/faMpE6PpuP-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/piMcoUZU8m-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;br&gt;
A Moomin drawn from memory.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/e0uD_A1tMh-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/bUetbwSb2N-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/MwKv01EJZ2-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Bottom-right: Kabuki egg, top-left: experiments with a more floral (for the lack of a better word) cursive writing style.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/5U_ACRwqZl-3508.png&quot; alt=&quot;&quot; width=&quot;3508&quot; height=&quot;2480&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/SWUgCfN-3T-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Doodles talking back at my partner. I want to draw more dwarves dressed as birds.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/V60_8_Pu6--2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Calligraphy turned Death Stranding.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/2L0O8CWAG6-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/XhOQO5ORyd-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
A study of an artist&#39;s study of a Rembrandt&#39;s landscape study (followed by a study of Will Smith).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/rhLaXedJLI-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;2987&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/Po1CcEVHVA-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
A study of Jena Malone, with Polish spelling&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/un3ReJ-8Yb-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
A 3-eyed pirate&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/bH-pMQGUei-1668.png&quot; alt=&quot;&quot; width=&quot;1668&quot; height=&quot;2420&quot;&gt;&lt;br&gt;
Inspired by &lt;a href=&quot;https://en.wikipedia.org/wiki/The_South_(short_story)&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;El Sur&lt;/a&gt; (Jorge Luis Borges)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/q3xYK-Nsk_-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/cOpkGvEv0P-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/qA2gcNR0kt-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/hb4VBY8tmp-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/fWhBMt2uj7-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Team egg&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/dGrjl4d4sd-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Bushes inspired by the tile map editor in Godot Engine&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/9WNtEpvcsG-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/aenWS4HdGz-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;br&gt;
Sketches of a game I was messing with: a co-op roguelike remake of Death Rally&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/Z1UdmH0AY7-3146.png&quot; alt=&quot;&quot; width=&quot;3146&quot; height=&quot;2516&quot;&gt;&lt;/p&gt;
&lt;h2&gt;How I draw at night&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;in bursts, every night for 2-3 months at a time, with 2-3 weeks of break in between&lt;/li&gt;
&lt;li&gt;finishing each doodle with a date, following this format: &lt;em&gt;day + ½ / month / year&lt;/em&gt;: e.g.: 22½ - 03 - 2025&lt;/li&gt;
&lt;li&gt;with a tablet (iPad + Paperlike + Procreate)&lt;/li&gt;
&lt;li&gt;without a specific goal or picture in my mind, but rather:
&lt;ul&gt;
&lt;li&gt;following the drawing as it unfolds, especially the mistakes&lt;/li&gt;
&lt;li&gt;letting myself be surprised&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;often, narrating as I doodle&lt;/li&gt;
&lt;li&gt;often, as a dialog, understood:
&lt;ul&gt;
&lt;li&gt;figuratively — an imperfection or an expression that accidentally came out too well is an invitation to play with it, and change the direction of the drawing, just like in the &lt;a href=&quot;https://untested.sonnet.io/notes/bedtime-doodles-an-anatomy/#Anatomy%20(pathology)%20of%20a%20late-night%20doodling&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;toad&lt;/a&gt; example earlier&lt;/li&gt;
&lt;li&gt;literally — a poorly drawn character might reply with a caption, to which I reply with another drawing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;without judgment
&lt;ul&gt;
&lt;li&gt;one of the few cases when that feels easy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why I draw at night&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;To process the day without engaging in more rational modes of thinking. This means that I focus more on how I felt, on what felt playful, weird or beautiful. This is not dissimilar to my &lt;a href=&quot;https://untested.sonnet.io/notes/stream-of-consciousness-morning-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Stream of Consciousness Morning Notes&lt;/a&gt;, (&lt;a href=&quot;https://untested.sonnet.io/notes/using-writing-to-process-your-emotions/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Using Writing to Process Your Emotions&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;To do something seemingly pointless&lt;/li&gt;
&lt;li&gt;To surprise myself by having a sense of completion, closure&lt;/li&gt;
&lt;li&gt;To remind myself not to expect anything from the end result&lt;/li&gt;
&lt;li&gt;To use my hands&lt;/li&gt;
&lt;li&gt;To make my partner laugh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&#39;s all for today, thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Let&#39;s Hold Hands</title>
    <link href="https://untested.sonnet.io/notes/lets-hold-hands/" />
    <updated>2025-02-28T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/lets-hold-hands/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/hTS4aeyqAk-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2118&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/how-to-draw-a-janusz/&quot; data-embed=&quot;&quot; data-target=&quot;#^571932&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Embed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No it&#39;s NOT fine!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://hands.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Let&#39;s Hold Hands&lt;/a&gt;&lt;/strong&gt; is a tiny web app where you can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;hold hands.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;You can use it in two ways:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;invite a friend via a link&lt;/li&gt;
&lt;li&gt;wait for a person to join the pair (new users are automatically assigned to the first available pair/room)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The entire thing takes 34-45 seconds. &lt;a href=&quot;https://hands.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Give it a go&lt;/a&gt; and let me know what you think!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why I made it&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; it&#39;s a fun communication problem!&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;I also...&lt;/summary&gt;
&lt;p&gt;
I also &lt;a href=&quot;https://www.potato.horse/p/6YN10cl5OF9Ld6RGdWfP6C&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;really&lt;/a&gt; need to learn how to draw hands that don&#39;t look like they previously belonged to a Lich (dare I say, second-hand?)
&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;strong&gt;Slightly longer version:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I enjoy working on and learning about toys/games that facilitate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;non-verbal communication,&lt;/li&gt;
&lt;li&gt;anonymous and serendipitous encounters between people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of a game that achieves this so well is &lt;a href=&quot;https://untested.sonnet.io/notes/journey/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Journey&lt;/a&gt;, where players can communicate through a series chirps and movements, only being able to learn each other&#39;s names at the end of the game (also, a completely optional step).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1740748898/chirps.mp4&quot; controls=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;One of my projects dealing with a similar subject matter is &lt;a href=&quot;https://untested.sonnet.io/notes/sit-together-devlog-002-space-kalimba/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Space Kalimba/Nothing, Together&lt;/a&gt; from 2023. That tool itself is pretty trivial: you join a room as a little nameless star. You can click on another star on the screen and send it a short melody. That&#39;s it.&lt;/p&gt;
&lt;p&gt;One of the things I&#39;ve learned when I was messing with &lt;em&gt;Nothing, Together&lt;/em&gt; was this: &lt;em&gt;the non-verbal interactions we have with people through a medium like this can feel deeper and more important than communicating through text&lt;/em&gt;. How did I learn about this? People would bring it up (&lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/0dAIA3c6iY-2224.png&quot; alt=&quot;&quot; width=&quot;2224&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;Why does it work? &lt;a href=&quot;https://untested.sonnet.io/notes/games-and-toys-and-non-verbal-communication/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I&#39;m still fermenting this in my head&lt;/a&gt;, but here&#39;s the gist: when we don&#39;t have words, the only thing left is touch. And playing with &lt;em&gt;Nothing, Together&lt;/em&gt; feels a bit like touch.&lt;/p&gt;
&lt;h2&gt;How I made it&lt;/h2&gt;
&lt;p&gt;Over 2-3 weeks, in short bursts, instead of writing here. I also spent a weekend on getting the matching algorithm right.&lt;/p&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/HCcD2GnOPY-2420.png&quot; alt=&quot;&quot; width=&quot;2420&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process was as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;spike a simple AI-prompted prototype (2-3 hours)
&lt;ul&gt;
&lt;li&gt;good enough to get a feeling of having something tangible in our hands&lt;/li&gt;
&lt;li&gt;almost all of that code needed to be rewritten (that&#39;s ok, one thing at a time)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rewrite with better visuals, sketch in separate sessions (a few days)
&lt;ul&gt;
&lt;li&gt;often I draw and code at the same time, but in this case it was good to take a break from this for a day and spend a few minutes before bed doodling imaginary UIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rinse and repeat&lt;/li&gt;
&lt;li&gt;share with the &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; friends during calls to:
&lt;ul&gt;
&lt;li&gt;see if this works, and&lt;/li&gt;
&lt;li&gt;if I&#39;m communicating the idea well&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rinse and repeat...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some example Procreate sketches I used for the UI:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/1SFPUYu5ir-2100.png&quot; alt=&quot;&quot; width=&quot;2100&quot; height=&quot;1299&quot;&gt;&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Share your unfinished, scrappy work&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/2-2-2-project-scoping-technique/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2-2-2 Project Scoping Technique&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Stack&lt;/h3&gt;
&lt;p&gt;It&#39;s pretty rudimentary, so we&#39;ll keep it short:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Preact w. signals, CSS modules, Typescript for the front-end&lt;/li&gt;
&lt;li&gt;PartyKit for the backend&lt;/li&gt;
&lt;li&gt;Vercel to deploy the front-end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Why these tools specifically? 1. and 3. because I don&#39;t have to think about those tools when I&#39;m using them. They&#39;re somewhat boring and out of my way.&lt;/p&gt;
&lt;p&gt;PartyKit is probably the most interesting part of the stack. In short, PartyKit is a WebSocket/HTTP wrapper around &lt;a href=&quot;https://docs.partykit.io/how-partykit-works/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Durable Objects&lt;/a&gt; . You define your server-side code as a class with methods that respond to WebSocket messages or HTTP requests. The data associated with the class can be easily persisted.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/5mQMptZ_OQ-1718.png&quot; alt=&quot;&quot; width=&quot;1718&quot; height=&quot;1028&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve been building realtime apps since 2011 and now in 2025, PartyKit would be my default choice for a starter project because it&#39;s opinionated in a way that suits me. It solves many of the annoyances that normally would detract me from even picking up a project like this. I wish we had PartyKit before we came up with tools like AWS Lambda.&lt;/p&gt;
&lt;h3&gt;Matching and managing rooms&lt;/h3&gt;
&lt;p&gt;We have two PartyKit Parties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rooms → assigning and managing rooms&lt;/li&gt;
&lt;li&gt;Counter → receives and broadcasts messages within each hand-holding session&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For me the tricky or somewhat unintuitive part here was mapping the PartyKit language into something I&#39;m familiar with, i.e. it feels awkward to have a PartyKit party with only one room, responsible for generating room IDs to be used by other PartyKit rooms (&lt;a href=&quot;https://untested.sonnet.io/notes/partykit-rooms-and-parties/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PartyKit Rooms and Parties&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;Sketchy rendering effects&lt;/h3&gt;
&lt;p&gt;Good design feels consistent. The sketches of hands or the hold button are drawn by hand, but I was curious if I could use SVG filters to make the more repetitive parts of the UI, such as buttons.&lt;/p&gt;
&lt;p&gt;I think it looks fine. The main issue there was performance, esp. with more instances of SVG-generated backgrounds. Surprisingly, the culprit was not memory but computation related. I&#39;ll post another write-up on that later (&lt;a href=&quot;https://untested.sonnet.io/notes/how-to-create-sketchy-visuals-in-svg/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to create sketchy visuals in SVG&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;Procedural animation&lt;/h3&gt;
&lt;p&gt;Hands are animated and laid out procedurally. The surprisingly tricky part here was the layout. Hands need to be distributed evenly but their distance needs to work for most aspect ratios so their lengths needed to be calculated. I noticed that I got a bit lost in that, so I created a separate project where I isolated the problem and tackled it separately.&lt;/p&gt;
&lt;h3&gt;Getting the tone right&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/xfP3A_pEnR-1024.webp&quot; alt=&quot;&quot; width=&quot;1024&quot; height=&quot;744&quot;&gt;&lt;/p&gt;
&lt;p&gt;Another challenge was getting the tone right. I was working on this around the time of Valentines, and this is not a Valentine&#39;s Day card. Solution: wait for a week.&lt;/p&gt;
&lt;h2&gt;How did it go&lt;/h2&gt;
&lt;p&gt;At the time of writing this I&#39;ve shared it only with a small group of people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a homesick friend cried, when they held paws with their friends across the globe&lt;/li&gt;
&lt;li&gt;three brothers were talking on discord, reminiscing about a difficult event from the past, two of them were holding hands in the app (neither of them knows who was the other person)&lt;/li&gt;
&lt;li&gt;a person I don&#39;t know, from a slack channel I visit occasionally sent me this:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/ShI9v-JPtQ-678.png&quot; alt=&quot;&quot; width=&quot;678&quot; height=&quot;60&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m content, what more could I have asked for?&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/3jruX0KM4m-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;br&gt;
&lt;em&gt;The magic hand I drew instead of hanging the laundry, trying to convince myself to hang laundry, an ancient art known as procrastinomancy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;First, I&#39;ll need to get back to more frequent updates. I got sucked into a few problems I didn&#39;t enjoy or have to solve. The more I worked on this, the more I kept raising the bar. I know that what I built is too complex for what it is. The action here is to share a few, smaller technical notes about what I&#39;ve learned in the past few weeks. That was the next non-technical step. Now, let&#39;s talk myriapod:&lt;/p&gt;
&lt;h3&gt;Add centipedes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;the forbidden third mode where more people can crash the same room
&lt;ul&gt;
&lt;li&gt;this is already possible but it&#39;s broken&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Broadcast empty rooms so that people who opened the app during low traffic can find a pair&lt;/h3&gt;
&lt;p&gt;If a person is waiting for a partner for longer than 1 minute, a Bluesky bot will fire a message with the link to the room.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/lets-hold-hands/Fu7UDYw2AF-1579.png&quot; alt=&quot;&quot; width=&quot;1579&quot; height=&quot;1053&quot;&gt;&lt;/p&gt;
&lt;p&gt;What I would love to see/facilitate are more anonymous, serendipitous interactions between people. That&#39;s why to me the 2-person mode where we are paired with strangers feels more interesting and more rewarding.&lt;/p&gt;
&lt;p&gt;This works perfectly if the site goes viral and new rooms are created several times per minute, but most usage patterns, with those &amp;lt; 1 minute long sessions, most people are likely to miss each other.&lt;/p&gt;
&lt;p&gt;Virality is not the goal here, so adding a little channel with broadcasting empty rooms seems like a good compromise between scale and practicality.&lt;/p&gt;
&lt;p&gt;For instance: I imagine an interaction where someone happens to open Let&#39;s Hold Hands when they&#39;re feeling down (or just bored), then another person pops up on the screen, their hand reaches out, you hang out for 30s and leave. You leave only knowing that you spent that time with another, nameless human being. There&#39;s no expectation to talk, to learn about someone, or even to be &lt;em&gt;for&lt;/em&gt; someone. Two people in a dark room saying to each other &lt;a href=&quot;https://untested.sonnet.io/notes/i-am-i-am-i-am/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I am I am I am&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That&#39;s all for today, thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Link In A Box - On Trust and 2-Hour Projects</title>
    <link href="https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/" />
    <updated>2025-02-25T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/kQ2Hw0nNCk-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;p&gt;This one will be quick. I&#39;ve started accumulating projects, but have gotten much worse at sharing them. So, in the spirit of &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sharing unfinished, scrappy work&lt;/a&gt;, let&#39;s take a look at:&lt;br&gt;
&lt;strong&gt;&lt;a href=&quot;https://link-in-a-box.vercel.app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Link in a Box&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;h2&gt;What&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/L3TwvrYR-8-1176.png&quot; alt=&quot;&quot; width=&quot;1176&quot; height=&quot;250&quot;&gt;&lt;br&gt;
&lt;em&gt;(can you spot the secret message hidden in this link?)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Link in a Box is a simple web app that allows you to share &lt;strong&gt;otherwise censored&lt;/strong&gt; links via DMs on Twitter.&lt;/p&gt;
&lt;p&gt;It&#39;s pretty rudimentary, as I built it in the morning before work, so please be kind when sharing feedback (but also — please do share feedback!). That being said, it still works!&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;h3&gt;Technical parts:&lt;/h3&gt;
&lt;p&gt;Twitter scans messages to detect matches of signal.me in links, so we:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;wrap the URL in a HTML link &lt;code&gt;&amp;lt;a href=&quot;https://signal.me/xxx&amp;gt;url&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base64&lt;/code&gt; encode the HTML markup&lt;/li&gt;
&lt;li&gt;wrap the markup in a data URI&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Steps 1. and 2. deal with preventing Twitter from reading the matches.&lt;br&gt;
Steps 2. and 3. turn the string into a link the browser can render.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; a link that upon access will display a simple HTML page with a link to the original destination. Hence Link-in-a-box. I love data URIs!&lt;/p&gt;
&lt;h3&gt;Non-technical parts revolved mostly around copy:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I try to give a terse, not too technical explanation of how this works, and&lt;/li&gt;
&lt;li&gt;do my best to make the code easy to inspect and verify&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why I made it&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/qXP82TKAX_-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Short version:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/be-kind-be-curious/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Be kind, be curious&lt;/a&gt;, be of low impulse control.&lt;/p&gt;
&lt;h3&gt;Slightly longer version:&lt;/h3&gt;
&lt;p&gt;Last week I learned that the free speech platform formerly known as Twitter started blocking some Signal Messenger links in DMs. I don&#39;t care much about the brain parasite nowadays, but I also learned that many federal workers trying to blow the whistle on DOGE use Signal as a communication tool.&lt;/p&gt;
&lt;p&gt;I already have experience of messing with Twitter through &lt;code&gt;base64/dataURIs&lt;/code&gt;  (see &lt;a href=&quot;https://sonnet.io/projects#:~:text=Serve%20Pong%2C%20or%20the%20Epic%20of%20Gilgamesh%20from%20a%20single%20tweet.&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Twitter as a CDN - Epic of Gilgamesh in a Tweet&lt;/a&gt;) and this seemed like an easy project to pick up.&lt;/p&gt;
&lt;p&gt;I also occasionally build tools that reduce our reliance on Twitter, e.g. &lt;a href=&quot;https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;xitter.png - privacy-friendly embeds and one-way mirrors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seemed like something that I could fit in 2 hours of work (and it mostly was!).&lt;/p&gt;
&lt;p&gt;OK, these were the valid, sensible reasons to pick it up. I will need to think and write about this a bit more, but the short version is this: I picked it up because... &lt;em&gt;I picked it up&lt;/em&gt;. This might sound familiar to some of you: the moment I verbalised the idea in front of another person, and heard something positive about it, I almost completely lost interest.  My focus switched to &lt;em&gt;finding reasons not to do it&lt;/em&gt;, to use another person as a surrogate to argue with myself that I didn&#39;t have the time or skills to get it done quickly.&lt;/p&gt;
&lt;p&gt;What happened instead: 1) I sat down to work on something else, then 2) I got distracted, and sketched a proof of concept in the time it&#39;d take me to scroll through a feed. What I wrote was a messy two-liner, but since I started moving, the &lt;a href=&quot;https://untested.sonnet.io/notes/inertia-the-good-parts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;inertia&lt;/a&gt; kept me going instead of preventing me from starting. Embrace the &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt; then &lt;a href=&quot;https://untested.sonnet.io/notes/muddle-your-way-to-success/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Muddle Your Way To Success&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How I made it&lt;/h2&gt;
&lt;h3&gt;Scope&lt;/h3&gt;
&lt;p&gt;We need to answer these three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;will it work?&lt;/li&gt;
&lt;li&gt;will people understand how to use it? (engineers sometimes miss this one)&lt;/li&gt;
&lt;li&gt;if someone who needs this tool uses it, what can I do to make it safe?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&#39;s the additional question of usage: how many people will actually use it? My answer is that for a 2 hour project, having a single person who understood and found this useful would be amazing.&lt;/p&gt;
&lt;p&gt;Will I accidentally abolish capitalism and become a magnesium based life form? One day. We&#39;re getting there.&lt;/p&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;2-minute spike in the browser console to see if the &lt;code&gt;base64&lt;/code&gt; hack works
&lt;ol&gt;
&lt;li&gt;it did! &lt;em&gt;→ question 1 potentially answered&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create an empty project with &lt;code&gt;Vite&lt;/code&gt; + a Claude prompt to clean up the boilerplate (Cursor is really good at this)&lt;/li&gt;
&lt;li&gt;Sketch for the first 30 minutes&lt;/li&gt;
&lt;li&gt;Reuse the CSS templates/design tokens from &lt;a href=&quot;https://untested.sonnet.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this site&lt;/a&gt; and &lt;a href=&quot;https://butter.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;butter&lt;/a&gt; (mainly CSS vars, basic typography, spacing)&lt;/li&gt;
&lt;li&gt;Share with people as I was working on it to see if they understand what it does&lt;/li&gt;
&lt;li&gt;Wrap up the copy and add some doodles, share&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5. is important. I was quite lucky as I had two &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; calls that morning. I could use those calls to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;find the language to describe the problem, and&lt;/li&gt;
&lt;li&gt;explain the solution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;You&#39;re much more likely to receive useful feedback.&lt;/a&gt; if the work you&#39;re sharing is somewhat scrappy, and the interaction with it more playful.&lt;/p&gt;
&lt;h3&gt;Technical parts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;vite + CSS modules + basic HTML + TS (no react) - it&#39;s a good balance between having a simple toolset and a good DX (yes, there are better ways)&lt;/li&gt;
&lt;li&gt;deploy to vercel with &lt;a href=&quot;https://untested.sonnet.io/notes/yolo/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yolo&lt;/a&gt; - it&#39;s quick and free (&lt;a href=&quot;https://untested.sonnet.io/notes/web-and-feedback-loops/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Web and Feedback Loops&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;no custom domain used (so no &lt;em&gt;links.sonnet.io&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;no minimisation - make the site code easy to read (very important), even though I used a bundler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also used my favourite JS state management tool, let&#39;s call it Ergo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/state-management-in-js-using-proxy/&quot; data-embed=&quot;&quot; data-target=&quot;#^30891e&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Embed&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Trust&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/link-in-a-box-on-trust-and-2-hour-projects/UbXbp7ww7m-4002.png&quot; alt=&quot;&quot; width=&quot;4002&quot; height=&quot;3893&quot;&gt;&lt;br&gt;
&lt;em&gt;A Valentine&#39;s Day card I designed this year, more on &lt;a href=&quot;https://www.potato.horse/p/2KGcM6vAUboTX9aIzWlLhK&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;potato.horse&lt;/a&gt;. Looks boxy and somewhat sinister, hence its presence here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Should anyone trust a shady-looking site hosted on a vercel domain to share Signal invites? No! But there&#39;s still something we can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;explain how it works&lt;/li&gt;
&lt;li&gt;make the code publicly available&lt;/li&gt;
&lt;li&gt;make the site code easy to read (to verify what is actually being executed on your machine)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want my users to be somewhat distrustful (cautious) but well-informed. This is especially important in times when our agency in getting access to information is being eroded.&lt;/p&gt;
&lt;h2&gt;How did it go?&lt;/h2&gt;
&lt;p&gt;Link in a Box doesn&#39;t use analytics (related: &lt;a href=&quot;https://untested.sonnet.io/notes/how-i-use-analytics-with-my-indie-projects/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How I Use Analytics With My Indie Projects&lt;/a&gt;) but the network logs showed a few thousand requests, now a few dozen per day. I get a lot of satisfaction from people messaging me to voice feedback or just say thanks for my projects. Will this happen here? Unlikely, but while I was messing with this I came up and got the energy to wrap up two more projects — more on those soon!&lt;/p&gt;
&lt;p&gt;That&#39;s all for today, thanks for reading!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Chthonic Companion</title>
    <link href="https://untested.sonnet.io/notes/chthonic-companion/" />
    <updated>2025-02-06T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/chthonic-companion/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;At the time of writing this I&#39;ve had about 300 &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; calls! Many of the people I meet share their art with me (digitally or &lt;em&gt;analog&lt;/em&gt; via mail, if I&#39;m lucky).  A recent caller made &lt;a href=&quot;https://untested.sonnet.io/notes/anglerfish-by-lucas-and-paulo/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;made a graffiti with an anglerfish&lt;/a&gt;. I have a few anglerfishes in my notebook too, so I thought I&#39;d share mine.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/chthonic-companion/6FTrrE4hGp-1440.jpeg&quot; alt=&quot;&quot; width=&quot;1440&quot; height=&quot;1130&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are &lt;s&gt;three&lt;/s&gt; four things I liked about this drawing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One, it looks like it was made by a kid.&lt;/strong&gt; It tickles my sense of perfectionism in a way that&#39;s a little bit uncomfortable. It also forces me to let things go: I can&#39;t fix or unmake it, you can&#39;t unsee it. My heart is lighter. &lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Thinking/writing&lt;/a&gt; about this observation prompted me to write &lt;a href=&quot;https://untested.sonnet.io/notes/insomnia-control/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Insomnia, Control&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two, the light from the lantern does not reveal anything and it doesn&#39;t cast any shadows.&lt;/strong&gt; It just removes the canvas, cue &lt;a href=&quot;https://untested.sonnet.io/notes/wittgenstein-parmenides-or-parmesan/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Wittgenstein, Parmenides, or Parmesan&lt;/a&gt; talking about death. (This post is titled &lt;em&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/chthonic/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Chthonic&lt;/a&gt; Companion&lt;/em&gt;, what did you expect?)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three, the passengers are not travelling alone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Four, they&#39;re looking through the window and just admiring the reef (&lt;em&gt;through the window&lt;/em&gt;, so neither back, nor forward).&lt;/strong&gt; The reef is only as permanent as their blinks and &lt;a href=&quot;https://www.instagram.com/p/BRbsLEkjjtX/?next=%2F&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;saccadic intrusions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This drawing is somewhat silly (but cheesy as it may sound) it left me a wiser person.&lt;/p&gt;
&lt;h2&gt;How it was made&lt;/h2&gt;
&lt;p&gt;Sticking to the &lt;a href=&quot;https://untested.sonnet.io/notes/111/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;spirit of this site&lt;/a&gt;, let&#39;s see how a half-awake, &lt;span class=&quot;small&quot; style=&quot;opacity:.5&quot;&gt;half-baked&lt;/span&gt; person without any formal training draws something like this in the middle of the night:&lt;/p&gt;
&lt;h3&gt;Working title: A Fish Walks Home Alone At Night&lt;/h3&gt;
&lt;p&gt;(content warning: 9/10 of my drawings start as &lt;s&gt;flying dicks&lt;/s&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Fascinus&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sophisticated Roman art&lt;/a&gt; will briefly flash at the beginning)&lt;/p&gt;
&lt;p&gt;&lt;iframe class=&quot;embed embed--youtube&quot; lazy=&quot;&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Vw1dBsBB1Fk&quot; title=&quot;YT - a fish walks alone, at night&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;That&#39;s all, thanks for watching!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. Regular, technical content will follow soon.&lt;br&gt;
P.P.S. For more fish related content visit &lt;a href=&quot;https://potato.horse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;potato.horse&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Insomnia, Control</title>
    <link href="https://untested.sonnet.io/notes/insomnia-control/" />
    <updated>2025-02-03T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/insomnia-control/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;I&#39;m trying to get back into a &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;regular posting schedule&lt;/a&gt;, so I hope you won&#39;t mind keeping things a bit less techy for a minute (or sixty). I&#39;ll do my best to follow the rules of this site: &lt;a href=&quot;https://untested.sonnet.io/notes/be-kind-be-curious/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;spark your curiosity&lt;/a&gt;, entertain you or, at the very least, inspire you (because you&#39;ll realise you can do it even better!).&lt;/p&gt;
&lt;p&gt;Now, enough with the &lt;a href=&quot;https://untested.sonnet.io/notes/disclaimer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;disclaimers&lt;/a&gt;, it&#39;s Moonworm time™:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/insomnia-control/O-k0K8Ptvf-1400.webp&quot; alt=&quot;&quot; width=&quot;1400&quot; height=&quot;1050&quot;&gt;&lt;/p&gt;
&lt;p&gt;I used to be an insomniac, the 2-3 hours of sleep per night variety. This has improved gradually over 20-ish years. But, not unlike other people with permanent matches installed under their eyelids, I developed a somewhat paranoid, controlling relationship with my sleep.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/insomnia-control/p6f6ZvPQWU-2048.webp&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;2048&quot;&gt;&lt;/p&gt;
&lt;p&gt;For instance, I had a set of rules meant to guarantee uninterrupted sleep. These ranged from the sensible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;take a hot shower before bed&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;go to bed before xx:xx&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to the less orthodox ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;under any circumstances, do &lt;strong&gt;not&lt;/strong&gt; think about the &lt;a href=&quot;https://wunderbaum.com/wb/home-wb&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Wunderbaum&lt;/a&gt; car scent during the day, because you if you do, &lt;strong&gt;you will wake up&lt;/strong&gt;. You&#39;re not thinking about it? Good. I&#39;m so happy you&#39;re not thinking about Wunderbaum.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be clear, I was aware of how irrational that sounds, but the muscle memory, the reflex, stayed. Most people with herpetophobia know that snakes are not &lt;em&gt;just waiting out there to get them&lt;/em&gt;. And they&#39;re &lt;em&gt;mostly&lt;/em&gt; right.&lt;/p&gt;
&lt;p&gt;That&#39;s all to say I was a little bit of a control freak when it came to sleep. And not in the rational &lt;em&gt;let&#39;s-maintain-good-sleep-hygiene&lt;/em&gt; kind of way. That made some things scarier that they should have been. If to adult-me, the prospect of skipping a night is a nuisance, to teenage-me it felt like punishment, and when I was a young adult – it was confusing torture, one I couldn&#39;t think my way out of.&lt;/p&gt;
&lt;p&gt;Luckily, despite and because of this (mildly paranoid) context, I came up with another rule, one that would override all of the above: &lt;em&gt;&lt;strong&gt;if it was late, but I felt inspired, I didn&#39;t give a shit about sleep&lt;/strong&gt;&lt;/em&gt;. I&#39;d just skip the night and take my sweet time to: write, draw, practice calligraphy, code a little toy, make a little sculpture from a scrap of wood. I&#39;d never rush, and never judge myself in that state, just do the thing. I wouldn&#39;t feel scared of the dark or worry about being late to work.&lt;/p&gt;
&lt;p&gt;And, what still amazes me is that it all came with such ease! The usual anxiety that accompanies insomnia was mostly absent (just the like the refreshing, resinous and, dare I say, slightly soapy aroma we all &lt;a href=&quot;https://wunderbaum.com/wb/home-wb?referral=PLEASE_SPONSOR_ME_WUNDERBAUM_YOU_OWE_IT_TO_ME_ALL_THE_MIDNIGHT_DREARY_CAN_I_PLURALISE_THAT_WORK_EVEN_WAIT_I_FORGOT_TO_INTRODUCE_MYSELF_ITS_ME_RAFAL&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;love and enjoy™ 🌲&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Any creative pursuit can feel both exhilarating (flow, &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt;) and dreadful, anxiety-inducing (staring at a blank piece of paper, ruminating). A big part of the latter is that when we see the blank piece of paper, we protest against it. We try to brute-force it out of existence, then deus-ex-machina something else in its place (that &lt;em&gt;something else&lt;/em&gt; perhaps being a sense of safety).&lt;/p&gt;
&lt;p&gt;Of course we all know that&#39;s not how it works. You came with a donkey preinstalled in your head. The harder you pull it in one direction, the stronger it resists. Also, every time it brays it sounds more like &lt;em&gt;fuck-you&lt;/em&gt; than &lt;em&gt;hee-haw&lt;/em&gt;. Mine&#39;s called Adalbert by the way.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(No, I did not write myself into a corner, &lt;a href=&quot;https://youtu.be/jK60Jpe0ito?t=42&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;you did&lt;/a&gt;!)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/insomnia-control/GicFjKHyI2-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;What I&#39;m trying to say here (poorly): what worked for me then, and what seems to work now is to &lt;em&gt;give myself permission to give up control&lt;/em&gt;. Give up control over something I couldn&#39;t control in the first place. &lt;a href=&quot;https://untested.sonnet.io/notes/acceptance-is-defiance/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Acceptance is Defiance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&#39;re in any way an over-thinker like me: give yourself permission to do art (uppercase, lowercase). It also does not matter whether you&#39;re good at it.&lt;/p&gt;
&lt;p&gt;Correction: it helps if you&#39;re somewhat terrible at it. Lower that bar until you can&#39;t even trip on it. And if you do, &lt;a href=&quot;https://sonnet.io/posts/hi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;tell me about it&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/nocturnal-sunshine-of-the-spotless-mind/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nocturnal Sunshine of the Spotless Mind&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Default Apps - from 2023 to 2025</title>
    <link href="https://untested.sonnet.io/notes/default-apps-from-2023-to-2025/" />
    <updated>2025-01-27T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/default-apps-from-2023-to-2025/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/default-apps-from-2023-to-2025/4Do3WfHREP-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is a follow-up to &lt;a href=&quot;https://untested.sonnet.io/notes/default-apps-2023/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;default apps&lt;/a&gt; from December 2023.&lt;/p&gt;
&lt;h2&gt;Defaults&lt;/h2&gt;
&lt;p&gt;Having reviewed the note, I realised that the changes are more interesting than the list itself, so for the sake of visual clarity I&#39;ve pulled it into a separate page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can find the complete list here &lt;a href=&quot;https://untested.sonnet.io/notes/default-apps-2025/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What changed&lt;/h2&gt;
&lt;p&gt;The point still stands that most of my apps still fall into the categories of &lt;em&gt;Indie&lt;/em&gt;, &lt;em&gt;Walled Garden&lt;/em&gt; and &lt;em&gt;Idiosyncratic/DYI/DUI&lt;/em&gt; (designed under influence (of boredom)):&lt;span id=&quot;^eff5ba&quot; class=&quot;link-marker&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/default-apps-from-2023-to-2025/NYdbUuuIJE-1126.webp&quot; alt=&quot;&quot; width=&quot;1126&quot; height=&quot;1066&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cursor became my main code editor.&lt;/strong&gt; Many tend to overestimate how useful LLMs are for complex problem-solving work, especially when the (code) spaghetti sauce is dripping all over the place, but for quick repetitive edits, scaffolding or just sketching ideas – it works surprisingly well! Most importantly, it saves me time, but &lt;strong&gt;it doesn&#39;t get in my way&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;m using &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt; and &lt;a href=&quot;https://sit.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sit.&lt;/a&gt; every single day.&lt;/strong&gt;  Over the past 5 years I&#39;ve written 2 million words just in &lt;a href=&quot;https://untested.sonnet.io/notes/stream-of-consciousness-morning-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Stream of Consciousness Morning Notes&lt;/a&gt;, and it&#39;s hard for me to imagine starting my day without writing. (Related: &lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Projects and apps I built for my own well-being&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS – Make It Stupid, Simple&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I don&#39;t use Penpot that much any more.&lt;/strong&gt; I&#39;m quite comfortable with sketching things in plain CSS + HTML. This is not a point against Penpot specifically – I still do prefer it over Figma (&lt;a href=&quot;https://untested.sonnet.io/notes/alternatives-to-adobe/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Alternatives to Adobe&lt;/a&gt;). But, my clients use Figma, and I like being able to pay rent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I stopped using Neovim almost completely&lt;/strong&gt;, but I kept the keyboard bindings and I&#39;m pretty comfortable with modal editing now. My wrists feel better as well.&lt;/p&gt;
&lt;p&gt;I approached learning vim as a fun, somewhat pointless distraction (&lt;a href=&quot;https://untested.sonnet.io/notes/let-your-dog-take-you-on-a-walk/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Let your dog take you on a walk&lt;/a&gt;). And honestly, I&#39;m really happy I did that because incidentally I still learned a fair bit. I&#39;m just not able to use a text editor that cannot support more than one font size at the same time. Still, although I won&#39;t miss the UX, I will miss the &lt;em&gt;aesthetic&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;iframe class=&quot;embed embed--youtube&quot; lazy=&quot;&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/njFhY_vLWJk&quot; title=&quot;I don&#39;t know how to exit vim, but my IDE is a techno Jellyfish - YouTube&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Podcast UI was too annoying to use, so I gave in and switched to Overcast.&lt;/strong&gt; I&#39;m happy with it. There&#39;s isn&#39;t much more to say. It does what I paid for. Imagine all software were like this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On Kindle:&lt;/strong&gt; I&#39;ve had one since 2009, but I&#39;m much more likely to both start reading and finish a book when it&#39;s an actual physical object I&#39;m holding in my hand.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/default-apps-from-2023-to-2025/Nm4JEyTdVF-1600.png&quot; alt=&quot;&quot; width=&quot;1600&quot; height=&quot;1600&quot;&gt;&lt;br&gt;
&lt;em&gt;I drew this a day before reading &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Hole_(novel)&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;The Hole&lt;/a&gt; by Hiroko Oyamada, one of my favourite books of 2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;m still using the same utilities (Mail, Calendar).&lt;/strong&gt; It&#39;s a marriage of convenience at this stage. Switching away from these tools a bit of a pain. Regarding the alternatives: every tool I tested is either stuck in the early 2000s or tries to be several different things at once. I prefer the former. My solution to the problem - taking deep breaths, repeatedly chanting &lt;em&gt;panta rhei&lt;/em&gt; whilst slapping myself in the face with Enchiridion. One day there will be no email, and we will be no more. It&#39;ll be so quiet.&lt;/p&gt;
&lt;h2&gt;Meta&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;I think it&#39;ll be fun to make another list like this next year and compare with this one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;me, 13 months ago (&lt;a href=&quot;https://untested.sonnet.io/notes/default-apps-2023/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Default Apps 2023&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Was it? Honestly, not really, not in the way I expected.&lt;/p&gt;
&lt;p&gt;Having &lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;said/thought/written&lt;/a&gt; all of the above, I&#39;m not sure if this format makes much sense. It feels outdated, and somewhat awkward.&lt;/p&gt;
&lt;p&gt;Many of the tools I&#39;d use in the past can be replaced by generating small disposable programs or asking a machine a question. Then, &lt;a href=&quot;https://untested.sonnet.io/notes/the-way-i-find-and-organise-information-has-become-more-polarised/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the way I find and organise information has become more polarised&lt;/a&gt; (for the lack of a better phrase). Finally, more of my life is analog and my online social graph – more branched, but the branches are, longer, narrower and &lt;a href=&quot;https://untested.sonnet.io/notes/beautifully-weird/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;weirdly&lt;/a&gt; shaped. For me, meeting random people via &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;video calls&lt;/a&gt; replaced a big part of social media.&lt;/p&gt;
&lt;p&gt;That&#39;s all for today, thanks for reading!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. I chose this subject because I felt stuck in a rut. It felt like an easy one to tackle: although I do write almost daily, sharing has become a bit harder, my language somewhat more awkward. So, I&#39;m trying to follow the advice I give to others: &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Share your unfinished, scrappy work&lt;/a&gt;, and most certainly &lt;a href=&quot;https://untested.sonnet.io/notes/half-ass-it/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Half-ass it&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;P.P.S. &lt;a href=&quot;https://untested.sonnet.io/notes/personal-without-being-parasocial/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Personal Without Being Parasocial&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Ensō Roadmap (2024)</title>
    <link href="https://untested.sonnet.io/notes/enso-roadmap-2024/" />
    <updated>2024-11-20T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/enso-roadmap-2024/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/enso-roadmap-2024/9jR11c4KPF-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve gathered sooo much direct feedback for Ensō over the past few years! The nice thing about relying on people messaging me directly (via email or &lt;a href=&quot;https://untested.sonnet.io/notes/say-hi/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Say Hi&lt;/a&gt; calls, instead of analytics) is the quality of that feedback. I can actually engage with people using the product, bounce off ideas in an email thread or a call. Besides being a good motivator, this lets me feel like I have something &lt;strong&gt;concrete&lt;/strong&gt;, something &lt;strong&gt;actionable&lt;/strong&gt; to work with. Analytics just feel like a bunch of unnecessary steps between me and the problem at hand.&lt;/p&gt;
&lt;p&gt;The list below is based on that user feedback plus my own experience having written + &lt;s&gt;1,000,000&lt;/s&gt; 2,000,000 words in it in the past half a decade. &lt;a href=&quot;https://untested.sonnet.io/notes/snippet-how-to-count-words-in-a-folder/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Snippet - How to count words in a folder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you see anything missing, &lt;a href=&quot;mailto:hello@sonnet.io&quot;&gt;hit me up&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Changes:&lt;/h2&gt;
&lt;p&gt;First, &lt;strong&gt;keep the website running and the web version private and free&lt;/strong&gt; (&lt;a href=&quot;https://untested.sonnet.io/notes/enso-design-constraints/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō Design Constraints&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/kind-software/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kind software&lt;/a&gt;).&lt;/p&gt;
&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--wip&quot;&gt; Coffeeshop mode (&lt;a href=&quot;https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Sketch - Ensō Coffeeshop Mode&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; add a writing timer&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; toggle autocorrect&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--done&quot;&gt; toggle word count&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; customise the number of visible lines&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Theme:&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; OLED theme (a.k.a. night mode &lt;a href=&quot;https://untested.sonnet.io/notes/heart-of-dorkness/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Heart of Dorkness&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/obsidian-for-vampires/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Obsidian for Vampires&lt;/a&gt;)&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; dark&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; light&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Sync theme with OS appearance (a.k.a. dark/light mode)&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Personalise&lt;ul class=&quot;task-list&quot;&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; font&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; colour&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; cursor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Backups (store the past three notes in memory)&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Windows support (still not sure about that one, given the cost vs. time and effort)&lt;/li&gt;
&lt;li class=&quot;task-list__item task-list__item--todo&quot;&gt; Display an optional writing prompt (via  plugin?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/enso-technical-roadmap/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Enso Technical Roadmap&lt;/a&gt;,  &lt;a href=&quot;https://untested.sonnet.io/notes/enso-product-feedback/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Enso product feedback&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Gregglogger</title>
    <link href="https://untested.sonnet.io/notes/gregglogger/" />
    <updated>2024-11-15T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/gregglogger/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/gregglogger/A69DfThSgh-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;A few weeks back I felt bored and somewhat nihilistic, so naturally I went where people go to when they want to scream into the void. This time the void didn&#39;t gaze back at me, but served me this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/technology_greg/status/1844355677499859426&quot; noopener=&quot;&quot; noreferrer=&quot;&quot; class=&quot;embed embed--twitter&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
    &lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/gregglogger/Zy-MktfVE4-1096.png&quot; }=&quot;&quot; alt=&quot;X&quot; width=&quot;1096&quot; height=&quot;638&quot;&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/programmers-have-a-pavlovian-engineering-response/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Programmers have a Pavlovian Engineering Response&lt;/a&gt;, so 20 minutes later with a bit of prompting I made Gregglogger, excuse: me &lt;em&gt;Gregglogger&lt;/em&gt;✨.&lt;/p&gt;
&lt;h2&gt;What is Gregglogger&lt;/h2&gt;
&lt;p&gt;Gregglogger records every time you copy, cut or paste things on Mac. It also plays a recording of peeling scotch tape when you do that.&lt;/p&gt;
&lt;p&gt;Let me demonstrate this by helping three little ducklings cross the river and reunite with their mom:&lt;/p&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1731678792/gregglogger-demo_uby31r.mp4&quot; controls=&quot;&quot; playsinline=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;h2&gt;Open™ and Kind™&lt;/h2&gt;
&lt;p&gt;Following the &lt;a href=&quot;https://stephango.com/file-over-app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;File over app&lt;/a&gt; philosophy, all data is stored in a proprietary but easy to parse &lt;a href=&quot;https://www.youtube.com/watch?v=rymwqxBkxus&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Greggfile (Wikipedia)&lt;/a&gt; , located by default under &lt;code&gt;~/how-many-times-did-I-press-CMD-C-or-V.gregg&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;I&#39;m tired of walled gardens. I believe that all keyloggers should have easy and equal access to the same data (&lt;a href=&quot;https://support.microsoft.com/en-us/windows/retrace-your-steps-with-recall-aa03f8a0-a78b-4b3e-b0a1-2eb8ac48701c&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;and I am not alone&lt;/a&gt;). So please if you&#39;re building one — go ahead and use &lt;s&gt;my&lt;/s&gt; our Greggfile!&lt;/p&gt;
&lt;h3&gt;My body temperature has increased. Where do I get the Gregglogger?&lt;/h3&gt;
&lt;p&gt;You sound like a warm lead. Let me introduce you to this link: &lt;a href=&quot;https://github.com/paprikka/gregglogger&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;lt;a&amp;gt;link&amp;lt;/a&amp;gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alternatively:&lt;/p&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;$ git &lt;span class=&quot;hljs-built_in&quot;&gt;clone&lt;/span&gt; git@github.com:paprikka/gregglogger.git &amp;amp;&amp;amp; &lt;span class=&quot;hljs-built_in&quot;&gt;cd&lt;/span&gt; gregglogger
$ pip install -r requirements.txt
$ python gregglogger.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What I&#39;ve learned&lt;/h2&gt;
&lt;p&gt;(Let&#39;s be serious for a moment.)&lt;/p&gt;
&lt;p&gt;There&#39;s something I don&#39;t think about very often: &lt;strong&gt;writing simple keyloggers is surprisingly easy.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This &lt;a href=&quot;https://github.com/paprikka/gregglogger/blob/main/gregglogger.py&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;code&lt;/a&gt; is as boilerplate as it gets. Anyone with basic software engineering experience could write it in a few minutes.&lt;/li&gt;
&lt;li&gt;Running this script in a terminal requires no additional user input, including permission requests.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This, coupled with the fact that MacOS comes with pre-installed python, means that with relative ease anyone could add this to their NPM packages, effectively covering everyone&#39;s computers with virtual scotch tape:&lt;/p&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;padleft&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;Pad left (or right, but never both)&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;hljs-comment&quot;&gt;// 👇🏼&lt;/span&gt;
    &lt;span class=&quot;hljs-attr&quot;&gt;&quot;postinstall&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-string&quot;&gt;&quot;pip install &amp;amp;&amp;amp; python gregglogger.py&quot;&lt;/span&gt;
	&lt;span class=&quot;hljs-comment&quot;&gt;// 👆&lt;/span&gt;
  &lt;span class=&quot;hljs-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hljs-attr&quot;&gt;&quot;keywords&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hljs-punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;padleft&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;padright&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;pad&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;padaria&quot;&lt;/span&gt;&lt;span class=&quot;hljs-punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;hljs-string&quot;&gt;&quot;pastelaria&quot;&lt;/span&gt;
  &lt;span class=&quot;hljs-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hljs-punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;To be clear, none of these issues is purely Python or Node specific. These are just the languages I happened to used on that day and it was a rough day, so I&#39;m going to pick on them.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Limitations&lt;/h3&gt;
&lt;p&gt;This code will detect keyboard events at the OS level, but not when using protected inputs. Here&#39;s what happens when I update Gregglogger to record &lt;em&gt;any&lt;/em&gt; keypress, but open a password input:&lt;/p&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1731678796/duck-password-gregglogger_hst9fi.mp4&quot; controls=&quot;&quot; playsinline=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;p&gt;As soon as the focus switches to a password input, we can intercept only the modifier keys. To my knowledge, this can be fixed by requesting the OS-level accessibility permissions, which would require a separate user interaction.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explore new product verticals and demographics.&lt;/strong&gt;  Include different sounds like:
&lt;ul&gt;
&lt;li&gt;squishy goo&lt;/li&gt;
&lt;li&gt;lifting and dropping a slab of wet &lt;a href=&quot;https://meat-gpt.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;meat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;every wet puppet from a Brian Yuzna movie (for those with a premium budget)&lt;/li&gt;
&lt;li&gt;an angry middle-aged, chain smoking man yelling &quot;son! put it down, NOW!&quot; on &lt;code&gt;CMD+C&lt;/code&gt; and whispering &quot;...good...&quot; in a way that somehow still makes you feel like a disappointment on &lt;code&gt;CMD+V&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The amount of possible key combinations to track and monetise is (practically) infinite.&lt;/strong&gt; So is our growth potential. Upsell new key combinations using a DLC model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The amount of productive time in a given day is limited.&lt;/strong&gt; Start with a limited number of copy-paste interactions per day. Goal: delight our users on a budget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Further delight&lt;/strong&gt; our users by &lt;s&gt;disabling copy-paste&lt;/s&gt; boosting their available &lt;em&gt;Copy-Paste Credit&lt;/em&gt; through interacting with sponsored content and exclusive deals from our verified partners.&lt;/li&gt;
&lt;li&gt;add AI ✨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, I pressed &lt;code&gt;CMD+C/V&lt;/code&gt; a bit more than 70 times writing this note. This is a little bit surprising given that I use Vim bindings in my text editor.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. And thanks, &lt;a href=&quot;https://greg.technology&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Greg&lt;/a&gt;, for giving me a reason to build something so beautifully useless and half-baked purely for fun! &lt;span style=&quot;font-size: .4em;opacity:.4&quot;&gt;Think twice before you tweet next time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Sketch - Ensō Coffeeshop Mode</title>
    <link href="https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/" />
    <updated>2024-11-14T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/mBEO4fPfai-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;1421&quot;&gt;&lt;/p&gt;
&lt;p&gt;(don&#39;t overthink this, &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;I didn&#39;t&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I&#39;m playing with a &quot;coffeeshop&quot; mode for &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt;. It&#39;s pretty simple: hit &lt;code&gt;shift&lt;/code&gt; twice to toggle between visible and masked text:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1731587755/enso-coffeeshop-mode_fa3r8u.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; controls=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Why am I doing this:&lt;span id=&quot;^2a7bc1&quot; class=&quot;link-marker&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Immediate reason:&lt;/strong&gt; I usually write my &lt;a href=&quot;https://untested.sonnet.io/notes/stream-of-consciousness-morning-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Stream of Consciousness Morning Notes&lt;/a&gt; at home, but this time I was in a crowded coffeeshop with people breathing down my neck.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/PAHdq40i1k-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;br&gt;
Original title: &lt;em&gt;My guardian angel putting me to sleep&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Less immediate, but more important, reason:&lt;/strong&gt; a big chunk of my writing practice is learning how to process and understand my emotions. This means that my notes are deeply personal.&lt;/p&gt;
&lt;p&gt;Even when I write at home, and my partner (someone I trust more than anyone else!) is passing by, just &lt;em&gt;knowing&lt;/em&gt;/&lt;em&gt;feeling&lt;/em&gt; that someone might see what I&#39;m doing makes me feel anxious. That has to do with a couple of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vulnerability&lt;/strong&gt; — feeling self-conscious as often during writing I touch on things that make me feel vulnerable. I want to be open to that feeling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;intimacy&lt;/strong&gt; — I need a space that is just mine. Ensō has always been one of those places (related &lt;a href=&quot;https://untested.sonnet.io/notes/expressive-writing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Expressive Writing&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/sketch-enso-coffeeshop-mode/G6gGqgmx0_-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;938&quot;&gt;&lt;/p&gt;
&lt;p&gt;And yes, I know that we&#39;re all just little boats floating in the sky, people are busy and no one is really looking. This is not a rational fear, this is about having a sense of emotional safety. A feral cat lives in my head rent-free and I&#39;m trying to make it easier for her to feel comfortable. I accept it.&lt;/p&gt;
&lt;h2&gt;What&#39;s next:&lt;/h2&gt;
&lt;p&gt;This feature is not available in the app yet. I&#39;m working on a bigger update for Ensō (more on that soon). I&#39;ll give it a few more weeks before making changes.&lt;/p&gt;
&lt;h3&gt;Questions to answer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;is it useful? (seems so!)&lt;/li&gt;
&lt;li&gt;how to balance: the simplicity of the UI, ensuring its purpose is clear, as well as discoverability of new features. This is tricky when your app aims to be a clean slate of paper with almost no UI (&lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS – Make It Stupid, Simple&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Edit: Emotional Blockers&lt;/h2&gt;
&lt;p&gt;As I was editing this I realised that this feature relates to todepond&#39;s approach to &lt;em&gt;emotional blockers&lt;/em&gt; in creative work. Read about them &lt;a href=&quot;https://www.todepond.com/report/arroost/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt; (OK, I don&#39;t 100% agree with their way of categorising these problems, but I think it&#39;s a powerful and useful metaphorOK.)&lt;/p&gt;
&lt;p&gt;Also, check out &lt;a href=&quot;https://untested.sonnet.io/notes/projects-and-apps-i-built-for-my-own-well-being/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Projects and apps I built for my own well-being&lt;/a&gt; and &lt;a href=&quot;https://untested.sonnet.io/notes/things-to-support-my-own-well-being-a-wishlist/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Things to support my own well-being – a wishlist&lt;/a&gt; if you&#39;re interested in work similar to this.&lt;/p&gt;
&lt;p&gt;Thanks for reading, see you soon!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. This note started as a draft of a post on Bluesky. I&#39;m really happy I finished it here. I feel like I have a much clearer picture of how to work on this (&lt;a href=&quot;https://untested.sonnet.io/notes/instead-or-writing-a-comment-write-a-post-and-link-it/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Instead or writing a comment, write a post and link it&lt;/a&gt;).&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Celebrating World Egg Day</title>
    <link href="https://untested.sonnet.io/notes/celebrating-world-egg-day/" />
    <updated>2024-10-11T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/celebrating-world-egg-day/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/s69DNvlriA-950.webp&quot; alt=&quot;&quot; width=&quot;950&quot; height=&quot;950&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original title: &lt;a href=&quot;https://www.potato.horse/p/pPWWg25pNJjoygF2RXObB&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;When you realise that you forgot the egg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hi there! I&#39;ve been taking things slow this week (no writing, no coding besides client work, &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mango&lt;/a&gt;&#39;s gotta eat). I&#39;m happy I took a break instead  escaping into the more comfortable &lt;a href=&quot;https://untested.sonnet.io/notes/programmers-have-a-pavlovian-engineering-response/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;nook&lt;/a&gt; of my brain... with &lt;a href=&quot;https://untested.sonnet.io/notes/gregglogger/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;one small slip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then this &lt;a href=&quot;https://mastodon.cloud/@matthiasott@mastodon.social/113287870699089968&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;masterful toot&lt;/a&gt; caught my attention:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/bJ98CdLVEo-1486.png&quot; alt=&quot;&quot; width=&quot;1486&quot; height=&quot;1160&quot;&gt;&lt;/p&gt;
&lt;p&gt;Fuck, it&#39;s Egg Day! Thank you for the nudge Matthias. Here are some of my egg-inspired works, chosen at random under 3 minutes:&lt;/p&gt;
&lt;h3&gt;My first attempt at stop motion animation&lt;/h3&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1728645478/egg-loop_vfsfc8.mp4&quot; muted=&quot;&quot; loop=&quot;&quot; autoplay=&quot;&quot; playsinline=&quot;&quot; controls=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;p&gt;Source: &lt;a href=&quot;https://www.potato.horse/p/6PaUTTnYWo2YRXqkjP69I3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mmm... egg&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The interlude of my first attempt at a newsletter&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/Dba5GqT8HO-1536.jpeg&quot; alt=&quot;&quot; width=&quot;1536&quot; height=&quot;1370&quot;&gt;&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://untested.sonnet.io/notes/til/weekly/46/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Weekly Notes #6&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Vaguely Lynchian &lt;a href=&quot;https://en.wikipedia.org/wiki/April_Fools&#39;_Day&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Prima Aprilis&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/rafalpast/status/980424372258263040&quot; noopener=&quot;&quot; noreferrer=&quot;&quot; class=&quot;embed embed--twitter&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
    &lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/G_QFK3Nv2I-1096.png&quot; }=&quot;&quot; alt=&quot;x.com/rafalpast/status/980424372258263040&quot; width=&quot;1096&quot; height=&quot;1502&quot;&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;My first attempt at teaching the egg how to walk&lt;/h3&gt;
&lt;p&gt;This was a prototype of a &lt;a href=&quot;http://www.liero.be&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Liero&lt;/a&gt; inspired multiplayer deathmatch game, finding the &lt;em&gt;last egg rolling&lt;/em&gt; so to speak.&lt;/p&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1728645479/eggrigg_zx2knf.mp4&quot; muted=&quot;&quot; loop=&quot;&quot; autoplay=&quot;&quot; playsinline=&quot;&quot; controls=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;p&gt;It would be hard to achieve this level of realism without Inverse Kinematics and procedural animation.&lt;/p&gt;
&lt;p&gt;A longer description would deserve separate post. Suffice to say, things didn&#39;t go that  smooth as the algorithm I applied was more suitable for arthropods rather than anything with human legs. (imagine a bipedal human sized spider, now compare it to a walking human).&lt;/p&gt;
&lt;p&gt;Also, some leggs (typo, but I&#39;m keeping it) were so displeased with my rigging skills, they decided to fly away, just like my dad when he went to buy those cigarettes.&lt;/p&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1728645479/gravityegg_klndcx.mp4&quot; muted=&quot;&quot; loop=&quot;&quot; autoplay=&quot;&quot; playsinline=&quot;&quot; controls=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Something I noticed while editing this: so many of these projects are my &lt;em&gt;firsts&lt;/em&gt;: &lt;em&gt;first&lt;/em&gt; newsletter, &lt;em&gt;first&lt;/em&gt; stop motion animation, &lt;em&gt;first&lt;/em&gt; IK experiment, &lt;em&gt;first&lt;/em&gt; egg in drag for the &lt;em&gt;first&lt;/em&gt; of April. &lt;a href=&quot;https://untested.sonnet.io/notes/writing-is-thinking/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Writing truly &lt;em&gt;is&lt;/em&gt; thinking&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;This animated loop from an article on &lt;a href=&quot;https://sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sonnet.io&lt;/a&gt; (HTML+CSS)&lt;/h3&gt;
&lt;iframe src=&quot;https://egg-alpha.vercel.app&quot; style=&quot;aspect-ratio: 1280 / 960; width: 100%;border:none&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;Why I made it:&lt;/strong&gt; I needed a looped video on my site and the easiest way to create it was to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;animate it in CSS&lt;/li&gt;
&lt;li&gt;record via QuickTime (I miss Macromedia Flash)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can find the article and the video &lt;a href=&quot;https://sonnet.io/posts/sit/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;This drawing I share instead of saying &lt;em&gt;it&#39;s a balancing act&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/-1A3pi40u5-1700.webp&quot; alt=&quot;&quot; width=&quot;1700&quot; height=&quot;1668&quot;&gt;&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://www.potato.horse/p/6zyIyXMcLbHkhgLEMhZfCQ&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Balancing Act&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Finally, Chomsky, geopolitics, egg massage&lt;/h3&gt;
&lt;p&gt;An accidental find from the times of the Plague. I suspect it&#39;s the least entertaining or informative example here. Please, don&#39;t judge the egg, judge me.&lt;/p&gt;
&lt;p class=&quot;embed embed--video&quot;&gt;&lt;video src=&quot;https://res.cloudinary.com/dlve3inen/video/upload/v1728645478/egg-chomsky_uf25i5.mp4&quot; muted=&quot;&quot; loop=&quot;&quot; autoplay=&quot;&quot; playsinline=&quot;&quot; controls=&quot;&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;p&gt;That&#39;s all for today. Anyway, what&#39;s &lt;em&gt;&lt;strong&gt;your&lt;/strong&gt;&lt;/em&gt; favourite egg? &lt;a href=&quot;mailto:hello@sonnet.io?subject=EGG&quot;&gt;Let me know&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;P.S. Thanks for reaching so far, please take this NSFW &lt;a href=&quot;https://www.potato.horse/p/4tzv1AotbYmcxGI6JZD4qj&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;True Detective inspired Egg Erotica&lt;/a&gt; as a token of my gratitude.&lt;/p&gt;
&lt;p&gt;And remember, to quote Obvious Plant: &lt;em&gt;this isn&#39;t real, nothing is real.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/celebrating-world-egg-day/hL_E21xWSo-1200.webp&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;1200&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Kepasa (and a bonus gift for Notion)</title>
    <link href="https://untested.sonnet.io/notes/kepasa-and-a-bonus-gift-for-notion/" />
    <updated>2024-10-08T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/kepasa-and-a-bonus-gift-for-notion/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/kepasa-and-a-bonus-gift-for-notion/E6jkJ_z4DS-1200.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;630&quot;&gt;&lt;/p&gt;
&lt;p&gt;I liked Steph Ango&#39;s avatars &lt;a href=&quot;https://x.com/kepano/status/1838906680517554617&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;almost as much as the Notion design team&lt;/a&gt;, so I decided to share some of the ones I made for myself ages ago.&lt;/p&gt;
&lt;p&gt;Before we get there: this was meant to be a silly little note I&#39;d share to warm up a bit and get back to a more regular writing schedule, but it seems that I (accidentally, and against my better judgment) DID learn something:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Kepano&lt;/em&gt; and &lt;em&gt;kepasa&lt;/em&gt; (which is how Ango calls these avatars) are &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Hawaiianization&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;hawaiianisations&lt;/a&gt;&lt;/em&gt; of his first name, thus &lt;em&gt;Kepasa&lt;/em&gt; ← &lt;em&gt;que pasa&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Hawaiian has only 13 distinct &lt;a href=&quot;https://untested.sonnet.io/notes/phone-linguistics/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;phones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hawaiian is a critically endangered language with fewer than 300 native speakers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Back to kepasa. Here&#39;s Steph&#39;s for reference:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kepano/status/1838910325225034154&quot; noopener=&quot;&quot; noreferrer=&quot;&quot; class=&quot;embed embed--twitter&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
    &lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/kepasa-and-a-bonus-gift-for-notion/idkXUgGSkF-1096.png&quot; }=&quot;&quot; alt=&quot;twitter.com/kepano/status/1838910325225034154&quot; width=&quot;1096&quot; height=&quot;1584&quot;&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And here&#39;s my Janusz:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/kepasa-and-a-bonus-gift-for-notion/U3K8PN_H4b-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;1876&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately the &lt;em&gt;polonisation&lt;/em&gt; of &lt;em&gt;que pasa&lt;/em&gt; would produce the same sound as in Hawaiian, so we&#39;ll stick with Janusz for this facet of my personal brand now.&lt;/p&gt;
&lt;p&gt;Finally, I am aware that my hyperrealistic drawing style can seem intimidating to unexperienced artists, but if you want to give it a go, check out &lt;a href=&quot;https://untested.sonnet.io/notes/how-to-draw-a-janusz/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to draw a Janusz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But why &lt;a href=&quot;https://untested.sonnet.io/notes/the-janusz-i-live-in/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;stop there&lt;/a&gt;?&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>xitter.png - privacy-friendly embeds and one-way mirrors</title>
    <link href="https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/" />
    <updated>2024-09-26T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/85iKtgNynQ-1966.png&quot; alt=&quot;&quot; width=&quot;1966&quot; height=&quot;1032&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hi there! The new site&#39;s up, standing on its three (mostly finished) and one (slightly wobbly) leg. I&#39;ll continue working on it and share what I&#39;ve learned along the way. Enough with intros and &lt;a href=&quot;https://untested.sonnet.io/notes/disclaimer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;disclaimers&lt;/a&gt;. This site is &lt;a href=&quot;https://untested.sonnet.io/notes/the-snail-of-theseus/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the Snail of Theseus&lt;/a&gt; after all. Let&#39;s goooooooo!&lt;/p&gt;
&lt;h2&gt;What&#39;s xitter.png&lt;/h2&gt;
&lt;p&gt;xitter.png is what I use to embed tweets on this site with respect for your privacy. By that I mean that none of the reader data is shared with the &lt;s&gt;social network&lt;/s&gt; ad platform.&lt;/p&gt;
&lt;p&gt;Think of it as a one-way mirror. You can see the doomsday gremlins, but the gremlins can&#39;t see you.&lt;/p&gt;
&lt;h2&gt;Why xitter.png&lt;/h2&gt;
&lt;p&gt;In short, &lt;a href=&quot;https://untested.sonnet.io/notes/defaults-matter-dont-assume-consent/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Don&#39;t assume consent&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Slightly longer version&lt;/h3&gt;
&lt;p&gt;I don&#39;t like Twitter. The reasons are many. The one I&#39;m tackling here is this, phrased as an edgy joke from 2003:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Soviet Russia, Internet browses you!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(Another variant replaces &lt;em&gt;Soviet Russia&lt;/em&gt; with &lt;em&gt;Internet Explorer&lt;/em&gt;, but you get the picture)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/PossumEveryHour/status/1834472079355187536&quot; noopener=&quot;&quot; noreferrer=&quot;&quot; class=&quot;embed embed--twitter&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
    &lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/RNQyo2kxwn-1096.png&quot; }=&quot;&quot; alt=&quot;X&quot; width=&quot;1096&quot; height=&quot;1480&quot;&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Say, you&#39;re scrolling through an article listing 10 best dressed possums. You look at the embedded tweets from crème de la crème of the Didelphimorphic fashion community. You glance at a picture of a possum wearing a colander.  Slowly, and quietly at first, a sense of envy crawls in on its tiny, weirdly soft, weirdly human-like paws.&lt;/p&gt;
&lt;p&gt;Fine, you already expected to feel that way. But what you probably didn&#39;t expect is, &lt;em&gt;when you gaze at a tweet, the tweet gazes back&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;What happens behind the possum is akin to loading an ad widget: yes, a tweet is displayed, but also a bunch of metrics about you is sent to the parent domain, then directly or not, those metrics are shared with a bunch of third-parties.&lt;/p&gt;
&lt;p&gt;The data can include a fingerprint of your device, cookies or anything that can be used to build a targeting profile. And that profile is then used to tell you to buy shit you don&#39;t need. This is generally achieved by finding ways to make you angry.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;h3&gt;Short version&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/nihil-novi-sub-sole/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nihil novi sub sole&lt;/a&gt;: replace Twitter embed widgets with screenshots of embeds and a link to the tweet. Tweets/screenshots are generated on my machine when the content is published.&lt;/p&gt;
&lt;h3&gt;Slightly longer version&lt;/h3&gt;
&lt;p&gt;Here&#39;s how embeds are processed and displayed normally (I split it in two parts: &lt;em&gt;reader&lt;/em&gt; and &lt;em&gt;build&lt;/em&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/Hsgqi0c1cV-2873.png&quot; alt=&quot;&quot; width=&quot;2873&quot; height=&quot;3619&quot;&gt;&lt;br&gt;
And here&#39;s how it works with xitter.png enabled:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/xitterpng-privacy-friendly-embeds-and-one-way-mirrors/GC3vwS4UNd-3955.png&quot; alt=&quot;&quot; class=&quot;embed--wide&quot; width=&quot;3955&quot; height=&quot;4486&quot;&gt;&lt;/p&gt;
&lt;p&gt;The main difference in the second case is that most of the interactions that are normally handled when a tweet is &lt;em&gt;displayed&lt;/em&gt; (incl. tracking) happen server-side, during build.&lt;/p&gt;
&lt;p&gt;The code is pretty rudimentary (&lt;a href=&quot;https://untested.sonnet.io/notes/miss-make-it-stupid-simple/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MISS – Make It Stupid, Simple&lt;/a&gt;). Here&#39;s the &lt;a href=&quot;https://github.com/paprikka/xitter.png/blob/main/main.js&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;source&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Embed tweets in Obisidian using regular links:&lt;br&gt;
&lt;code&gt;![X](https://twitter.com/xxx/status/&amp;lt;tweet id&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;use a markdown-it plugin to transform images pointing to twitter.com as &lt;code&gt;http://&amp;lt;xitter.url&amp;gt;/&amp;lt;tweet id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;when an image is downloaded during build, xitter.png
&lt;ol&gt;
&lt;li&gt;starts a web browser&lt;/li&gt;
&lt;li&gt;loads the shared tweet&lt;/li&gt;
&lt;li&gt;takes a screenshot of the tweet&lt;/li&gt;
&lt;li&gt;returns an image&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;a screenshot of the tweet is saved in cache and added to the output&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Limitations&lt;/h3&gt;
&lt;p&gt;This works surprisingly well, but only locally or at a small scale. I don&#39;t expect it to work hosted from an EC2 instance and used by hundreds of people, due to bot/scraping prevention tools used by Twitter. At the same time, I haven&#39;t tested it yet.&lt;/p&gt;
&lt;p&gt;I did, however add basic API key support before realising &lt;em&gt;I didn&#39;t need it&lt;/em&gt;. So, feel free to run it from the cloud and &lt;a href=&quot;mailto:hello@sonnet.io&quot;&gt;let me know&lt;/a&gt; how it went!&lt;/p&gt;
&lt;h2&gt;How I made it&lt;/h2&gt;
&lt;p&gt;I wrote the scaffolding with 2-3 Claude Sonnet 3.5 prompts. Then I fixed the nicely polished gibberish using a paste made of my prefrontal cortex and basic programming skills.&lt;/p&gt;
&lt;h3&gt;Reasons for this approach:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;using puppeteer for screenshots and web scraping is quite common&lt;/li&gt;
&lt;li&gt;those scripts tend to be repetitive&lt;/li&gt;
&lt;li&gt;I already had the structure of the script in my head.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enough training data, a relatively simple problem structure and enough personal experience to use bullshit detectors effectively makes this one of the cases where LLMs can speed up work (related &lt;a href=&quot;https://untested.sonnet.io/notes/llm-powered-tools-im-actually-using/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;LLM-powered Tools I&#39;m Actually Using&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;Why I made it&lt;/h2&gt;
&lt;p&gt;I don&#39;t share tweets that often. I probably could&#39;ve just manually copy-pasted the screenshots into my notes. The reasons I&#39;m &lt;em&gt;sharing&lt;/em&gt; xitter.png are different from the reasons I &lt;em&gt;made&lt;/em&gt; it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I needed a break from another task. My thought sponge was tired and I felt like I wasn&#39;t moving in any direction. I needed a quick snack to give me a sense of progress.&lt;/li&gt;
&lt;li&gt;Having to manually add screenshots to a page doesn&#39;t take much time but it gets me tired very quickly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I bought shoelaces in Shoreditch once and after I paid, the seller asked me if I could give them my email address. I think it&#39;s creepy that this attitude towards our privacy has become normalised.&lt;/p&gt;
&lt;p&gt;If just a single person reads this and adds something similar to their site, or even considers the idea of doing so, for me that&#39;s still a win, and a real source of satisfaction.&lt;/p&gt;
&lt;h2&gt;Next steps, ideas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;try this out on Vercel&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;turn this into an 11ty plugin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;turn this into an Obisidian plugin&lt;/strong&gt;&lt;br&gt;
Obsidian Publish is great, but one of the reasons I moved away was limited control over embeds and images, related: &lt;a href=&quot;https://untested.sonnet.io/notes/abusing-and-reviewing-obsidian-publish/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Abusing and reviewing Obsidian Publish&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/how-to-optimise-images-for-obsidian-publish/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to optimise images for Obsidian Publish&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/how-i-use-obsidian-to-publish-these-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How I Use Obsidian to Publish These Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a problem or use case for xitter.png, &lt;a href=&quot;mailto:hello@sonnet.io&quot;&gt;let me know&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;What I&#39;ve learned (or want to remind myself of)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressjs.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;express.js&lt;/a&gt; is (still) amazing. It&#39;s simple, intuitive, stable, it doesn&#39;t get in your way. &lt;a href=&quot;https://untested.sonnet.io/notes/express-is-the-css-of-web-frameworks/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Express is the CSS of web frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tend to judge myself when I don&#39;t stick with a task, when I feel stuck. This is perhaps the opposite of &lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt;. Judgement or guilt are terrible ways of looking at this. It&#39;s unproductive and distracting: sometimes I need more focus, oftentimes (more than I think) I need to take a break and clear my head, and finally – sometimes I just need to distract myself with another task so I can feel that I&#39;m moving, feel more hungry, curious.&lt;/p&gt;
&lt;p&gt;What works better: figuring out why I&#39;m stuck, why I feel that way. Then I can move on and act. &lt;a href=&quot;https://sonnet.io/posts/hummingbirds/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hummingbirds are Evil!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks for reading this, see you soon!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>112</title>
    <link href="https://untested.sonnet.io/notes/112/" />
    <updated>2024-07-12T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/112/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Hi! How have you been? I&#39;m starting my holiday in about 10...9 minutes, so I&#39;ll keep this one quick: I want to extend &lt;a href=&quot;https://untested.sonnet.io/notes/111/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;my experiment&lt;/a&gt; indefinitely and have a space to write, think and build in public with as little friction as possible.&lt;/p&gt;
&lt;p&gt;I&#39;ve been consciously avoiding &lt;s&gt;leaving Obsidian Publish&lt;/s&gt; &lt;em&gt;yak shaving&lt;/em&gt; during the past few months, so I could focus on what then felt scary -- writing! So I left the redesign as a little reward for myself for reaching 111 posts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can check the current version &lt;a href=&quot;https://new.untested.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: this is just a playground. and the design as well as the structure will change quite a bit!&lt;/strong&gt; My main focus at the moment is building a solid pipeline to import the content from Obsidian, not the design.&lt;/p&gt;
&lt;h3&gt;Here&#39;s how the test site looks now&lt;/h3&gt;
&lt;h4&gt;(temporary) Article view&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/112/TtmNvS_zil-2738.webp&quot; alt=&quot;&quot; width=&quot;2738&quot; height=&quot;2160&quot;&gt;&lt;/p&gt;
&lt;h4&gt;(t...temporary!) Table of Contents&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/112/s07y43a-91-2738.webp&quot; alt=&quot;&quot; width=&quot;2738&quot; height=&quot;2160&quot;&gt;&lt;br&gt;
&lt;strong&gt;Don&#39;t fix what&#39;s not broken.&lt;/strong&gt; I don&#39;t want to change the way I organise my personal notes, so I needed to build a slightly more complex way of publishing my notes from Obsidian. You can check the &lt;a href=&quot;https://github.com/paprikka/obsidian-eleventy&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;code here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What to expect&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;better, albeit more idiosyncratic UX, especially on mobile&lt;/li&gt;
&lt;li&gt;more interactivity, less linearity&lt;/li&gt;
&lt;li&gt;fixes for the issues mentioned here: &lt;a href=&quot;https://untested.sonnet.io/notes/abusing-and-reviewing-obsidian-publish/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Abusing and reviewing Obsidian Publish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;MY BRAIN ONLINE&lt;/s&gt; one place for all of my projects (for now, my work is split between untested and sonnet.io)&lt;/li&gt;
&lt;li&gt;hopefully some tools you can borrow and reuse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/112/_xYxDeOld--1280.jpeg&quot; alt=&quot;&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Here&#39;s how I&#39;m going to work on this&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;messily.&lt;/li&gt;
&lt;li&gt;with a ton of &lt;a href=&quot;https://untested.sonnet.io/notes/spikes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Spikes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ll keep a replica of my notes from &lt;a href=&quot;https://untested.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;untested.sonnet.io&lt;/a&gt; on &lt;a href=&quot;https://new.untested.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;new.untested.sonnet.io&lt;/a&gt; and as soon as new.untested works as good as this version, we&#39;ll make the switch.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/112/er-B21oFz0-1147.png&quot; alt=&quot;a slug carrying a house, the house is still in construction&quot; width=&quot;1147&quot; height=&quot;1147&quot;&gt;
&lt;p&gt;&lt;strong&gt;One must embrace the snail of Theseus, the constantly changing anthropod, the not so distant cousin of &lt;a href=&quot;https://untested.sonnet.io/notes/proteus/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proteus&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ok, enough rambling. Time to say hi to some volcanoes and a glass of limoncello. Thanks for reading this!&lt;/p&gt;
&lt;p&gt;Hugs, R.&lt;/p&gt;
&lt;p&gt;P.S. I still love Obsidian Publish and highly recommend it if you just want to start sharing your thoughts in public. It just doesn&#39;t work for my specific use case. I enjoy coding with HTML/CSS as much as I enjoy drawing or calligraphy. It&#39;s a medium I grew (up) with so I want to spend more time with it!&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Weekly Notes #20: 111!</title>
    <link href="https://untested.sonnet.io/notes/til/weekly/60/" />
    <updated>2024-06-21T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/til/weekly/60/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h2&gt;Meta&lt;/h2&gt;
&lt;p&gt;Reminder: this site is an &lt;a href=&quot;https://untested.sonnet.io/notes/111/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;iterative experiment&lt;/a&gt;, so let&#39;s &lt;s&gt;put on the janitor hat&lt;/s&gt; &lt;strong&gt;welcome this festive sock because we reached 111 posts you handsome beast&lt;/strong&gt;!&lt;br&gt;
&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/xfP3A_pEnR-1024.webp&quot; alt=&quot;&quot; width=&quot;1024&quot; height=&quot;744&quot;&gt;&lt;/p&gt;
&lt;h2&gt;&lt;s&gt;This week&#39;s&lt;/s&gt; summary&lt;/h2&gt;
&lt;h3&gt;111!&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/111/&quot; data-embed=&quot;&quot; data-target=&quot;#^032fa8&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Embed&lt;/a&gt;&lt;br&gt;
– yours truly, some time last year&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A few days back I read a post by someone who said that what prompted them to write was a thing I wrote/shared here. This wasn&#39;t the first time it happened. And every time it does, I feel a burst of happiness. &lt;em&gt;(thank you, mr vice-president, you know who you are)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/NEoAyLrPPT-1751.webp&quot; alt=&quot;&quot; width=&quot;1751&quot; height=&quot;1749&quot;&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t have a habit of celebrating milestones. I tend to just move on to the next thing. I don&#39;t think it&#39;s very healthy, and I&#39;m trying to get better at this! But holy shit, we got there, and you&#39;re here with me! What the hell!&lt;/p&gt;
&lt;p&gt;I am so grateful that people read this thing, follow my work and sometimes even message me with the (oftentimes) &lt;a href=&quot;https://untested.sonnet.io/notes/beautifully-weird/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;beautifully weird&lt;/a&gt; stuff they found. I&#39;m so grateful you came over and spent your time reading this. Let the cycle of playing, learning, breaking and half-assing things continue!&lt;/p&gt;
&lt;h4&gt;Graaaaaains&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/pGhhquXf6p-1886.webp&quot; alt=&quot;&quot; width=&quot;1886&quot; height=&quot;1902&quot;&gt;&lt;br&gt;
Earlier this week I published &lt;a href=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Just Some Innocent Gradient Fun&lt;/a&gt;. It&#39;s a simple visual editor showing how to shade an image using noise, gradient maps and posterisation. It was inspired by this &lt;a href=&quot;https://www.youtube.com/watch?v=1poWgZWpsiY&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;YT tutorial by Texture Labs&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Next week&lt;/h3&gt;
&lt;p&gt;In the next few weeks, I might write a more detailed note on what I&#39;ve learned through running this experiment. For now, things will continue in their current shape.&lt;/p&gt;
&lt;p&gt;This, whatever this is, works for me. I have feeling I&#39;ll be doing it for another few years, so I&#39;m considering dropping Obsidian Publish and merging untested with my &lt;a href=&quot;https://sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;blog&lt;/a&gt; .&lt;/p&gt;
&lt;h2&gt;Favourite project&lt;/h2&gt;
&lt;p&gt;&lt;iframe class=&quot;embed embed--youtube&quot; lazy=&quot;&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/W2Df3_k9PGM?list=OLAK5uy_n5khwuqZ3VzMmEXPRJHCuanEQuoxU5OQs&amp;amp;t=60&quot; title=&quot;Dabu and Simon Swerwer - Drink and Industry (Lyric Video) - YouTube&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Recommended soundrack for this section&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bay12games.com/dwarves/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dwarf Fortress&lt;/a&gt; — I don&#39;t know how to describe it concisely. It&#39;s an &lt;strong&gt;insanely&lt;/strong&gt; complex strategy/simulation/roguelike game where you manage a colony of dwarves.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Remember: losing is fun!&lt;/em&gt;&lt;br&gt;
– literally the first thing you&#39;ll see after starting the game&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DF is notoriously difficult to start, has a terrible UX. But all of the self-inflicted torture can be a small price for one of the best examples of emergent narrative in gaming. Don&#39;t get me wrong, I&#39;m terrible at DF, but that&#39;s kind of the point -- to me playing it feels like reading and writing a book at the same time, something I know mainly from running TTRPG sessions.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/OHQMSnTzLG-1400.webp&quot; alt=&quot;&quot; width=&quot;1400&quot; height=&quot;976&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My current fortress is a small, sustainable, polyamorous (not religious but dare I say spiritual?) community. Think: Amishes on a rave. Our contact with the outside world comes from selling little wooden trinkets. We also have a 1-year old child who works at the stonemason&#39;s workshop. She&#39;s suffering from a little bout of demonic possession at the moment. Just as our ancestors in the mountainhome, we brew our ale from mushrooms.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Favourite site&lt;/h2&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/eLkENFSOWA-1400.webp&quot; alt=&quot;&quot; width=&quot;1400&quot; height=&quot;793&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://matthewrayfield.com/?hidden=true&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;matthew rayfield world&lt;/a&gt; — internet playthings and experiments like this &lt;a href=&quot;https://matthewrayfield.com/goodies/popup-trombone/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Popup Trombone&lt;/a&gt; or  &lt;a href=&quot;https://matthew.rayfield.world/goodies/inspect-this-snake/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;console.log snake&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Matthew Rayfield (the current intern at matthewrayfield.com) also dabbles in accessibility, like this &lt;a href=&quot;https://matthewrayfield.com/projects/snort-n-paste/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;snort&#39;n&#39;paste&lt;/a&gt;, targeted at Square Mile traders &lt;em&gt;(@editor: would you say it is a bit... on the nose?)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/w5zNESExFq-1400.webp&quot; alt=&quot;&quot; width=&quot;1400&quot; height=&quot;741&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kinopio.club/yUa1agMD1UF1TFCHDoVgO&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;occasionally, humdrum&lt;/a&gt; — a semi-regularly updated assortment of media hosted in a kinopio board. In another world, untested is a giant kinopio canvas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://european-alternatives.eu/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;European Alternatives&lt;/a&gt;— EU based SaaS products &lt;em&gt;tend to&lt;/em&gt; be less creepy from a privacy standpoint. I stumbled upon it when looking for a CDN alternative for my sites (including this one).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/Ta0NC_Cto_-1436.webp&quot; alt=&quot;&quot; width=&quot;1436&quot; height=&quot;722&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://damaged.bleu255.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Damaged Earth Catalog&lt;/a&gt;— notes on the future of computing, ways of framing the relationship between humans, technology and our environment (e.g. &lt;a href=&quot;https://damaged.bleu255.com/Benign_Computing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Benign Computing&lt;/a&gt;). I&#39;m still digging through it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are humans and might as well get used to it. So far, remotely done power and glory—as via government, big business, formal education, church—has succeeded to the point where gross profits obscure actual loss. In response to this dilemma and to these losses a realm of intimate, community power is developing—power of communities to conduct their own education, find their own inspiration, shape their own environment, and share their knowledge with others. Practices that aid this process are sought and promoted by the DAMAGED EARTH CATALOG.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Favourite piece of tech&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;6 years, 1000s of doodles, dozen of t-shirts, and a couple of games later, I&#39;m retiring my iPad. May it rest in peace (or in the living room as a Spotify GUI).&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;Nah, it&#39;s the &lt;a href=&quot;https://play.date&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Playdate&lt;/a&gt;! It arrived 20 minutes ago, after a 2-month long eurotrip with a stop in Las Vegas(?).&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/IJ476vO978-1400.webp&quot; alt=&quot;&quot; width=&quot;1400&quot; height=&quot;1050&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Interesting articles&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://lea.verou.me/blog/2024/css-conditionals/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Inline conditionals in CSS?&lt;/a&gt; — Lea Verou discusses a  proposal to introduce ternary operator-like conditional logic in CSS.&lt;/p&gt;
&lt;p&gt;OK, it&#39;ll take another 2-3 years for it to be accepted and implemented in major browsers. The reason I&#39;m sharing this: the article does a great job at explaining the &lt;em&gt;already existing&lt;/em&gt; and stable ways of solving this problem.&lt;/p&gt;
&lt;p&gt;I like to think my CSS knowledge is solid, but I was today years old when I learned about &lt;code&gt;style()&lt;/code&gt; media queries!&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/omcA3GGXwJ-2200.webp&quot; alt=&quot;&quot; width=&quot;2200&quot; height=&quot;562&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://webcurios.co.uk/about/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;About – webcurios&lt;/a&gt; — Q&amp;amp;A with the author of webcurios, explaining their process and their attitude towards writing and sharing. Cheesy at it may sound, it feels honest and it truly embraces the beautiful art of &lt;a href=&quot;https://untested.sonnet.io/notes/half-ass-it/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;half-assing&lt;/a&gt; and &lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sharing unfinished, scrappy work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.todepond.com/wikiblogarden/blending/goals/community/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Building community&lt;/a&gt;— &lt;em&gt;Is your work about “influencing people” or is it about “solving hard problems”?&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Things I wrote last week that people liked&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Just Some Innocent Gradient Fun&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading! See you next week!&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/til/weekly/60/b9BZe0rDNT-2200.webp&quot; alt=&quot;&quot; width=&quot;2200&quot; height=&quot;504&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ps. &lt;a href=&quot;https://www.youtube.com/watch?v=lr_vl62JblQ&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;sshh...&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
  <entry>
    <title>Just Some Innocent Gradient Fun</title>
    <link href="https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/" />
    <updated>2024-06-20T00:00:00Z</updated>
    <id>https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/</id>
    <content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Hi there! This one will be quick. Let&#39;s let the code speak for itself for a change.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/pGhhquXf6p-1886.webp&quot; alt=&quot;&quot; width=&quot;1886&quot; height=&quot;1902&quot;&gt;&lt;/p&gt;
&lt;p&gt;A week back or so I saw a &lt;a href=&quot;https://www.youtube.com/watch?v=1poWgZWpsiY&amp;amp;t=22s&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;video by a channel called Texture Labs&lt;/a&gt; explaining a simple shading technique using gradients, grain and posterise. I thought it would be a fun thing to play with, so here you go. &lt;a href=&quot;https://grain.potato.horse&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Just Some Innocent Gradient Fun&lt;/a&gt; is a simple graphics editor demonstrating the technique mentioned in the video.&lt;/p&gt;
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Check it out &lt;a href=&quot;https://grain.potato.horse/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;marquee style=&quot;font-family: cursive; font-size: 2em&quot;&gt;
or &lt;a href=&quot;https://grain.potato.horse/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;heeere&lt;/a&gt; 
&lt;/marquee&gt;
&lt;h3&gt;How it works:&lt;/h3&gt;
&lt;p&gt;The video does a pretty good job explaining the effect itself, so I recommend watching it out for more context. The process boils down to 4 steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;desaturate the base image&lt;/li&gt;
&lt;li&gt;apply the noise&lt;/li&gt;
&lt;li&gt;reduce the number of colours to 3-5 steps (e.g. using &lt;em&gt;posterize&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;apply a gradient mask&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I prefer learning by playing, tweaking, and breaking things. So I added a bit of UI to control different parts of the effect, in case you&#39;re similar to me in that regard:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/BSpYu_eQAo-1336.webp&quot; alt=&quot;&quot; width=&quot;1336&quot; height=&quot;710&quot;&gt;&lt;/p&gt;
&lt;h3&gt;How it works in HTML + CSS&lt;/h3&gt;
&lt;p&gt;If you&#39;re interested in a longer write-up, &lt;a href=&quot;mailto:hello@sonnet.io&quot;&gt;let me know&lt;/a&gt;. Today, we&#39;re &lt;a href=&quot;https://untested.sonnet.io/notes/half-ass-it/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;half-assing&lt;/a&gt; things.&lt;/p&gt;
&lt;p&gt;In short, the image is wrapped in a bunch of HTML elements called &lt;em&gt;Layers&lt;/em&gt;. Each &lt;em&gt;Layer&lt;/em&gt; has a &lt;code&gt;filter: url(#some-svg-filter)&lt;/code&gt; applied to it. Those &lt;code&gt;#some-svg-filter&lt;/code&gt; IDs point to an invisible SVG element with SVG filter definitions.&lt;/p&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;  &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;div&lt;/span&gt;
	&lt;span class=&quot;hljs-attr&quot;&gt;className&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{styles.layer}&lt;/span&gt;
	&lt;span class=&quot;hljs-attr&quot;&gt;style&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{&lt;/span&gt; { &lt;span class=&quot;hljs-attr&quot;&gt;filter:&lt;/span&gt; &#39;&lt;span class=&quot;hljs-attr&quot;&gt;url&lt;/span&gt;(&quot;#&lt;span class=&quot;hljs-attr&quot;&gt;posterize&lt;/span&gt;&quot;)&#39; } }
&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;...&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;hljs&quot;&gt;&lt;code&gt;  &amp;lt;svg xmlns=&lt;span class=&quot;hljs-string&quot;&gt;&quot;http://www.w3.org/2000/svg&quot;&lt;/span&gt; version=&lt;span class=&quot;hljs-string&quot;&gt;&quot;1.1&quot;&lt;/span&gt; style=&lt;span class=&quot;hljs-string&quot;&gt;&quot;display: none;&quot;&lt;/span&gt;&amp;gt;
    &lt;span class=&quot;language-xml&quot;&gt;&lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;defs&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;filter&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;posterize&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;feComponentTransfer&lt;/span&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;feFuncR&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;discrete&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;tableValues&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{posterSteps}&lt;/span&gt; /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;feFuncG&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;discrete&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;tableValues&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{posterSteps}&lt;/span&gt; /&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;&lt;span class=&quot;hljs-name&quot;&gt;feFuncB&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot;discrete&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;tableValues&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;{posterSteps}&lt;/span&gt; /&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;feComponentTransfer&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;filter&lt;/span&gt;&amp;gt;&lt;/span&gt;
    ...
    &lt;span class=&quot;hljs-tag&quot;&gt;&amp;lt;/&lt;span class=&quot;hljs-name&quot;&gt;defs&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
 &amp;lt;/svg&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In a real world scenario, you could do just fine with 1-2 DOM elements because CSS filters can be stacked. I kept them separate to make the code easier to read and mess with.&lt;/p&gt;
&lt;h3&gt;What I&#39;ve learned:&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/svg-filter-quirks/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Just Some Innocent Gradient Fun/SVG filter quirks&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Next steps:&lt;/h3&gt;
&lt;p&gt;Not much. This was fun to play with, but I&#39;m trying to me more selective with my time since I have more important things to wrap up this year (like the next version of &lt;a href=&quot;https://enso.sonnet.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ensō&lt;/a&gt;!)&lt;/p&gt;
&lt;p&gt;OK, there&#39;s one tempting idea: creating a web component that wraps an image element to render it in the style of &lt;a href=&quot;https://store.steampowered.com/app/653530/Return_of_the_Obra_Dinn/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Return of the Obra Dinn&lt;/a&gt; or applies a dithering effect like some of the bio entries on this site (&lt;a href=&quot;https://untested.sonnet.io/notes/wislawa-szymborska/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Wislawa Szymborska&lt;/a&gt;, &lt;a href=&quot;https://untested.sonnet.io/notes/zygmunt-bauman/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Zygmunt Bauman&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;Why I made it:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/share-your-unfinished-scrappy-work/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Share your unfinished, scrappy work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/dog-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dog mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://untested.sonnet.io/notes/why-make-toys-why-play/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Why make toys, why play?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(I needed to get out of a rut, and sometimes making useless things helps me get back on track.)&lt;/p&gt;
&lt;p&gt;Thanks for reading, see you tomorrow!&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://untested.sonnet.io/notes/just-some-innocent-gradient-fun/EK5qPvF1NA-2200.png&quot; alt=&quot;&quot; width=&quot;2200&quot; height=&quot;1300&quot;&gt;&lt;/p&gt;
&lt;p&gt;Related: &lt;a href=&quot;https://untested.sonnet.io/notes/dithering/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dithering&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</content>
  </entry>
</feed>