Hoarder – a self hosted link collection and web archive

I found out about Hoarder via the self-hosted podcast. While I don’t always agree with the opinions of the hosts, they’ve helped me discover useful things a few times. I’d certainly recommend checking the podcast out.

The Bookmark Everything App

Quickly save links, notes, and images and hoarder will automatically tag them for you using AI for faster retrieval. Built for the data hoarders out there!

The install is docker friendly and based on compose. It’s a very simple 3 steps to get a test instance setup.

  1. Download the compose yaml.
  2. Create a .env file with a few values
  3. Then docker compose up

Seems like it supports “sign up” – if you host this visibly externally you may have some spammy sign-ups.. this may be something you can disable.. (yes, you can disable this as I find out below)

After you have created a user – you are greeted with this blank canvas

I currently run Wallabag – which I landed on after trying a few other choices. It was the best choice for my needs at the time, but also super basic. Wallabag has a mobile app which I find useful – as it makes sharing links I find on mobile easy to my Wallbag install.

Wallabag often struggles to capture a page – but it at least keeps the link. One example is this website – which has some sort of scraper blocker. You get a page that indicates it is protected by this.

Ok – so how does Hoarder do with a link https://www.thekitchn.com/instant-pot-bo-kho-recipe-23242169?

For comparison – this is what wallabag got..

The capture in Hoarder take a bit of time – not long, but it renders sort of a blank-ish card immediately and then the image fills in.


Let’s take a closer look at the tile that it created for me

The top of the tile is a picture and link to the original URL (1). The link (1) is also the same destination.
The date (2) and expansion arrows (2) both take you to a larger locally hosted view.
(3) is a menu of options

Let’s dive deeper into the expanded (locally hosted view)

The overall capture/rendering of the page from the local version is pretty good. Links in the text haven’t been re-written, but that’s both expected and generally useful.

This view also offers the option to view a screenshot – which is as you expect.

Since I didn’t provide an OpenAI key nor did I configure Ollama the fancy “Summarize with AI” button just gives me an error.

Looking – it seems this setup 3 unique containers

  • ghcr.io/hoarder-app/hoarder:release
  • getmeili/meilisearch:v1.11.1
  • gcr.io/zenika-hub/alpine-chrome:123

but.. I’m not seeing any storage on the host – this is probably bad, because that means at least one of these containers is stateful (and looking at the compose — there are two data volumes)

I have a preference of storing my data on the host filesystem as a volume mapping… maybe I’ll warm up to the whole docker volume thing, but it always feels like a big hack. (Read on and you’ll find that there is a way to avoid the storage concerns that I have here).

The search appears limited to the title only (boo) – tags are supported in search too.. but no deep searching within the text of the articles.

Looking more at the doc – persistence is something you can configure

DATA_DIR – “The path for the persistent data directory. This is where the db and the uploaded assets live.”

and it does appear you can stop signups from happening

DISABLE_SIGNUPS – “If enabled, no new signups will be allowed and the signup button will be disabled in the UI”

Interesting options for the crawler (disabled by default)

CRAWLER_FULL_PAGE_SCREENSHOT – “Whether to store a screenshot of the full page or not. Disabled by default, as it can lead to much higher disk usage. If disabled, the screenshot will only include the visible part of the page”

CRAWLER_FULL_PAGE_ARCHIVE – “Whether to store a full local copy of the page or not. Disabled by default, as it can lead to much higher disk usage. If disabled, only the readable text of the page is archived.”

CRAWLER_VIDEO_DOWNLOAD – “Whether to download videos from the page or not (using yt-dlp)”

Overall – I’m pretty impressed. I’m not sure I’m quite ready to dump wallabag, but this might become a project I tackle during the holiday break. That stew recipe is pretty amazing, absolutely worth trying.

New Thermostat – Ecobee Lite 3

I’ve had my eye on the Ecobee 3 Lite for a while. My previous thermostat was starting to show it’s age. The cloud service had been discontinued, but it still worked well with Home Assistant. However, recently it started to be colder at home than was comfortable – this turned out to be the fact that the temperature was set 2 degrees lower than the schedule?! Sure I could have worked around this, but when you can’t trust the device to do what it is supposed to do – time for a change.

I was able to get a used Ecobee 3 Lite pretty much new in box for $60 from someone locally. This is a good price, but I’ve seen it as low as $50, but often higher. Keep in mind the new price is currently only $179.99, so it is a reasonable cost even new.

The Ecobee comes with a white plastic shield you can use to cover up any unsightly holes left in the wall from the previous thermostat. As my drywall patching skills are finally getting to an acceptable level, I opted for a ‘clean’ install and patched and painted the mounting damage.

Since I’d already sorted out the whole C-wire thing for the previous smart thermostat, it was just a matter of removing the old one – and installing the new Ecobee. Included with the Ecobee is a magic box that will let you fix your missing C-wire problems, it is involved and you have to mess with the wiring in your furnace but at least they have a solution.

Here is a photo of my existing wiring.

I’ve got C, W, Y, Rh and G. Following along with the installation manual, it’s easy to map this over to the Ecobee wiring harness.

The old -> new wiring

  • Rh -> Rc
  • G -> G
  • Y -> Y1
  • W -> W1
  • C -> C

Once this is done, you just snap the thermostat in place. I thought it was pretty cool that it detects the wiring setup and confirms as part of the first start experience.

This is a good way to confirm that you’ve got at least good connections to each of the wires on the back plate.

Next up it’ll send you off to download the app and sign up for an account with Ecobee. For now I’m using the ‘cloud’ service but I will say that I wasn’t a huge fan of how much information it wants to gather about your location, size of house, number of people in the house. I can rationalize why they might use that information to provide a better experienced – but we are talking about just a thermostat that is going to turn your HVAC system on and off. It does sound like you can disable it’s internet connectivity and run with just local and you can get by fine.

I do have it integrated with Home Assistant. It seems that Ecobee is no longer offering the ability to create new API keys so the only way to connect is via the HomeKit integration. HomeKit really wants to use mDNS to discover things, and running HomeAssistant (HA) inside of a docker container can make this tricky. Most solutions suggest you run the container using the host networking mode --network:host, but I opted to give my HA a macvlan IP address.

I probably should have done this a while back. Suddenly my HA install was able to find all sorts of compatible devices on my network. The Roku Ultra, the HD Homerun, my printer, and the Sonos speakers. While I was able to make all of these integrations work previously the auto-discovery wasn’t happening.

I was able to easily integrate via HomeKit without any Apple devices in the mix. From the thermostat itself you can enable HomeKit integration, then just use the 8 digit value from the screen to connect to the HA integration.

Of course, many of my IoT devices also live on an isolated network, and I haven’t quite figured out how to get the mDNS reflection stuff to work yet. Hopefully at one point I’ll get there, and maybe that will let me shift the thermostat and Sonos speakers to the IoT network as well.

It’s been a couple of days, and the Ecobee has been working fine. It’s integrated into Home Assistant via HomeKit and as a bonus I now get both temperature and humidity readings from the thermostat. It also look pretty nice on the wall – and no more surprise cold wake ups. The thermostat user interface is touch screen and feels pretty intuitive.

 

Signal “desktop” on an Android Tablet

I’m all in on Android. I actually like Apple products just fine too, I’m composing this post on a M1 Macbook Pro. In the past I’ve toyed with lots of Apple hardware, like the 2nd generation iPod Touch. When Google released the G1 I was hooked, a phone with a keyboard? It’s like a tiny computer in your pocket that can also make phone calls.  Since then I’ve been through a lot of Android devices, both phones and tablets.

Privacy is also important to me, and Signal is a great match for my messaging needs. It has always bothered me that while you can get a very nice desktop experience linking your “primary device” (aka your phone) to your laptop, it wasn’t really possible to run Signal on an Android tablet as a linked device. The folks at Signal enabled the iPad as a linked device, but no love for Android tablets yet.

Recently I came across a solution. Molly.im. This allows my tablet to run a version of the Signal client (Molly) and be a linked device. While I almost never am far from my phone, sometimes I’m doing something on my tablet and switching devices is a pain. I also use the Note to Self to move data between devices (links, photos, files).

Molly is a fork of the Signal client code for Android. From a security point of view, it’s using the same Signal protocol – so your data is encrypted end to end. You do have to decide to ‘trust’ that the Molly code hasn’t been compromised in some way and will leak your data. This ‘trust’ is the same trust you are giving the folks that work on the Signal client code (or the desktop application). While it is a little uncomfortable to trust yet another group of people developing some code, we do this all the time with all of the apps we run on our devices. For me, this small risk is well worth the utility of having a linked Signal client on my tablet.

Avoid Device Linking

While it may be tempting to link your Signal account to your desktop device for convenience, keep in mind that this extends your trust to an additional and potentially less secure operating system.

If your threat model calls for it, avoid linking your Signal account to a desktop device to reduce your attack surface.

The good news for me, is my threat model doesn’t cause me to be concerned about having my devices linked and spreading my private communication across multiple devices that I own. Still, this is a decision everyone should think through.

Getting setup with Molly is very easy. You start by installing F-Droid, an alternative app store for Android. This is an apk download and install, you’ll likely need to approve/enable the installation of ‘side-loaded’ content on your device.

Once you have F-Droid installed, open the app. Let it do the first time setup where it will update the various repositories. This process will probably prompt you for some additional permissions, you’ll probably want to permit them as you do want this new ‘app store’ to install more apps, and alert you when there are updates. It’s always good to pause and think about the permissions being asked for, but F-Droid is a well known application.

Now we need to configure the Molly application repository. While F-Droid comes with a built in ‘store’ of content, it also supports adding additional content sources. Go to the Molly webpage, and click on the Molly F-Droid repository. This will configure F-Droid so that it can see the Molly application. There are two versions of Molly, the FOSS one removes some of the Google integration and may be less compatible with the original Signal app – let’s pick the non-FOSS version.

At this point, it should be just like installing any application – but instead of using the Google Play store, you’re going to use F-Droid to install Molly.

Molly can act as a primary Signal installation, or as a linked device. Assuming you were able to install Molly on your device, let’s walk through the simple steps to get you linked to your existing Signal account.

When you launch Molly for the first time you will be prompted to choose additional database encryption. This is a security trade off, being asked each time to unlock the database may be annoying, but it will give you better security if your device is compromised.

Next we see the normal Signal launch screen.

We can just hit “Continue” here to move to the next screen.

This is where you can choose how many Android capabilities you want to grant the Molly app. I’ll leave this up to personal choice, I didn’t give it permission to my Contacts, but granted the others. Both Signal and Molly are good about using very limited permissions.

Next is the registration screen. While we could set this device up as a primary Signal device and link a phone number, we don’t want to do that in this case. Do not enter a phone number here. The “Link to existing device” option in the lower left is what we want to do. This will make this device act just like the ‘desktop’ version of Signal.

Here we get to give this device a name. Pressing the “Link” button will display a QR-Code we can scan from our primary device and connect the two. The Signal documentation talks about linked devices, but with Molly we bypass the limitation of multiple mobile devices.

That’s it, now enjoy Signal on your tablet via Molly.