<?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;Launchlet&#34;</title>



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

<generator>Hugo</generator>

<language>en-ca</language>



<lastBuildDate>Tue, 14 Apr 2026 08:33:02 +0000</lastBuildDate>

<atom:link href="https://rosano.ca/log/tag/launchlet/feed" rel="self" type="application/rss" /><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><item>
  <title>Launchlet—Customize any website with JavaScript or CSS</title>
  <link>https://rosano.ca/blog/launchlet-customize-any-website-with-javascript-or-css/</link>
  <pubDate>Wed, 09 Oct 2019 06:11:00 +0000</pubDate>
  <guid>https://rosano.ca/blog/launchlet-customize-any-website-with-javascript-or-css/</guid>
  <description>I&#39;m super excited to share Launchlet https://launchlet.dev - my first project that integrates with remoteStorage. It&#39;s a javascript/css launcher that you can run as a bookmarklet, browser extension, or module in your own project.&#xA;There is a compose interface for managing your Recipes and it uses remotestorage.js + a custom storage widget. It&#39;s so nice to be able to work offline, sync between different devices or prod/dev environments. I wish remoteStorage was more well-known and adopted everywhere because it makes the whole app and dev experience so much simpler.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">


<div class="content"><p>I'm super excited to share <strong>Launchlet</strong> <a href="https://launchlet.dev">https://launchlet.dev</a> - my first project that integrates with remoteStorage. It's a javascript/css launcher that you can run as a bookmarklet, browser extension, or module in your own project.</p>
<p>There is a compose interface for managing your <em>Recipes</em> and it uses remotestorage.js + a custom storage widget. It's so nice to be able to work offline, sync between different devices or prod/dev environments. I wish remoteStorage was more well-known and adopted everywhere because it makes the whole app and dev experience so much simpler.</p>
<p>Any feedback is welcome. Let's make more of these apps!!</p>
<p><a href="https://launchlet.dev">Launchlet</a></p>
<iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/4pH6tS7x_nA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

</div><p>
	<small>Tagged: <a href="/log/tag/debut/">debut</a>, <a href="/log/tag/launchlet/">Launchlet</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 2:11 am, October 9, 2019" href="/blog/launchlet-customize-any-website-with-javascript-or-css/"><time datetime="2019-10-09T02:11:00-04:00" data-pagefind-sort="date[datetime]">02h11</time></a>

		
		<span>from <a href="/log/place/montreal/">Montreal</a> / </span>

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

</span>

</div>

  ]]></content:encoded>
</item><item>
  <title>Wednesday, October 9, 2019 02h11</title>
  <link>https://rosano.ca/log/2019-10-09-launchlet-customize-any-website-with-javascript-or-css/</link>
  <pubDate>Wed, 09 Oct 2019 02:11:00 -0400</pubDate>
  <guid>https://rosano.ca/log/2019-10-09-launchlet-customize-any-website-with-javascript-or-css/</guid>
  <description>I&#39;m super excited to share Launchlet https://launchlet.dev - my first project that integrates with remoteStorage. It&#39;s a javascript/css launcher that you can run as a bookmarklet, browser extension, or module in your own project.&#xA;There is a compose interface for managing your Recipes and it uses remotestorage.js + a custom storage widget. It&#39;s so nice to be able to work offline, sync between different devices or prod/dev environments. I wish remoteStorage was more well-known and adopted everywhere because it makes the whole app and dev experience so much simpler.&#xA;</description>
  <content:encoded><![CDATA[
  <div class="post">


<div class="content"><p>I'm super excited to share <strong>Launchlet</strong> <a href="https://launchlet.dev">https://launchlet.dev</a> - my first project that integrates with remoteStorage. It's a javascript/css launcher that you can run as a bookmarklet, browser extension, or module in your own project.</p>
<p>There is a compose interface for managing your <em>Recipes</em> and it uses remotestorage.js + a custom storage widget. It's so nice to be able to work offline, sync between different devices or prod/dev environments. I wish remoteStorage was more well-known and adopted everywhere because it makes the whole app and dev experience so much simpler.</p>
<p>Any feedback is welcome. Let's make more of these apps!!</p>
<p><a href="https://launchlet.dev">Launchlet</a></p>
<iframe width="300" height="250" src="https://www.youtube-nocookie.com/embed/4pH6tS7x_nA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

</div><p>
	<small>Tagged: <a href="/log/tag/debut/">debut</a>, <a href="/log/tag/launchlet/">Launchlet</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 2:11 am, October 9, 2019" href="/log/2019-10-09-launchlet-customize-any-website-with-javascript-or-css/"><time datetime="2019-10-09T02:11:00-04:00" data-pagefind-sort="date[datetime]">02h11</time></a>

		
		<span>from <a href="/log/place/montreal/">Montreal</a> / </span>

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

</span>

</div>

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



</channel>

</rss>
