<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">

<channel>

<title>Rosano / entries tagged &#34;technical&#34;</title>



<link>https://rosano.ca/log/tag/technical/</link>

<generator>Hugo</generator>

<language>en-ca</language>



<lastBuildDate>Thu, 16 Apr 2026 08:25:44 +0000</lastBuildDate>

<atom:link href="https://rosano.ca/log/tag/technical/feed" rel="self" type="application/rss" /><item>
  <title>fun with redirects</title>
  <link>https://rosano.ca/blog/fun-with-redirects/</link>
  <pubDate>Mon, 18 Mar 2024 12:23:11 +0000</pubDate>
  <guid>https://rosano.ca/blog/fun-with-redirects/</guid>
  <description>Owning my URLs and avoiding link rot since 2012.</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget>Owning my URLs and avoiding link rot since 2012.</nugget><hr>
<div class="content"><blockquote>
<p>If you have a website, what are your earliest meaningful links that still work? I have almost no broken links at least since 2012 because I usually add a redirect whenever something changes.</p></blockquote>
<p>Redirects help links in a healthy web <a href="https://www.w3.org/Provider/Style/URI">resolve</a>, avoid <a href="https://en.wikipedia.org/wiki/Link%5Frot">rot</a>, and <a href="https://worrydream.com/TheWebOfAlexandria">last a long time</a>, but they also increase agency by letting own your data (own your URLs).</p>
<h1 id="own-your-links">own your links</h1>
<p>When I link to a platform I don't control, I try to at least use a URL that I do control. I have found this useful in recent years when switching my newsletter provider (<a href="https://rosano.ca/list">/list</a>), Mastodon instance (<a href="https://rosano.ca/mastodon">/mastodon</a>), or crowdfunding platform (<a href="https://rosano.ca/fund">/fund</a>)–I didn't have to change any links when that happened.</p>
<p>I'm considering even my Twitter account (<a href="https://rosano.ca/twitter">/twitter</a> in case the site goes bankrupt, and GitHub repositories (<a href="https://rosano.ca/hyperdraft-source">/hyperdraft-source</a>) or YouTube videos (<a href="https://rosano.ca/strolling-0172-video">/strolling-0172-video</a>) in case I start self-hosting; neither has happened yet, but if it occurs, I can easily update the destination once and point it somewhere else retroactively.</p>
<h1 id="self-hosting-a-link-manager">self-hosting a link manager</h1>
<figure>
	<img src="https://static.rosano.ca/home/blog/2024-03-18-fun-with-redirects/yourls.png"/>
	<figcaption>about 300 links managed with YOURLS</figcaption>
</figure>
<p>My links tend to be readable, but I like Derek Sivers' idea of making them <a href="https://sive.rs/su">short and speakable</a>. I use <a href="https://yourls.org">YOURLS</a> one-click self-hosted via <a href="https://www.cloudron.io">Cloudron</a> to manage my redirects which makes it easy to have both short and speakable if necessary; the links technically are something like <code>go.rosano.ca/whatever</code>, but because I own the data, I can make it further accessible under my root domain, as <code>rosano.ca/whatever</code> is often shortest, simplest, and most memorable. I also do the same contraction with blog permalinks so that <code>utopia.rosano.ca/interoperable-visions/</code> can be accessed at <code>rosano.ca/interoperable-visions</code>; I stick with <a href="https://ghost.org">Ghost</a>'s simple permalinks design of <code>/post-title-as-a-slug</code> and find it more readable and predictable.</p>
<h1 id="self-hosting-legacy-redirection">self-hosting legacy redirection</h1>
<p>For legacy domains and permalinks, I made a simple <a href="https://github.com/rosano/redirects/blob/master/main.js">single-file Node.js Express app</a> (<code>git push</code> self-hosted via <a href="https://caprover.com">CapRover</a>). There are about two dozen domains pointing to the same app to handle:</p>
<ol>
<li><a href="https://github.com/rosano/redirects/commit/3ed596df0fb4cebe5d32c231b4aecd44de091bbd">removing www.</a></li>
<li><a href="https://github.com/rosano/redirects/commit/52bf5d6ffe8dde9faadc0d71a524d76ec70be8ee">correcting old and mispelled domains</a></li>
<li><a href="https://github.com/rosano/redirects/commit/fbab1be533fc64ed01c0611b630eadb89c59e2a9">redirecting archived projects to a single page</a></li>
<li><a href="https://github.com/rosano/redirects/commit/43eeee14874ded0c16be6e82fcfd786fad4caf22">masking a domain that functions as a landing page</a></li>
<li><a href="https://github.com/rosano/redirects/commit/8a4ce8ed0c309dd4a40c57477e5df80d6fc2ba4f">redirecting PeerTube links to YouTube</a></li>
<li><a href="https://github.com/rosano/redirects/commit/41786338aee47c59e08ed6a7e03fd9a3b715c54e">redirecting gibberish slugs to friendly slugs</a></li>
<li><a href="https://github.com/rosano/redirects/commit/47a9439a5d523ea4cbbc6257e4e40e995c75dd8d">redirecting to the Wayback Machine</a> as a last resort, (but I may have done this one incorrectly, as it might cause some recursive issues).</li>
</ol>
<p>This is hopefully a graceful degradation that takes care to guide existing links somewhere useful. It also supports HTTPS so if you write <code>https://[OLD_DOMAIN]</code> it works, which is not the case when you 'forward' URLs via registrars like <a href="https://www.hover.com">Hover</a> who only support writing <code>http://[OLD_DOMAIN]</code>.</p>
<h1 id="static-versus-dynamic">static versus dynamic</h1>
<p>I love the simplicity of static sites and how they're basically free to keep alive forever, but all of my redirect pipework makes me feel forever tied to dynamic systems. It's possible to redirect via <a href="https://www.w3.org/TR/WCAG20-TECHS/H76.html">meta refresh</a> on a static page but I find it ugly to write and manage with HTML; I'm also not sure if all search engines understand them, although <a href="https://developers.google.com/search/docs/crawling-indexing/special-tags#refresh">Google claims to yet still recommends server-side redirects</a>:</p>
<blockquote>
<p>This tag, commonly called meta-refresh, sends the user to a new URL after a certain amount of time, and is sometimes used as a simple form of redirection. However, it is <a href="https://www.w3.org/TR/WCAG10-HTML-TECHS/#meta-element">not supported by all browsers and can be confusing to the user</a>. We recommend using a server-side <a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects">301 redirect</a> instead.</p></blockquote>
<h1 id="conclusion">conclusion</h1>
<p>Maybe it's the librarian in me that finds it fun to have my stuff organized and moving along smoothly. I like the sense of ownership that comes with being able to direct links where I want, and the care to avoid throwing visitors into the weeds by making sure they land somewhere useful, always and forever.</p>
<hr>
	<p><small>If you want to keep reading, learn about the difference between fragile data and <a href="https://utopia.rosano.ca/durable-data/">durable data</a>, dream some <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">interoperable visions</a> with me, or marvel at how the person who wrote this needed <a href="https://utopia.rosano.ca/sixth-times-a-charm/">six tries to learn iPhone programming</a>.</small></p>
	<hr></div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/self-hosting/">self-hosting</a>, <a href="/log/tag/interop/">interop</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 8:23 am, March 18, 2024" href="/blog/fun-with-redirects/"><time datetime="2024-03-18T08:23:11-04:00" data-pagefind-sort="date[datetime]">08h23</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Monday, March 18, 2024 08h23</title>
  <link>https://rosano.ca/log/2024-03-18-fun-with-redirects/</link>
  <pubDate>Mon, 18 Mar 2024 08:23:11 -0400</pubDate>
  <guid>https://rosano.ca/log/2024-03-18-fun-with-redirects/</guid>
  <description> If you have a website, what are your earliest meaningful links that still work? I have almost no broken links at least since 2012 because I usually add a redirect whenever something changes.&#xA;Redirects help links in a healthy web resolve, avoid rot, and last a long time, but they also increase agency by letting own your data (own your URLs).&#xA;own your links When I link to a platform I don&#39;t control, I try to at least use a URL that I do control. I have found this useful in recent years when switching my newsletter provider (/list), Mastodon instance (/mastodon), or crowdfunding platform (/fund)–I didn&#39;t have to change any links when that happened.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget><blockquote>
<p>If you have a website, what are your earliest meaningful links that still work? I have almost no broken links at least since 2012 because I usually add a redirect whenever something changes.</p></blockquote>
<p>Redirects help links in a healthy web <a href="https://www.w3.org/Provider/Style/URI">resolve</a>, avoid <a href="https://en.wikipedia.org/wiki/Link%5Frot">rot</a>, and <a href="https://worrydream.com/TheWebOfAlexandria">last a long time</a>, but they also increase agency by letting own your data (own your URLs).</p>
<h1 id="own-your-links">own your links</h1>
<p>When I link to a platform I don't control, I try to at least use a URL that I do control. I have found this useful in recent years when switching my newsletter provider (<a href="https://rosano.ca/list">/list</a>), Mastodon instance (<a href="https://rosano.ca/mastodon">/mastodon</a>), or crowdfunding platform (<a href="https://rosano.ca/fund">/fund</a>)–I didn't have to change any links when that happened.</p></nugget><hr>
<div class="content"><blockquote>
<p>If you have a website, what are your earliest meaningful links that still work? I have almost no broken links at least since 2012 because I usually add a redirect whenever something changes.</p></blockquote>
<p>Redirects help links in a healthy web <a href="https://www.w3.org/Provider/Style/URI">resolve</a>, avoid <a href="https://en.wikipedia.org/wiki/Link%5Frot">rot</a>, and <a href="https://worrydream.com/TheWebOfAlexandria">last a long time</a>, but they also increase agency by letting own your data (own your URLs).</p>
<h1 id="own-your-links">own your links</h1>
<p>When I link to a platform I don't control, I try to at least use a URL that I do control. I have found this useful in recent years when switching my newsletter provider (<a href="https://rosano.ca/list">/list</a>), Mastodon instance (<a href="https://rosano.ca/mastodon">/mastodon</a>), or crowdfunding platform (<a href="https://rosano.ca/fund">/fund</a>)–I didn't have to change any links when that happened.</p>
<p>I'm considering even my Twitter account (<a href="https://rosano.ca/twitter">/twitter</a> in case the site goes bankrupt, and GitHub repositories (<a href="https://rosano.ca/hyperdraft-source">/hyperdraft-source</a>) or YouTube videos (<a href="https://rosano.ca/strolling-0172-video">/strolling-0172-video</a>) in case I start self-hosting; neither has happened yet, but if it occurs, I can easily update the destination once and point it somewhere else retroactively.</p>
<h1 id="self-hosting-a-link-manager">self-hosting a link manager</h1>
<figure>
	<img src="https://static.rosano.ca/home/blog/2024-03-18-fun-with-redirects/yourls.png"/>
	<figcaption>about 300 links managed with YOURLS</figcaption>
</figure>
<p>My links tend to be readable, but I like Derek Sivers' idea of making them <a href="https://sive.rs/su">short and speakable</a>. I use <a href="https://yourls.org">YOURLS</a> one-click self-hosted via <a href="https://www.cloudron.io">Cloudron</a> to manage my redirects which makes it easy to have both short and speakable if necessary; the links technically are something like <code>go.rosano.ca/whatever</code>, but because I own the data, I can make it further accessible under my root domain, as <code>rosano.ca/whatever</code> is often shortest, simplest, and most memorable. I also do the same contraction with blog permalinks so that <code>utopia.rosano.ca/interoperable-visions/</code> can be accessed at <code>rosano.ca/interoperable-visions</code>; I stick with <a href="https://ghost.org">Ghost</a>'s simple permalinks design of <code>/post-title-as-a-slug</code> and find it more readable and predictable.</p>
<h1 id="self-hosting-legacy-redirection">self-hosting legacy redirection</h1>
<p>For legacy domains and permalinks, I made a simple <a href="https://github.com/rosano/redirects/blob/master/main.js">single-file Node.js Express app</a> (<code>git push</code> self-hosted via <a href="https://caprover.com">CapRover</a>). There are about two dozen domains pointing to the same app to handle:</p>
<ol>
<li><a href="https://github.com/rosano/redirects/commit/3ed596df0fb4cebe5d32c231b4aecd44de091bbd">removing www.</a></li>
<li><a href="https://github.com/rosano/redirects/commit/52bf5d6ffe8dde9faadc0d71a524d76ec70be8ee">correcting old and mispelled domains</a></li>
<li><a href="https://github.com/rosano/redirects/commit/fbab1be533fc64ed01c0611b630eadb89c59e2a9">redirecting archived projects to a single page</a></li>
<li><a href="https://github.com/rosano/redirects/commit/43eeee14874ded0c16be6e82fcfd786fad4caf22">masking a domain that functions as a landing page</a></li>
<li><a href="https://github.com/rosano/redirects/commit/8a4ce8ed0c309dd4a40c57477e5df80d6fc2ba4f">redirecting PeerTube links to YouTube</a></li>
<li><a href="https://github.com/rosano/redirects/commit/41786338aee47c59e08ed6a7e03fd9a3b715c54e">redirecting gibberish slugs to friendly slugs</a></li>
<li><a href="https://github.com/rosano/redirects/commit/47a9439a5d523ea4cbbc6257e4e40e995c75dd8d">redirecting to the Wayback Machine</a> as a last resort, (but I may have done this one incorrectly, as it might cause some recursive issues).</li>
</ol>
<p>This is hopefully a graceful degradation that takes care to guide existing links somewhere useful. It also supports HTTPS so if you write <code>https://[OLD_DOMAIN]</code> it works, which is not the case when you 'forward' URLs via registrars like <a href="https://www.hover.com">Hover</a> who only support writing <code>http://[OLD_DOMAIN]</code>.</p>
<h1 id="static-versus-dynamic">static versus dynamic</h1>
<p>I love the simplicity of static sites and how they're basically free to keep alive forever, but all of my redirect pipework makes me feel forever tied to dynamic systems. It's possible to redirect via <a href="https://www.w3.org/TR/WCAG20-TECHS/H76.html">meta refresh</a> on a static page but I find it ugly to write and manage with HTML; I'm also not sure if all search engines understand them, although <a href="https://developers.google.com/search/docs/crawling-indexing/special-tags#refresh">Google claims to yet still recommends server-side redirects</a>:</p>
<blockquote>
<p>This tag, commonly called meta-refresh, sends the user to a new URL after a certain amount of time, and is sometimes used as a simple form of redirection. However, it is <a href="https://www.w3.org/TR/WCAG10-HTML-TECHS/#meta-element">not supported by all browsers and can be confusing to the user</a>. We recommend using a server-side <a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects">301 redirect</a> instead.</p></blockquote>
<h1 id="conclusion">conclusion</h1>
<p>Maybe it's the librarian in me that finds it fun to have my stuff organized and moving along smoothly. I like the sense of ownership that comes with being able to direct links where I want, and the care to avoid throwing visitors into the weeds by making sure they land somewhere useful, always and forever.</p>
<hr>
	<p><small>If you want to keep reading, learn about the difference between fragile data and <a href="https://utopia.rosano.ca/durable-data/">durable data</a>, dream some <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">interoperable visions</a> with me, or marvel at how the person who wrote this needed <a href="https://utopia.rosano.ca/sixth-times-a-charm/">six tries to learn iPhone programming</a>.</small></p>
	<hr></div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/self-hosting/">self-hosting</a>, <a href="/log/tag/interop/">interop</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 8:23 am, March 18, 2024" href="/log/2024-03-18-fun-with-redirects/"><time datetime="2024-03-18T08:23:11-04:00" data-pagefind-sort="date[datetime]">08h23</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>durable data</title>
  <link>https://rosano.ca/blog/durable-data/</link>
  <pubDate>Wed, 21 Feb 2024 14:24:24 +0000</pubDate>
  <guid>https://rosano.ca/blog/durable-data/</guid>
  <description>Data ownership baked into how the system works, no goodwill needed, making people feel safe as in a long-term relationship.</description>
  <content:encoded><![CDATA[
  <div class="post">

<p class="feature-image"><img src="https://static.rosano.ca/home/tags/technical/test.jpg" aria-hidden="true"></p><nugget>Data ownership baked into how the system works, no goodwill needed, making people feel safe as in a long-term relationship.</nugget><hr>
<div class="content"><p>After the experiences that prompted my <a href="https://utopia.rosano.ca/encryption-rant/">encryption rant</a>, I have started to notice other moments when my digital stuff seems precarious, fleeting, as if slipping out of my hands; I hope to describe this a little and then consider some solutions.</p>
<h1 id="fragile-data">fragile data</h1>
<p>Encrypted messaging apps (like Signal and WhatsApp) can be <a href="https://utopia.rosano.ca/encryption-rant/">volatile</a>: you can easily lose access to your conversations; messages can fail to sync or deliver; your data might be secure with encryption, yet still trapped in an app.</p>
<p><a href="https://www.beeper.com">Beeper</a> and <a href="https://texts.com">Texts</a> help bring your messaging app data in one place, but export is not yet possible, even with open-source <a href="https://element.io">Element</a> and the half dozen <a href="https://matrix.org">Matrix</a> clients I've tried.</p>
<p>Platforms (like Discord, Slack, Telegram, or Facebook) don't let you own your messages: their systems can go offline and temporarily obstruct access; one of your contacts can delete their account and disappear your correspondence; smaller ones get <a href="https://ourincrediblejourney.tumblr.com">acquired or shut down</a>; you can only hope to get your data out or somewhere useful; your 'permalinks' (which you didn't own or control) break (remember that <a href="https://www.w3.org/Provider/Style/URI">cool URLs don't change</a>).</p>
<p>Microblogging platforms make it hard to own your posts: Twitter oscillates in states of chaos; Mastodon (or ActivityPub) ties them to whichever server you published from; Bluesky claims to let you move your data, but somehow it's not directly tangible.</p>
<p>Self-hosting gives you more control, but you still might end up losing stuff to 'export'. <a href="https://discourse.org">Discourse</a> will give you SQL that has 'everything', which you need technical expertise to 'do something'; <a href="https://datasette.io">Datasette</a> can be helpful to browse what you have and maybe convert to more accessible formats. <a href="https://ghost.org">Ghost</a> claims creators get &quot;access to 100% of their data&quot;, and WordPress claims you can &quot;Own your data, all of it&quot;, but both their exports only include what <em>they</em> consider important; to actually get 'everything', you need to have systems administrator expertise to export SQL and download your images or attachments, then more expertise once you have all that and want to 'do something'. <a href="https://twitter.com/andy%5Fmatuschak/status/1452438176996347907">Consider export harmful</a> unless proven otherwise.</p>
<p>I've been enthusiastic about <a href="https://0data.app">personal data stores</a>, but can admit it doesn't feel like it's <a href="https://utopia.rosano.ca/interoperable-visions/#there-but-invisible">in my hands</a>.</p>
<hr>
<p>Let's summarize 'fragile data' as:</p>
<ul>
<li>volatile access</li>
<li>limited or no export</li>
<li>data tied to a provider</li>
<li>unusable formats (needing technical expertise)</li>
<li>hard to see or manipulate data directly</li>
</ul>
<h1 id="durable-data">durable data</h1>
<p>I want to stop my stuff slipping out of reach as platforms change, depending on companies to stay around and hold it for me, or losing it to 'security', 'encryption', and 'export'. I want to have all my correspondence, publishing, and data, forever, defragmented from various networks and apps. I want to search my archive. I want to avoid being tied to a risky provider or format.</p>
<p>So far, the options that feel durable to me are email, files, Delta Chat, and git: they all continue to work, are supported by older systems and diverse new ones, and enable interesting possibilities via interop; the closest to 'future-proof' that I'm aware of.</p>
<h2 id="email">email</h2>
<p>Email will likely be around <a href="https://en.wikipedia.org/wiki/Lindy%5Feffect">for at least as long as it has been around</a> and remains ubiquitous and accessible to more people than any other data storage system. You can take your messages with you, switch providers, interact with everything in a variety of apps and clients.</p>
<p>Too bad many associate it with 'transactional B.S. from startups', 'marketing offers', 'newsletters one can't unsubscribe to', '10,000+ unread and no way to process'. Comprehensive solutions to <a href="https://en.wikipedia.org/wiki/Information%5Foverload">information overload</a> would be beyond the scope of what I'm writing (off the cuff, I can think of <a href="https://www.hey.com">technical</a>, <a href="https://calmtech.com">philosophical</a>, <a href="https://en.wikipedia.org/wiki/Email%5Fbankruptcy">social</a>, and <a href="https://en.wikipedia.org/wiki/Right%5Fto%5Fdisconnect">political</a> ones), but even if your main account isn't usable, it's easy and basically free to create a quiet new one to play with possibilities.</p>
<p>Email is a nice way to store data associated with a specific moment in time without considering how to structure files or tag items. Sometimes when I research an answer that I likely won't need anymore, I send myself an email instead of putting it in my notes. I would love to have a rich summary of activity on various platforms periodically archived there to maintain my history. Gmail used to harmonize chats and email by archiving and automatically grouping messages by conversation.</p>
<p>Email means copies. Using platforms with their own messaging system relies on the site to be online and hold your messages, while it's also possible for them to go offline (temporarily or permanently), erase data of someone who deletes their account, and sell or get acquired (sending your data who knows where). I used to delete emails with 'messages' sent on these platforms, but now I keep them as I don't trust the platform to do it for me.</p>
<p>Email is the original 'all your stuff in one place that you control', and as long it's designed to protect and respect your attention, it can serve an important function in supporting more durable data.</p>
<h2 id="files">files</h2>
<p>I don't like managing files and consider them a holdover from an older time, preferring interoperable apps (ideally as <a href="https://utopia.rosano.ca/interoperable-visions/#flexibility-through-pluralism">pluralistic lenses on data</a>), yet they remain a useful <a href="https://stephango.com/file-over-app">response to ephemeral software</a>. Files let you <a href="https://www.geoffreylitt.com/2021/03/05/bring-your-own-client.html">choose how to use them</a>, and can be moved between different devices or storage providers.</p>
<p>I don't like hand-editing CSV, reading JSON or XML or HTML, but I'll be able to 'do something' with them probably forever. Plaintext is the way to my heart, and also one of the most interoperable types out there.</p>
<p>There are so many common formats and it's not easy to get an ecosystem to agree on which ones to use. Despite their limitations, having the data stored this way liberates it from any app. Your data could be available in these formats through export or integrations, but ultimately the app developer chooses whether to make that available; some solutions could be to ask people nicely, pressure companies publicly, or <a href="https://beepb00p.xyz/myinfra.html">take it ourselves</a>.</p>
<h2 id="delta-chat">Delta Chat</h2>
<p>(Disclosure: I've done paid work in the past to help with this project. I write my own opinions here to describe how it relates to durable data.)</p>
<p><a href="https://delta.chat">Delta Chat</a> uses your existing email account as a messaging app, and lets you do many things you'd want to do with apps like Signal and WhatsApp.</p>
<p>Unlike other messaging apps: you can move your messages between providers as easily as email; if the app goes away or stops working, you'll still have access to your messages (even if encrypted); it can help defragment your social graph across various platforms; it supports <a href="https://webxdc.org">webxdc</a> as an emerging way to do 'app things', including collaboration; it requires no permission, no company, and &quot;no coins&quot; to participate.</p>
<p>As documented in <a href="https://utopia.rosano.ca/encryption-rant/">encryption rant</a>, it's easy to transfer devices and never leaves me with the feeling that my messages will disappear. And because the data is stored in my email account, it's not dependent on any app, including Delta Chat itself.</p>
<p>It's basically as durable as email, with extra features and benefits: one approach to 'email without crap'.</p>
<h2 id="git-and-github">git and GitHub</h2>
<p>GitHub still leans technical but is becoming increasingly accessible.</p>
<p>It turns git into version control you can see and lets you edit directly on the site without installing apps.</p>
<p>There are virtually infinite integrations and automations available.</p>
<p>Backup, replication, and copies are built into the underlying technology.</p>
<p>Git enables <a href="https://subconscious.substack.com/p/credible-exit">credible exit</a> from GitHub so you can take your files with you.</p>
<p>It's also collaborative and doesn't rely on a specific app's format of version control.</p>
<p>Connecting <a href="https://utopia.rosano.ca/github-as-storage/">GitHub as the storage backend</a> for apps would be a powerful way to enable backup and sync to multiple devices.</p>
<h1 id="building-for-ownership">building for ownership</h1>
<p>There's a reason why <a href="https://0data.app">Zero Data</a> defines data ownership specifically to mean 'having access without export or permission'. In the sea of shiny features advertised by apps, startups, and projects, it can be confusing to understand whether you actually have or own your stuff in the end.</p>
<p>'Encryption' helps avoid unauthorized access, but <a href="https://utopia.rosano.ca/encryption-rant/">your data could easily disappear</a>.</p>
<p>Many efforts that use the '<a href="https://www.inkandswitch.com/local-first/">local-first</a>' label focus on 'working offline', 'sync', and 'collaboration via CRDTs' without consideration for the seventh ideal of data ownership (perhaps leaving some company holding the data); in this way, plenty of Apple software could be misunderstood as 'local-first' while locking data into their ecosystem; <a href="https://dxos.org">DXOS</a> is the closest I've seen to doing local-first right.</p>
<p>Ideally, data ownership is not a coincidental byproduct of someone's goodwill, but rather baked into how the system works. It should go beyond a technical concept to make people feel safe and able to trust the space as they might in a long-term relationship.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/interop/">interop</a>, <a href="/log/tag/zero-data/">zero data</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:24 am, February 21, 2024" href="/blog/durable-data/"><time datetime="2024-02-21T09:24:24-05:00" data-pagefind-sort="date[datetime]">09h24</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Wednesday, February 21, 2024 09h24</title>
  <link>https://rosano.ca/log/2024-02-21-durable-data/</link>
  <pubDate>Wed, 21 Feb 2024 09:24:24 -0500</pubDate>
  <guid>https://rosano.ca/log/2024-02-21-durable-data/</guid>
  <description>After the experiences that prompted my encryption rant, I have started to notice other moments when my digital stuff seems precarious, fleeting, as if slipping out of my hands; I hope to describe this a little and then consider some solutions.&#xA;fragile data Encrypted messaging apps (like Signal and WhatsApp) can be volatile: you can easily lose access to your conversations; messages can fail to sync or deliver; your data might be secure with encryption, yet still trapped in an app.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<p class="feature-image"><img src="https://static.rosano.ca/home/tags/technical/test.jpg" aria-hidden="true"></p><nugget><p>After the experiences that prompted my <a href="https://utopia.rosano.ca/encryption-rant/">encryption rant</a>, I have started to notice other moments when my digital stuff seems precarious, fleeting, as if slipping out of my hands; I hope to describe this a little and then consider some solutions.</p>
<h1 id="fragile-data">fragile data</h1>
<p>Encrypted messaging apps (like Signal and WhatsApp) can be <a href="https://utopia.rosano.ca/encryption-rant/">volatile</a>: you can easily lose access to your conversations; messages can fail to sync or deliver; your data might be secure with encryption, yet still trapped in an app.</p></nugget><hr>
<div class="content"><p>After the experiences that prompted my <a href="https://utopia.rosano.ca/encryption-rant/">encryption rant</a>, I have started to notice other moments when my digital stuff seems precarious, fleeting, as if slipping out of my hands; I hope to describe this a little and then consider some solutions.</p>
<h1 id="fragile-data">fragile data</h1>
<p>Encrypted messaging apps (like Signal and WhatsApp) can be <a href="https://utopia.rosano.ca/encryption-rant/">volatile</a>: you can easily lose access to your conversations; messages can fail to sync or deliver; your data might be secure with encryption, yet still trapped in an app.</p>
<p><a href="https://www.beeper.com">Beeper</a> and <a href="https://texts.com">Texts</a> help bring your messaging app data in one place, but export is not yet possible, even with open-source <a href="https://element.io">Element</a> and the half dozen <a href="https://matrix.org">Matrix</a> clients I've tried.</p>
<p>Platforms (like Discord, Slack, Telegram, or Facebook) don't let you own your messages: their systems can go offline and temporarily obstruct access; one of your contacts can delete their account and disappear your correspondence; smaller ones get <a href="https://ourincrediblejourney.tumblr.com">acquired or shut down</a>; you can only hope to get your data out or somewhere useful; your 'permalinks' (which you didn't own or control) break (remember that <a href="https://www.w3.org/Provider/Style/URI">cool URLs don't change</a>).</p>
<p>Microblogging platforms make it hard to own your posts: Twitter oscillates in states of chaos; Mastodon (or ActivityPub) ties them to whichever server you published from; Bluesky claims to let you move your data, but somehow it's not directly tangible.</p>
<p>Self-hosting gives you more control, but you still might end up losing stuff to 'export'. <a href="https://discourse.org">Discourse</a> will give you SQL that has 'everything', which you need technical expertise to 'do something'; <a href="https://datasette.io">Datasette</a> can be helpful to browse what you have and maybe convert to more accessible formats. <a href="https://ghost.org">Ghost</a> claims creators get &quot;access to 100% of their data&quot;, and WordPress claims you can &quot;Own your data, all of it&quot;, but both their exports only include what <em>they</em> consider important; to actually get 'everything', you need to have systems administrator expertise to export SQL and download your images or attachments, then more expertise once you have all that and want to 'do something'. <a href="https://twitter.com/andy%5Fmatuschak/status/1452438176996347907">Consider export harmful</a> unless proven otherwise.</p>
<p>I've been enthusiastic about <a href="https://0data.app">personal data stores</a>, but can admit it doesn't feel like it's <a href="https://utopia.rosano.ca/interoperable-visions/#there-but-invisible">in my hands</a>.</p>
<hr>
<p>Let's summarize 'fragile data' as:</p>
<ul>
<li>volatile access</li>
<li>limited or no export</li>
<li>data tied to a provider</li>
<li>unusable formats (needing technical expertise)</li>
<li>hard to see or manipulate data directly</li>
</ul>
<h1 id="durable-data">durable data</h1>
<p>I want to stop my stuff slipping out of reach as platforms change, depending on companies to stay around and hold it for me, or losing it to 'security', 'encryption', and 'export'. I want to have all my correspondence, publishing, and data, forever, defragmented from various networks and apps. I want to search my archive. I want to avoid being tied to a risky provider or format.</p>
<p>So far, the options that feel durable to me are email, files, Delta Chat, and git: they all continue to work, are supported by older systems and diverse new ones, and enable interesting possibilities via interop; the closest to 'future-proof' that I'm aware of.</p>
<h2 id="email">email</h2>
<p>Email will likely be around <a href="https://en.wikipedia.org/wiki/Lindy%5Feffect">for at least as long as it has been around</a> and remains ubiquitous and accessible to more people than any other data storage system. You can take your messages with you, switch providers, interact with everything in a variety of apps and clients.</p>
<p>Too bad many associate it with 'transactional B.S. from startups', 'marketing offers', 'newsletters one can't unsubscribe to', '10,000+ unread and no way to process'. Comprehensive solutions to <a href="https://en.wikipedia.org/wiki/Information%5Foverload">information overload</a> would be beyond the scope of what I'm writing (off the cuff, I can think of <a href="https://www.hey.com">technical</a>, <a href="https://calmtech.com">philosophical</a>, <a href="https://en.wikipedia.org/wiki/Email%5Fbankruptcy">social</a>, and <a href="https://en.wikipedia.org/wiki/Right%5Fto%5Fdisconnect">political</a> ones), but even if your main account isn't usable, it's easy and basically free to create a quiet new one to play with possibilities.</p>
<p>Email is a nice way to store data associated with a specific moment in time without considering how to structure files or tag items. Sometimes when I research an answer that I likely won't need anymore, I send myself an email instead of putting it in my notes. I would love to have a rich summary of activity on various platforms periodically archived there to maintain my history. Gmail used to harmonize chats and email by archiving and automatically grouping messages by conversation.</p>
<p>Email means copies. Using platforms with their own messaging system relies on the site to be online and hold your messages, while it's also possible for them to go offline (temporarily or permanently), erase data of someone who deletes their account, and sell or get acquired (sending your data who knows where). I used to delete emails with 'messages' sent on these platforms, but now I keep them as I don't trust the platform to do it for me.</p>
<p>Email is the original 'all your stuff in one place that you control', and as long it's designed to protect and respect your attention, it can serve an important function in supporting more durable data.</p>
<h2 id="files">files</h2>
<p>I don't like managing files and consider them a holdover from an older time, preferring interoperable apps (ideally as <a href="https://utopia.rosano.ca/interoperable-visions/#flexibility-through-pluralism">pluralistic lenses on data</a>), yet they remain a useful <a href="https://stephango.com/file-over-app">response to ephemeral software</a>. Files let you <a href="https://www.geoffreylitt.com/2021/03/05/bring-your-own-client.html">choose how to use them</a>, and can be moved between different devices or storage providers.</p>
<p>I don't like hand-editing CSV, reading JSON or XML or HTML, but I'll be able to 'do something' with them probably forever. Plaintext is the way to my heart, and also one of the most interoperable types out there.</p>
<p>There are so many common formats and it's not easy to get an ecosystem to agree on which ones to use. Despite their limitations, having the data stored this way liberates it from any app. Your data could be available in these formats through export or integrations, but ultimately the app developer chooses whether to make that available; some solutions could be to ask people nicely, pressure companies publicly, or <a href="https://beepb00p.xyz/myinfra.html">take it ourselves</a>.</p>
<h2 id="delta-chat">Delta Chat</h2>
<p>(Disclosure: I've done paid work in the past to help with this project. I write my own opinions here to describe how it relates to durable data.)</p>
<p><a href="https://delta.chat">Delta Chat</a> uses your existing email account as a messaging app, and lets you do many things you'd want to do with apps like Signal and WhatsApp.</p>
<p>Unlike other messaging apps: you can move your messages between providers as easily as email; if the app goes away or stops working, you'll still have access to your messages (even if encrypted); it can help defragment your social graph across various platforms; it supports <a href="https://webxdc.org">webxdc</a> as an emerging way to do 'app things', including collaboration; it requires no permission, no company, and &quot;no coins&quot; to participate.</p>
<p>As documented in <a href="https://utopia.rosano.ca/encryption-rant/">encryption rant</a>, it's easy to transfer devices and never leaves me with the feeling that my messages will disappear. And because the data is stored in my email account, it's not dependent on any app, including Delta Chat itself.</p>
<p>It's basically as durable as email, with extra features and benefits: one approach to 'email without crap'.</p>
<h2 id="git-and-github">git and GitHub</h2>
<p>GitHub still leans technical but is becoming increasingly accessible.</p>
<p>It turns git into version control you can see and lets you edit directly on the site without installing apps.</p>
<p>There are virtually infinite integrations and automations available.</p>
<p>Backup, replication, and copies are built into the underlying technology.</p>
<p>Git enables <a href="https://subconscious.substack.com/p/credible-exit">credible exit</a> from GitHub so you can take your files with you.</p>
<p>It's also collaborative and doesn't rely on a specific app's format of version control.</p>
<p>Connecting <a href="https://utopia.rosano.ca/github-as-storage/">GitHub as the storage backend</a> for apps would be a powerful way to enable backup and sync to multiple devices.</p>
<h1 id="building-for-ownership">building for ownership</h1>
<p>There's a reason why <a href="https://0data.app">Zero Data</a> defines data ownership specifically to mean 'having access without export or permission'. In the sea of shiny features advertised by apps, startups, and projects, it can be confusing to understand whether you actually have or own your stuff in the end.</p>
<p>'Encryption' helps avoid unauthorized access, but <a href="https://utopia.rosano.ca/encryption-rant/">your data could easily disappear</a>.</p>
<p>Many efforts that use the '<a href="https://www.inkandswitch.com/local-first/">local-first</a>' label focus on 'working offline', 'sync', and 'collaboration via CRDTs' without consideration for the seventh ideal of data ownership (perhaps leaving some company holding the data); in this way, plenty of Apple software could be misunderstood as 'local-first' while locking data into their ecosystem; <a href="https://dxos.org">DXOS</a> is the closest I've seen to doing local-first right.</p>
<p>Ideally, data ownership is not a coincidental byproduct of someone's goodwill, but rather baked into how the system works. It should go beyond a technical concept to make people feel safe and able to trust the space as they might in a long-term relationship.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/interop/">interop</a>, <a href="/log/tag/zero-data/">zero data</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:24 am, February 21, 2024" href="/log/2024-02-21-durable-data/"><time datetime="2024-02-21T09:24:24-05:00" data-pagefind-sort="date[datetime]">09h24</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>encryption rant</title>
  <link>https://rosano.ca/blog/encryption-rant/</link>
  <pubDate>Wed, 21 Feb 2024 14:23:43 +0000</pubDate>
  <guid>https://rosano.ca/blog/encryption-rant/</guid>
  <description>Robustly-secured data that can surprisingly vanish at a moments notice.</description>
  <content:encoded><![CDATA[
  <div class="post">

<p class="feature-image"><img src="https://static.rosano.ca/home/tags/technical/Screen-Shot-2024-02-14-at-11.30.50-copy-export.jpg" aria-hidden="true"></p><nugget>Robustly-secured data that can surprisingly vanish at a moments notice.</nugget><hr>
<div class="content"><p><small>👋 Heads up: if you're more interested in solutions, read <a href="https://utopia.rosano.ca/durable-data/">durable data</a>.</small></p>
<hr>
<p>This sort of 'complain-y' post fleshes out my <a href="https://mastodon.online/@rosano/110685716693430299">encryption thread</a> to highlight how data becoming inaccessible might feel to someone less tech-oriented than I am and who isn't going to document their experience; if you're a technology wrangler, read the rest of this while putting yourself in the shoes of someone whose relationship with owning data might be &quot;new phone, please send your number&quot;.</p>
<h1 id="encrypted-bricks">encrypted bricks</h1>
<p>In the end of 2023 I experienced the co-incidental deprecation of multiple messaging apps simultaneously. <a href="https://whatsapp.com">WhatsApp</a>, <a href="https://signal.org">Signal</a>, and <a href="https://www.beeper.com">Beeper</a> either suddenly stopped working or warned about 'going away soon'.</p>
<p><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2023.11.07-16.56.23.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2024.01.26-at-07.19.54.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/Screen-Shot-2024-02-17-at-10.06.50.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2023.11.07-18.21.46.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/Screen-Shot-2024-02-17-at-16.34.05.png" aria-hidden="true">
</gallery></p>
<figure><figcaption>removing native support for older systems</figcaption></figure>
<p>As a technologist, I can vaguely guess it's tied to something like 'availability of better encryption primitives or standards on newer versions of the operating system', but to a non-tech person it might be strange how WhatsApp says &quot;you can use their web version instead, without upgrading your computer, but the native version that was working yesterday 'needs to' stop working today because of 'security'&quot;.</p>
<p>This could nicely tie into imagined stories of planned obsolescence and 'Apple pushing people to always get new stuff' even if that might not be what's really happening here; without technical knowledge, how would you tell the difference?</p>
<p>Also weird how many of these run in Electron (Chrome) as web apps with some kind of server component, but they don't work in a normal web browser.</p>
<h1 id="volatile-updates">volatile updates</h1>
<p>It's fine that Beeper is no longer compatible with my older version of macOS, but not fine that the underlying self-update framework (<a href="https://github.com/Squirrel/Squirrel.Mac/issues/275">Squirrel</a>) forces an upgrade to a version that doesn't run on my machine: when is that ever desirable?</p>
<p>The threat of these workflow disruptions means one needs to keep backup copies of apps or lock them from being changed to prevent unintended updates.</p>
<figure>
<p><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/Untitled-2-export.jpg" aria-hidden="true">
</p>
<figcaption>locking Element on macOS to prevent it from incompatible upgrades</figcaption>
</figure>
<p>locking Element on macOS to prevent it from incompatible upgrades</p>
<h1 id="moving-devices">moving devices</h1>
<p>Transferring both WhatsApp and Signal messages to a new phone, there's a scary thought (and real possibility) that all my messages could suddenly disappear because of 'security'. Since the app's transfer interface doesn't assure me of the correct path, I need to find the <a href="https://faq.whatsapp.com/209942271778103/">eight-</a> to <a href="https://support.signal.org/hc/en-us/articles/360007059752-Backup-and-Restore-Messages">thirteen-</a>step guide via a search engine and precisely follow it in order to understand and not mess up.</p>
<p>WhatsApp's transfer process simply didn't appear for me, but I was able to just re-register my number on the new phone (<a href="https://support.apple.com/en-us/HT204184#computer">restored from iOS full backup</a>) and unlock my data; phew, glad I didn't trust the <em>documented process</em> and relied on luck or a third party like Apple instead.</p>
<p>Signal's QR-code-based local network transfer is more straight-forward, but repeatedly failed at 99%, which although probably contains all my data, will not let me manage the last inch, thus leaving me locked out. After changing Wi-Fi networks, with a crash for success, it seemed to make it over safely.</p>
<p>Now, even though my messages are there at the moment, there's a lingering worry that my path was not acceptable for 'security' and so it might all get randomly taken away from me some day; this comes from seeing how message history is often not available on new linked devices. It doesn't matter whether my imagined story about possibly losing data is real. Does the experience make you feel safe? Does it reassure you that you have your data? Or does it threaten that you could become signed out and lose everything 'for your own protection'?</p>
<p><a href="https://delta.chat">Delta Chat</a> has the simplest device transfer and even an equivalent of 'changing your number'; the messages are also encrypted, yet I never worry about losing them.</p>
<h1 id="clean-by-accident">clean by accident</h1>
<p>If you can't afford larger storage capacity, you might find yourself managing space on your device. While cleanup up earlier in the year, I accidentally deleted Signal because my screen stalled — throw away your old, slower devices as they quickly become obsolete, right? — and my finger tapped and swiped perfectly because of muscle memory. My years of chat history were just gone. I have some messages on another linked device, but no possibility to export or transfer or merge because their desktop version is only 'linked' and not 'special', awaiting the next unfortunate accident; it sends the message that 'security' lacks agency.</p>
<h1 id="decentralized-if-you-know-how">decentralized if you know how</h1>
<p>Is the solution is an open standard like <a href="https://matrix.org">Matrix</a>? It's not so easy. Their <a href="https://joinmatrix.org">&quot;join&quot; explainer</a> is not as intuitive as other decentralized projects like <a href="https://joinmastodon.org">Mastodon</a>, <a href="https://joinpeertube.org">PeerTube</a>, or <a href="https://join-lemmy.org">Lemmy</a>. I don't believe a non-programmer would be able to do this without help, but assuming they sort through and understand the options of picking both a server and client, they will get stuck on errors like &quot;Unable to decrypt message&quot;, &quot;Verification failed&quot;, and the scary thought of losing messages if you log out.</p>
<p><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2023.11.23-at-14.31.33-1.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2024-02-14-at-12-12-14-1.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2024-02-14-at-12-12-48-1.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/IMG_E7520-1.JPG" aria-hidden="true">
</gallery></p>
<figure><figcaption>scary messages</figcaption></figure>
<p><gallery><img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2024.01.03-at-10-20-25.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/blog/2024-02-21-encryption-rant/2024.01.03-at-10-20-37.jpg" aria-hidden="true">
</gallery></p>
<figure><figcaption>do these match?</figcaption></figure>
<p>Well, it was tricky to figure out how to trigger the Matrix verification process, but I managed to revive access to my Beeper messages with <a href="https://fluffychat.im">FluffyChat</a> (which really might be &quot;The cutest messenger in the Matrix network&quot;), and it's nice to have access to my data in a variety of web apps that will probably remain backwards compatible forever. Still, &quot;I managed to get it working&quot; is a hard sell for normal people.</p>
<h1 id="export-impossible">export impossible</h1>
<p>I still have yet to see a built-in way to export all my messages at once with Signal, WhatsApp, or any popular Matrix client. It's possible to <a href="https://unix.stackexchange.com/questions/505008/signal-desktop-how-to-export-messages">get a copy of some Signal Desktop messages</a> with tools like <a href="https://github.com/tbvdm/sigtop">sigtop</a> and <a href="https://github.com/signalapp/Signal-Desktop/issues/2516#issuecomment-442797638">sqlcipher</a> if you're comfortable typing into a terminal (I'm not). <a href="https://imazing.com">iMazing</a> lets you export messages and attachments from WhatsApp. Not being part of official app interfaces just feels like platform capture to me: data in, but not out.</p>
<h1 id="secure-complex-fragile">secure, complex, fragile</h1>
<p>Why does all this 'security' have to feel so fragile? What does it mean when 'robustly-secured data' can accidentally vanish at a moment's notice, or that I can back up my entire phone for peace of mind, except for 'secure things'? Should it be normal to expect people to simply upgrade their operating system to the latest version when it's known to likely cause a slew of random issues?</p>
<p>How are ordinary people supposed to feel good about this? There may be workarounds, and maybe I'm even just taking the wrong approach in everything I've documented here, but if someone like me can't figure it out, it's bad: for people outside the tech world with little time or capacity to deal with these kinds of issues, the seeming possibility of them occurring is scary and unsafe, even if not real; for software developers to treat these circumstances as mere 'policy' is not very empathetic.</p>
<p>It's important to give space and patience to technology under development as people make it work, but there's no feigning moral superiority in using 'alternative tech' until it includes a real foundation to stand on for people without this domain expertise. Fleeting personal data is like alternative tech's equivalent of platform enshitification and doesn't fill me with confidence to trust these systems or recommend my non-tech friends to do so.</p>
<h1 id="end-rant">end rant</h1>
<p>I hope to see more apps with comprehensive export or supporting personal data stores. And why not maximize compatibility where possible? If I can message all these platforms via Matrix bridges in a web browser, there's no reason to force an upgrade or brick my app.</p>
<p>Digital security should go beyond a technical concept: what if it made people feel safe, trusting the space as they might in a long-term relationship?</p>
<p>Are these stories of data becoming inaccessible just mine? If you have your own, be welcome to share. Maybe if the problems are documented, they're more likely to be fixed.</p>
<hr>
	<p><small>If you liked that, you might want to read <a href="https://utopia.rosano.ca/durable-data/">durable data</a> for some solutions, or interoperable visions in <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">pointing at the wrong thing</a>, or about different <a href="https://utopia.rosano.ca/levels-of-agency/">levels of agency</a>.</small></p>
	<hr></div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/interop/">interop</a>, <a href="/log/tag/zero-data/">zero data</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:23 am, February 21, 2024" href="/blog/encryption-rant/"><time datetime="2024-02-21T09:23:43-05:00" data-pagefind-sort="date[datetime]">09h23</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Wednesday, February 21, 2024 09h23</title>
  <link>https://rosano.ca/log/2024-02-21-encryption-rant/</link>
  <pubDate>Wed, 21 Feb 2024 09:23:43 -0500</pubDate>
  <guid>https://rosano.ca/log/2024-02-21-encryption-rant/</guid>
  <description>👋 Heads up: if you&#39;re more interested in solutions, read durable data.&#xA;This sort of &#39;complain-y&#39; post fleshes out my encryption thread to highlight how data becoming inaccessible might feel to someone less tech-oriented than I am and who isn&#39;t going to document their experience; if you&#39;re a technology wrangler, read the rest of this while putting yourself in the shoes of someone whose relationship with owning data might be &amp;quot;new phone, please send your number&amp;quot;.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<p class="feature-image"><img src="https://static.rosano.ca/home/tags/technical/Screen-Shot-2024-02-14-at-11.30.50-copy-export.jpg" aria-hidden="true"></p><nugget><p><small>👋 Heads up: if you're more interested in solutions, read <a href="https://utopia.rosano.ca/durable-data/">durable data</a>.</small></p>
<hr>
<p>This sort of 'complain-y' post fleshes out my <a href="https://mastodon.online/@rosano/110685716693430299">encryption thread</a> to highlight how data becoming inaccessible might feel to someone less tech-oriented than I am and who isn't going to document their experience; if you're a technology wrangler, read the rest of this while putting yourself in the shoes of someone whose relationship with owning data might be &quot;new phone, please send your number&quot;.</p></nugget><hr>
<div class="content"><p><small>👋 Heads up: if you're more interested in solutions, read <a href="https://utopia.rosano.ca/durable-data/">durable data</a>.</small></p>
<hr>
<p>This sort of 'complain-y' post fleshes out my <a href="https://mastodon.online/@rosano/110685716693430299">encryption thread</a> to highlight how data becoming inaccessible might feel to someone less tech-oriented than I am and who isn't going to document their experience; if you're a technology wrangler, read the rest of this while putting yourself in the shoes of someone whose relationship with owning data might be &quot;new phone, please send your number&quot;.</p>
<h1 id="encrypted-bricks">encrypted bricks</h1>
<p>In the end of 2023 I experienced the co-incidental deprecation of multiple messaging apps simultaneously. <a href="https://whatsapp.com">WhatsApp</a>, <a href="https://signal.org">Signal</a>, and <a href="https://www.beeper.com">Beeper</a> either suddenly stopped working or warned about 'going away soon'.</p>
<p><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2023.11.07-16.56.23.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2024.01.26-at-07.19.54.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/Screen-Shot-2024-02-17-at-10.06.50.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2023.11.07-18.21.46.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/Screen-Shot-2024-02-17-at-16.34.05.png" aria-hidden="true">
</gallery></p>
<figure><figcaption>removing native support for older systems</figcaption></figure>
<p>As a technologist, I can vaguely guess it's tied to something like 'availability of better encryption primitives or standards on newer versions of the operating system', but to a non-tech person it might be strange how WhatsApp says &quot;you can use their web version instead, without upgrading your computer, but the native version that was working yesterday 'needs to' stop working today because of 'security'&quot;.</p>
<p>This could nicely tie into imagined stories of planned obsolescence and 'Apple pushing people to always get new stuff' even if that might not be what's really happening here; without technical knowledge, how would you tell the difference?</p>
<p>Also weird how many of these run in Electron (Chrome) as web apps with some kind of server component, but they don't work in a normal web browser.</p>
<h1 id="volatile-updates">volatile updates</h1>
<p>It's fine that Beeper is no longer compatible with my older version of macOS, but not fine that the underlying self-update framework (<a href="https://github.com/Squirrel/Squirrel.Mac/issues/275">Squirrel</a>) forces an upgrade to a version that doesn't run on my machine: when is that ever desirable?</p>
<p>The threat of these workflow disruptions means one needs to keep backup copies of apps or lock them from being changed to prevent unintended updates.</p>
<figure>
<p><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/Untitled-2-export.jpg" aria-hidden="true">
</p>
<figcaption>locking Element on macOS to prevent it from incompatible upgrades</figcaption>
</figure>
<p>locking Element on macOS to prevent it from incompatible upgrades</p>
<h1 id="moving-devices">moving devices</h1>
<p>Transferring both WhatsApp and Signal messages to a new phone, there's a scary thought (and real possibility) that all my messages could suddenly disappear because of 'security'. Since the app's transfer interface doesn't assure me of the correct path, I need to find the <a href="https://faq.whatsapp.com/209942271778103/">eight-</a> to <a href="https://support.signal.org/hc/en-us/articles/360007059752-Backup-and-Restore-Messages">thirteen-</a>step guide via a search engine and precisely follow it in order to understand and not mess up.</p>
<p>WhatsApp's transfer process simply didn't appear for me, but I was able to just re-register my number on the new phone (<a href="https://support.apple.com/en-us/HT204184#computer">restored from iOS full backup</a>) and unlock my data; phew, glad I didn't trust the <em>documented process</em> and relied on luck or a third party like Apple instead.</p>
<p>Signal's QR-code-based local network transfer is more straight-forward, but repeatedly failed at 99%, which although probably contains all my data, will not let me manage the last inch, thus leaving me locked out. After changing Wi-Fi networks, with a crash for success, it seemed to make it over safely.</p>
<p>Now, even though my messages are there at the moment, there's a lingering worry that my path was not acceptable for 'security' and so it might all get randomly taken away from me some day; this comes from seeing how message history is often not available on new linked devices. It doesn't matter whether my imagined story about possibly losing data is real. Does the experience make you feel safe? Does it reassure you that you have your data? Or does it threaten that you could become signed out and lose everything 'for your own protection'?</p>
<p><a href="https://delta.chat">Delta Chat</a> has the simplest device transfer and even an equivalent of 'changing your number'; the messages are also encrypted, yet I never worry about losing them.</p>
<h1 id="clean-by-accident">clean by accident</h1>
<p>If you can't afford larger storage capacity, you might find yourself managing space on your device. While cleanup up earlier in the year, I accidentally deleted Signal because my screen stalled — throw away your old, slower devices as they quickly become obsolete, right? — and my finger tapped and swiped perfectly because of muscle memory. My years of chat history were just gone. I have some messages on another linked device, but no possibility to export or transfer or merge because their desktop version is only 'linked' and not 'special', awaiting the next unfortunate accident; it sends the message that 'security' lacks agency.</p>
<h1 id="decentralized-if-you-know-how">decentralized if you know how</h1>
<p>Is the solution is an open standard like <a href="https://matrix.org">Matrix</a>? It's not so easy. Their <a href="https://joinmatrix.org">&quot;join&quot; explainer</a> is not as intuitive as other decentralized projects like <a href="https://joinmastodon.org">Mastodon</a>, <a href="https://joinpeertube.org">PeerTube</a>, or <a href="https://join-lemmy.org">Lemmy</a>. I don't believe a non-programmer would be able to do this without help, but assuming they sort through and understand the options of picking both a server and client, they will get stuck on errors like &quot;Unable to decrypt message&quot;, &quot;Verification failed&quot;, and the scary thought of losing messages if you log out.</p>
<p><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2023.11.23-at-14.31.33-1.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2024-02-14-at-12-12-14-1.jpg" aria-hidden="true">
</gallery><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2024-02-14-at-12-12-48-1.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/IMG_E7520-1.JPG" aria-hidden="true">
</gallery></p>
<figure><figcaption>scary messages</figcaption></figure>
<p><gallery><img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2024.01.03-at-10-20-25.jpg" aria-hidden="true">
 <img src="https://static.rosano.ca/home/timeline/2024-02-21-encryption-rant1708525423/2024.01.03-at-10-20-37.jpg" aria-hidden="true">
</gallery></p>
<figure><figcaption>do these match?</figcaption></figure>
<p>Well, it was tricky to figure out how to trigger the Matrix verification process, but I managed to revive access to my Beeper messages with <a href="https://fluffychat.im">FluffyChat</a> (which really might be &quot;The cutest messenger in the Matrix network&quot;), and it's nice to have access to my data in a variety of web apps that will probably remain backwards compatible forever. Still, &quot;I managed to get it working&quot; is a hard sell for normal people.</p>
<h1 id="export-impossible">export impossible</h1>
<p>I still have yet to see a built-in way to export all my messages at once with Signal, WhatsApp, or any popular Matrix client. It's possible to <a href="https://unix.stackexchange.com/questions/505008/signal-desktop-how-to-export-messages">get a copy of some Signal Desktop messages</a> with tools like <a href="https://github.com/tbvdm/sigtop">sigtop</a> and <a href="https://github.com/signalapp/Signal-Desktop/issues/2516#issuecomment-442797638">sqlcipher</a> if you're comfortable typing into a terminal (I'm not). <a href="https://imazing.com">iMazing</a> lets you export messages and attachments from WhatsApp. Not being part of official app interfaces just feels like platform capture to me: data in, but not out.</p>
<h1 id="secure-complex-fragile">secure, complex, fragile</h1>
<p>Why does all this 'security' have to feel so fragile? What does it mean when 'robustly-secured data' can accidentally vanish at a moment's notice, or that I can back up my entire phone for peace of mind, except for 'secure things'? Should it be normal to expect people to simply upgrade their operating system to the latest version when it's known to likely cause a slew of random issues?</p>
<p>How are ordinary people supposed to feel good about this? There may be workarounds, and maybe I'm even just taking the wrong approach in everything I've documented here, but if someone like me can't figure it out, it's bad: for people outside the tech world with little time or capacity to deal with these kinds of issues, the seeming possibility of them occurring is scary and unsafe, even if not real; for software developers to treat these circumstances as mere 'policy' is not very empathetic.</p>
<p>It's important to give space and patience to technology under development as people make it work, but there's no feigning moral superiority in using 'alternative tech' until it includes a real foundation to stand on for people without this domain expertise. Fleeting personal data is like alternative tech's equivalent of platform enshitification and doesn't fill me with confidence to trust these systems or recommend my non-tech friends to do so.</p>
<h1 id="end-rant">end rant</h1>
<p>I hope to see more apps with comprehensive export or supporting personal data stores. And why not maximize compatibility where possible? If I can message all these platforms via Matrix bridges in a web browser, there's no reason to force an upgrade or brick my app.</p>
<p>Digital security should go beyond a technical concept: what if it made people feel safe, trusting the space as they might in a long-term relationship?</p>
<p>Are these stories of data becoming inaccessible just mine? If you have your own, be welcome to share. Maybe if the problems are documented, they're more likely to be fixed.</p>
<hr>
	<p><small>If you liked that, you might want to read <a href="https://utopia.rosano.ca/durable-data/">durable data</a> for some solutions, or interoperable visions in <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">pointing at the wrong thing</a>, or about different <a href="https://utopia.rosano.ca/levels-of-agency/">levels of agency</a>.</small></p>
	<hr></div><p>
	<small>Tagged: <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/interop/">interop</a>, <a href="/log/tag/zero-data/">zero data</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:23 am, February 21, 2024" href="/log/2024-02-21-encryption-rant/"><time datetime="2024-02-21T09:23:43-05:00" data-pagefind-sort="date[datetime]">09h23</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>GitHub as storage</title>
  <link>https://rosano.ca/blog/github-as-storage/</link>
  <pubDate>Wed, 24 Jan 2024 14:51:04 +0000</pubDate>
  <guid>https://rosano.ca/blog/github-as-storage/</guid>
  <description>Could it be one of the most interoperable formats out there?</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget>Could it be one of the most interoperable formats out there?</nugget><hr>
<div class="content"><p>Writing <a href="https://rosano.ca/interoperable-visions">interoperable visions</a> got me thinking about how cool it would be to use a GitHub repository as the storage for <a href="https://0data.app">Zero Data</a> or <a href="https://www.inkandswitch.com/local-first">local-first</a> apps as many people have an account there, even some less technical people. Using their <a href="https://docs.github.com/en/rest/repos/contents">repository contents API</a> it should be possible to connect it as a backend for web apps and store the data in a repository. Has this been done already?</p>
<p>GitHub has useful affordances for browsing files, understanding directory structure, editing text, collaborating, version control, and a whole wack of integrations hooking into every corner of the internet. A repo can be synced to your local device where you can also do all the things your device can, then push it back to the cloud.</p>
<p>Might be interesting to think of it like a Dropbox shared folder, but globally public and editable, or another way to get <a href="https://docs.datomic.com/pro/time/filters.html#history">Datomic</a>'s &quot;version control for your database&quot;.</p>
<p>Of course, you may not want the data created by your app to be public, so you might use a private repository instead of a public one. Choosing a public repository where it doesn't breach privacy could be a new way to encourage 'open data', as one can literally see, fork, and hack all of it with no extra steps,</p>
<p>The many affordances accessible point-and-click via GitHub's web interface ensures there are at least two apps that can edit the same data, which is great for interop, but factoring all the ways to edit GitHub repos via integrations and on your local device, it becomes closer to infinite: could it be one of the most interoperable formats out there? What would it say about sovereignty if similar flexibility via an API was replicated by <a href="https://codeberg.org">Codeberg</a>, or <a href="https://easyindie.app">self-hostable options</a> like <a href="https://gitlab.com">GitLab</a>, <a href="https://gitea.io">Gitea</a>, or <a href="https://gogs.io">Gogs</a>?</p>
<p>The <a href="https://github.com/remotestorage/remotestorage.js">remoteStorage.js library</a> already supports <a href="https://remotestoragejs.readthedocs.io/en/latest/getting-started/dropbox-and-google-drive.html">Dropbox and Google Drive</a> as an optional storage backend, with <a href="https://community.remotestorage.io/t/adding-solid-as-a-backend/828">Solid</a> on the way. Why not add GitHub? A polyglot library with five low-friction storage options would give developers more potential for their apps, and the people using them more ways into owning their data.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/idea/">idea</a>, <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/easy-indie-app/">Easy Indie App</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:51 am, January 24, 2024" href="/blog/github-as-storage/"><time datetime="2024-01-24T09:51:04-05:00" data-pagefind-sort="date[datetime]">09h51</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Wednesday, January 24, 2024 09h51</title>
  <link>https://rosano.ca/log/2024-01-24-github-as-storage/</link>
  <pubDate>Wed, 24 Jan 2024 09:51:04 -0500</pubDate>
  <guid>https://rosano.ca/log/2024-01-24-github-as-storage/</guid>
  <description>Writing interoperable visions got me thinking about how cool it would be to use a GitHub repository as the storage for Zero Data or local-first apps as many people have an account there, even some less technical people. Using their repository contents API it should be possible to connect it as a backend for web apps and store the data in a repository. Has this been done already?&#xA;GitHub has useful affordances for browsing files, understanding directory structure, editing text, collaborating, version control, and a whole wack of integrations hooking into every corner of the internet. A repo can be synced to your local device where you can also do all the things your device can, then push it back to the cloud.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget><p>Writing <a href="https://rosano.ca/interoperable-visions">interoperable visions</a> got me thinking about how cool it would be to use a GitHub repository as the storage for <a href="https://0data.app">Zero Data</a> or <a href="https://www.inkandswitch.com/local-first">local-first</a> apps as many people have an account there, even some less technical people. Using their <a href="https://docs.github.com/en/rest/repos/contents">repository contents API</a> it should be possible to connect it as a backend for web apps and store the data in a repository. Has this been done already?</p>
<p>GitHub has useful affordances for browsing files, understanding directory structure, editing text, collaborating, version control, and a whole wack of integrations hooking into every corner of the internet. A repo can be synced to your local device where you can also do all the things your device can, then push it back to the cloud.</p></nugget><hr>
<div class="content"><p>Writing <a href="https://rosano.ca/interoperable-visions">interoperable visions</a> got me thinking about how cool it would be to use a GitHub repository as the storage for <a href="https://0data.app">Zero Data</a> or <a href="https://www.inkandswitch.com/local-first">local-first</a> apps as many people have an account there, even some less technical people. Using their <a href="https://docs.github.com/en/rest/repos/contents">repository contents API</a> it should be possible to connect it as a backend for web apps and store the data in a repository. Has this been done already?</p>
<p>GitHub has useful affordances for browsing files, understanding directory structure, editing text, collaborating, version control, and a whole wack of integrations hooking into every corner of the internet. A repo can be synced to your local device where you can also do all the things your device can, then push it back to the cloud.</p>
<p>Might be interesting to think of it like a Dropbox shared folder, but globally public and editable, or another way to get <a href="https://docs.datomic.com/pro/time/filters.html#history">Datomic</a>'s &quot;version control for your database&quot;.</p>
<p>Of course, you may not want the data created by your app to be public, so you might use a private repository instead of a public one. Choosing a public repository where it doesn't breach privacy could be a new way to encourage 'open data', as one can literally see, fork, and hack all of it with no extra steps,</p>
<p>The many affordances accessible point-and-click via GitHub's web interface ensures there are at least two apps that can edit the same data, which is great for interop, but factoring all the ways to edit GitHub repos via integrations and on your local device, it becomes closer to infinite: could it be one of the most interoperable formats out there? What would it say about sovereignty if similar flexibility via an API was replicated by <a href="https://codeberg.org">Codeberg</a>, or <a href="https://easyindie.app">self-hostable options</a> like <a href="https://gitlab.com">GitLab</a>, <a href="https://gitea.io">Gitea</a>, or <a href="https://gogs.io">Gogs</a>?</p>
<p>The <a href="https://github.com/remotestorage/remotestorage.js">remoteStorage.js library</a> already supports <a href="https://remotestoragejs.readthedocs.io/en/latest/getting-started/dropbox-and-google-drive.html">Dropbox and Google Drive</a> as an optional storage backend, with <a href="https://community.remotestorage.io/t/adding-solid-as-a-backend/828">Solid</a> on the way. Why not add GitHub? A polyglot library with five low-friction storage options would give developers more potential for their apps, and the people using them more ways into owning their data.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/idea/">idea</a>, <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>, <a href="/log/tag/easy-indie-app/">Easy Indie App</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:51 am, January 24, 2024" href="/log/2024-01-24-github-as-storage/"><time datetime="2024-01-24T09:51:04-05:00" data-pagefind-sort="date[datetime]">09h51</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>interoperable visions</title>
  <link>https://rosano.ca/blog/interoperable-visions/</link>
  <pubDate>Tue, 16 Jan 2024 14:40:26 +0000</pubDate>
  <guid>https://rosano.ca/blog/interoperable-visions/</guid>
  <description>Every interoperable app becomes a super-app.</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget>Every interoperable app becomes a super-app.</nugget><hr>
<div class="content"><p><small>👋 Heads up: if you're looking for the shorter, less technical version, read <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">pointing at the wrong thing</a>.</small></p>
<hr>
<p>I have been using my own <a href="https://0data.app">Zero Data</a> apps (storing all data on spaces you own) since 2018, starting with <a href="https://hyperdraft.rosano.ca">Hyperdraft</a> for taking notes and gradually developing five more to optimize other meaningful workflows. It was enough back then to know that every iota of my data from these apps, including documents, configurations, and preferences, was in a place I control—a 'personal data store' (PDS).</p>
<p>It's been great, perhaps life-changing, and still continues to be a vital part of how I organize myself and my projects: my important stuff is with me at all times and eventually gets synced to all my devices; these web apps happen to be <a href="https://www.inkandswitch.com/local-first">local-first</a> and work fine without internet access; I've spent no time on spam, or proving to a machine that I'm human via captchas; and somehow I was even able to collaborate with other people on flashcards despite it not really being baked into my development frameworks—all without any felt presence of a large tech company deciding whether I can or not.</p>
<h1 id="there-but-invisible">there, but invisible</h1>
<p>One of the principles I listed on the Zero Data page is &quot;do what you want with your data at any time&quot;, and I've been reflecting on some limitations of the current reality: it's technically true that I'm able to 'do what I want with it any time', but what <em>can</em> I actually do with this?</p>
<p>Most of my data in a PDS is stored in a format for machines ('<a href="https://simple.wikipedia.org/wiki/JSON">JSON objects</a>'), which I generally don't wrangle with my own hands—perhaps nobody should (to avoid throwing a computer into crisis by missing a comma). Sometimes I write code to maneuver this format into something meaningful, mostly for one-off situations that don't repeat and wouldn't be resolvable with any graphical interfaces ('<a href="https://simple.wikipedia.org/wiki/Graphical%5Fuser%5Finterfaces%5Fand%5Fconsoles">GUI</a>' software) that I'm aware of; I would prefer to avoid coding and can imagine it's not an option for most people (who still might not have the programming knowledge or mindset). More often, I use self-hosted <a href="https://n8n.io">n8n automations</a> as a way to bridge different flows while using this data; it can be overall fantastic, yet still cumbersome and not quite low-code enough to include non-tech people. In the process, I learned about and self-hosted the no-code database <a href="https://www.directus.io">Directus</a>, which, although well-designed in many ways, feels quite heavy-handed and unfortunately not local-first. There are apps like <a href="https://inspektor.5apps.com">Inspektor</a> with useful affordances to edit key-value pairs as if they were 'fields', but it's not practical to do this regularly.</p>
<p>This data is somehow 100% mine, but as if I can't touch it or do much without technical expertise, as if I don't really have it even though it's right there; this is in some way strangely similar to having it stuck in one of those silos that I meant to avoid in the first place. The nicest way would be to simply use a variety of apps that can (inter-)operate on the same data without breaking each other. Observing <a href="https://pdsinterop.org/conventions/bookmark/#webmarks">how some of these Zero Data apps store the data</a> (mine included), it seems there's a long way to go. Interoperability (interop) would make this better.</p>
<hr>
<h1 id="pure-not-practical">pure not practical</h1>
<p>Related to silos, I've also been reflecting on how Zero Data shouldn't always mean asking people to leave the tools they know, or starting a new ecosystem from scratch. I've probably been as guilty of this as anyone else who claims to care about more ethical technology, and believed for a while in blank slates, but now I assume that things are and perhaps should be <em>messy</em>, because that's how it works in real life, with humans and their complex logistical or emotional entanglements. Only in the tech sphere would it be popular to 'start from scratch', with pristine self-declared confines unaffected by legacy; there's enough money and free time there to prop it up until there isn't, but for the rest of the world, subsidizing success isn't always sustainable: politically speaking, people generally gain leverage by forming imperfect coalitions rather than by staying 'pure' to any ideals or working exclusively with those who pledge the same; these pluralistic (messy) conditions for collaboration are exactly what an approach to apps and their data could exemplify.</p>
<p>In practice, that could mean:</p>
<ul>
<li>embracing popular formats, even if created by the devil</li>
<li>not waiting for neat standards, instead letting systems grow from <a href="https://subconscious.substack.com/p/simple-seeds">simple seeds</a></li>
<li>not pushing people to a single blessed representation, instead perhaps supporting a dynamic vocabulary with something like <a href="https://www.inkandswitch.com/cambria">Cambria</a></li>
<li>having diverse options for import and export, then proliferating them through packages</li>
<li>minimizing the 'destructive' tradeoffs of any decision.</li>
</ul>
<p>Perhaps instead of forcing a choice to be made, there's potential to encourage a 'both and' mentality: alternative technology and the frameworks built in that world have an opportunity to become sort of 'data liberators' that help people avoid feeling stuck: personal data stores and apps built for them could, rather than feeling like silos, be considered bridges between or out of them by enabling <a href="https://subconscious.substack.com/p/credible-exit">credible exit</a> where there is none. Interop would make this better.</p>
<hr>
<h1 id="function-over-formats">function over formats</h1>
<p>One way to restate and combine the above two perspectives is that the feeling of 'having your data in your hands' or '<a href="https://youtu.be/McKXW-bP2HQ?t=1833">handedness</a>' (credit to <a href="https://bmann.ca">Boris</a> for the term)—being able to mold and maneuver it as you wish—comes not from a consecrated format but rather from access to diverse lenses, views, or 'applications' for the same data: maximizing what a human can do while minimizing the knowledge or skill required. I would say it's the variety in those possibilities that make the data tangible in this way, not the format itself, even though the format 'enables' it. Of course, interop would make this better.</p>
<hr>
<h1 id="apps-as-dumb-interoperable-views">apps as dumb, interoperable views</h1>
<p>Various people (such as <a href="https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/#apps-become-views">Ruben Verborgh</a> and <a href="https://www.geoffreylitt.com/2021/03/05/bring-your-own-client.html">Geoffrey Litt</a>) have articulated visions of apps almost like functions where your data goes in and a visual representation or interface comes out. I hope that by sketching out some more details around interop, something new can become discernible.</p>
<p>I've been thinking about this for my note-taking app and will use it as the main example, but there's probably lots that can be applied to other kinds of apps. As an aside, stealing these concepts for your project would not only be appreciated, but perhaps a way to 'do your part' if you're an interoperable app developer.</p>
<h2 id="decouple-type-and-location-enable-pointing">decouple type and location, enable pointing</h2>
<p>Text editors are commonly used to 'edit text documents', often 'plain text' and sometimes 'rich text' with formatting. Unlike native apps where you can simply 'drag and drop' or 'share' files and the app will try to 'open' them, apps built for 'personal data stores' (Zero Data apps) <a href="https://pdsinterop.org/conventions/notepad/#litewrite">currently link</a> the format or 'type' to a specific location or 'path': for example, reading or writing note-like things in <code>/notes</code> versus <code>/documents</code> versus <code>/$APP_NAME</code>, which makes it hard to anticipate where your notes will be and breaks interop. There's also a tension here between 'app folder' versus 'type folder' (which I call 'chaos folder'), or <a href="https://michielbdejong.com/blog/29.html">'document box' versus 'data graph'</a>. One can debate whether there's such a thing as 'the correct' place, but let's assume it doesn't matter: if a Zero Data app wants to access a specific kind of data, ultimately it needs to be built 'knowing' about that relationship between location and type. Solid 'solves' this with <a href="https://solid.github.io/type-indexes/">type indexes</a>, remoteStorage with <a href="https://remotestoragejs.readthedocs.io/en/latest/data-modules.html">data modules</a>, but neither are guaranteed to be used when reading or writing data. Until there's a magical solution to that complex social problem of getting people (in this case, app developers) on the same page, it would be more flexible to perhaps have a default or preferred location but more importantly, like native apps, an option to 'point' the app at some data, whether local files, on cloud storage, or in PDS 'JSON objects'.</p>
<h2 id="pointing-at-the-wrong-thing">pointing at the 'wrong' thing</h2>
<p>Would it make sense to point a notes app at your bookmarks? Or a maps app at your contact list? Or a flashcards app at your music collection? Some domains are more complementary than others, but regardless, the potential combinatorial possibilities of being open and flexible in this way are immense and would enable people to play with and combine data in interesting ways.</p>
<p>By pointing your notepad at a bookmarks app, for example, you might use fancier text-editing capabilities, rather than those of a simple text field, to add notes to saved links, perhaps more comfortably draft a personal message or blog post about that link, <em>and</em> have it automatically associated correctly with the corresponding document from a different app. Pointing at other things (like contacts, recipes, correspondence, etc.) might mean dealing with a 'plain editable text' representation of those 'items' or 'objects', and at the very least being able to read and search them. Consider also pointing a maps app at your contacts (maybe to see where your friends are?), or recipes (maybe to see where foods or ingredients come from or can be found?), or photos (maybe to see where you've made some memories?).</p>
<p>These are some of the possibilities when there's flexibility in the storage location and format; this sort of exists already with native apps and individual files, but pointing at 'collections of objects' in the way previously described often requires specific integrations (as <a href="https://www.apple.com/icloud/find-my">Find my</a> shows your friends or <a href="https://apps.apple.com/us/app/photos/id1584215428">Photos</a> presents places from geotagged images).</p>
<p>Again, I'd leave it to someone smarter than I to discover the best interface solution here: my imagination is currently limited to something like a 'file picker' without the burden of a deeply nested file system, where even on a mobile device you can say 'open this from there' with just a few taps; maybe the picker itself needs to be aware of various formats and how to convert random stuff into vocabularies that it knows the receiving app will understand—like the <a href="https://developer.apple.com/design/human-interface-guidelines/activity-views">iOS Share sheet</a> shows &quot;what you can do with the shared content&quot;, but in reverse, to show &quot;what content you can use with the current app&quot;; anyone familiar with <a href="https://qsapp.com">Quicksilver</a> or <a href="https://launchlet.dev">Launchlet</a>'s 'pipe mode' might hear echos of 'subject' and 'action' ('with X, do Y').</p>
<h2 id="two-way-sync">two-way sync</h2>
<p>Going a step further, let's imagine seeing contacts in this note-taking app (represented as plain editable text); modifying a name, address, or text blurb; and having the changes translate back from text into the original format (perhaps vCard). A bidirectional transformer or translator could be written once (perhaps even by one person), and any note-taking app could use that to flexibly view and edit all kinds of things. The closest usable solution I've seen for JSON objects (although not yet in common use) is <a href="https://remotestoragejs.readthedocs.io/en/latest/data-modules/defining-data-types.html">remoteStorage data modules</a>, encapsulating schema and logic together in a package that can enable any app to 'handle' specific data; <a href="https://github.com/solid-contrib/data-modules">similar efforts for Solid</a> are currently in development. Lots of people use text editors (plain or rich) and would have an option to move data around fluidly while still benefiting from apps that use structured data under the hood. For a distant but novel approach, see how the <a href="https://www.inkandswitch.com/potluck">Potluck research prototype</a> cuts out the middleman and simply uses text in a notepad as the home for all kinds of data.</p>
<h2 id="dynamic-schemas-from-the-start">dynamic schemas from the start</h2>
<p>It might take a lot of work to write and maintain many data converters, and although still useful under those circumstances, what if it could be easier or partially automated through a cheap pseudo-intelligent function? Perhaps a library could be preloaded with vocabularies from <a href="https://schema.org">Schema.org</a> or <a href="https://shaperepo.com">ShapeRepo</a> and utilities that attempt a simple best guess when an input 'fits' a known structure? This could help with the issue of 'stale apps' (that either haven't been updated in a long time or may never be updated again) by enabling them to handle data dynamically from the start (as opposed to perpetually speaking only one fixed format), perhaps without requiring updates to learn about new schemas, and thus helping more of them remain compatible, interoperable, and useful without developer effort.</p>
<h2 id="flexibility-through-pluralism">flexibility through pluralism</h2>
<p>In addition to processing various forms of local data, I can imagine it being useful to have specific integrations with external services, transform their representations into one or multiple common data vocabularies, and package that integration to simplify inclusion in other apps. Imagine a text editor that can deal with input spanning the gamut of:</p>
<ul>
<li><code>.txt</code> files in a personal data store, whether stored in <code>/notes</code>, <code>/documents</code>, or <code>/$APP_NAME</code></li>
<li>JSON text documents, whether stored as <a href="https://schema.org/TextDigitalDocument">Schema.org/TextDigitalDocument</a> or even <a href="https://pdsinterop.org/conventions/notepad/#hyperdraft">Hyperdraft's occult format</a></li>
<li>either of the above, whether stored on remoteStorage, Fission, Solid, Dropbox, Google Drive, iCloud, nextCloud, locally via the <a href="https://developer.chrome.com/docs/capabilities/web-apis/file-system-access">File System Access API</a>, in a Git or GitHub repository, etc…</li>
<li>documents from Apple Notes or Simplenote</li>
<li>documents from Google Docs or Microsoft Word, editable as plain text, Markdown, or rich text</li>
<li>blog posts from <a href="https://ghost.org">Ghost</a> or <a href="https://wordpress.org">Wordpress</a></li>
<li>contacts, calendars, or correspondence as text by 'pointing at the wrong thing'</li>
<li>perhaps not limited to one of the above sources or collections at a time, simultaneously handling multiple clouds or storage providers, multiple sources, or multiple formats</li>
</ul>
<p>To more technical people, this might sound merely like 'integrating with 3rd party systems'. I would suggest that if those are the meaningful representations to someone using this kind of app, then it's what makes the data feel tangible and 'in the hands', clear that they actually have it without needing to trust any specific app, developer, or protocol.</p>
<p>What's the value of one app supporting a mix of these? Two apps? A whole ecosystem of apps? Not only reading but writing back via two-way sync? In the way we 'edit stuff as text' here, regardless of original format, what other affordances can be made for apps to 'edit stuff as X'? and how can it be enabled permisionlessly? This feels like an ideal for many protocol designers: a dynamic ecosystem where people are building and using software in unpredictable permutations, where progress happens faster than the speed of plugins, or perhaps even without codifying specific possibilities in advance. It's important to restate that these pluralistic potentials shouldn't be exclusive to Hyperdraft, as any note-taking app might benefit from at least some of this; ideally, it would be packaged in a way that minimizes complexity for the app developer while maximizing potential interop.</p>
<h1 id="text-editor-as-super-app">text editor as super-app</h1>
<p>With all these concepts in mind, let's paint a picture of how software could be more interoperable.</p>
<p>Point your app at various formats and locations, and it will show you meaningful representations; where possible, it provides natural ways to shape those representations, transparently translating and syncing back if necessary. Use specialized features, shortcuts, and interfaces for text editing wherever some modifiable text is exposed: instead of 'editing text documents', simply 'edit text' wherever you see it. Try the same with non-text. <a href="https://youtu.be/UNKgD8OzjCk?t=57m11s">Apps become smaller</a>.</p>
<p>Connect multiple sources simultaneously, no need to have it all in one storage. Assume a messy ecosystem and embrace plurality. If the data's preferred transport is not available to web apps, make it available via something like <a href="https://github.com/sockethub/sockethub">sockethub</a>. Bridges, converters, or dynamic vocabularies are written once and abundantly available—handy for whoever made them, but more likely for many other people; app developers can benefit without releasing new updates. At minimum, there are multiple useful options for import and export. Data is already everywhere, make use of it; rather than government surveillance and large tech companies monopolizing our data to cross-reference between multiple systems and silos, we own our data and the potentials that result.</p>
<p>It's a lot of work to consider, implement, and maintain storage, identity, CRDTs, encryption, and replication—on top of UX and the actual app: put it in the foundation, reduce pain for the interoperable app developer, minimize friction of having to choose—let them simply read and write data.</p>
<p>Every interoperable app becomes a super-app.</p>
<h1 id="my-future">my future</h1>
<p>I'm currently most excited to imagine: writing notes in Hyperdraft and 'seeing it' in <a href="https://logseq.com">Logseq</a>; writing a Zero Data web app that syncs with my phone's contact list; a liberator app where you can read from (and maybe write to) your favourite centralized platforms; journaling 'daily notes' in <a href="https://emojilog.rosano.ca">Emoji Log</a> and publishing as a digital garden via something like <a href="https://quartz.jzhao.xyz">Quartz</a>; a <a href="https://merveilles.town/@rosano/106071811392168445">tool to edit arbitrary JSON objects</a>; and my own apps supporting multiple clouds or sources simultaneously. It feels great to have space to progress on some of these ideas again: if you want to hear when I have this working in some way, sign up for the Zero Data mailing list here or follow me anywhere.</p>
<hr>
<h3 id="acknowledgements">acknowledgements</h3>
<p>Thanks (in reverse alphabetical order) to Sebastian Kippe, Michiel de Jong, Jess Martin, Heddi Ried, Gordon Brander, Elisa Guimarães, and Boris Mann for reading a draft of this and sharing feedback 🙏🏽.</p>
<hr>
<p><small>P.S. Gordon shared some interesting notes which I'll quote here (with permission):</small></p>
<details>
<summary>notes from Gordon</summary>
<blockquote>
<p>my own notes as I grapple with these same challenges:</p>
<ul>
<li><a href="https://subconscious.substack.com/p/credible-exit">Credible exit</a>. For exit to be credible, the data must be gettable, but also useful. What useful means depends upon the usecase/goal. So credible exit is a soft condition, or a gradient.</li>
<li>Hostile interoperability. Historically, interoperability has often emerged through competition. Microsoft Word or Photoshop implement a proprietary format. The app becomes popular. It spawns competitors, and also adjacent apps. These apps implement all or a subset of the proprietary format. Finally, that format becomes a de facto standard, and sometimes an actual standard. [See <a href="https://subconscious.substack.com/i/40537200/files-make-interoperability-the-default">Files allow interoperability to emerge retroactively</a>].</li>
</ul>
<p>Something I realized while writing these: Interoperability is not a feature. Interoperability is an ecological condition. It's what happens when different players with different incentives evolve networks of exchange. That means we can't force it to come about. We can only terraform the conditions where it might grow.</p>
<p>The desktop had the file system, a permissionless shared substrate belonging to the user. Apps could read each other's files and implement each other's file formats (each app effectively acts as a Cambria lens). These conditions were extremely conducive to the emergence of hostile interop.</p>
<p>This is what lead me personally toward building Noosphere protocol… it's essentially a very simple networked file system, supporting user ownership, multiplayer, and ability to permissionlessly plug multiple apps on top. There may be other paths to this outcome as well. In conversations with PVH he's mentioned that his motivation for investing in CRDT research is that if you have a file that knows how to sync itself, you don't have to care about the protocol.</p>
</blockquote>
</details>
<hr>
<p><small>P.P.S. I was thinking about this post before Jesse got me 'interop-pilled', but <a href="https://utopia.rosano.ca/interoperable-collaborative-apps-with-jess-martin/">our conversation</a> certainly helped add fuel to the fire:</small></p>
<iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/UNKgD8OzjCk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

</div><p>
	<small>Tagged: <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:40 am, January 16, 2024" href="/blog/interoperable-visions/"><time datetime="2024-01-16T09:40:26-05:00" data-pagefind-sort="date[datetime]">09h40</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Tuesday, January 16, 2024 09h40</title>
  <link>https://rosano.ca/log/2024-01-16-interoperable-visions/</link>
  <pubDate>Tue, 16 Jan 2024 09:40:26 -0500</pubDate>
  <guid>https://rosano.ca/log/2024-01-16-interoperable-visions/</guid>
  <description>👋 Heads up: if you&#39;re looking for the shorter, less technical version, read pointing at the wrong thing.&#xA;I have been using my own Zero Data apps (storing all data on spaces you own) since 2018, starting with Hyperdraft for taking notes and gradually developing five more to optimize other meaningful workflows. It was enough back then to know that every iota of my data from these apps, including documents, configurations, and preferences, was in a place I control—a &#39;personal data store&#39; (PDS).&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget><p><small>👋 Heads up: if you're looking for the shorter, less technical version, read <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">pointing at the wrong thing</a>.</small></p>
<hr>
<p>I have been using my own <a href="https://0data.app">Zero Data</a> apps (storing all data on spaces you own) since 2018, starting with <a href="https://hyperdraft.rosano.ca">Hyperdraft</a> for taking notes and gradually developing five more to optimize other meaningful workflows. It was enough back then to know that every iota of my data from these apps, including documents, configurations, and preferences, was in a place I control—a 'personal data store' (PDS).</p></nugget><hr>
<div class="content"><p><small>👋 Heads up: if you're looking for the shorter, less technical version, read <a href="https://utopia.rosano.ca/pointing-at-the-wrong-thing/">pointing at the wrong thing</a>.</small></p>
<hr>
<p>I have been using my own <a href="https://0data.app">Zero Data</a> apps (storing all data on spaces you own) since 2018, starting with <a href="https://hyperdraft.rosano.ca">Hyperdraft</a> for taking notes and gradually developing five more to optimize other meaningful workflows. It was enough back then to know that every iota of my data from these apps, including documents, configurations, and preferences, was in a place I control—a 'personal data store' (PDS).</p>
<p>It's been great, perhaps life-changing, and still continues to be a vital part of how I organize myself and my projects: my important stuff is with me at all times and eventually gets synced to all my devices; these web apps happen to be <a href="https://www.inkandswitch.com/local-first">local-first</a> and work fine without internet access; I've spent no time on spam, or proving to a machine that I'm human via captchas; and somehow I was even able to collaborate with other people on flashcards despite it not really being baked into my development frameworks—all without any felt presence of a large tech company deciding whether I can or not.</p>
<h1 id="there-but-invisible">there, but invisible</h1>
<p>One of the principles I listed on the Zero Data page is &quot;do what you want with your data at any time&quot;, and I've been reflecting on some limitations of the current reality: it's technically true that I'm able to 'do what I want with it any time', but what <em>can</em> I actually do with this?</p>
<p>Most of my data in a PDS is stored in a format for machines ('<a href="https://simple.wikipedia.org/wiki/JSON">JSON objects</a>'), which I generally don't wrangle with my own hands—perhaps nobody should (to avoid throwing a computer into crisis by missing a comma). Sometimes I write code to maneuver this format into something meaningful, mostly for one-off situations that don't repeat and wouldn't be resolvable with any graphical interfaces ('<a href="https://simple.wikipedia.org/wiki/Graphical%5Fuser%5Finterfaces%5Fand%5Fconsoles">GUI</a>' software) that I'm aware of; I would prefer to avoid coding and can imagine it's not an option for most people (who still might not have the programming knowledge or mindset). More often, I use self-hosted <a href="https://n8n.io">n8n automations</a> as a way to bridge different flows while using this data; it can be overall fantastic, yet still cumbersome and not quite low-code enough to include non-tech people. In the process, I learned about and self-hosted the no-code database <a href="https://www.directus.io">Directus</a>, which, although well-designed in many ways, feels quite heavy-handed and unfortunately not local-first. There are apps like <a href="https://inspektor.5apps.com">Inspektor</a> with useful affordances to edit key-value pairs as if they were 'fields', but it's not practical to do this regularly.</p>
<p>This data is somehow 100% mine, but as if I can't touch it or do much without technical expertise, as if I don't really have it even though it's right there; this is in some way strangely similar to having it stuck in one of those silos that I meant to avoid in the first place. The nicest way would be to simply use a variety of apps that can (inter-)operate on the same data without breaking each other. Observing <a href="https://pdsinterop.org/conventions/bookmark/#webmarks">how some of these Zero Data apps store the data</a> (mine included), it seems there's a long way to go. Interoperability (interop) would make this better.</p>
<hr>
<h1 id="pure-not-practical">pure not practical</h1>
<p>Related to silos, I've also been reflecting on how Zero Data shouldn't always mean asking people to leave the tools they know, or starting a new ecosystem from scratch. I've probably been as guilty of this as anyone else who claims to care about more ethical technology, and believed for a while in blank slates, but now I assume that things are and perhaps should be <em>messy</em>, because that's how it works in real life, with humans and their complex logistical or emotional entanglements. Only in the tech sphere would it be popular to 'start from scratch', with pristine self-declared confines unaffected by legacy; there's enough money and free time there to prop it up until there isn't, but for the rest of the world, subsidizing success isn't always sustainable: politically speaking, people generally gain leverage by forming imperfect coalitions rather than by staying 'pure' to any ideals or working exclusively with those who pledge the same; these pluralistic (messy) conditions for collaboration are exactly what an approach to apps and their data could exemplify.</p>
<p>In practice, that could mean:</p>
<ul>
<li>embracing popular formats, even if created by the devil</li>
<li>not waiting for neat standards, instead letting systems grow from <a href="https://subconscious.substack.com/p/simple-seeds">simple seeds</a></li>
<li>not pushing people to a single blessed representation, instead perhaps supporting a dynamic vocabulary with something like <a href="https://www.inkandswitch.com/cambria">Cambria</a></li>
<li>having diverse options for import and export, then proliferating them through packages</li>
<li>minimizing the 'destructive' tradeoffs of any decision.</li>
</ul>
<p>Perhaps instead of forcing a choice to be made, there's potential to encourage a 'both and' mentality: alternative technology and the frameworks built in that world have an opportunity to become sort of 'data liberators' that help people avoid feeling stuck: personal data stores and apps built for them could, rather than feeling like silos, be considered bridges between or out of them by enabling <a href="https://subconscious.substack.com/p/credible-exit">credible exit</a> where there is none. Interop would make this better.</p>
<hr>
<h1 id="function-over-formats">function over formats</h1>
<p>One way to restate and combine the above two perspectives is that the feeling of 'having your data in your hands' or '<a href="https://youtu.be/McKXW-bP2HQ?t=1833">handedness</a>' (credit to <a href="https://bmann.ca">Boris</a> for the term)—being able to mold and maneuver it as you wish—comes not from a consecrated format but rather from access to diverse lenses, views, or 'applications' for the same data: maximizing what a human can do while minimizing the knowledge or skill required. I would say it's the variety in those possibilities that make the data tangible in this way, not the format itself, even though the format 'enables' it. Of course, interop would make this better.</p>
<hr>
<h1 id="apps-as-dumb-interoperable-views">apps as dumb, interoperable views</h1>
<p>Various people (such as <a href="https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/#apps-become-views">Ruben Verborgh</a> and <a href="https://www.geoffreylitt.com/2021/03/05/bring-your-own-client.html">Geoffrey Litt</a>) have articulated visions of apps almost like functions where your data goes in and a visual representation or interface comes out. I hope that by sketching out some more details around interop, something new can become discernible.</p>
<p>I've been thinking about this for my note-taking app and will use it as the main example, but there's probably lots that can be applied to other kinds of apps. As an aside, stealing these concepts for your project would not only be appreciated, but perhaps a way to 'do your part' if you're an interoperable app developer.</p>
<h2 id="decouple-type-and-location-enable-pointing">decouple type and location, enable pointing</h2>
<p>Text editors are commonly used to 'edit text documents', often 'plain text' and sometimes 'rich text' with formatting. Unlike native apps where you can simply 'drag and drop' or 'share' files and the app will try to 'open' them, apps built for 'personal data stores' (Zero Data apps) <a href="https://pdsinterop.org/conventions/notepad/#litewrite">currently link</a> the format or 'type' to a specific location or 'path': for example, reading or writing note-like things in <code>/notes</code> versus <code>/documents</code> versus <code>/$APP_NAME</code>, which makes it hard to anticipate where your notes will be and breaks interop. There's also a tension here between 'app folder' versus 'type folder' (which I call 'chaos folder'), or <a href="https://michielbdejong.com/blog/29.html">'document box' versus 'data graph'</a>. One can debate whether there's such a thing as 'the correct' place, but let's assume it doesn't matter: if a Zero Data app wants to access a specific kind of data, ultimately it needs to be built 'knowing' about that relationship between location and type. Solid 'solves' this with <a href="https://solid.github.io/type-indexes/">type indexes</a>, remoteStorage with <a href="https://remotestoragejs.readthedocs.io/en/latest/data-modules.html">data modules</a>, but neither are guaranteed to be used when reading or writing data. Until there's a magical solution to that complex social problem of getting people (in this case, app developers) on the same page, it would be more flexible to perhaps have a default or preferred location but more importantly, like native apps, an option to 'point' the app at some data, whether local files, on cloud storage, or in PDS 'JSON objects'.</p>
<h2 id="pointing-at-the-wrong-thing">pointing at the 'wrong' thing</h2>
<p>Would it make sense to point a notes app at your bookmarks? Or a maps app at your contact list? Or a flashcards app at your music collection? Some domains are more complementary than others, but regardless, the potential combinatorial possibilities of being open and flexible in this way are immense and would enable people to play with and combine data in interesting ways.</p>
<p>By pointing your notepad at a bookmarks app, for example, you might use fancier text-editing capabilities, rather than those of a simple text field, to add notes to saved links, perhaps more comfortably draft a personal message or blog post about that link, <em>and</em> have it automatically associated correctly with the corresponding document from a different app. Pointing at other things (like contacts, recipes, correspondence, etc.) might mean dealing with a 'plain editable text' representation of those 'items' or 'objects', and at the very least being able to read and search them. Consider also pointing a maps app at your contacts (maybe to see where your friends are?), or recipes (maybe to see where foods or ingredients come from or can be found?), or photos (maybe to see where you've made some memories?).</p>
<p>These are some of the possibilities when there's flexibility in the storage location and format; this sort of exists already with native apps and individual files, but pointing at 'collections of objects' in the way previously described often requires specific integrations (as <a href="https://www.apple.com/icloud/find-my">Find my</a> shows your friends or <a href="https://apps.apple.com/us/app/photos/id1584215428">Photos</a> presents places from geotagged images).</p>
<p>Again, I'd leave it to someone smarter than I to discover the best interface solution here: my imagination is currently limited to something like a 'file picker' without the burden of a deeply nested file system, where even on a mobile device you can say 'open this from there' with just a few taps; maybe the picker itself needs to be aware of various formats and how to convert random stuff into vocabularies that it knows the receiving app will understand—like the <a href="https://developer.apple.com/design/human-interface-guidelines/activity-views">iOS Share sheet</a> shows &quot;what you can do with the shared content&quot;, but in reverse, to show &quot;what content you can use with the current app&quot;; anyone familiar with <a href="https://qsapp.com">Quicksilver</a> or <a href="https://launchlet.dev">Launchlet</a>'s 'pipe mode' might hear echos of 'subject' and 'action' ('with X, do Y').</p>
<h2 id="two-way-sync">two-way sync</h2>
<p>Going a step further, let's imagine seeing contacts in this note-taking app (represented as plain editable text); modifying a name, address, or text blurb; and having the changes translate back from text into the original format (perhaps vCard). A bidirectional transformer or translator could be written once (perhaps even by one person), and any note-taking app could use that to flexibly view and edit all kinds of things. The closest usable solution I've seen for JSON objects (although not yet in common use) is <a href="https://remotestoragejs.readthedocs.io/en/latest/data-modules/defining-data-types.html">remoteStorage data modules</a>, encapsulating schema and logic together in a package that can enable any app to 'handle' specific data; <a href="https://github.com/solid-contrib/data-modules">similar efforts for Solid</a> are currently in development. Lots of people use text editors (plain or rich) and would have an option to move data around fluidly while still benefiting from apps that use structured data under the hood. For a distant but novel approach, see how the <a href="https://www.inkandswitch.com/potluck">Potluck research prototype</a> cuts out the middleman and simply uses text in a notepad as the home for all kinds of data.</p>
<h2 id="dynamic-schemas-from-the-start">dynamic schemas from the start</h2>
<p>It might take a lot of work to write and maintain many data converters, and although still useful under those circumstances, what if it could be easier or partially automated through a cheap pseudo-intelligent function? Perhaps a library could be preloaded with vocabularies from <a href="https://schema.org">Schema.org</a> or <a href="https://shaperepo.com">ShapeRepo</a> and utilities that attempt a simple best guess when an input 'fits' a known structure? This could help with the issue of 'stale apps' (that either haven't been updated in a long time or may never be updated again) by enabling them to handle data dynamically from the start (as opposed to perpetually speaking only one fixed format), perhaps without requiring updates to learn about new schemas, and thus helping more of them remain compatible, interoperable, and useful without developer effort.</p>
<h2 id="flexibility-through-pluralism">flexibility through pluralism</h2>
<p>In addition to processing various forms of local data, I can imagine it being useful to have specific integrations with external services, transform their representations into one or multiple common data vocabularies, and package that integration to simplify inclusion in other apps. Imagine a text editor that can deal with input spanning the gamut of:</p>
<ul>
<li><code>.txt</code> files in a personal data store, whether stored in <code>/notes</code>, <code>/documents</code>, or <code>/$APP_NAME</code></li>
<li>JSON text documents, whether stored as <a href="https://schema.org/TextDigitalDocument">Schema.org/TextDigitalDocument</a> or even <a href="https://pdsinterop.org/conventions/notepad/#hyperdraft">Hyperdraft's occult format</a></li>
<li>either of the above, whether stored on remoteStorage, Fission, Solid, Dropbox, Google Drive, iCloud, nextCloud, locally via the <a href="https://developer.chrome.com/docs/capabilities/web-apis/file-system-access">File System Access API</a>, in a Git or GitHub repository, etc…</li>
<li>documents from Apple Notes or Simplenote</li>
<li>documents from Google Docs or Microsoft Word, editable as plain text, Markdown, or rich text</li>
<li>blog posts from <a href="https://ghost.org">Ghost</a> or <a href="https://wordpress.org">Wordpress</a></li>
<li>contacts, calendars, or correspondence as text by 'pointing at the wrong thing'</li>
<li>perhaps not limited to one of the above sources or collections at a time, simultaneously handling multiple clouds or storage providers, multiple sources, or multiple formats</li>
</ul>
<p>To more technical people, this might sound merely like 'integrating with 3rd party systems'. I would suggest that if those are the meaningful representations to someone using this kind of app, then it's what makes the data feel tangible and 'in the hands', clear that they actually have it without needing to trust any specific app, developer, or protocol.</p>
<p>What's the value of one app supporting a mix of these? Two apps? A whole ecosystem of apps? Not only reading but writing back via two-way sync? In the way we 'edit stuff as text' here, regardless of original format, what other affordances can be made for apps to 'edit stuff as X'? and how can it be enabled permisionlessly? This feels like an ideal for many protocol designers: a dynamic ecosystem where people are building and using software in unpredictable permutations, where progress happens faster than the speed of plugins, or perhaps even without codifying specific possibilities in advance. It's important to restate that these pluralistic potentials shouldn't be exclusive to Hyperdraft, as any note-taking app might benefit from at least some of this; ideally, it would be packaged in a way that minimizes complexity for the app developer while maximizing potential interop.</p>
<h1 id="text-editor-as-super-app">text editor as super-app</h1>
<p>With all these concepts in mind, let's paint a picture of how software could be more interoperable.</p>
<p>Point your app at various formats and locations, and it will show you meaningful representations; where possible, it provides natural ways to shape those representations, transparently translating and syncing back if necessary. Use specialized features, shortcuts, and interfaces for text editing wherever some modifiable text is exposed: instead of 'editing text documents', simply 'edit text' wherever you see it. Try the same with non-text. <a href="https://youtu.be/UNKgD8OzjCk?t=57m11s">Apps become smaller</a>.</p>
<p>Connect multiple sources simultaneously, no need to have it all in one storage. Assume a messy ecosystem and embrace plurality. If the data's preferred transport is not available to web apps, make it available via something like <a href="https://github.com/sockethub/sockethub">sockethub</a>. Bridges, converters, or dynamic vocabularies are written once and abundantly available—handy for whoever made them, but more likely for many other people; app developers can benefit without releasing new updates. At minimum, there are multiple useful options for import and export. Data is already everywhere, make use of it; rather than government surveillance and large tech companies monopolizing our data to cross-reference between multiple systems and silos, we own our data and the potentials that result.</p>
<p>It's a lot of work to consider, implement, and maintain storage, identity, CRDTs, encryption, and replication—on top of UX and the actual app: put it in the foundation, reduce pain for the interoperable app developer, minimize friction of having to choose—let them simply read and write data.</p>
<p>Every interoperable app becomes a super-app.</p>
<h1 id="my-future">my future</h1>
<p>I'm currently most excited to imagine: writing notes in Hyperdraft and 'seeing it' in <a href="https://logseq.com">Logseq</a>; writing a Zero Data web app that syncs with my phone's contact list; a liberator app where you can read from (and maybe write to) your favourite centralized platforms; journaling 'daily notes' in <a href="https://emojilog.rosano.ca">Emoji Log</a> and publishing as a digital garden via something like <a href="https://quartz.jzhao.xyz">Quartz</a>; a <a href="https://merveilles.town/@rosano/106071811392168445">tool to edit arbitrary JSON objects</a>; and my own apps supporting multiple clouds or sources simultaneously. It feels great to have space to progress on some of these ideas again: if you want to hear when I have this working in some way, sign up for the Zero Data mailing list here or follow me anywhere.</p>
<hr>
<h3 id="acknowledgements">acknowledgements</h3>
<p>Thanks (in reverse alphabetical order) to Sebastian Kippe, Michiel de Jong, Jess Martin, Heddi Ried, Gordon Brander, Elisa Guimarães, and Boris Mann for reading a draft of this and sharing feedback 🙏🏽.</p>
<hr>
<p><small>P.S. Gordon shared some interesting notes which I'll quote here (with permission):</small></p>
<details>
<summary>notes from Gordon</summary>
<blockquote>
<p>my own notes as I grapple with these same challenges:</p>
<ul>
<li><a href="https://subconscious.substack.com/p/credible-exit">Credible exit</a>. For exit to be credible, the data must be gettable, but also useful. What useful means depends upon the usecase/goal. So credible exit is a soft condition, or a gradient.</li>
<li>Hostile interoperability. Historically, interoperability has often emerged through competition. Microsoft Word or Photoshop implement a proprietary format. The app becomes popular. It spawns competitors, and also adjacent apps. These apps implement all or a subset of the proprietary format. Finally, that format becomes a de facto standard, and sometimes an actual standard. [See <a href="https://subconscious.substack.com/i/40537200/files-make-interoperability-the-default">Files allow interoperability to emerge retroactively</a>].</li>
</ul>
<p>Something I realized while writing these: Interoperability is not a feature. Interoperability is an ecological condition. It's what happens when different players with different incentives evolve networks of exchange. That means we can't force it to come about. We can only terraform the conditions where it might grow.</p>
<p>The desktop had the file system, a permissionless shared substrate belonging to the user. Apps could read each other's files and implement each other's file formats (each app effectively acts as a Cambria lens). These conditions were extremely conducive to the emergence of hostile interop.</p>
<p>This is what lead me personally toward building Noosphere protocol… it's essentially a very simple networked file system, supporting user ownership, multiplayer, and ability to permissionlessly plug multiple apps on top. There may be other paths to this outcome as well. In conversations with PVH he's mentioned that his motivation for investing in CRDT research is that if you have a file that knows how to sync itself, you don't have to care about the protocol.</p>
</blockquote>
</details>
<hr>
<p><small>P.P.S. I was thinking about this post before Jesse got me 'interop-pilled', but <a href="https://utopia.rosano.ca/interoperable-collaborative-apps-with-jess-martin/">our conversation</a> certainly helped add fuel to the fire:</small></p>
<iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/UNKgD8OzjCk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

</div><p>
	<small>Tagged: <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:40 am, January 16, 2024" href="/log/2024-01-16-interoperable-visions/"><time datetime="2024-01-16T09:40:26-05:00" data-pagefind-sort="date[datetime]">09h40</time></a>

		
		<span>from <a href="/log/place/toronto/">Toronto</a> / </span>

		<span><a href="/log/country/canada/">Canada</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>introducing feedbox</title>
  <link>https://rosano.ca/blog/introducing-feedbox/</link>
  <pubDate>Wed, 20 Dec 2023 12:29:56 +0000</pubDate>
  <guid>https://rosano.ca/blog/introducing-feedbox/</guid>
  <description>Embed an RSS feed on any website with a few lines of code.</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget>Embed an RSS feed on any website with a few lines of code.</nugget><hr>
<div class="content"><p><a href="https://github.com/rosano/feedbox">feedbox</a> is an embed for previewing RSS feeds. Here's what it looks like:</p>
<p><img src="https://static.rosano.ca/home/blog/2023-12-20-introducing-feedbox/2023.12.20-08h56.jpg" aria-hidden="true">
</p>
<p>Here it's configured to fetch the one from this blog, but you can use any RSS feed and drop in on your website with a few lines of code. I've added it to all my project home pages, including <a href="https://0data.app">Zero Data App</a> and <a href="https://rosano.ca">my homepage</a>.</p>
<p>It uses an instance of <a href="https://github.com/Rob--W/cors-anywhere">cors-anywhere</a> to get around CORS complaints; I hope someday it will be simpler to just <code>fetch</code> the raw contents of a page.</p>
<p>Unlike most of my programming projects, I tried to write code that feels more 'messy' to me (simple human names instead of XYZVerboseNames, which is generally hell for other people). I also actually wrote a <a href="https://github.com/rosano/feedbox/blob/master/README.md">README</a> (uncommon for most of the over 100 <a href="https://github.com/olsk">OldSkool</a> modules) to describe the setup and possible options; hope to maintain this as a baseline for future modules.</p>
<p>Was kind of fun to let go, and not test everything, although I still wrote some tests…</p>
<p>As a more general complement, I <a href="https://github.com/olsk/OLSKExpress/commit/4eabc72df40cb0c822c27ba86ac45300e48a13c7#">automatically added link[rel=&quot;alternate]</a> to sites that don't have one by setting an environment variable.</p>
<p>The sensation of stuff updating everywhere, even on static pages, without anybody doing anything, is kind of electric to me: isn't that what computers are for? <em>bleep bloop</em>!</p>
</div><p>
	<small>Tagged: <a href="/log/tag/process/">process</a>, <a href="/log/tag/debut/">debut</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:29 am, December 20, 2023" href="/blog/introducing-feedbox/"><time datetime="2023-12-20T09:29:56-03:00" data-pagefind-sort="date[datetime]">09h29</time></a>

		
		<span>from <a href="/log/place/brasilia/">Brasilia</a> / </span>

		<span><a href="/log/country/brazil/">Brazil</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Wednesday, December 20, 2023 09h29</title>
  <link>https://rosano.ca/log/2023-12-20-introducing-feedbox/</link>
  <pubDate>Wed, 20 Dec 2023 09:29:56 -0300</pubDate>
  <guid>https://rosano.ca/log/2023-12-20-introducing-feedbox/</guid>
  <description>feedbox is an embed for previewing RSS feeds. Here&#39;s what it looks like:&#xA;Here it&#39;s configured to fetch the one from this blog, but you can use any RSS feed and drop in on your website with a few lines of code. I&#39;ve added it to all my project home pages, including Zero Data App and my homepage.&#xA;It uses an instance of cors-anywhere to get around CORS complaints; I hope someday it will be simpler to just fetch the raw contents of a page.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget><p><a href="https://github.com/rosano/feedbox">feedbox</a> is an embed for previewing RSS feeds. Here's what it looks like:</p>
<p><img src="https://static.rosano.ca/home/timeline/2023-12-20-introducing-feedbox1703075396/2023.12.20-08h56.jpg" aria-hidden="true">
</p>
<p>Here it's configured to fetch the one from this blog, but you can use any RSS feed and drop in on your website with a few lines of code. I've added it to all my project home pages, including <a href="https://0data.app">Zero Data App</a> and <a href="https://rosano.ca">my homepage</a>.</p>
<p>It uses an instance of <a href="https://github.com/Rob--W/cors-anywhere">cors-anywhere</a> to get around CORS complaints; I hope someday it will be simpler to just <code>fetch</code> the raw contents of a page.</p></nugget><hr>
<div class="content"><p><a href="https://github.com/rosano/feedbox">feedbox</a> is an embed for previewing RSS feeds. Here's what it looks like:</p>
<p><img src="https://static.rosano.ca/home/timeline/2023-12-20-introducing-feedbox1703075396/2023.12.20-08h56.jpg" aria-hidden="true">
</p>
<p>Here it's configured to fetch the one from this blog, but you can use any RSS feed and drop in on your website with a few lines of code. I've added it to all my project home pages, including <a href="https://0data.app">Zero Data App</a> and <a href="https://rosano.ca">my homepage</a>.</p>
<p>It uses an instance of <a href="https://github.com/Rob--W/cors-anywhere">cors-anywhere</a> to get around CORS complaints; I hope someday it will be simpler to just <code>fetch</code> the raw contents of a page.</p>
<p>Unlike most of my programming projects, I tried to write code that feels more 'messy' to me (simple human names instead of XYZVerboseNames, which is generally hell for other people). I also actually wrote a <a href="https://github.com/rosano/feedbox/blob/master/README.md">README</a> (uncommon for most of the over 100 <a href="https://github.com/olsk">OldSkool</a> modules) to describe the setup and possible options; hope to maintain this as a baseline for future modules.</p>
<p>Was kind of fun to let go, and not test everything, although I still wrote some tests…</p>
<p>As a more general complement, I <a href="https://github.com/olsk/OLSKExpress/commit/4eabc72df40cb0c822c27ba86ac45300e48a13c7#">automatically added link[rel=&quot;alternate]</a> to sites that don't have one by setting an environment variable.</p>
<p>The sensation of stuff updating everywhere, even on static pages, without anybody doing anything, is kind of electric to me: isn't that what computers are for? <em>bleep bloop</em>!</p>
</div><p>
	<small>Tagged: <a href="/log/tag/process/">process</a>, <a href="/log/tag/debut/">debut</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 9:29 am, December 20, 2023" href="/log/2023-12-20-introducing-feedbox/"><time datetime="2023-12-20T09:29:56-03:00" data-pagefind-sort="date[datetime]">09h29</time></a>

		
		<span>from <a href="/log/place/brasilia/">Brasilia</a> / </span>

		<span><a href="/log/country/brazil/">Brazil</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>interoperable collaborative apps (with Jess Martin)</title>
  <link>https://rosano.ca/blog/interoperable-collaborative-apps-with-jess-martin/</link>
  <pubDate>Mon, 06 Nov 2023 14:15:11 +0000</pubDate>
  <guid>https://rosano.ca/blog/interoperable-collaborative-apps-with-jess-martin/</guid>
  <description>Even when you #OwnYourData 100%, many might find little agency in being able to &#39;edit properties on JSON objects&#39;. What level of handedness would be meaningful to them?</description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget>Even when you #OwnYourData 100%, many might find little agency in being able to 'edit properties on JSON objects'. What level of handedness would be meaningful to them?</nugget><hr>
<div class="content"><iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/UNKgD8OzjCk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<table>
  <thead>
      <tr>
          <th>time</th>
          <th>section</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>00:00</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=00m00s">opening questions</a></td>
      </tr>
      <tr>
          <td>01:13</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=01m13s">zero data</a></td>
      </tr>
      <tr>
          <td>02:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=02m05s">DXOS</a></td>
      </tr>
      <tr>
          <td>03:20</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=03m20s">zero data origin</a></td>
      </tr>
      <tr>
          <td>07:23</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=07m23s">apps as public spaces</a></td>
      </tr>
      <tr>
          <td>10:19</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=10m19s">diffuse supporting multiple backends</a></td>
      </tr>
      <tr>
          <td>11:04</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=11m04s">rosano's apps</a></td>
      </tr>
      <tr>
          <td>12:03</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=12m03s">adoption challenges</a></td>
      </tr>
      <tr>
          <td>15:01</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=15m01s">interfaces for multi-device recovery</a></td>
      </tr>
      <tr>
          <td>18:15</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=18m15s">using a remoteStorage app to teach languages</a></td>
      </tr>
      <tr>
          <td>22:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=22m05s">prove functionality to groups</a></td>
      </tr>
      <tr>
          <td>23:42</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=23m42s">invisible technology</a></td>
      </tr>
      <tr>
          <td>25:37</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=25m37s">cross-app interoperability visions</a></td>
      </tr>
      <tr>
          <td>27:02</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=27m02s">syncing a shared data substrate</a></td>
      </tr>
      <tr>
          <td>29:46</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=29m46s">group chat as a catalyst for interop</a></td>
      </tr>
      <tr>
          <td>31:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=31m16s">integrating with existing storage</a></td>
      </tr>
      <tr>
          <td>35:45</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=35m45s">credible exit and exit by default</a></td>
      </tr>
      <tr>
          <td>38:18</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=38m18s">owning your data without handedness</a></td>
      </tr>
      <tr>
          <td>42:44</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=42m44s">interoperability needs adoption</a></td>
      </tr>
      <tr>
          <td>45:51</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=45m51s">valuable technology comes from other purposes</a></td>
      </tr>
      <tr>
          <td>47:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=47m16s">open-source can live on</a></td>
      </tr>
      <tr>
          <td>49:58</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=49m58s">re-thinking funding apps</a></td>
      </tr>
      <tr>
          <td>51:10</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=51m10s">making space for contributors</a></td>
      </tr>
      <tr>
          <td>52:48</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=52m48s">old house versus old app</a></td>
      </tr>
      <tr>
          <td>53:49</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=53m49s">personal spaces and malleable software</a></td>
      </tr>
      <tr>
          <td>55:30</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=55m30s">being handy with houses and software</a></td>
      </tr>
      <tr>
          <td>57:11</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=57m11s">shrinking programs</a></td>
      </tr>
  </tbody>
</table>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://jessmart.in">Jess Martin</a></li>
<li><a href="https://dxos.org">DXOS</a></li>
<li><a href="https://en.wikipedia.org/wiki/The%5FHumane%5FInterface">&quot;The Humane Interface&quot; by Jeff Raskin</a></li>
<li><a href="https://subconscious.substack.com/p/credible-exit">&quot;Credible exit&quot; by Gordon Brander</a></li>
<li><a href="https://0data.app">Zero Data</a></li>
</ul>
</div><p>
	<small>Tagged: <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 11:15 am, November 6, 2023" href="/blog/interoperable-collaborative-apps-with-jess-martin/"><time datetime="2023-11-06T11:15:11-03:00" data-pagefind-sort="date[datetime]">11h15</time></a>

		
		<span>from <a href="/log/place/belo-horizonte/">Belo Horizonte</a> / </span>

		<span><a href="/log/country/brazil/">Brazil</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Monday, November 6, 2023 11h15</title>
  <link>https://rosano.ca/log/2023-11-06-interoperable-collaborative-apps-with-jess-martin/</link>
  <pubDate>Mon, 06 Nov 2023 11:15:11 -0300</pubDate>
  <guid>https://rosano.ca/log/2023-11-06-interoperable-collaborative-apps-with-jess-martin/</guid>
  <description> time section 00:00 opening questions 01:13 zero data 02:05 DXOS 03:20 zero data origin 07:23 apps as public spaces 10:19 diffuse supporting multiple backends 11:04 rosano&#39;s apps 12:03 adoption challenges 15:01 interfaces for multi-device recovery 18:15 using a remoteStorage app to teach languages 22:05 prove functionality to groups 23:42 invisible technology 25:37 cross-app interoperability visions 27:02 syncing a shared data substrate 29:46 group chat as a catalyst for interop 31:16 integrating with existing storage 35:45 credible exit and exit by default 38:18 owning your data without handedness 42:44 interoperability needs adoption 45:51 valuable technology comes from other purposes 47:16 open-source can live on 49:58 re-thinking funding apps 51:10 making space for contributors 52:48 old house versus old app 53:49 personal spaces and malleable software 55:30 being handy with houses and software 57:11 shrinking programs Links Jess Martin DXOS &amp;quot;The Humane Interface&amp;quot; by Jeff Raskin &amp;quot;Credible exit&amp;quot; by Gordon Brander Zero Data </description>
  <content:encoded><![CDATA[
  <div class="post">

<nugget><iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/UNKgD8OzjCk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<table>
  <thead>
      <tr>
          <th>time</th>
          <th>section</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>00:00</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=00m00s">opening questions</a></td>
      </tr>
      <tr>
          <td>01:13</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=01m13s">zero data</a></td>
      </tr>
      <tr>
          <td>02:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=02m05s">DXOS</a></td>
      </tr>
      <tr>
          <td>03:20</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=03m20s">zero data origin</a></td>
      </tr>
      <tr>
          <td>07:23</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=07m23s">apps as public spaces</a></td>
      </tr>
      <tr>
          <td>10:19</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=10m19s">diffuse supporting multiple backends</a></td>
      </tr>
      <tr>
          <td>11:04</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=11m04s">rosano's apps</a></td>
      </tr>
      <tr>
          <td>12:03</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=12m03s">adoption challenges</a></td>
      </tr>
      <tr>
          <td>15:01</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=15m01s">interfaces for multi-device recovery</a></td>
      </tr>
      <tr>
          <td>18:15</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=18m15s">using a remoteStorage app to teach languages</a></td>
      </tr>
      <tr>
          <td>22:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=22m05s">prove functionality to groups</a></td>
      </tr>
      <tr>
          <td>23:42</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=23m42s">invisible technology</a></td>
      </tr>
      <tr>
          <td>25:37</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=25m37s">cross-app interoperability visions</a></td>
      </tr>
      <tr>
          <td>27:02</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=27m02s">syncing a shared data substrate</a></td>
      </tr>
      <tr>
          <td>29:46</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=29m46s">group chat as a catalyst for interop</a></td>
      </tr>
      <tr>
          <td>31:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=31m16s">integrating with existing storage</a></td>
      </tr>
      <tr>
          <td>35:45</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=35m45s">credible exit and exit by default</a></td>
      </tr>
      <tr>
          <td>38:18</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=38m18s">owning your data without handedness</a></td>
      </tr>
      <tr>
          <td>42:44</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=42m44s">interoperability needs adoption</a></td>
      </tr>
      <tr>
          <td>45:51</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=45m51s">valuable technology comes from other purposes</a></td>
      </tr>
      <tr>
          <td>47:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=47m16s">open-source can live on</a></td>
      </tr>
      <tr>
          <td>49:58</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=49m58s">re-thinking funding apps</a></td>
      </tr>
      <tr>
          <td>51:10</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=51m10s">making space for contributors</a></td>
      </tr>
      <tr>
          <td>52:48</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=52m48s">old house versus old app</a></td>
      </tr>
      <tr>
          <td>53:49</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=53m49s">personal spaces and malleable software</a></td>
      </tr>
      <tr>
          <td>55:30</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=55m30s">being handy with houses and software</a></td>
      </tr>
      <tr>
          <td>57:11</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=57m11s">shrinking programs</a></td>
      </tr>
  </tbody>
</table>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://jessmart.in">Jess Martin</a></li>
<li><a href="https://dxos.org">DXOS</a></li>
<li><a href="https://en.wikipedia.org/wiki/The%5FHumane%5FInterface">&quot;The Humane Interface&quot; by Jeff Raskin</a></li>
<li><a href="https://subconscious.substack.com/p/credible-exit">&quot;Credible exit&quot; by Gordon Brander</a></li>
<li><a href="https://0data.app">Zero Data</a></li>
</ul></nugget><hr>
<div class="content"><iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/UNKgD8OzjCk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<table>
  <thead>
      <tr>
          <th>time</th>
          <th>section</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>00:00</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=00m00s">opening questions</a></td>
      </tr>
      <tr>
          <td>01:13</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=01m13s">zero data</a></td>
      </tr>
      <tr>
          <td>02:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=02m05s">DXOS</a></td>
      </tr>
      <tr>
          <td>03:20</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=03m20s">zero data origin</a></td>
      </tr>
      <tr>
          <td>07:23</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=07m23s">apps as public spaces</a></td>
      </tr>
      <tr>
          <td>10:19</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=10m19s">diffuse supporting multiple backends</a></td>
      </tr>
      <tr>
          <td>11:04</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=11m04s">rosano's apps</a></td>
      </tr>
      <tr>
          <td>12:03</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=12m03s">adoption challenges</a></td>
      </tr>
      <tr>
          <td>15:01</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=15m01s">interfaces for multi-device recovery</a></td>
      </tr>
      <tr>
          <td>18:15</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=18m15s">using a remoteStorage app to teach languages</a></td>
      </tr>
      <tr>
          <td>22:05</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=22m05s">prove functionality to groups</a></td>
      </tr>
      <tr>
          <td>23:42</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=23m42s">invisible technology</a></td>
      </tr>
      <tr>
          <td>25:37</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=25m37s">cross-app interoperability visions</a></td>
      </tr>
      <tr>
          <td>27:02</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=27m02s">syncing a shared data substrate</a></td>
      </tr>
      <tr>
          <td>29:46</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=29m46s">group chat as a catalyst for interop</a></td>
      </tr>
      <tr>
          <td>31:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=31m16s">integrating with existing storage</a></td>
      </tr>
      <tr>
          <td>35:45</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=35m45s">credible exit and exit by default</a></td>
      </tr>
      <tr>
          <td>38:18</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=38m18s">owning your data without handedness</a></td>
      </tr>
      <tr>
          <td>42:44</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=42m44s">interoperability needs adoption</a></td>
      </tr>
      <tr>
          <td>45:51</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=45m51s">valuable technology comes from other purposes</a></td>
      </tr>
      <tr>
          <td>47:16</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=47m16s">open-source can live on</a></td>
      </tr>
      <tr>
          <td>49:58</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=49m58s">re-thinking funding apps</a></td>
      </tr>
      <tr>
          <td>51:10</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=51m10s">making space for contributors</a></td>
      </tr>
      <tr>
          <td>52:48</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=52m48s">old house versus old app</a></td>
      </tr>
      <tr>
          <td>53:49</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=53m49s">personal spaces and malleable software</a></td>
      </tr>
      <tr>
          <td>55:30</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=55m30s">being handy with houses and software</a></td>
      </tr>
      <tr>
          <td>57:11</td>
          <td><a href="https://youtu.be/UNKgD8OzjCk?t=57m11s">shrinking programs</a></td>
      </tr>
  </tbody>
</table>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://jessmart.in">Jess Martin</a></li>
<li><a href="https://dxos.org">DXOS</a></li>
<li><a href="https://en.wikipedia.org/wiki/The%5FHumane%5FInterface">&quot;The Humane Interface&quot; by Jeff Raskin</a></li>
<li><a href="https://subconscious.substack.com/p/credible-exit">&quot;Credible exit&quot; by Gordon Brander</a></li>
<li><a href="https://0data.app">Zero Data</a></li>
</ul>
</div><p>
	<small>Tagged: <a href="/log/tag/zero-data/">zero data</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 11:15 am, November 6, 2023" href="/log/2023-11-06-interoperable-collaborative-apps-with-jess-martin/"><time datetime="2023-11-06T11:15:11-03:00" data-pagefind-sort="date[datetime]">11h15</time></a>

		
		<span>from <a href="/log/place/belo-horizonte/">Belo Horizonte</a> / </span>

		<span><a href="/log/country/brazil/">Brazil</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Flashcards from Google Translate</title>
  <link>https://rosano.ca/blog/flashcards-from-google-translate/</link>
  <pubDate>Mon, 03 Apr 2023 10:39:27 +0000</pubDate>
  <guid>https://rosano.ca/blog/flashcards-from-google-translate/</guid>
  <description> time section 00:00 Introduction 01:26 Starting from scratch 03:33 Trying it out 04:08 Conclusion Recipe NameFlashcards from translations Callback const source = document.querySelector(&#39;textarea[aria-label=&#34;Source text&#34;]&#39;).value.split(&#39;\n&#39;); const pronounce = source.map(e =&amp;gt; &#39;&#39;);&#xA;if (document.querySelector(&#39;div[data-location=&amp;quot;2&amp;quot;] div&#39;)) {&#xA;document.querySelector(&#39;div[data-location=&amp;quot;2&amp;quot;] div&#39;).textContent.split(&#39;\n&#39;).forEach((e, i) =&amp;gt; pronounce[i] = e);&#xA;}&#xA;const translations = Array.from(document.querySelectorAll(&#39;div[aria-live=&amp;quot;polite&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; span:nth-child(2n + 1) &amp;gt; span&#39;)).map(e =&amp;gt; e.textContent);&#xA;const cardsText = translations.map((e, i) =&amp;gt; [e, source[i], pronounce[i]].map(e =&amp;gt; e.trim().replace(/^- ?/g, &#39;&#39;)).join(&#39;;&#39;)).join(&#39; &#39;);&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">


<div class="content"><iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/ytY842W9o3s" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<table>
  <thead>
      <tr>
          <th>time</th>
          <th>section</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>00:00</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=00m00s">Introduction</a></td>
      </tr>
      <tr>
          <td>01:26</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=01m26s">Starting from scratch</a></td>
      </tr>
      <tr>
          <td>03:33</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=03m33s">Trying it out</a></td>
      </tr>
      <tr>
          <td>04:08</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=04m08s">Conclusion</a></td>
      </tr>
  </tbody>
</table>
<h1 id="recipe">Recipe</h1>
<dl class="OLSKDecorGlossary">
<dt>Name</dt><dd>Flashcards from translations</dd>
<dt>Callback</dt>
<dd><code>const source = document.querySelector('textarea[aria-label="Source text"]').value.split('\n');
<p>const pronounce = source.map(e =&gt; '');</p>
<p>if (document.querySelector('div[data-location=&quot;2&quot;] div')) {<br>
document.querySelector('div[data-location=&quot;2&quot;] div').textContent.split('\n').forEach((e, i) =&gt; pronounce[i] = e);<br>
}</p>
<p>const translations = Array.from(document.querySelectorAll('div[aria-live=&quot;polite&quot;] &gt; div &gt; div &gt; span &gt; span:nth-child(2n + 1) &gt; span')).map(e =&gt; e.textContent);</p>
<p>const cardsText = translations.map((e, i) =&gt; [e, source[i], pronounce[i]].map(e =&gt; e.trim().replace(/^- ?/g, '')).join(';')).join('  ');</p>
<p>return this.api.LCHCopyToClipboard(cardsText);<br>
</code></dd></p>
<dt>URL Filter</dt><dd>https://translate.google.com</dd>
</dl>
<hr>
<p>Part of <a href="https://rosano.hmm.garden/01f1ghgrgxq5adk0sdck3csghh">Cooking with Launchlet</a>.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/launchlet/">Launchlet</a>, <a href="/log/tag/kommit/">Kommit</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 5:39 pm, April 3, 2023" href="/blog/flashcards-from-google-translate/"><time datetime="2023-04-03T17:39:27&#43;07:00" data-pagefind-sort="date[datetime]">17h39</time></a>

		
		<span>from <a href="/log/place/chiang-mai/">Chiang Mai</a> / </span>

		<span><a href="/log/country/thailand/">Thailand</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Monday, April 3, 2023 17h39</title>
  <link>https://rosano.ca/log/2023-04-03-flashcards-from-google-translate/</link>
  <pubDate>Mon, 03 Apr 2023 17:39:27 +0700</pubDate>
  <guid>https://rosano.ca/log/2023-04-03-flashcards-from-google-translate/</guid>
  <description> time section 00:00 Introduction 01:26 Starting from scratch 03:33 Trying it out 04:08 Conclusion Recipe NameFlashcards from translations Callback const source = document.querySelector(&#39;textarea[aria-label=&#34;Source text&#34;]&#39;).value.split(&#39;\n&#39;); const pronounce = source.map(e =&amp;gt; &#39;&#39;);&#xA;if (document.querySelector(&#39;div[data-location=&amp;quot;2&amp;quot;] div&#39;)) {&#xA;document.querySelector(&#39;div[data-location=&amp;quot;2&amp;quot;] div&#39;).textContent.split(&#39;\n&#39;).forEach((e, i) =&amp;gt; pronounce[i] = e);&#xA;}&#xA;const translations = Array.from(document.querySelectorAll(&#39;div[aria-live=&amp;quot;polite&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; span &amp;gt; span:nth-child(2n + 1) &amp;gt; span&#39;)).map(e =&amp;gt; e.textContent);&#xA;const cardsText = translations.map((e, i) =&amp;gt; [e, source[i], pronounce[i]].map(e =&amp;gt; e.trim().replace(/^- ?/g, &#39;&#39;)).join(&#39;;&#39;)).join(&#39; &#39;);&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">


<div class="content"><iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/ytY842W9o3s" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<table>
  <thead>
      <tr>
          <th>time</th>
          <th>section</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>00:00</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=00m00s">Introduction</a></td>
      </tr>
      <tr>
          <td>01:26</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=01m26s">Starting from scratch</a></td>
      </tr>
      <tr>
          <td>03:33</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=03m33s">Trying it out</a></td>
      </tr>
      <tr>
          <td>04:08</td>
          <td><a href="https://youtu.be/ytY842W9o3s?start=04m08s">Conclusion</a></td>
      </tr>
  </tbody>
</table>
<h1 id="recipe">Recipe</h1>
<dl class="OLSKDecorGlossary">
<dt>Name</dt><dd>Flashcards from translations</dd>
<dt>Callback</dt>
<dd><code>const source = document.querySelector('textarea[aria-label="Source text"]').value.split('\n');
<p>const pronounce = source.map(e =&gt; '');</p>
<p>if (document.querySelector('div[data-location=&quot;2&quot;] div')) {<br>
document.querySelector('div[data-location=&quot;2&quot;] div').textContent.split('\n').forEach((e, i) =&gt; pronounce[i] = e);<br>
}</p>
<p>const translations = Array.from(document.querySelectorAll('div[aria-live=&quot;polite&quot;] &gt; div &gt; div &gt; span &gt; span:nth-child(2n + 1) &gt; span')).map(e =&gt; e.textContent);</p>
<p>const cardsText = translations.map((e, i) =&gt; [e, source[i], pronounce[i]].map(e =&gt; e.trim().replace(/^- ?/g, '')).join(';')).join('  ');</p>
<p>return this.api.LCHCopyToClipboard(cardsText);<br>
</code></dd></p>
<dt>URL Filter</dt><dd>https://translate.google.com</dd>
</dl>
<hr>
<p>Part of <a href="https://rosano.hmm.garden/01f1ghgrgxq5adk0sdck3csghh">Cooking with Launchlet</a>.</p>
</div><p>
	<small>Tagged: <a href="/log/tag/launchlet/">Launchlet</a>, <a href="/log/tag/kommit/">Kommit</a>, <a href="/log/tag/technical/">technical</a>.
	</small>
</p>

<hr>
<span class="metadata" data-pagefind-ignore>

	<small>
		<a aria-label="Permalink for 5:39 pm, April 3, 2023" href="/log/2023-04-03-flashcards-from-google-translate/"><time datetime="2023-04-03T17:39:27&#43;07:00" data-pagefind-sort="date[datetime]">17h39</time></a>

		
		<span>from <a href="/log/place/chiang-mai/">Chiang Mai</a> / </span>

		<span><a href="/log/country/thailand/">Thailand</a></span></small>

</span>

</div>

  ]]></content:encoded>
</item>



</channel>

</rss>
