[-] michaelharley@infosec.pub 1 points 5 hours ago

Short version, and Deebster's got the shape right: use a DNS-01 challenge. You prove domain control with a TXT record instead of serving a file over HTTP, so the hostname never has to be reachable from the internet. That's what gets you a real Let's Encrypt cert for a LAN-only name.

Mine's acme.sh issuing a wildcard for *.lan.michaelharley.net via my registrar's DNS API (Porkbun), with a deploy hook dropping it where Caddy reads it. Caddy's own Cloudflare plugin is simpler, I just already had acme.sh. Local DNS is a wildcard rewrite on my router.

122

This is the companion to I own my books, where I made the case for stripping DRM and actually owning what I buy. This post is the machinery overview: how I store, serve, and read all of it from my own homelab.

My books workflow

When I find a book I want to buy, I go to eBooks.com and search for it. They have most titles, but occasionally I will have to go to Kobo to find it; regardless, I purchase the book.

Note: This is just an overview of how this works and is not a technical, step-by-step walk-thru.

Calibre

If the book has DRM, the distributor gives me a file with the .acsm extension. If the book is DRM free, then they hand me the ePUB file directly. Either way, the next step is to import the downloaded file into Calibre. With the right plug-ins, Calibre will automatically download the book, remove the DRM (if any) and add the ePUB file to the Calibre books library.

Syncthing

Once the book is in Calibre as a DRM-free ePUB, Syncthing syncs it to one of my homelab instances that serves it with Calibre-Web.

Calibre-Web

I use Calibre-Web to then serve my Calibre books on my local network. Calibre-Web implements the same endpoints the Kobo store exposes: sync, library metadata, cover images, reading state. This is the first piece that allows me to connect my books library to my Kobo device.

DNS and certificates

Two things have to be in place to allow my Kobo to connect to Calibre-Web. My local DNS has to point an internal hostname at the server running Calibre-Web. And that server needs a real, publicly trusted TLS certificate, because the Kobo thinks it's talking to a commercial store and won't accept a self-signed one. Getting a legitimate certificate for a hostname that only exists inside my homelab is the fiddly part. I may write that up separately.

Kobo

Now I update the api_endpoint setting in the .kobo/Kobo/Kobo eReader.conf file on the Kobo itself so it points to the internal hostname from the DNS and certificates section above. I plug the Kobo into my computer over USB and it mounts as a drive, which is how I get at the file. There's no way to do this from the device's settings menus.

All together now

So my workflow looks like this in practice:

  1. Buy and download the book.
  2. Import the book into Calibre.
  3. Open my Kobo device and download the new book to the reader.
  4. Read.

The default software on the Kobo is a first-class reading experience. Connecting it to my Calibre-Web server keeps that experience intact while my whole library syncs down over my local network.

KOReader

I see many people talking about KOReader, so when I first started on this path, I had every intention of installing and using it. In my own tests, the software just felt a lot rougher and harder to make into a nice reading experience, and I still had to connect my device directly to my laptop to load books. No shade towards KOReader and all the people who seem to love it, but the Kobo reading software works perfectly for me, and I can't think of a feature that KOReader provides that isn't already in the Kobo software.

Audiobooks

I listen to a fair amount of audiobooks, and my preference is to purchase them from Libro.fm. Their audiobooks are already DRM-free, so I just download the files from the Libro.fm website and boom, I have my backup.

Audible books do have DRM, but I can remove it. In order to make my backups, I use ffmpeg with credentials that audible-cli legitimately pulls from my authenticated account. I'm decrypting content I bought, using a key I'm entitled to, into a universally playable format (.m4b). So I can back up even Audible exclusives like Dungeon Crawler #8.

No matter how I purchased and backed up the audiobooks, I prefer to listen to them in Audiobookshelf, which is a self-hosted solution in my homelab.

Conclusion

And that's my books workflow and an overview of how I self-host all this. I'm really interested in hearing about others' book workflows too. Drop me a line if you've written something up and want to share.

Originally posted on my site: https://michaelharley.net/posts/2026/07/21/how-i-self-host-my-ebooks-and-audiobooks/

[-] michaelharley@infosec.pub 5 points 1 week ago

Yes, he definitely comes out and goes for the wafers. Thanks for the feedback!

32
Is my pleco healthy? (thelemmy.club)

Hello. I'm pretty new to keeping plecos and this lil guys in our big community tank. I'm unsure if he's getting enough food. I've read the descriptions on how to tell and it seems to boil down 'is it skinny'. Sold to me as a Super Red Bristlenose Pleco from an individual.

Does my pleco look skinny/under fed? What's your favorite food for you pleco?

127
submitted 1 week ago* (last edited 1 week ago) by michaelharley@infosec.pub to c/cat@lemmy.world

Hi hello. Happy #Caturday! I would like to introduce you to our little weirdo, Lennie.

A white cat with green eyes wearing a yellow collar with a bell sits on a gray wood-look floor in front of a gray couch. The cat is looking directly at the camera with an alert expression.

Look at this little dummy! What a sweetie. (Richmond, VA)

Lennie is the newest member of The Goblin Hoard. He was born 06/28/2025 and his gotcha date was 10/04/2025. We don't exactly know his breed, but he looks like a lynx point Siamese to us. We named him after Lennie from the John Steinbeck novel Of Mice and Men. If you've read it, you know Lennie was big, sweet, and not the sharpest. We took one look at our derpy little buddy and knew it fit.

He's very best buds with Linus and they're always hanging out and getting into shenanigans together. They play and play and play together. They hang out on the back porch, keeping watch over the backyard. He even interacts with grumpy pants Lily.

It took him the longest of any of our cats to learn how to use the cat door. He'd sit and watch the others use it, then he'd approach and inspect it. He did that for weeks and weeks before actually doing it. Even to this day, he still kind of tumbles through it as if he's surprised it worked.

Some of our kitties are snugglers like Linus, Mac and Polly, while others are more aloof, and Lennie falls squarely in the aloof camp. He likes to be around us, or at least in the same room, and he'll allow us to give him some pets, but pets are not his favorite thing. He especially doesn't want his head petted or his face touched.

He's pretty timid around new people or strange, loud noises. If the garbage truck is coming down the alley, he books it inside and heads straight upstairs. If we have guests over, he makes himself quite scarce. Oddly enough, he's not timid around strange cats. There's a neighborhood cat that comes around who is somewhat aggressive, but Lennie wants to be his friend. It's quite odd considering how he is about everything else!

We quite love Lennie. Please enjoy these photos of our little weirdo.

A gray cat rests on a light-colored armchair in a modern living room with large windows overlooking green foliage. An orange owl-shaped lamp sits on a side table, and a green blanket drapes over the chair.

A gray tabby cat wearing a blue collar lounges on a gray upholstered armchair near a window, gazing outside at greenery and bare tree branches visible through the glass.

A tabby and white cat lies contentedly on a burgundy blanket surrounded by pink and beige quilted blankets on a gray striped couch, appearing relaxed and comfortable.

Two cats lounging on a brown couch, with a cream-colored cat stretching in the foreground and a black and white cat resting in the background, surrounded by various items including cushions and electronic cords.

A white cat with a collar and bell sits on top of an aquarium containing aquatic plants and substrate. Behind the aquarium is a dark wooden shelf unit displaying books, decorative items, and a red ornament.

A white cat stands on hind legs reaching up toward festive Christmas decorations, including shimmering gold and purple tinsel garland and ornaments on a wooden floor.

A white cat sits in front of an elaborate holiday display featuring a large silver disco ball, gold tinsel garland with warm lights, red ornaments, and various festive decorations in a doorway.

Originally posted on my site: https://michaelharley.net/posts/2026/07/11/please-meet-our-cat-lennie/

[-] michaelharley@infosec.pub 6 points 1 week ago

Sorry about the managed post at first.

I'm new to the community so sorry about the basic question but is this type of post ok here? This is a blog post that I put on my site. Do we prefer to have the full post like this with the link or do we prefer to just have a link and intro?

33
submitted 1 week ago* (last edited 1 week ago) by michaelharley@infosec.pub to c/homeassistant@lemmy.world

Rachelle and I bought our house in Richmond in late 2022 and moved in early 2023. The ULTRALOQ U-Bolt Pro Z-Wave Smart Lock was the very first smart device I installed after setting up Home Assistant.

Requirements

Our must-have requirements were the lock must work with Home Assistant, and it must have a fingerprint sensor. Everything else was just nice-to-haves.

The setup

After doing lots of reading about smart locks and Home Assistant, I eventually landed on the ULTRALOQ U-Bolt Pro Z-Wave Smart Lock. We have the same lock on both the front door and the back door btw!

I did have to install their app in order to set up users and modify PINs and such. But I only have to use their app if I'm updating users.

  • Controller: Home Assistant Z-Wave JS
  • Radio: Home Assistant Connect ZWA-2
  • Locks: ULTRALOQ U-Bolt Pro Z-Wave Smart Lock

First impressions vs. now

Physically installing the locks was pretty straightforward, and the instructions were clear. The Z-Wave onboarding workflow was the standard one for Z-Wave devices. You put Home Assistant and the device in pairing mode, and then you confirm with the PIN from the device. Easy peasy.

I'd say the build quality is average. It's nothing to write home about but the locks seem sturdy enough. I've had to tighten the mounting screws up at least once over the past 3½ years, which I think is a normal and expected thing, so no points off there.

Living with them day to day

The #1 usability requirement for us was the fingerprint sensor on the lock. We did not want to have to mess with keys or fish out our phones or even enter a code to unlock the doors. So the main way, other than our arriving-home automations, that we unlock the door is with our fingerprints.

The fingerprint reader works fine. We often have to try the sensor twice, but it's not a huge problem. A more accurate sensor would be nice!

The other main use case is friends or pet sitters who come to feed the cats while we're out of town. For that, we just provide people with the door code and that has generally worked reliably. There was one time when our friends were trying to gain access in the afternoon when the front door lock was directly in the sun and had overheated or something. Our friend couldn't make the lock work. We had to unlock it remotely but that only happened once.

Reliability over 3½ years

I've had very few problems with the locks. As previously noted, we did have an issue with the lock overheating because it was directly in the sun during the summer, and it just kind of became unavailable for a little bit.

The coating on one of the fingerprint sensors has started to peel/flake, as you can see in the photo below. It doesn't seem to affect the accuracy of the sensor though as it still works fine!

A black rotary dial keypad mounted on a bright green wooden surface. The keypad features numbered buttons 0-9 arranged in a circular pattern around a central rotating dial, with 'UltraLoo' branding visible at the bottom.

The fingerprint sensor is in the center, and you can plainly see the coating has started to flake and peel. It still works fine! (Richmond, VA · July 2026)

I pulled the Home Assistant data, and we have to replace the batteries about every three months or so. We tried rechargeable, but they don't really work that well, so we went back to Energizer disposable. The gold standard would be a lock that was on mains power with a built-in battery backup. The main problem is that the locks don't seem to update their reported battery level until it drops to about 16%, so it basically goes from 100% to 16% (and sometimes straight to 0%) after 3 months.

Battery graph

(Richmond, VA)

Home Assistant / Z-Wave

Once I added the locks to Home Assistant, they work locally without their app. The only thing we need the app for is if we're modifying users/PINs.

Here are our main automations:

  • Automatic locking: The locks automatically lock themselves after 10 minutes.
  • Bed time locking: When the house goes into sleep mode, the locks automatically lock.
  • People leaving locking: When Home Assistant detects someone has left the home zone, the locks automatically lock.
  • Arriving home automatic unlock: When Home Assistant detects someone has returned home from being away, the doors automatically unlock. This one is probably my favorite!

What broke / what annoyed

Nothing has really flat out broken, but there are a few annoyances.

Fingerprint sensor and humidity

We live in Richmond, VA and it gets humid here in the summer. Every morning for about 2 months, both locks are beeping when we get up. Moisture has accumulated from humidity on the fingerprint sensor, and it's reading it like someone is trying to use the sensor. They just beep and beep and beep for a few hours in the morning. Both the front door and the back door have coverings. The front porch is a porch, of course, and the back porch has a big permanently attached awning, so neither lock is directly open to the elements. This is by far the #1 annoyance.

A black rotary telephone dial mounted on a green painted wall, showing numbers 0-9 arranged in a circle around a central metal finger hole, with water droplets covering its surface.

Beep beep beep (Richmond, VA · July 2026)

Unreliable battery reporting

As previously mentioned, the battery reporting is not very good. The locks only report their battery level when they get to about 16%, then it drops from 100% to 16% in an instant. It hasn't bit us yet, but it would be better if it would report the battery level in the way everyone expects it to.

More accurate fingerprint sensor

This is a minor quibble but it would be nice if the fingerprint sensor were more accurate. This has not been a deal breaker for us but still.

Verdict

★★★☆☆

Overall, the locks are fine. I'd give them three stars out of five. I think these specific locks are discontinued now, though, so even if I did want to recommend them, I don't think it's possible for someone to buy one new.

The perfect lock for our use case would be a Yale or Schlage lock that was officially in the Works with Home Assistant program, worked over Z-Wave, and had an accurate and moisture-resistant fingerprint sensor.

What's your favorite smart lock and why did you pick it?

Originally posted on my site: https://michaelharley.net/posts/2026/07/09/3-years-with-the-ultraloq-u-bolt-pro-z-wave-smart-lock/

17

The city has asked us to try to conserve water because of drought conditions. My little 20 gallon tanks are whatever but if I do a 50% water change for the 75, well that's like 30 gallons of water.

Am I silly to be thinking about this? Like, I'm not really too worried about the fish. That tank is very solid and has a strong BB community (fx4).

Would you skip for a month or two? Or is 30 gallons a month not that much?

[-] michaelharley@infosec.pub 3 points 2 weeks ago

KeePassXc and syncthing on Linux. KeePassDx and syncthing on Android.

[-] michaelharley@infosec.pub 1 points 4 weeks ago

Nice man. It's my dream to have a fish room!

[-] michaelharley@infosec.pub 8 points 4 weeks ago

I run Calibre-Web in Docker (linuxserver.io image) and read on a Kobo. My desktop Calibre library on my laptop is the source of truth; Syncthing replicates it to the server where Calibre-Web serves it, and the Kobo pulls books over Kobo Sync

michaelharley

0 post score
0 comment score
joined 3 months ago