<?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>hi, it&#39;s mike</title>
    <link>https://mike.puddingtime.org/tags/linkding/</link>
    <description>Recent content on hi, it&#39;s mike</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>mike@puddingtime.org (mike)</managingEditor>
    <webMaster>mike@puddingtime.org (mike)</webMaster>
    <copyright>© 2026, mike</copyright>
    <lastBuildDate>Sun, 04 Feb 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://mike.puddingtime.org/tags/linkding/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>State of the self-host</title>
      <link>https://mike.puddingtime.org/posts/2024-02-04-state-of-the-self-host/</link>
      <pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-02-04-state-of-the-self-host/</guid>
      <description>What has stuck and what has not from recent self-hosting experiments.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve tried a bunch of self-hosted things recently. In the spirit of &ldquo;yeah, but how is it <em>really</em> working,&rdquo; a quick rundown:</p>
<h2 id="linkding">Linkding</h2>
<p><a href="https://github.com/sissbruecker/linkding">Linkding</a> is a bookmarking tool. It has a UI similar to pinboard.in, can import <kbd>bookmarks.html</kbd> files, and has a decent API. It&rsquo;s working very well. I&rsquo;m particularly fond of the <a href="https://github.com/fivefold/linkding-injector">Linkding injector addon for Firefox</a>, which injects Linkding search results into the sidebar of most popular search engines.</p>
<p>This one seems to be a keeper.</p>
<p>I briefly considered <a href="https://github.com/shaarli/Shaarli">shaarli</a> as an alternative. I didn&rsquo;t like the UI as much, but it has a bigger list of third-party extensions than Linkding.</p>
<h2 id="wallabag">Wallabag</h2>
<p><a href="https://wallabag.org/">Wallabag</a> is a self-hosted Pocket alternative. It also has a useful API, an iOS app, and a Firefox extension. I wasn&rsquo;t too sure about this one going in, but once I got the Docker stuff and some reverse proxy weirdness sorted it worked quite well. It has a few more smarts than Pocket, and it provides Atom feeds of simplified articles you can use to create ebook digests via Calibre or just consume with your everyday RSS reader, given the formatting is cleaned up.</p>
<p>It also lets you share <a href="https://reader.puddingtime.net/share/65bff5347b9932.42547178">a public-facing version of a saved article</a>, and its clipper extension seems to be able to see around a few paywalls if you&rsquo;re <a href="https://reader.puddingtime.net/view/176">saving from a subscription site</a>.</p>
<p>I think this one is a keeper given I can automate the ebook exports: That essentially recreates the Pocket/Kobo integration.</p>
<h2 id="calibre-web">calibre-web</h2>
<p><a href="https://github.com/janeczku/calibre-web">calibre-web</a> is a HTML5 front-end for Calibre libraries that allows you to edit metadata, organize your ebook collection into shelves and, most importantly to me, act as an online sync source for Kobo e-readers, allowing you to browse your collection and download to your Kobo, then keep your reading location in sync.</p>
<p>Some people live in calibre-web full-time, uploading ebooks and managing their metadata. I prefer to pair it with Calibre itself due to an ongoing content conversion project.</p>
<p>It&rsquo;s definitely a keeper. I recovered a ton of books from another device and converted them to Kobo-friendly epubs. Better yet, when downloaded to a Kobo, calibre-web serves up kepubs, which are optimized for Kobos.</p>
<h2 id="calibre">Calibre</h2>
<p><a href="https://calibre-ebook.com/">Calibre</a> is an ebook conversion/management tool, ordinarily used on the desktop. I found <a href="https://mariushosting.com/how-to-install-calibre-on-your-synology-nas/">a Docker recipe</a> that lets me run it on my Synology and access it via a web-based VNC tool. With a little fiddling, I added mountpoints that let me install downloaded extensions and import books from a <kbd>bookdrop</kbd> directory as I pull them down from their assorted vendor sites.</p>
<p>It works alongside calibre-web, allowing me to install books from assorted formats and export them to epub, where they&rsquo;re almost instantly available from the calibre-web web interface or Kobo integration.</p>
<p>Even if sync didn&rsquo;t work, you can access a content server that uses the <a href="https://en.wikipedia.org/wiki/Open_Publication_Distribution_System">OPDS protocol</a> for browsing. So with a reverse proxy and authenticated user, you can get at your library from anywhere and side-load books to your reader.</p>
<p>I&rsquo;m going to keep the Dockerized version.</p>
<h2 id="vikunja">Vikunja</h2>
<p><a href="https://vikunja.io/">Vikunja</a> is a todo app that includes a traditional list view and a card view. It serves up CalDAV, so it could theoretically work with any CalDAV client, but its doesn&rsquo;t work well with iOS Reminders. The responsive Web UI isn&rsquo;t bad if you want to install it to your iPhone desktop.</p>
<p>I installed it and tried it for a day, but I am not sure about it. I&rsquo;m a little uneasy about self-hosting my todos, and was hoping for some kind of native client.</p>
<h2 id="joplin">Joplin</h2>
<p><a href="https://joplinapp.org/">Joplin</a> is an Evernote-esque app with a ton of cross-platform support that I couldn&rsquo;t quite bring myself to trust in a self-hosted context.  It&rsquo;s a good tool and all, but I&rsquo;d prefer to just have my notes in a plaintext, version-controlled setup.</p>
<h2 id="mariushosting">MariusHosting</h2>
<p><a href="https://mariushosting.com/">MariusHosting</a> isn&rsquo;t an app, it&rsquo;s a site run by Marius Lixandru with a ton of recipes for Dockerizing common self-hosted apps on a Synology. It&rsquo;s my first stop when I want to try something out. I was resistant to a lot of his earlier stuff because he had an idiosyncratic way of getting containers set up, but he has since begun to use <a href="https://mariushosting.com/synology-portainer-vs-container-manager/">Portainer</a> for his recipes, which has simplified them a lot. If you find a Docker recipe that uses <kbd>docker run</kbd>, you can convert that to Docker Compose with <a href="https://www.composerize.com/">composerize</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2024-02-01</title>
      <link>https://mike.puddingtime.org/posts/2024-02-01-daily-notes/</link>
      <pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-02-01-daily-notes/</guid>
      <description>Contributed my Linkding plugin to Newsboat. The collaborative introvert.</description>
      <content:encoded><![CDATA[<h2 id="linkding-newsboat">Linkding, Newsboat</h2>
<p>I shared my Linkding bookmarking plugin to the Newsboat project. It&rsquo;s in <a href="https://github.com/newsboat/newsboat/tree/master/contrib">the contrib directory</a>. It works fine as a standalone tool, too, if you just want to push a bookmark up from the command line. I submitted a PR for the Wallabag version, too.</p>
<h2 id="collaborative-introvert">Collaborative introvert</h2>
<p>Today had some unpleasant aspects to it. I had to do one of those things where you both don&rsquo;t want to get a lot of practice at it, but feel grateful you&rsquo;ve had the practice.</p>
<p>I also felt grateful to have partners to work with on the whole thing who were both willing to share ideas and tools, but also let me plot my own course. It felt like the right balance of &ldquo;not up here completely without a safety net&rdquo; and &ldquo;able to follow my instincts.&rdquo; When things went a little off-road, I felt able to improvise and adjust without looking over my shoulder.</p>
<p>I think I am an okay collaborator, but I know there are times that my internal models take over and it&rsquo;s hard for me to shake myself out of whatever I had in my head as The Right Thing. My introversion sometimes makes it hard to read the room when I&rsquo;m going too far that way. When I realize I have, I usually pull back unless I&rsquo;ve gotten into a headspace where I feel unyielding on the matter. That&rsquo;s rare. I wish I had a little better sense of how I come off. Even the times I&rsquo;ve thought I must sound like I&rsquo;m close to exploding, people say &ldquo;no, had no idea. Really? You just seemed your normal self.&rdquo;</p>
<p>I mentioned that to Al this morning, because as I was getting ready to do the unpleasant but needful, she said &ldquo;you seem pretty calm.&rdquo; My wrist vibrated and I looked down and it was my blood glucose monitor telling me my blood sugar was spiking. I&rsquo;ve learned that correlates with stress a lot of the time. I held up my watch and read her the number.</p>
<p>&ldquo;There&rsquo;s a lot going on in there,&rdquo; she said.</p>
<p>There is.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2024-01-26</title>
      <link>https://mike.puddingtime.org/posts/2024-01-26-daily-notes/</link>
      <pubDate>Fri, 26 Jan 2024 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-01-26-daily-notes/</guid>
      <description>Sorta the mutt of RSS readers. Scripting the Linkding API.</description>
      <content:encoded><![CDATA[<h2 id="sorta-the-mutt-of-rss-readers">Sorta the mutt of RSS readers</h2>
<p><a href="https://newsboat.org/">Newsboat</a> is pretty cool! It&rsquo;s a plaintext RSS reader that has strong affinities for mutt in look and configuration.</p>
<p>Like mutt, it might not crowd out everything else in the toolbox but it can help you burn through the subscription list and triage even if you have more comfortable ways of reading the content you process.</p>
<p>It also has built-in filtering. If you&rsquo;re using an RSS provider that already does that, e.g. FreshRSS or Feedly, that might not be super valuable, but it&rsquo;s easy to make a killfile either way:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ignore-mode display
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/ducks/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/advice/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/nfl/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/beavers/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/blazers/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/highschoolsports/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/entertainment/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/realestate-news/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/food/\&#34;&#34;
</span></span><span class="line"><span class="cl">ignore-article &#34;*&#34; &#34;link =~ \&#34;/hawks/\&#34;&#34;</span></span></code></pre></div>
<h2 id="scripting-the-linkding-api-to-make-a-bookmark-function-for-newsboat">Scripting the Linkding API to make a bookmark function for Newsboat</h2>
<p>If you like reading longform plaintext maybe Newsboat is all you need. I tend to treat RSS as a two-step process: See an interesting thing, send it to some sort of RIL or bookmarking service. Newsboat has a bookmarking function you can customize with your own scripts. It just passes the article URL, title, description, and website description to your script, which has to talk to whatever API. There are a bunch of <a href="https://github.com/newsboat/newsboat/tree/master/contrib">examples in the Newsboat contrib directory</a> for things like Pocket, Pinboard, and Evernote. No Linkding, but <a href="https://github.com/sissbruecker/linkding/blob/master/docs/API.md">the Linkding API</a> is simple enough.</p>
<p>Could be simpler but I bounced off of <kbd>net:http</kbd> in my formative years:</p>






<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env ruby</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">require</span> <span class="s1">&#39;httparty&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">require</span> <span class="s1">&#39;json&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">linkding_uri</span> <span class="o">=</span> <span class="s2">&#34;https://links.puddingtime.net/api/bookmarks/&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Get your Linkding API key from Settings &gt; Integrations</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">token</span> <span class="o">=</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;LINKDING&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">link_url</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">link_title</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">description</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">website_title</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="ss">url</span><span class="p">:</span> <span class="no">URI</span><span class="p">(</span><span class="n">link_url</span><span class="p">),</span> <span class="ss">title</span><span class="p">:</span> <span class="n">link_title</span><span class="p">,</span> <span class="ss">website_title</span><span class="p">:</span> <span class="n">website_title</span><span class="p">,</span> <span class="ss">unread</span><span class="p">:</span> <span class="kp">true</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Content-Type&#39;</span> <span class="o">=&gt;</span> <span class="s2">&#34;application/json&#34;</span><span class="p">,</span> <span class="s1">&#39;Authorization&#39;</span> <span class="o">=&gt;</span> <span class="s2">&#34;Token </span><span class="si">#{</span><span class="n">token</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">resp</span> <span class="o">=</span> <span class="no">HTTParty</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">linkding_uri</span><span class="p">,</span> <span class="ss">body</span><span class="p">:</span> <span class="n">params</span><span class="o">.</span><span class="n">to_json</span><span class="p">,</span> <span class="ss">headers</span><span class="p">:</span> <span class="n">headers</span><span class="p">)</span></span></span></code></pre></div>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Notes for 2024-01-21</title>
      <link>https://mike.puddingtime.org/posts/2024-01-21-daily-notes/</link>
      <pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate><author>mike@puddingtime.org (mike)</author>
      <guid>https://mike.puddingtime.org/posts/2024-01-21-daily-notes/</guid>
      <description>A possible self-hosted pinboard replacement. Synology reverse proxies.</description>
      <content:encoded><![CDATA[<h2 id="linkding-a-possible-pinboard-replacement">LinkDing &ndash; a possible pinboard replacement</h2>
<p>We took Ben out to dinner for his birthday last night, came back to our room in Eugene, and I gave <a href="https://github.com/sissbruecker/linkding">Linkding</a>
a try on a PikaPod. It&rsquo;s very similar to <a href="https://pinboard.in">pinboard</a> in terms of the basic look, and it can import a pinboard export of the basic Netscape <kbd>bookmarks.html</kbd> file.</p>
<p>There are a few community tools that make it a reasonably complete pinboard replacement:</p>
<ul>
<li>A bookmarking extension for Firefox/Chrome. Works fine (though pinboard&rsquo;s tag suggesting is nice and linkding doesn&rsquo;t seem to have it)</li>
<li>The <a href="https://addons.mozilla.org/en-US/firefox/addon/linkding-injector/">linkding injector</a>, which you can connect to your instance to inject a sidebar of related bookmarks into your search results (Google, DuckDuckGo, kagi, and Bing)</li>
<li>The <a href="https://apps.apple.com/us/app/linkthing/id1666031776">LinkThing app for iOS,</a> which provides a decent mobile client (though they&rsquo;re still working on a share sheet for it and you have to use a Shortcut for now).</li>
</ul>
<p>For the way I use pinboard, that&rsquo;s all pretty good.</p>
<h2 id="getting-synology-reverse-proxying-and-ssl-working">Getting Synology reverse proxying and SSL working</h2>
<p>Once I had Linkding working on the PikaPod I ran into a few problems with my DNS and SSL, and it just reminded me that I&rsquo;ve been deferring a cleaner setup on my Synology.</p>
<p>I mentioned Marius Hosting&rsquo;s tutorials a few days ago, and he&rsquo;s got some stuff on how to set up <a href="https://mariushosting.com/synology-how-to-enable-https-on-dsm-7/">SSL on a Synology with LetsEncrypt</a>, and <a href="https://mariushosting.com/synology-how-to-use-reverse-proxy-on-dsm-7/">reverse proxies</a>. It&rsquo;s all concise and illustrated and &ldquo;just works.&rdquo; Combined with his increasingly efficient docs on <a href="https://www.portainer.io/">how to get portainer up and running</a> then use it to install an assortment of containers (<a href="https://mariushosting.com/how-to-install-linkding-on-your-synology-nas/">including the one for Linkding</a>), you can get a lot of eggs stuffed into that basket.</p>
<h2 id="pikapod-still-has-a-place">PikaPod still has a place</h2>
<p>It suits me to truly be self-hosting all this stuff, just as a matter of &ldquo;I wanted to learn how&rdquo; and &ldquo;if I&rsquo;ve got the thing, I should use it.&rdquo; PikaPod&rsquo;s cool, though, because it&rsquo;s one-click, cheap, and gives you a chance to kick the tires on these things before you do much work.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
