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

<channel>
	<title>stuff</title>
	<atom:link href="https://dgen.net/0/category/stuff/feed/" rel="self" type="application/rss+xml" />
	<link>https://dgen.net/0</link>
	<description>Designing our data infrastructure</description>
	<lastBuildDate>Mon, 27 Apr 2026 19:37:58 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://dgen.net/0/wp-content/uploads/2017/02/cropped-dgen-D-logo-2017-32x32.png</url>
	<title>stuff</title>
	<link>https://dgen.net/0</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">232530259</site>	<item>
		<title>Broadside: write once, post many, keep everything</title>
		<link>https://dgen.net/0/2026/04/26/broadside/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Sun, 26 Apr 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[business]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[stuff]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7838</guid>

					<description><![CDATA[<img width="1024" height="576" src="https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1024x576.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" fetchpriority="high" srcset="https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1024x576.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-300x169.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-768x432.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1536x864.jpg 1536w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-830x467.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-230x129.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-350x197.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-480x270.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" />A self-hosted social posting tool, ensuring you own your own content In my ongoing experiments with ai-assisted dev of tools I&#8217;d like, I&#8217;ve create Broadside [&#8230;]]]></description>
										<content:encoded><![CDATA[<img width="1024" height="576" src="https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1024x576.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1024x576.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-300x169.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-768x432.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-1536x864.jpg 1536w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-830x467.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-230x129.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-350x197.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427-480x270.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-diamond.v20260427.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" />
<h2 class="wp-block-heading">A self-hosted social posting tool, ensuring you own your own content</h2>



<p>In my ongoing experiments with ai-assisted dev of tools I&#8217;d like, I&#8217;ve create Broadside to solve a specific irritation. As we all know, “<a href="https://www.google.com/search?q=%E2%80%9CIf+you+aren%E2%80%99t+paying+for+the+product%2C+you+are+the+product.%E2%80%9D">If you aren’t paying for the product, you are the product</a>.” and as all these tools develop their own special <a href="https://en.wikipedia.org/wiki/Enshittification">enshittifications</a>, it feels like it&#8217;s time to have another go at inverting the models. </p>


<div class="wp-block-image img-left">
<figure class="alignleft size-large is-resized"><a href="https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09.png"><img decoding="async" width="1024" height="685" src="https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09-1024x685.png" alt="" class="wp-image-7862" style="aspect-ratio:1.4949112952561037;object-fit:contain;width:386px;height:auto" srcset="https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09-1024x685.png 1024w, https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09-300x201.png 300w, https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09-768x514.png 768w, https://dgen.net/0/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-19.53.09-1536x1028.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>


<p>Also, with the demise of that old-bird-site, things have become more federated and fragmented. I wanted to post across Mastodon, Bluesky, Threads and LinkedIn at the same time, and do so without &#8216;losing&#8217; what I&#8217;d written the moment I hit publish.</p>



<p>Broadside it a small web app that posts to all four simultaneously, keeps a searchable archive of everything locally, and pulls social feeds into one place, including creating useful open things, like an RSS feed.  This post is about why I made it, what it does, and the slightly eccentric vocabulary it uses.</p>



<p>You can read all my posts here: <a href="https://broadside.dgen.net/bindery/gavin">https://broadside.dgen.net/bindery/gavin</a></p>



<p>If you&#8217;d like to try it, just ping me (on any channel).</p>



<h3 class="wp-block-heading"><strong>You probably didn&#8217;t know LinkedIn is a one-way street</strong></h3>



<p>If you post to LinkedIn regularly, you&#8217;re building a professional record in a place <strong>you cannot back up</strong>. They do not let you download your own posts in bulk &#8211; the &#8220;account data export&#8221; doesn&#8217;t include posts. You can use their API to POST to the site, but not GET your own content back (without paying).</p>



<p>For the platform most associated with <em>professional credibility</em> where people are documenting their work, sharing hard-won thinking, and announcing things that matter to them,  to offer no way to retrieve what you&#8217;ve put there is, to be generous, unprofessional.</p>



<p>The same applies across many platforms, to varying degrees and I&#8217;ve maintained this website (dgen.net) to be both a business site and a master record of my own works, that I completely control. With music I am addressing a version of this <a href="https://dgen.net/0/2026/02/25/discovery-collection-connection/">by building a tool to convert my Spotify playlists into a physical record catalogue</a>, because streaming solved discovery but not &#8216;ownership&#8217;. Social media has the same shape: it solved distribution but not possession.  Broadside is an attempt to do something about that. </p>



<p>And, yes, of course there are loads of self-publishing tools, but they&#8217;re often commercialised into their own SaaS businesses with similar issues of enshittification (looking at you TweetDeck/HootSuite), or too &#8216;techy&#8217; to actually do yourself. Alternative services, like Mastodon are great but also directly compete with, rather than replace the production flow.</p>



<h2 class="wp-block-heading">What Broadside does</h2>



<p>Broadside runs on my own server (you can host your own too, once I get it on GitHub, open licence of course), and it supports multiple users (so I can enable my constellations and communities to use it for free). It connects social accounts, enables a post to be written in a single compose window, and it posts simultaneously to whichever platforms you select (Mastodon, Bluesky, Threads, LinkedIn, or any combination. Note that Facebook and others don&#8217;t allow connections like this). Link previews, image attachments and scheduled posts all work.</p>



<p>It also is keep a copy.</p>



<p>Before anything goes to a social platform, it&#8217;s written to an archive on my server. That archive is searchable and downloadable. If any other platform disappears, your posts don&#8217;t (nb: if my/your server vanishes, you have backups everywhere else you&#8217;ve posted). If you want to find what you said about something three years ago, you can. This useful to me &#8211; having a personal, searchable archive of all my public writing is just <em>nice</em>, independently of the cross-posting convenience.</p>



<p>There&#8217;s also a feed view, pulling in my Mastodon and Bluesky feeds together into one place (NB: LinkedIn and Threads don&#8217;t allow this, and Facebook doesn&#8217;t allow anything). </p>



<h2 class="wp-block-heading">With added AI?</h2>


<div class="wp-block-image img-right">
<figure class="alignright size-large is-resized"><a href="https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04.jpg"><img decoding="async" width="1024" height="555" src="https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-1024x555.jpg" alt="" class="wp-image-7852" style="aspect-ratio:1.8450767065929918;width:472px;height:auto" srcset="https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-1024x555.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-300x163.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-768x416.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-1536x832.jpg 1536w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-830x450.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-230x125.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-350x190.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04-480x260.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/04/Bindery-research-2026-04-04.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>


<p>I added an AI-assisted <strong>research tool</strong> that automatically surfaces related links (e.g. Wikipedia, academic papers, Guardian articles, Hacker News discussions and things I&#8217;m experimenting with) for anything I post. This last bit genuinely surprised me with how useful it can be by lowering the &#8216;friction&#8217; in then googling for references &#8211; in an age of fake news, it&#8217;s nice to filter on some diverse-yet-trusted sources. The whole thing was built with Claude and, like my other experiments is stuff I wanted but would never have had time to build a decade ago.</p>



<h2 class="wp-block-heading">And, a white-listed constellation?</h2>



<p>Of course, once you&#8217;ve got a publishing tool that works well, you can share it with your friends. And then you have something that&#8217;s bot-free, curated (h/t <a href="https://www.gyford.com/phil/writing/2007/02/04/the-haddock-dire/">haddock</a>), and more akin to the original idea of shared bookmarking and socials. Back to basics, without the tracking (no, really tracking, like <a href="https://thenextweb.com/news/linkedin-browsergate-extension-scanning-privacy-fingerprint">LinkedIn scanning all your browser extensions to fingerprint your machine and track you</a> is actually a thing, never mind cookies).</p>



<p>All while <strong>not having to switch</strong> away from, or shut down, places you like to hangout with <em><strong>other</strong> </em>friends and colleagues.</p>



<p>You can probably guess where I might go next with this: not leaving places, but rather <em><strong>connecting</strong></em> them.</p>



<h2 class="wp-block-heading">On words</h2>



<p>Those who know me already know I love finding fun words (e.g. <a href="http://ib1.org">Icebreaker One</a>, <a href="https://dgen.net/0/2017/03/10/the-amee-story-part-one/">AMEE</a>, <a href="https://dgen.net/0/overview/tornado-history/">Tornado</a>) to make using things <em>just feel good</em>.  And, of course, design matters deeply to all of this so I&#8217;m experimenting with letting people choose their own themes.  We love to personalise things. </p>



<p>Note that while I&#8217;m using ai for these prototypes, a quick plug for my friends at <a href="https://philpottdesign.com/">philpottdesign.com</a>, just because ;).</p>



<p>I&#8217;ve given Broadside its own vocabulary because I think it&#8217;s  more interesting than calling things &#8220;dashboard&#8221; and &#8220;feed&#8221;.</p>



<p><strong>Broadside</strong>: historically, this is a large sheet printed on one side and distributed as news, proclamations, or verse &#8211; one of the original one-to-many formats. It felt right for a tool that takes one piece of writing and to many public spaces at once. Obviously, given my interest in things nautical, broadside is also when all the guns on one side of a warship are fired simultaneously&#8230; so quite apt!</p>



<p><strong>The Murmurator</strong>: the compose interface. A murmuration is what you see when a flock of starlings moves as one coherent shape. Social media can feel a bit like that and The Murmurator is where you introduce something into the flow.</p>



<p><strong>Murmurings</strong>: your own incoming feeds from the people you follow, across the networks.</p>



<p><strong>The Bindery</strong>: your personal post archive. The Bindery refers to &#8220;a&nbsp;studio,&nbsp;workshop&nbsp;or&nbsp;factory&nbsp;where sheets of (usually) paper are fastened together to make books&#8221; [<a href="https://en.wikipedia.org/wiki/Bindery">wikipedia</a>] so felt apt for where your own posts are gathered, ordered, and made publicly accessible by default (as a public web page and RSS feed).</p>



<p><strong>Commonplace</strong>: As I add people from my constellation into our shared Broadside instance, the Commonplace is our collective archive: everything everyone has posted, in one place (as a public web page and RSS feed). (originally I used <em>Sammelband</em> a <a href="https://en.wikipedia.org/wiki/Sammelband">German word</a> for a &#8216;volume that binds together separately published works&#8217; but that was getting a bit too esoteric, even for me).</p>



<h2 class="wp-block-heading"><strong>Addenda</strong>: re-establishing control</h2>



<p>Stepping aside from all the stupid AI-hype, I think we&#8217;re at a fascinating juncture that reminds me of the 1990s early web. The same AI tools that vast platform players are racing to deploy to bind us <strong>to them</strong>, are equally available to <strong>all of us</strong>. </p>



<p>We can all now build personalised infrastructure, in hours or days, that would have taken dedicated teams many months or years before. Broadside is an example of this: a small act of reclaiming your relationship with your own writing, from the platforms you publish on and can control.</p>



<p>If we can&#8217;t build things for everyone, it won&#8217;t <em>work</em> for all of us.</p>



<p>To quote NTK, &#8220;<em>THEY STOLE OUR REVOLUTION</em>. NOW WE&#8217;RE STEALING IT BACK&#8221;</p>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk.jpg"><img decoding="async" width="1024" height="576" src="https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-1024x576.jpg" alt="" class="wp-image-8209" srcset="https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-1024x576.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-300x169.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-768x432.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-830x467.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-230x129.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-350x197.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk-480x270.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/04/broadside-ntk.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7838</post-id>	</item>
		<item>
		<title>From discovery to collection to connection</title>
		<link>https://dgen.net/0/2026/02/25/discovery-collection-connection/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Wed, 25 Feb 2026 12:20:59 +0000</pubDate>
				<category><![CDATA[arts]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[music-industry]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[stuff]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7810</guid>

					<description><![CDATA[<img width="1024" height="691" src="https://dgen.net/0/wp-content/uploads/2026/02/music-cat-1024x691.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/music-cat-1024x691.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-300x203.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-768x518.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-830x560.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-230x155.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-350x236.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-480x324.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" />Turning your Spotify playlist into a record collection, and why that could be really disruptive Quick summary I’ve long wanted to make it easy to [&#8230;]]]></description>
										<content:encoded><![CDATA[<img width="1024" height="691" src="https://dgen.net/0/wp-content/uploads/2026/02/music-cat-1024x691.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/music-cat-1024x691.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-300x203.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-768x518.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-830x560.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-230x155.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-350x236.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat-480x324.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/music-cat.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p><strong><em>Turning your Spotify playlist into a record collection, and why that could be really disruptive</em></strong></p>



<h2 class="wp-block-heading"><strong>Quick summary</strong></h2>



<p>I’ve long wanted to make it easy to buy the music of artists I like, not least because they get better £pay on physical, but when (not if) online services de-list things and hard drives break, they don’t vanish forever.</p>



<p>So, here&#8217;s a first experiment: pulling out one of my annual playlists into a ‘catalogue/shop window’ that links to various retailers, CD and Vinyl, and Bandcamp if that exists for the artist. </p>



<p style="text-decoration:line-through">This is only 2025 for now, while I work out some of the bugs. <a href="https://dgen.net/w/playlists/2025.html">https://dgen.net/w/playlists/2025.html</a></p>



<p>Update: now live at <a href="https://secondpress.club/p/5lx398">https://secondpress.club/p/5lx398</a> </p>



<h2 class="wp-block-heading"><strong>Some reflections (over the past three decades</strong>) </h2>



<p>This is an example of shifting power dynamics in consumption, engagement and how we can help deliver open markets that work for everyone.  I&#8217;ve also noticed that the music sector is often an early adopter/trailblazer for broader societal shifts. </p>



<p>Music streaming has solved discovery: a near-infinite library at your fingertips, finding new artists, forgotten classics and new connections has never been easier. </p>



<p>However, there&#8217;s an issue buried in that convenience: you don&#8217;t really &#8216;have&#8217; any of it. If a label dispute pulls an album, or you cancel your subscription, your carefully curated listening history evaporates. This can also apply to your &#8216;downloads&#8217; (even with good hard drives and cloud services, we still lose our digital stuff).</p>



<p>I&#8217;ve long thought about what it actually means to have a music collection. Back in the day (1998!) I put Virgin Megastores online: all 60,000 products (which is how may CDs were in a typical store), and designed a service with a colleague, Rick Glanville, where we could sell a subscription to digital downloads and give away a tiny MP3 player as part of the package. We even got Cambridge Electronics to make a little postage-stamp sized player. [yes, these pre-dated the iPod, iPod Shuffle and Spotify by many, many years]. </p>



<p>While on that journey it struck me that we were in the process of reducing &#8216;music&#8217; to a search box, killing most of the actual experience outside of listening, destroying record stores, and as humans we were likely to eventually push back on something so techno-reductionist. </p>



<p>Many of the things we enjoy about music listening are physical: this has played out in the long-term success of stores like Rough Trade, and the resurgence of vinyl (even cassettes are back!).  At the time, as a bit of rebellion, I also released my own music as a <a href="https://binarydust.org/consume/">19kg solid granite MP3 player and radio transmitter</a>.</p>



<p>In one of my many roles as CEO of <a href="https://ci-info.com/">Consolidated Independent</a>, we helped get over 20% of the world&#8217;s music online: millions of tracks from thousands of labels distributed to hundreds of retailers and services. Some of the labels were <em>terrified </em>of the web destroying their business due to piracy, but the whole system had to embrace it, including sorting out commercial realities. Sadly some of those realities massively skewed market value to &#8216;the big guys&#8217;, including ludicrous statements from some (let&#8217;s say &#8216;commercial&#8217;) CEOs that if artists wanted more money they should increase their output (as if <em>art</em> and <em>soup cans</em> are the same thing <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ). </p>



<p>Don&#8217;t get me wrong, I love the fact we have vast access to new music, and listen to a very diverse range of music. And, it creates different challenges for us as consumers and music fans. Now we can have more agency in balancing out the way the music market works &#8211; the <a href="https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar">cathedrals are not going anywhere, but the bazaar has some new spaces</a>.  </p>



<h2 class="wp-block-heading"><strong>What we can now do</strong></h2>



<p>One of the things I missed when listening was album art, and a few years back I made a <a href="https://dgen.net/0/2023/07/05/bringing-album-art-back-to-life/">12&#8243; sized screen to pull down and display</a> whatever I&#8217;m playing on Spotify (AI helped me code this, and I would never have got around to it without that help).</p>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust.jpg"><img decoding="async" width="1024" height="568" src="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1024x568.jpg" alt="" class="wp-image-6382" srcset="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1024x568.jpg 1024w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-300x166.jpg 300w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-768x426.jpg 768w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1536x852.jpg 1536w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-830x460.jpg 830w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-230x128.jpg 230w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-350x194.jpg 350w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-480x266.jpg 480w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust.jpg 1706w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading"><strong>Building things just for me is fun, and&#8230; </strong></h2>



<p>Interestingly, with just a few AI prompts and some lightweight code, I created a tool that takes my Spotify playlist, cross-references every album against <a href="https://www.discogs.com/">Discogs</a>, and produced a personalised catalogue. </p>



<p>Based on the <strong>individual tracks</strong> I&#8217;d added to my annual playlist (which I have going back 8 years now), it looks up the <strong>album</strong> that it was on. It then works out which are available on <strong>CD</strong> and <strong>Vinyl</strong> (or <strong>digital</strong>&#8211;<strong>only</strong>), where to find them, and who sells them. And, not &#8216;just Amazon&#8217;, but others: Rough Trade, HMV and directly linking back to the artist&#8217;s Bandcamp. This is just the start of and idea, and took less than half a day to create it as a prototype.</p>



<p>This makes me wonder about a quiet promise of AI that doesn&#8217;t get talked about so much: enabling each of us to build the world we&#8217;d like. This will disrupt the big platforms (Spotify, Amazon, Apple) who have invested billions in making their aggregated experience frictionless and hard to leave. They&#8217;re using AI to make them more personalised and &#8216;sticky&#8217;. We can do the same for ourselves.</p>



<p>The same AI tools they&#8217;re racing to build are equally available to you and me. We can now spin up personalised services—in an afternoon—that would have taken a dedicated development team a decade ago.</p>



<p>So, this is a prototype of a custom, personalised catalogue and record-buying assistant that can be built around <em>your</em> taste, routing money to <em>your</em> preferred retailers that you can share with <em>your</em> friends. It is a small but real act of reclaiming your relationship with artists, and their music, from the big platforms.  </p>



<p>We can help bridge the gaps and connect the smaller services together (back to the original vision of the web). </p>



<p>And, looking forward, we can start blending, sharing, cross-connecting using federated services like <a href="https://mastodon.social/@agentGav">Mastodon</a> and then connecting people, places, gigs, merch, in a way that could actually help everyone. </p>



<p>Isn&#8217;t that exciting!?</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7810</post-id>	</item>
		<item>
		<title>AI-enabled Hi-Fi adventures</title>
		<link>https://dgen.net/0/2026/02/20/ai-enabled-hifi-adventures/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 16:14:51 +0000</pubDate>
				<category><![CDATA[data]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[stuff]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[hi-fi]]></category>
		<category><![CDATA[pi]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7740</guid>

					<description><![CDATA[<img width="1024" height="683" src="https://dgen.net/0/wp-content/uploads/2026/02/amp-1024x683.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/amp-1024x683.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/amp-300x200.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/amp-768x512.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/amp-830x553.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/amp-230x153.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/amp-350x233.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/amp-480x320.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/amp.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" />AI-generated image of an amplifier being controlled via a web interface.]]></description>
										<content:encoded><![CDATA[<img width="1024" height="683" src="https://dgen.net/0/wp-content/uploads/2026/02/amp-1024x683.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/amp-1024x683.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/amp-300x200.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/amp-768x512.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/amp-830x553.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/amp-230x153.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/amp-350x233.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/amp-480x320.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/amp.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>I wonder if AI might actually help us actually break away from native mobile apps for a lot of things &amp; &#8216;get back to the web&#8217;? </p>



<p>Many modern hi-fi amplifiers have &#8216;an App&#8217;. They are, uniformly (from what I can see), terrible.</p>



<p>In this post I show how I &#8216;fixed this&#8217; in <strong>under an hour</strong> using ai to do something I would never, ever have got around to doing. Given how much I listen to music, I know it&#8217;s going to save me many hours of irritation. It even left me with enough time to write this post.</p>



<p>Let&#8217;s start with the challenge.  In the UK we spend about £600M a year on hi-fi stuff: that seems like quite a lot. And the higher-end kit costs more than your PC. However, while they &#8216;try and be digital&#8217;, it&#8217;s like walking back into the 1990s as a user. </p>



<p>Here are some screenshots from the &#8216;flagship&#8217; Marantz app starting up.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1.jpg"><img decoding="async" width="461" height="1024" data-id="7743" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-461x1024.jpg" alt="" class="wp-image-7743" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132503_marantz-avr-remote_55106088266_o-1.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o.jpg"><img decoding="async" width="461" height="1024" data-id="7744" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-461x1024.jpg" alt="" class="wp-image-7744" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132526_marantz-avr-remote_55106289933_o.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o.jpg"><img decoding="async" width="461" height="1024" data-id="7746" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-461x1024.jpg" alt="" class="wp-image-7746" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132603_marantz-avr-remote_55106465980_o.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>
</figure>



<p>I should point out that not only is the user interface <strong>terrible</strong> (including trying to get you to sign up to their <a href="https://www.reddit.com/r/heos/comments/ibp45y/heos_software_is_complete_garbage_almost_to_the/">HEOS garbage</a>) but it takes needless <strong>ages </strong>to start up and navigate. Those spinning disks spin for a long time, and then present with a page with a <strong><em>tiny </em></strong>round button for the volume and mostly meaningless other stuff that&#8217;s too small to consistently accurately tap. It&#8217;s really easy to accidentally turn the volume up a lot (which on a >3kW system can be alarming if you&#8217;re not expecting it).</p>



<p>Let&#8217;s say you want to turn the volume down (the #1 thing you do on an amp &#8216;instantly&#8217;), it can take up to <strong>10 seconds</strong> to get there. This means you revert back to the remote control, or &#8211; heaven forbid &#8211; <em>have to actually stand up and turn actual the volume control &#8211; there are plenty of other apps that tell us when we need to move <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></em>. Further, to get into any granular controls such as changing sound processing, or changing the volume on individual surround channels is painfully slow (tens of seconds to get to, seconds for each change), cumbersome and, actually just <strong>unusable</strong>. I often want to do this for specific tracks when in a proper listening session.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o.jpg"><img decoding="async" width="461" height="1024" data-id="7747" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-461x1024.jpg" alt="" class="wp-image-7747" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132612_marantz-avr-remote_55105203647_o.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o.jpg"><img decoding="async" width="461" height="1024" data-id="7748" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-461x1024.jpg" alt="" class="wp-image-7748" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132628_marantz-avr-remote_55106466135_o.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o.jpg"><img decoding="async" width="461" height="1024" data-id="7750" src="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-461x1024.jpg" alt="" class="wp-image-7750" srcset="https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-461x1024.jpg 461w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-135x300.jpg 135w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-768x1707.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-691x1536.jpg 691w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-922x2048.jpg 922w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-830x1844.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-230x511.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-350x778.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o-480x1067.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/screenshot_20260220_132652_marantz-avr-remote_55106290143_o.jpg 1080w" sizes="(max-width: 461px) 100vw, 461px" /></a></figure>
</figure>



<p>Clearly in 2026 this really isn&#8217;t good enough.   Fortunately this is now something (almost) anyone can fix without waiting for manufacturers to wake up and do something. </p>



<p>Googling around the docs there are some API standards and I&#8217;d done some previous command-line work to pull status and push things like volume to see if it all actually worked (it did). </p>



<p>But now, with the wonders of AI (in this case, <em><a href="https://claude.ai">Claude.ai</a></em>) it is almost <em>magically trivial to make your own interface.</em></p>



<p>In this post I show how easy (and things that can be frustrating).</p>



<p>Let&#8217;s start with a bit of magic: I asked Claude (thinking that this wouldn&#8217;t be enough)</p>



<pre class="wp-block-code"><code>&gt; develop a web interface for the Marantz SR7015 using its API</code></pre>



<p>It wasn&#8217;t just &#8220;enough&#8221;, it even styled the page with custom fonts and an image of a surround setup. To get it actually working (locally, on my Mac) I just had to give it the error I got</p>



<pre class="wp-block-code"><code>&gt; it says "Cannot reach 192.168.1.46"</code></pre>



<p>At which point the AI created a local proxy server, told me how to install it and some supporting packages (with copy/paste instructions). If I rewind to when I used to be able to actually code, I think this would have all easily taken me a day. Instead it took this aging hacker about 30 mins of faffing around. This was it &#8211; a fully working, way better visual interface and way better user experience (it loads <strong>instantly</strong> with no noticeable latency on the controls), and individual controls, all on one screen. And, against a black background as usually listening when it&#8217;s dark (or watching a movie).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-scaled.png"><img decoding="async" width="1260" height="2560" src="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-scaled.png" alt="" class="wp-image-7753" style="aspect-ratio:0.49219353841397434;width:558px;height:auto" srcset="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-scaled.png 1260w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-148x300.png 148w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-504x1024.png 504w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-768x1561.png 768w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-756x1536.png 756w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-1008x2048.png 1008w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-830x1687.png 830w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-230x467.png 230w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-350x711.png 350w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-12.29.22-480x976.png 480w" sizes="(max-width: 1260px) 100vw, 1260px" /></a></figure>
</div>


<p>I then spent a few hours playing around with layouts to see what was possible, then asked the AI to make a version I would run on my Pi-Fi (the <a href="https://dgen.net/0/2023/07/05/bringing-album-art-back-to-life/">Raspberry Pi I have that displays album art</a> when Spotify is playing). Which, of course, it did at a similar pace. </p>



<p>This means I can access a web page on my home&#8217;s wifi network on my phone, laptop or desktop &#8211; as can anyone I give the web address to who is with me. I can use it as a remote for the amplifier, not just for volume, but including controlling all the parameters I actually want to access instantly, with nice big buttons and only the things I need.  It still wasn&#8217;t able to do some things (like more nuanced reading/writing of custom fields).</p>



<p>I then added <strong>new functionality</strong> &#8211; to pair and group left and right speakers into &#8216;front&#8217;, &#8216;surround&#8217; so I can control the top-front-side-back distribution more easily (unless you&#8217;re a sound engineer, you&#8217;ll be surprise how much more this varies than you&#8217;d think based on the mix and type of the music). </p>



<p>And, finally, for now, a joystick control to move the balance around between all 11 speakers. Which was done with a single prompt:</p>



<pre class="wp-block-code"><code>> create a joystick control to balance the audio between all the speakers</code></pre>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07.png"><img decoding="async" width="1024" height="689" src="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-1024x689.png" alt="" class="wp-image-7799" srcset="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-1024x689.png 1024w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-300x202.png 300w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-768x517.png 768w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-1536x1034.png 1536w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-830x559.png 830w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-230x155.png 230w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-350x236.png 350w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07-480x323.png 480w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-17.55.07.png 1744w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



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



<p>Next up I&#8217;m thinking of keying together listening room profiles per track, keyed into what&#8217;s playing on Spotify so the entire balance of the system can auto-configure based on what&#8217;s playing. This would then include <a href="https://dgen.net/0/2022/12/22/a-stereo-or-a-soundstage/">custom listening profiles and sound stages</a> I&#8217;d set up for specific favourite tracks. It&#8217;s almost as if one could take all this too far*&#8230;? </p>



<figure class="wp-block-image size-full is-resized"><a href="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-scaled.png"><img decoding="async" width="1910" height="2560" src="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-scaled.png" alt="" class="wp-image-7763" style="width:828px;height:auto" srcset="https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-scaled.png 1910w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-224x300.png 224w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-764x1024.png 764w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-768x1029.png 768w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-1146x1536.png 1146w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-1528x2048.png 1528w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-830x1113.png 830w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-230x308.png 230w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-350x469.png 350w, https://dgen.net/0/wp-content/uploads/2026/02/Screenshot-2026-02-20-at-15.35.23-480x643.png 480w" sizes="(max-width: 1910px) 100vw, 1910px" /></a></figure>



<p>* Looking out at the hi-fi geek landscape, there is no end of completely stupid nonsense things people do (from £1,000 <a href="https://www.mcru.co.uk/product-category/hifi-cables/usb-cables-hifi-cables/">audiophile USB cables</a> to &#8216;<a href="https://forum.audiogon.com/discussions/does-raising-speaker-cables-off-the-floor-really-make-a-big-difference">elevated speaker cable risers</a>&#8216;), none of which make a single bean of difference to anything but your wallet. Once you&#8217;ve got a basic system in place by far the biggest differences you&#8217;ll be able to <em>actually hear</em> are (a) treating the room with sound insulation, and/or (b) treating the distribution, balance and EQ of the signal itself in your space, which is what I&#8217;m doing here.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7740</post-id>	</item>
		<item>
		<title>Data infrastructure as economic power</title>
		<link>https://dgen.net/0/2026/02/14/data-infrastructure-as-economic-power/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Sat, 14 Feb 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7795</guid>

					<description><![CDATA[<img width="1024" height="683" src="https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-1024x683.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-1024x683.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-300x200.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-768x512.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-830x553.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-230x153.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-350x233.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-480x320.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP.jpg 1536w" sizes="(max-width: 1024px) 100vw, 1024px" />
Data infrastructure as economic power
Those who set the rules and govern data flows, control the value]]></description>
										<content:encoded><![CDATA[<img width="1024" height="683" src="https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-1024x683.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-1024x683.jpg 1024w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-300x200.jpg 300w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-768x512.jpg 768w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-830x553.jpg 830w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-230x153.jpg 230w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-350x233.jpg 350w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP-480x320.jpg 480w, https://dgen.net/0/wp-content/uploads/2026/02/DIaSP.jpg 1536w" sizes="(max-width: 1024px) 100vw, 1024px" />
<h4 class="wp-block-heading">Those who set the rules and govern data flows, control the&nbsp;value</h4>



<p><strong>Data infrastructure</strong> is not a technical concern nor a subset of digital policy.</p>



<p>It is a core determinant of national power. It shapes how a country governs itself, secures its citizens and its businesses, how it shapes and grows its economy, and how it positions itself in an increasingly hostile geopolitical and commercial landscape. Data infrastructure also increasingly moderates the perceived legitimacy of relationships between government, institutions, business, and the general population.</p>



<p>As data mediates finance, energy, health, transport, housing and public services, the ability to govern how data <strong><em>flows</em></strong>, who controls it, through what processes and on what terms, is now inseparable from national interest.</p>



<p>Without sovereign control of the rules, permissions and layers of trust that determine data access, use and re-use, the UK risks outsourcing core economic and civic functions to foreign platforms, to standards outside of its control and incentives outside its jurisdiction.</p>



<p>This is not just a question of efficiency or cost: it is a question of agency. Who sets the rules of the digital economy? Who captures the value? Whose values and what incentives are encoded into the systems that increasingly shape everyday life and trade?</p>



<p>Addressing these questions can help to shine light on where important centers of power and decision-making capacity lie across the economy, and stimulate debate about what incentives, risks and benefits may exist. These should be considered on a short, medium and long-term commercial and geopolitical basis. They also highlight that a modern data economy requires a secure, trusted and domestically accountable, legally enforceable layer for organisations who use and control data. This is not just <em>technical</em> plumbing but foundational to democratic legitimacy and social trust.</p>



<p>At the same time, the opportunity is substantial. Countries that invest in trusted, interoperable, market-enabling data infrastructures are laying the foundations for a new wave of productivity and growth. The UK’s experience with Open Banking showed what is possible: clear rules, shared standards and strong governance unlocked a multibillion-pound fintech ecosystem used by millions, and positioned the UK as a global exemplar. As it extends this approach with primary legislation across energy, property, health, transport and other sectors it can unlock new markets, attract investment, and reduce friction across the economy.</p>



<p>Countries that can verify business identities while managing consumer permissions and protecting citizen rights in the digital sphere are better equipped to counter fraud, organised crime and interference from hostile actors. Those that can’t expose themselves to systemic risk.</p>



<p>In an adversarial geopolitical environment, data assets such as energy telemetry, financial behaviours and mobility patterns are strategic resources. We must proceed by assuming all digital systems are under continuous both commercial and ‘bad actor’ attack. Resilience depends on open markets, transparency, interoperability, assurance and governance, not just ‘technology infrastructure’ at scale.</p>



<p>This opportunity is also threatened by corporate capture. A small number of (predominantly US-based or Chinese) technology firms increasingly control critical digital infrastructure: cloud, identity, payments, AI models, developer ecosystems and now the <em>data layer itself </em>(data is a different <em>category</em> to technology).</p>



<p>Through proprietary or ‘high friction’ standards, high switching costs and vertically integrated platforms, these firms are de-facto rule-makers. They shape access, pricing and innovation trajectories without public accountability. This concentrates economic power, weakens regulatory leverage and displaces public value with private extraction. Such challenges have been well documented for some time (see selected references).</p>



<p>This is not inevitable and the UK has a credible alternative path. It can use its legal institutions, regulatory sophistication, academic depth and civil-society capability to lead a different model, based on open standards, open source and <em>open governance</em>. Open source in this context is not an ideology but a strategic instrument that underpins the principles of a free market economy. Properly governed, it reduces dependency, improves transparency, lowers barriers to entry, cost and friction, and allows domestic firms to build on shared foundations rather than renting infrastructure from abroad.</p>



<p>Crucially, <em>open governance</em> preserves cultural and democratic sovereignty. It ensures that the rules of the data economy reflect UK legal norms, social values and public-interest objectives.</p>



<p>Through modular, interoperable trust frameworks, the UK can export not just technology but governance itself, positioning the country as a global leader in trusted data markets. This is how economic value can be created at scale: enabling many firms to innovate on shared infrastructure, rather than entrenching a small number of dominant platforms.</p>



<p>The strategic choice is clear: data infrastructure must be treated not merely as national infrastructure, but as a core component of the economy itself. The UK should act accordingly: owning the rules, investing in open components, institutionalising trust frameworks, and using this architecture to drive growth, resilience and global influence. Nations that do this will shape the rules of the digital age. Those that do not will inherit rules written elsewhere.</p>



<p><strong>Selected references</strong></p>



<p>Khan, L.M. (2017) ‘Amazon’s antitrust paradox’, Yale Law Journal, 126(3), pp. 710–805. <a href="https://www.yalelawjournal.org/note/amazons-antitrust-paradox" rel="noreferrer noopener" target="_blank">https://yalelawjournal.org/note/amazons-antitrust-paradox</a></p>



<p>Kenney, M. and Zysman, J. (2016) ‘The rise of the platform economy’, Issues in Science and Technology, 32(3), pp. 61–69. <a href="https://issues.org/the-rise-of-the-platform-economy" rel="noreferrer noopener" target="_blank">https://issues.org/the-rise-of-the-platform-economy</a></p>



<p>OECD (2019) Competition policy in the digital age. <a href="https://www.oecd.org/competition/competition-policy-in-the-digital-age.htm" rel="noreferrer noopener" target="_blank">https://oecd.org/competition/competition-policy-in-the-digital-age.htm</a></p>



<p>OECD (2022) The evolving concept of market power in the digital economy. <a href="https://www.oecd.org/daf/competition/the-evolving-concept-of-market-power-in-the-digital-economy.htm" rel="noreferrer noopener" target="_blank">https://oecd.org/daf/competition/the-evolving-concept-of-market-power-in-the-digital-economy.htm</a></p>



<p>Srnicek, N. (2017) Platform capitalism. <a href="https://www.politybooks.com/bookdetail?book_slug=platform-capitalism--9781509504862" rel="noreferrer noopener" target="_blank">https://politybooks.com/bookdetail?book_slug=platform-capitalism&#8211;9781509504862</a></p>



<p>Zuboff, S. (2019) The age of surveillance capitalism: The fight for a human future at the new frontier of power. New York: PublicAffairs. <a href="https://www.publicaffairsbooks.com/titles/shoshana-zuboff/the-age-of-surveillance-capitalism/9781610395694/" rel="noreferrer noopener" target="_blank">https://publicaffairsbooks.com/titles/shoshana-zuboff/the-age-of-surveillance-capitalism/9781610395694/</a></p>



<p>Fetter J., Rao, K., Eaves, D. (2025) State of Digital Public Infrastructure Report <a href="https://www.ucl.ac.uk/bartlett/publications/2025/nov/2025-state-digital-public-infrastructure-report" rel="noreferrer noopener" target="_blank">https://www.ucl.ac.uk/bartlett/publications/2025/nov/2025-state-digital-public-infrastructure-report</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7795</post-id>	</item>
		<item>
		<title>GDrive sync to local drive &#8211; critical bug</title>
		<link>https://dgen.net/0/2025/08/25/gdrive-sync-to-local-drive-critical-bug/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Mon, 25 Aug 2025 19:12:55 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7687</guid>

					<description><![CDATA[If you are a Google Drive user (I&#8217;m on a Mac Mini M4), then when you set up local sync, there is a potentially disastrous [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>If you are a Google Drive user (I&#8217;m on a Mac Mini M4), then when you set up local sync, there is a potentially disastrous bug in their software.</p>



<p>I like to have local copies of everything, so when I upgraded to a new Mac I selected &#8220;<strong>Mirror files</strong>&#8221; below and set it running. It immediately moved everything on my GDrive cloud storage to the bin (ie. treated my local empty machine as the &#8216;new thing&#8217; and overwrote everything in the cloud). This is, obviously, not the behaviour anyone wants. </p>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34.png"><img decoding="async" width="1024" height="767" src="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-1024x767.png" alt="GDrive app" class="wp-image-7688" srcset="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-1024x767.png 1024w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-300x225.png 300w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-768x575.png 768w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-830x621.png 830w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-230x172.png 230w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-350x262.png 350w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34-480x359.png 480w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-19.56.34.png 1512w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The &#8216;solution&#8217; &#8211; after you&#8217;ve gone online into the Bin, very carefully selected everything and clicked &#8216;<strong>Restore</strong>&#8216; (not Delete forever(!)) &#8211; is to launch the application in &#8220;<strong>Stream files</strong>&#8221; mode. Then, when it starts to stream go into the finder, right-click and select &#8220;<strong>Download Now</strong>&#8220;. </p>



<figure class="wp-block-image size-full"><a href="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50.png"><img decoding="async" width="812" height="302" src="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50.png" alt="screenshot of right-click menu selection" class="wp-image-7689" srcset="https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50.png 812w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50-300x112.png 300w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50-768x286.png 768w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50-230x86.png 230w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50-350x130.png 350w, https://dgen.net/0/wp-content/uploads/2025/08/Screenshot-2025-08-25-at-20.05.50-480x179.png 480w" sizes="(max-width: 812px) 100vw, 812px" /></a></figure>



<p>The app itself has a terrible user experience for such a tiny number of options: it&#8217;s not always clear which account your are in (I have many Gdrive accounts), it&#8217;s not consistent in language and the menus often loop back to the same thing. As for trying to set it to save to an external drive, do let me know if you have any tips as this seems impossible now on the Mac M4 (apparently <em>symlinking</em> is the workaround &#8230; it&#8217;s  2025!). </p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7687</post-id>	</item>
		<item>
		<title>Alternatives to current big tech</title>
		<link>https://dgen.net/0/2025/02/28/alternatives/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 23:26:45 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7423</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<ol class="wp-block-list">
<li><a href="https://switching.software">https://switching.software</a></li>



<li><a href="https://www.privacyguides.org">https://www.privacyguides.org</a></li>



<li><a href="https://alternativeto.net">https://alternativeto.net</a></li>



<li><a href="https://ethical.net/resources">https://ethical.net/resources</a></li>



<li><a href="https://selfh.st/apps">https://selfh.st/apps</a></li>



<li><a href="https://european-alternatives.eu">https://european-alternatives.eu</a></li>



<li><a href="https://prism-break.org/en">https://prism-break.org/en</a></li>
</ol>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7423</post-id>	</item>
		<item>
		<title>Don’t let the mediocre be the enemy of the good</title>
		<link>https://dgen.net/0/2024/01/10/dont-let-the-mediocre-be-the-enemy-of-the-good/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Wed, 10 Jan 2024 01:01:00 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=7545</guid>

					<description><![CDATA[<img width="1024" height="1024" src="https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre.webp" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre.webp 1024w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-300x300.webp 300w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-150x150.webp 150w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-768x768.webp 768w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-830x830.webp 830w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-230x230.webp 230w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-350x350.webp 350w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-480x480.webp 480w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-45x45.webp 45w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-120x120.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" />“Don’t let the perfect be the enemy of the good” Oft-cited to help motivate us to get on with making&#160;something. But what happens when&#160;we’re not [&#8230;]]]></description>
										<content:encoded><![CDATA[<img width="1024" height="1024" src="https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre.webp" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre.webp 1024w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-300x300.webp 300w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-150x150.webp 150w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-768x768.webp 768w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-830x830.webp 830w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-230x230.webp 230w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-350x350.webp 350w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-480x480.webp 480w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-45x45.webp 45w, https://dgen.net/0/wp-content/uploads/2025/04/good-mediocre-120x120.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>“Don’t let the perfect be the enemy of the good”</p>



<p id="83ab">Oft-cited to help motivate us to get on with making&nbsp;<em>something.</em></p>



<p id="43e0">But what happens when&nbsp;<em>we’re not even at ‘good’ yet</em>?</p>



<p id="c3f3">Sorting out today’s challenges needs consideration of what gets ‘embedded in the system’ so that, instead of the 100x impact we need, we stumble into creating 100x friction in a few years.</p>



<p id="0cf2">There is a bar for good&nbsp;<em>enough</em>.</p>



<p id="21e3">Watching the unfolding developments in data sharing, with environmental reporting as an exemplar of the size of the challenge, we are still very far away from good.</p>



<p id="843a">For example, when I look at the landscape of carbon reporting, I see necessary progress from global standards bodies and regulators to&nbsp;<strong>mandate</strong>&nbsp;that companies&nbsp;<strong>must</strong>&nbsp;report. This will impact every business (not just the big ones) because those standards&nbsp;<strong>mandate</strong>&nbsp;that lenders (e.g. banks)&nbsp;<strong>must&nbsp;</strong>report on the businesses they are lending to (i.e. pretty much every business).</p>



<p id="0e9f">Note the emphasis on&nbsp;<strong>mandate</strong>&nbsp;and&nbsp;<strong>must</strong>. This isn’t going to be optional.</p>



<h2 class="wp-block-heading" id="a5bf">The challenges</h2>



<p id="ee82">The natural response to Big Problems is to say things like:</p>



<ol class="wp-block-list">
<li><strong>We need to start somewhere, so let’s create some approximations that look like things we already do</strong></li>



<li><strong>Let’s start by gathering all the data in one place</strong></li>



<li><strong>We know this is a global issue, but we need to create something centralised to start with so we can control it</strong></li>
</ol>



<h3 class="wp-block-heading" id="6bcc"><strong>(1) We need to start somewhere so let’s create some approximations that look like things we already do</strong></h3>



<p id="d3b8">Our approximations of investment risk for climate are not yet deeply rooted in reality — we don’t know what the real impact of most of our low-carbon investments will be. If I was to ask you to make a financial investment where I could say your bank balance was ‘about $100 plus or minus $50’ you wouldn’t give me your money. Right now, ‘carbon reporting’ has error bars. Large ones.</p>



<p id="5c31">People are reporting (because they must) and investing (because they also, must) but there is very scant data that shows that $X invested will link to exactly Y tonnes of climate impact. I don’t (just) mean offsetting, I mean exactly how much will I reduce my footprint by if I invest in changing a process. This is ‘okay’ (for some definitions of okay) for the business-as-usual economy, where market corrections emerge over time.</p>



<p id="1ee8">I’m confident we’re investing in a lower-carbon future, but I’m not confident that we’re investing in a net zero future. With climate,&nbsp;<a href="https://agentgav.medium.com/physics-doesnt-care-about-your-politics-eabbc52a118">physics doesn’t care about our economy</a>. It matters today, not tomorrow, that we have the right numbers.</p>



<h3 class="wp-block-heading" id="acf7"><strong>(2) Let’s start by gathering all the data in one place</strong></h3>



<p id="a29f">This is still the go-to.</p>



<p id="aef0">It ‘feels’ safer and easier to control. Everyone can kind of get their heads around ‘building a database’.&nbsp;<a href="https://agentgav.medium.com/too-good-to-be-true-9386c7a63937">I’ve</a>,&nbsp;<a href="https://agentgav.medium.com/connect-dont-collect-again-38a291ba7fe2">covered</a>,&nbsp;<a href="https://agentgav.medium.com/what-is-a-data-infrastructure-strategy-c5ac73217d6f">this</a>,&nbsp;<a href="https://agentgav.medium.com/on-data-where-is-it-and-what-can-we-do-with-it-9a09a0f93804">many</a>,&nbsp;<a href="https://agentgav.medium.com/making-data-work-harder-to-deliver-net-zero-can-we-automate-environmental-reporting-ac60d99695dd">times</a>.</p>



<p id="8fe2">Except,&nbsp;<strong>everyone</strong>&nbsp;makes their own. They’re mostly tech-first, not market-first. They don’t scale. They are, despite the marketing hype, not interoperable. It’s [still] a mess. It’s going to get a lot worse.</p>



<p id="f95a">The challenge is that everyone is happy to collect data as long as they don’t need to share theirs.</p>



<p id="ced2">And, there are $100M’s (hundreds of millions) being invested in private sector companies to create the next generation of eco-unicorns (whether software solutions, insurance companies or rating agencies). The castle &amp; moat business models that these rely on are already at play, and that’s baked into their design.</p>



<h3 class="wp-block-heading" id="acc7"><strong>(3) We know this is a global issue but we need to create something centralised to start with so we can control it</strong></h3>



<p id="6ee5">There are over 300 million companies in the world. Most large companies report over 70% of their carbon footprint is in their supply chains (e.g. SMEs). For lenders, the majority of their carbon footprint is in their customer chain (e.g. SMEs).</p>



<p id="4cef">How are we going to collect, check, calculate, verify, audit and share this data between organisations, across borders, in a comparable manner — and doesn’t undermine business confidentiality or national security?</p>



<h2 class="wp-block-heading" id="0728">Part of the solution is to think differently about the market architecture for a data-enabled future</h2>



<p id="e01f">So, what can we do differently? What things can change, and what things won’t?</p>



<p id="a7de">I doubt we can change the castle &amp; moat business model, so let’s not try.</p>



<p id="8714">What we can do&nbsp;<strong>now</strong>&nbsp;is&nbsp;<strong>change how we design data markets from the outset</strong>&nbsp;to connect, not [just] collect.</p>



<p id="ea11">Doing so would be good news for businesses. If they do this, they’ll save money&nbsp;<strong>and</strong>&nbsp;get more and better data faster, and at scale.</p>



<p id="37b0">The good news for everyone else is it can help create a race-to-the-top on&nbsp;<strong>insights</strong>&nbsp;instead of just relentless monetisation of the raw data, while also putting in place the right protections and security that everyone needs (including the businesses themselves), so everyone can engage.</p>



<p id="d46e">The key is, in business language, to&nbsp;<strong>shift where the line is on ‘pre-competitive’ access to data</strong>. To achieve this, we must ensure that the right foundations (robust data governance, technical and legal interoperability, common processes) are in place. The outcome will be that we can commoditise&nbsp;<strong>access</strong>&nbsp;to data, while enabling the&nbsp;<strong>value of data</strong>&nbsp;to be paid for or exchanged.</p>



<p id="fc23">The bar for&nbsp;<em>good</em>&nbsp;should be&nbsp;<strong>increased competition</strong>&nbsp;on analytics and measurable impact, not on the ‘biggest database’ (big data is so&nbsp;<a href="https://en.wikipedia.org/wiki/Big_data">1990s</a>).</p>



<p id="a920">In 2024&nbsp;<em>good</em>&nbsp;should assume (secure, permission-based, valued) access and unleash the power of our systems (human, financial, technical — including AI) to deliver the changes we need, quickly. Really quickly.</p>



<p id="71ce">The foundations of this have very little to do with ‘web tech’ (it’s already built), and a lot to do with culture, process, law and policy. If you’d like to learn about how we’re doing in one area, to help automate carbon reporting for every UK SME, see&nbsp;<a href="https://ib1.org/perseus">https://ib1.org/perseus</a></p>



<h2 class="wp-block-heading" id="6df5">What else?</h2>



<p id="6a6c">I may write equivalent pieces on data sharing in other areas we are working on, such as finance, energy, water, transport, buildings, and agriculture.</p>



<p id="53fa">But the tl;dr is<strong>&nbsp;the patterns are all identical</strong>.</p>



<p id="f31f">The challenges as large and (really) nothing to do with web technology, despite all the hype. The likelihood of making outcomes good, or mediocre, are the same in every sector I’ve engaged with.</p>



<p>Of course, with climate, mediocre means ‘<em>absolutely catastrophically terrible’</em>.<br>(see the solid black line)</p>



<p><a href="https://agentgav.medium.com/?source=post_page---byline--c9fa71815b69---------------------------------------"></a></p>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2025/04/climate.webp"><img decoding="async" width="1024" height="550" src="https://dgen.net/0/wp-content/uploads/2025/04/climate-1024x550.webp" alt="" class="wp-image-7546" srcset="https://dgen.net/0/wp-content/uploads/2025/04/climate-1024x550.webp 1024w, https://dgen.net/0/wp-content/uploads/2025/04/climate-300x161.webp 300w, https://dgen.net/0/wp-content/uploads/2025/04/climate-768x413.webp 768w, https://dgen.net/0/wp-content/uploads/2025/04/climate-830x446.webp 830w, https://dgen.net/0/wp-content/uploads/2025/04/climate-230x124.webp 230w, https://dgen.net/0/wp-content/uploads/2025/04/climate-350x188.webp 350w, https://dgen.net/0/wp-content/uploads/2025/04/climate-480x258.webp 480w, https://dgen.net/0/wp-content/uploads/2025/04/climate.webp 1122w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7545</post-id>	</item>
		<item>
		<title>Pay attention to what is important, not just what is quantifiable</title>
		<link>https://dgen.net/0/2023/08/23/pay-attention-to-what-is-important-not-just-what-is-quantifiable/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 17:03:23 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=6666</guid>

					<description><![CDATA[via https://donellameadows.org/archives/dancing-with-systems/ &#8220;8. Pay attention to what is important, not just what is quantifiable. Our culture, obsessed with numbers, has given us the idea that [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>via <a href="https://donellameadows.org/archives/dancing-with-systems/ ">https://donellameadows.org/archives/dancing-with-systems/</a></p>



<p>&#8220;<strong>8. Pay attention to what is important, not just what is quantifiable.</strong></p>



<p>Our culture, obsessed with numbers, has given us the idea that what we can measure is more important than what we can’t measure. You can look around and make up your own mind about whether quantity or quality is the outstanding characteristic of the world in which you live.</p>



<p>If something is ugly, say so. If it is tacky, inappropriate, out of proportion, unsustainable, morally degrading, ecologically impoverishing, or humanly demeaning, don’t let it pass. Don’t be stopped by the “if you can’t define it and measure it, I don’t have to pay attention to it” ploy. No one can precisely define or measure justice, democracy, security, freedom, truth, or love. No one can precisely define or measure any value. But if no one speaks up for them, if systems aren’t designed to produce them, if we don’t speak about them and point toward their presence or absence, they will cease to exist.&#8221;</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6666</post-id>	</item>
		<item>
		<title>How to get now playing album art from Spotify API</title>
		<link>https://dgen.net/0/2023/08/07/how-to-get-now-playing-album-art-from-spotify-api/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Mon, 07 Aug 2023 18:55:13 +0000</pubDate>
				<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=6617</guid>

					<description><![CDATA[<img width="1024" height="510" src="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1024x510.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1024x510.jpg 1024w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-300x149.jpg 300w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-768x383.jpg 768w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1536x765.jpg 1536w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-830x414.jpg 830w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-230x115.jpg 230w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-350x174.jpg 350w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-480x239.jpg 480w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock.jpg 1702w" sizes="(max-width: 1024px) 100vw, 1024px" />In a previous post, I hacked this by getting the album artwork jpg from my amplifier. Unfortunately, upgrading to a new amp &#8216;improved&#8217; its operating [&#8230;]]]></description>
										<content:encoded><![CDATA[<img width="1024" height="510" src="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1024x510.jpg" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1024x510.jpg 1024w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-300x149.jpg 300w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-768x383.jpg 768w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-1536x765.jpg 1536w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-830x414.jpg 830w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-230x115.jpg 230w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-350x174.jpg 350w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock-480x239.jpg 480w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-clock.jpg 1702w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>In a <a href="https://dgen.net/0/2023/07/05/bringing-album-art-back-to-life/">previous post</a>, I hacked this by getting the album artwork jpg from my amplifier.  Unfortunately, upgrading to a new amp &#8216;improved&#8217; its operating system and the artwork vanished, so I had to bite the bullet to get it straight from Spotify. This is far more painful than it needs to be and Spotify could do better (see footnote).</p>



<p>So, with a bit of help (actually a lot of help) from ChatGPT-4* and many rabbit holes explored, I&#8217;ve now got a call directly to the Spotify API of &#8220;now playing&#8221;.</p>



<figure class="wp-block-image size-large"><a href="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust.jpg"><img decoding="async" width="1024" height="568" src="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1024x568.jpg" alt="" class="wp-image-6382" srcset="https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1024x568.jpg 1024w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-300x166.jpg 300w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-768x426.jpg 768w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-1536x852.jpg 1536w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-830x460.jpg 830w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-230x128.jpg 230w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-350x194.jpg 350w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust-480x266.jpg 480w, https://dgen.net/0/wp-content/uploads/2023/07/AlbumArt-BinaryDust.jpg 1706w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>To get going, set up a <a href="https://developer.spotify.com/">developer account</a> in Spotify, create a new app and then get hold of </p>



<ul class="wp-block-list">
<li><strong>Client ID</strong></li>



<li><strong>Client secret</strong></li>
</ul>



<p>You <strong>must</strong> also set a <strong>Redirect URIs</strong> because Spotify <strong>requires you</strong> to use a web browser to authenticate: it&#8217;s not possible to do entirely on the command line (no, you can&#8217;t use CURL either, apparently). </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large is-style-default"><a href="https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37.png"><img decoding="async" width="1024" height="884" data-id="6620" src="https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-1024x884.png" alt="" class="wp-image-6620" srcset="https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-1024x884.png 1024w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-300x259.png 300w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-768x663.png 768w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-1536x1327.png 1536w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-2048x1769.png 2048w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-830x717.png 830w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-230x199.png 230w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-350x302.png 350w, https://dgen.net/0/wp-content/uploads/2023/08/Screenshot-2023-08-06-at-21.57.37-480x415.png 480w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</figure>



<p>This means you need to be able to put a web page <em>somewhere</em> that you can access. I decided to use one of my public web servers, so I can get the image from anywhere, not just at home, but you can use <em>localhost</em>. </p>



<p>Luckily there&#8217;s a <strong>Python</strong> library that does things. So, install python </p>



<pre class="wp-block-preformatted">apt-get install python3</pre>



<p>Also, to use a custom env we also need to add it to a <strong>Python</strong> virtual environment using this:</p>



<pre class="wp-block-preformatted">python3 -m venv myenv<br>source myenv/bin/activate  <br>pip install virtualenv<br>pip freeze > requirements.txt<br>pip install spotipy</pre>



<p>And using <strong><em>source myenv/bin/activate</em></strong> to recall.  </p>



<p>After many iterations (thanks ai), we get to a script:</p>



<p><strong><em>get_spot.py</em></strong></p>



<pre class="wp-block-preformatted">import spotipy
from spotipy.oauth2 import SpotifyOAuth

# Add your credentials here
SPOTIPY_CLIENT_ID = 'your_spotify_client_id'
SPOTIPY_CLIENT_SECRET = 'your_spotify_client_secret'
SPOTIPY_REDIRECT_URI = 'your_redirect_uri'
USERNAME = 'your_username'
SCOPE = "user-read-currently-playing"

# Create Spotify object with permissions
oauth = SpotifyOAuth(client_id=SPOTIPY_CLIENT_ID,
                     client_secret=SPOTIPY_CLIENT_SECRET,
                     redirect_uri=SPOTIPY_REDIRECT_URI,
                     username=USERNAME,
                     scope=SCOPE,
                     open_browser=False)

token_info = oauth.get_cached_token()

# Check if token needs to be refreshed
if token_info and oauth.is_token_expired(token_info):
    token_info = oauth.refresh_access_token(token_info['refresh_token'])

sp = spotipy.Spotify(auth_manager=oauth)

# Get current playing
current_playing = sp.current_user_playing_track()

# Ensure that a track is playing
if current_playing is not None:
    # Get the album art
    album_art = current_playing['item']['album']['images'][0]['url']
    print(album_art)
else:
    print("No track is currently playing.")
</pre>



<p>When you first run this, using</p>



<pre class="wp-block-preformatted">python get_spot.py</pre>



<p>it&#8217;ll give you a URL to copy/paste into a browser so you can authenticate.  </p>



<p>You need to have this as a web page at the <strong>RedirectURI</strong></p>



<pre class="wp-block-preformatted">&lt;div id="authorizationCode"&gt;&lt;/div&gt;
  &lt;script&gt;
    function handleAuthorizationCode() {
      const queryString = window.location.search;
      const urlParams = new URLSearchParams(queryString);
      const authorizationCode = urlParams.get('code');

      const authorizationCodeDiv = document.getElementById('authorizationCode');
      if (authorizationCode) {
        authorizationCodeDiv.innerHTML = `${authorizationCode}`;
        // Do something with the code (e.g., store it for later use)
        // You can also make a POST request to your server to exchange it for an access token
      } else {
        authorizationCodeDiv.innerHTML = 'No authorization code found in the URL.';
        // Handle the case when the user denies permission or other errors
      }
    }

    handleAuthorizationCode();
  &lt;/script&gt;</pre>



<p>Then access it, via <em>&lt;your URL&gt;/&lt;file&gt;?code=&lt;your_ClientID&gt;</em></p>



<p>You need to copy the &#8216;return <strong>URL</strong>&#8216; (not the code it renders) that it generates and paste it back onto the command line prompt.</p>



<p>After you&#8217;ve done that, you can run it again and it&#8217;ll (hopefully) give you a URL directly to the artwork on Spotify&#8217;s CDN, for example:</p>



<pre class="wp-block-preformatted"><a href="https://i.scdn.co/image/ab67616d0000b2737a9230e1ede602936d5056c8">https://i.scdn.co/image/ab67616d0000b2737a9230e1ede602936d5056c8</a></pre>



<p>We can then use <strong>THAT</strong> URL instead of the one I was getting from the amplifier in the previous post. </p>



<p>And, finally, we want to cron this as we did with the local example from last time. </p>



<p><strong>spot.sh</strong> (this time, on the server)</p>



<pre class="wp-block-preformatted">#!/bin/bash

folder='/<em>{path}</em>/spotify'
cd $folder

# Activate the virtual environment and get the album art URL
source $folder/myenv/bin/activate
albumart=$(python $folder/get.py)

# Check if the Python script executed successfully
if [ $? -ne 0 ]; then
  echo "Error: Failed to execute the Python script."
  echo "empty" &gt; status.flag
  exit 1
fi

# Download the album art, or exit with an error message if curl fails
if ! curl -o nowtmp.jpg $albumart; then
  echo "Failed to download album art"
  echo "empty" &gt; status.flag
  exit 1 
fi

# Move the temporary image to 'now.jpg'
mv nowtmp.jpg now.jpg

file now.jpg | awk '{print $2}' &gt; status.flag

# Compute the MD5 checksums of the current and live images
current_checksum=$(md5sum now.jpg  | awk '{print $1}')
live_checksum=$(md5sum live.jpg | awk '{print $1}')

# If the checksums differ, update the live image
if [ "$current_checksum"  != "$live_checksum" ]; then
  cp now.jpg live.jpg
fi </pre>



<p>Then, on the pi, we can do this:</p>



<p><strong>up-spot.sh</strong></p>



<pre class="wp-block-preformatted">#!/bin/bash
cd /<em>{path}</em>/hcm

server=`curl -k https://{server}/{folder}/status.flag`
echo server $server

if [  "$server" = "JPEG" ]; then
 if [ `cat status.flag` = "no" ]; then 
	 echo "yes" &gt; status.flag
  	 cp album-cover-live-safe.html album-cover.html
	 ./refresh.sh
 fi	 
 else 
 if [ `cat status.flag` = "yes" ]; then	 
	 echo "no" &gt; status.flag
 	 cp clock-analogue.html album-cover.html
	 ./refresh.sh
 fi
fi</pre>



<p>and put that into cron on the pi with:</p>



<pre class="wp-block-preformatted">*       *       *       *       *       /{path}/up-spot.sh &gt; /dev/null 2&gt;&amp;1</pre>



<p>and then</p>



<p><strong>test-refresh.sh</strong> becomes</p>



<pre class="wp-block-preformatted">#!/bin/bash
cd /{local path}
hifi=`cat hifi.ip`
albumart="https://{server}/{path}/live.jpg"

nowtmp="nowtmp.jpg"
curl -k $albumart &gt; $nowtmp
wait 

if [ -f "$nowtmp" ]; then 
# echo `date` "file exists: " `du -sk $nowtmp` "and" `md5sum $nowtmp` &gt;&gt; log
 mv nowtmp.jpg now.jpg # do as a step in case latency leads to partial download tests
 x=`md5sum now.jpg  | awk '{print $1}'`
 y=`md5sum live.jpg | awk '{print $1}'`


 if [ "$x" != "$y" ] ; then
#   echo "updating" `date`  $x $y &gt;&gt; log
  cp now.jpg live.jpg
   ./refresh.sh
 fi

fi
</pre>



<p>See the <a href="https://dgen.net/0/2023/07/05/bringing-album-art-back-to-life/">previous post</a> for more on other bits of script and cron.</p>



<p>* I started with &#8220;write a shell script to get the &#8216;now playing&#8217; album art from my spotify account&#8221;</p>



<p><strong>Footnote</strong></p>



<p>As an aside, I found that <a href="https://spotify.aidenwallis.co.uk/">this nice chap</a> has done a *really simple* integration where you just authorise his app and it tells you what&#8217;s playing. Unfortunately, it&#8217;s not generating the images (just the titles) and I didn&#8217;t want to rely on a 3rd party service [hint: Spotify, just make it this easy, good grief!]</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6617</post-id>	</item>
		<item>
		<title>ai code example: animated planetary orbit</title>
		<link>https://dgen.net/0/2023/07/21/ai-code-example-animated-planetary-orbit/</link>
		
		<dc:creator><![CDATA[Gavin]]></dc:creator>
		<pubDate>Fri, 21 Jul 2023 20:31:49 +0000</pubDate>
				<category><![CDATA[astronomy]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[socialchange]]></category>
		<category><![CDATA[stuff]]></category>
		<guid isPermaLink="false">https://dgen.net/0/?p=6502</guid>

					<description><![CDATA[<img width="838" height="504" src="https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17.png" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17.png 838w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-300x180.png 300w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-768x462.png 768w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-830x499.png 830w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-230x138.png 230w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-350x211.png 350w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-480x289.png 480w" sizes="(max-width: 838px) 100vw, 838px" />Today&#8217;s example of how easy AI can make it to write code. The interactive animation below is the final output from various experiments below.[My words [&#8230;]]]></description>
										<content:encoded><![CDATA[<img width="838" height="504" src="https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17.png" class="attachment-large size-large wp-post-image" alt="" style="float:left; margin:0 15px 15px 0;" decoding="async" srcset="https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17.png 838w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-300x180.png 300w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-768x462.png 768w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-830x499.png 830w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-230x138.png 230w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-350x211.png 350w, https://dgen.net/0/wp-content/uploads/2023/07/Screenshot-2023-07-21-at-21.30.17-480x289.png 480w" sizes="(max-width: 838px) 100vw, 838px" />
<p class="has-cyan-bluish-gray-background-color has-background" style="font-size:22px">Today&#8217;s example of how easy AI can make it to write code. The <a href="/w/ai-orbit/shadow.html">interactive animation</a> below is the final output from various experiments below.<br>[My words have this colour background. My instructions to the AI are in bold. <br>The rest of the content on this page is the AI. All of it, including words, code and highlighting.] </p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit/shadow.html" title="ai example" width="100%" height="600px" border="0"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background" style="font-size:22px">To begin with I just asked it the following:<br><strong>write html, css and javascript to demonstrate a planet orbiting the sun</strong><br>It replied&#8230;</p>



<p>Creating a realistic 3D planet orbiting the sun requires more advanced graphics and libraries, but I can show you a basic demonstration using HTML, CSS, and JavaScript that simulates a simple planet orbiting the sun</p>



<p><strong>example.html</strong></p>



<pre class="wp-block-preformatted">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  &lt;title&gt;Orbiting Planet&lt;/title&gt;
  &lt;link rel="stylesheet" href="styles.css"&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class="sun"&gt;&lt;/div&gt;
  &lt;div class="planet"&gt;&lt;/div&gt;
  &lt;script src="script.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>



<p><strong>CSS (styles.css):</strong></p>



<pre class="wp-block-preformatted">body {
  margin: 0;
  padding: 0;
  overflow: hidden;
}

.sun {
  width: 100px;
  height: 100px;
  background-color: orange;
  border-radius: 50%;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.planet {
  width: 30px;
  height: 30px;
  background-color: blue;
  border-radius: 50%;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}</pre>



<p><strong>JavaScript (script.js):</strong></p>



<pre class="wp-block-preformatted">let angle = 0;
const orbitRadius = 150;
const orbitSpeed = 0.005;

function animatePlanet() {
  const planet = document.querySelector('.planet');
  const sun = document.querySelector('.sun');
  const sunRect = sun.getBoundingClientRect();
  const centerX = sunRect.left + sunRect.width / 2;
  const centerY = sunRect.top + sunRect.height / 2;

  const x = centerX + orbitRadius * Math.cos(angle);
  const y = centerY + orbitRadius * Math.sin(angle);

  planet.style.left = x + 'px';
  planet.style.top = y + 'px';

  angle += orbitSpeed;
  requestAnimationFrame(animatePlanet);
}

animatePlanet();
</pre>



<p>This code creates a basic representation of a planet (blue circle) orbiting the sun (orange circle). It uses CSS to position and style the sun and the planet, and JavaScript to calculate the position of the planet as it orbits the sun.</p>



<p>Please note that this is a simplified demonstration and does not include realistic physics or 3D graphics. For more advanced and realistic animations, you would need to use libraries like Three.js or other WebGL frameworks.&#8221;</p>



<p class="has-cyan-bluish-gray-background-color has-background" style="font-size:22px">This is pretty astonishing [<a href="https://dgen.net/w/ai-orbit">output</a>]</p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit" title="ai example" width="100%" height="400px" border="0"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background" style="font-size:22px">but I wasn&#8217;t happy with it being a circular orbit, so I asked it to: <br><strong>redo with an elliptical orbit</strong></p>



<p>Creating an elliptical orbit requires more complex mathematical calculations and is beyond the scope of basic HTML, CSS, and JavaScript. However, I can show you an example using the p5.js library, which is a JavaScript library for creative coding and visualization. The p5.js library simplifies handling graphics and animation, making it easier to demonstrate an elliptical orbit.</p>



<ol class="wp-block-list">
<li>First, include the p5.js library in your HTML file:</li>
</ol>



<pre class="wp-block-preformatted">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  &lt;title&gt;Elliptical Orbit&lt;/title&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"&gt;&lt;/script&gt;
  &lt;style&gt;
    body {
      margin: 0;
      padding: 0;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script src="sketch.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>



<ol class="wp-block-list" start="2">
<li>Next, create a JavaScript file (e.g., &#8220;sketch.js&#8221;) that will handle the animation and display of the elliptical orbit:</li>
</ol>



<pre class="wp-block-preformatted">let sun;
let planet;
let orbitRadiusX = 150;
let orbitRadiusY = 100;
let angle = 0;
let orbitSpeed = 0.01;

function setup() {
  createCanvas(windowWidth, windowHeight);
  sun = createVector(width / 2, height / 2);
  planet = createVector(sun.x + orbitRadiusX, sun.y);
}

function draw() {
  background(240);

  // Draw the sun
  fill('orange');
  ellipse(sun.x, sun.y, 40, 40);

  // Calculate the position of the planet in the elliptical orbit
  let x = sun.x + orbitRadiusX * cos(angle);
  let y = sun.y + orbitRadiusY * sin(angle);

  // Draw the planet
  fill('blue');
  ellipse(x, y, 20, 20);

  // Update the angle for the next frame
  angle += orbitSpeed;
}</pre>



<p>The above code sets up a canvas, defines the sun and planet as vectors, and uses trigonometry to calculate the position of the planet as it moves along an elliptical orbit around the sun. The <code>orbitRadiusX</code> and <code>orbitRadiusY</code> variables determine the shape and size of the elliptical orbit, while the <code>orbitSpeed</code> variable controls the speed of the orbit.</p>



<p>Save these HTML and JavaScript files in the same folder and open the HTML file in a web browser. You should see an animation of a blue planet orbiting an orange sun in an elliptical path. Feel free to adjust the values of <code>orbitRadiusX</code>, <code>orbitRadiusY</code>, and <code>orbitSpeed</code> to experiment with different elliptical orbits.</p>



<p class="has-cyan-bluish-gray-background-color has-background" style="font-size:22px">This is a great example of how game-changing AI is becoming. To see the two bits of code (copy &amp; pasted) in action, click <a href="https://dgen.net/w/ai-orbit">Circular</a> or <a href="https://dgen.net/w/ai-orbit/ellipse.html">Elliptical</a>. Remarkable.</p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit/ellipse.html" title="ai example" width="100%" height="300px"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size">And then my friend Andy noticed it wasn&#8217;t doing a Keplerian orbit, so <br><strong>redo with a keplerian orbit</strong><br>led to this</p>



<p>Creating a Keplerian orbit involves implementing more complex mathematical formulas to simulate the motion of celestial bodies following Kepler&#8217;s laws of planetary motion. To do this, we&#8217;ll use the <code>p5.js</code> library to handle graphics and animation.</p>



<ol class="wp-block-list">
<li>First, include the p5.js library in your HTML file:</li>
</ol>



<pre class="wp-block-preformatted">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  &lt;title&gt;Keplerian Orbit&lt;/title&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"&gt;&lt;/script&gt;
  &lt;style&gt;
    body {
      margin: 0;
      padding: 0;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script src="sketch.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>



<ol class="wp-block-list" start="2">
<li>Next, create a JavaScript file (e.g., &#8220;sketch.js&#8221;) that will handle the animation and display of the Keplerian orbit:</li>
</ol>



<pre class="wp-block-preformatted">let sun;
let planet;
let a; // Semi-major axis
let b; // Semi-minor axis
let angle = 0;
let orbitSpeed = 0.01;

function setup() {
  createCanvas(windowWidth, windowHeight);
  sun = createVector(width / 2, height / 2);
  a = 150; // Set the semi-major axis
  b = 100; // Set the semi-minor axis
  planet = createVector(sun.x + a, sun.y);
}

function draw() {
  background(240);

  // Draw the sun
  fill('orange');
  ellipse(sun.x, sun.y, 40, 40);

  // Calculate the position of the planet in the Keplerian orbit
  let x = sun.x + a * cos(angle);
  let y = sun.y + b * sin(angle);

  // Draw the planet
  fill('blue');
  ellipse(x, y, 20, 20);

  // Update the angle for the next frame
  angle += orbitSpeed;
}
</pre>



<p>The above code sets up a canvas, defines the sun and planet as vectors, and uses trigonometry to calculate the position of the planet following Kepler&#8217;s laws of planetary motion. The <code>a</code> and <code>b</code> variables determine the size and shape of the Keplerian orbit, while the <code>orbitSpeed</code> variable controls the speed of the orbit.</p>



<p>Save these HTML and JavaScript files in the same folder and open the HTML file in a web browser. You should see an animation of a blue planet following a Keplerian orbit around an orange sun. Feel free to adjust the values of <code>a</code>, <code>b</code>, and <code>orbitSpeed</code> to experiment with different Keplerian orbits.</p>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size"><a href="https://dgen.net/w/ai-orbit/kepler.html">Interesting</a> but still not quite there</p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit/kepler.html" title="ai example" width="100%" height="300px"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size">So let&#8217;s <br><strong>place the sun at a focus point and add gravity</strong></p>



<p>To add gravity to the Keplerian orbit simulation, we can use Newton&#8217;s law of universal gravitation to calculate the gravitational force between the sun and the planet. The force will affect the acceleration of the planet, causing it to move in a curved path around the sun.</p>



<p>Here&#8217;s the updated code that includes gravity:</p>



<pre class="wp-block-preformatted">let sun;
let planet;
let a; // Semi-major axis
let b; // Semi-minor axis
let c; // Distance from the center to focus (c = sqrt(a^2 - b^2))
let angle = 0;
let orbitSpeed = 0.01;
let G = 0.5; // Gravitational constant

function setup() {
  createCanvas(windowWidth, windowHeight);
  sun = createVector(width / 2, height / 2);
  a = 150; // Set the semi-major axis
  b = 100; // Set the semi-minor axis
  c = sqrt(a * a - b * b);
  planet = createVector(sun.x + c + a, sun.y);
}

function draw() {
  background(240);

  // Draw the sun at the focus point
  fill('orange');
  ellipse(sun.x, sun.y, 40, 40);

  // Calculate the position of the planet in the Keplerian orbit
  let x = sun.x + c + a * cos(angle);
  let y = sun.y + b * sin(angle);

  // Draw the planet
  fill('blue');
  ellipse(x, y, 20, 20);

  // Calculate the distance between the planet and the sun
  let distance = dist(x, y, sun.x, sun.y);

  // Calculate the gravitational force between the planet and the sun
  let force = G * (1 / (distance * distance));

  // Calculate the angle of the force vector
  let forceAngle = atan2(sun.y - y, sun.x - x);

  // Calculate the acceleration of the planet due to gravity
  let acceleration = force / 1; // We can simplify the mass of the planet as 1

  // Update the planet's velocity based on the acceleration
  orbitSpeed += acceleration;

  // Update the angle for the next frame
  angle += orbitSpeed;
}

</pre>



<p>In this updated code, we introduce the gravitational constant <code>G</code> (you can adjust its value to control the strength of gravity) and calculate the gravitational force between the sun and the planet using Newton&#8217;s law of universal gravitation. The planet&#8217;s acceleration is then updated based on the gravitational force, and its velocity is adjusted accordingly. The result is a more realistic simulation of a Keplerian orbit with gravity affecting the motion of the planet around the sun.</p>



<p>Save these HTML and JavaScript files in the same folder and open the HTML file in a web browser. You should now see an animation of a blue planet following a Keplerian orbit around an orange sun, with gravity affecting its movement. Feel free to experiment with different values of <code>G</code> and other parameters to observe different orbital behaviors.</p>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size"><a href="https://dgen.net/w/ai-orbit/kepler-gravity.html">Very interesting</a>. It get&#8217;s it much more right, but there&#8217;s an acceleration that shouldn&#8217;t be there. The planet spins faster and faster&#8230; </p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit/kepler-gravity.html" title="ai example" width="100%" height="320px"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size">so, rather than try and troubleshoot it, let&#8217;s just ask it<br><strong>why does the speed of the planet accelerate?</strong></p>



<p>Apologies for the confusion in the code. The speed of the planet should not accelerate as a result of gravitational force. In reality, the speed of a planet in a stable orbit around the sun remains constant.</p>



<p>To accurately simulate a stable orbit, we need to use the principles of circular motion and centripetal force. The centripetal force acts perpendicular to the velocity vector, causing the planet to follow a circular path around the sun. In this scenario, the speed of the planet remains constant while its direction continuously changes.</p>



<p>Let&#8217;s correct the code to achieve a stable circular orbit:</p>



<pre class="wp-block-preformatted">let sun;
let planet;
let a; // Semi-major axis
let b; // Semi-minor axis
let c; // Distance from the center to focus (c = sqrt(a^2 - b^2))
let angle = 0;
let orbitSpeed = 0.01;
let G = 0.5; // Gravitational constant

function setup() {
  createCanvas(windowWidth, windowHeight);
  sun = createVector(width / 2, height / 2);
  a = 150; // Set the semi-major axis
  b = 100; // Set the semi-minor axis
  c = sqrt(a * a - b * b);
  planet = createVector(sun.x + c + a, sun.y);
}

function draw() {
  background(240);

  // Draw the sun at the focus point
  fill('orange');
  ellipse(sun.x, sun.y, 40, 40);

  // Calculate the position of the planet in the Keplerian orbit
  let x = sun.x + c + a * cos(angle);
  let y = sun.y + b * sin(angle);

  // Draw the planet
  fill('blue');
  ellipse(x, y, 20, 20);

  // Update the angle for the next frame
  angle += orbitSpeed;
}
</pre>



<p class="has-cyan-bluish-gray-background-color has-background">And, there we have it. We didn&#8217;t even need to understand why the planet was accelerating, or if there was a bug in the code, just ask a question and it corrected itself.</p>



<iframe loading="lazy" src="https://dgen.net/w/ai-orbit/kepler-gravity2.html" title="ai example" width="100%" height="300px"></iframe>



<p class="has-cyan-bluish-gray-background-color has-background has-medium-font-size">I wanted to change the colours and layout a bit, so I asked it to do that too<br><strong>left-align the scene, make the sun yellow, the background black and the planet blue</strong><br>and then I thought it&#8217;d be fun if we made it interactive, so I asked <br><strong>add a slider so I can change the value of G and ensure that the animation updates automatically if the value is changed. put the slider at the top in the middle<br></strong>which it didn&#8217;t get right the first time (the slider moved but the planet speed didn&#8217;t change) so,<br><strong>that isn&#8217;t updating the value of G in the animation<br></strong>which fixed it, and then a final bit of fiddling<br><strong>print the value of G on the screen as well. align the slider so it&#8217;s just above the animation</strong><br><strong>move it 200px left. Keep the value of G next to the slider<br></strong>and so on, which resulted in the <a href="/w/ai-orbit/example.html">interactive example</a> at the top of this page<br><br>And, lastly, for fans of <a href="https://processing.org/">Processing</a>, simply asking it to <br><strong>rewrite this in Processing<br></strong>gave this working code</p>



<pre class="wp-block-preformatted">int sunX, sunY;
float a; // Semi-major axis
float b; // Semi-minor axis
float c; // Distance from the center to focus (c = sqrt(a^2 - b^2))
float angle = 0;
float orbitSpeed = 0.01;
float G = 0.5; // Gravitational constant

void setup() {
  size(800, 600);
  sunX = width / 4;
  sunY = height / 2;
  a = 150; // Set the semi-major axis
  b = 100; // Set the semi-minor axis
  c = sqrt(a * a - b * b);
}

void draw() {
  background(0); // Set background color to black

  // Draw the sun at the focus point
  fill(255, 255, 0); // Change sun color to yellow
  ellipse(sunX, sunY, 40, 40);

  // Calculate the position of the planet in the Keplerian orbit
  float x = sunX + c + a * cos(angle);
  float y = sunY + b * sin(angle);

  // Draw the planet
  fill(0, 0, 255); // Change planet color to blue
  ellipse(x, y, 20, 20);

  // Update the angle for the next frame based on the slider value
  angle += G * orbitSpeed; // Use G to modify orbit speed

  // Display the value of G next to the slider
  fill(255);
  textSize(20);
  text("Gravitational Constant (G): " + G, 20, 20);
}

// Event handler for the slider
void mouseReleased() {
  if (mouseX &gt;= 20 &amp;&amp; mouseX &lt;= 320 &amp;&amp; mouseY &gt;= 40 &amp;&amp; mouseY &lt;= 60) {
    // Map the x-coordinate of the mouse to a value between 0 and 2 for G
    G = map(mouseX, 20, 320, 0, 2);
  }
}
</pre>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6502</post-id>	</item>
	</channel>
</rss>
