n2024

Okay folks, a word on the vibe-coding thing, since I can see it stirred up a lot and clearly rubs some of you the wrong way. Let me just drop a few numbers so you have an idea of what this actually is.

I started this project in February. I work on it mostly in the evenings, after my day job. Over ~4 months I estimate I've put around 100 hours into it. I use it every single day, and I've tested and optimized it quite a bit. So no, this isn't some thing I threw together in 2 hours with zero investment.

Yes, I built it with AI in the loop. But without it, I'd never have had the time to make something this "polished" on the side. And honestly, why would I deny myself that on a personal project? When a carpenter builds a piece of furniture, I don't hold it against him for using a power drill instead of a hand brace.

That's it, just a small rant. I won't engage with the AI criticism beyond this. Back to talking about the actual software for anyone interested. Cheers.

Honestly, partly history. When I started, I wasn't sold on KOReader yet, and the project began as a simple catalog just to push EPUBs easily onto my phone and my wife's phone. Then I thought "why not read them right here", so I built the PWA reader. Later I grew to really like KOReader, and that's when I wrote the plugin.

But there's also a real reason it's not just KOReader-on-everything: my wife and I read in the browser (the PWA), not in KOReader. KOReader-sync only works between KOReader instances, and it only syncs the position, not reading time. I wanted the web reader in the loop, and stats too, so I needed something that bridges KOReader and a browser reader. That's the whole point of the pivot format.

Thanks, glad it speaks to you! Right now it's EPUB-only. That was my own need, and the whole thing is really built around book reading (reader, fonts, cross-device position sync, reading stats), so I focused on doing that one format well rather than handling everything.

CBZ/comics would need a different reader and a different idea of "reading position", so it's not on the roadmap for now. But if you give it a try, I'd love to hear how it goes.

This is the perfect example, honestly. Same spirit: a real problem, solved fast with the tool in hand. Hope the acres-done feature compiles before you finish the field 😄

Thanks for the suggestion. I know Audiobookshelf, but it's audiobook-first and the EPUB side is basic, it doesn't do the KOReader ↔ web position sync I built this for. And no worries about the AI part, I was upfront in the post on purpose. You don't have to use it or like it. I built it for myself, it works for me every day, and I shared it in case it's useful to someone else. That's all.

Yeah they look great. One thing I focused on that I haven't seen in them: a real offline-first PWA, books cached locally so I can read with no signal, and it syncs back when I'm online. That's my main daily use case (train, no wifi), so it's the part I cared most about.

Touché 😄 Honestly that's the one feature I can't compete with: a book has infinite battery and zero downtime. Best I can do is offline caching.

Not a problem for me, because my sync is manual, not automatic. I assigned it to a gesture (tap the top-right corner): wifi on, sync, done. Waking the device doesn't trigger anything, so I never get that "jump to latest position?" dialog.

I did it this way mainly for battery, I don't want wifi turning on every time the Kobo wakes up. And I push my position at the end of my reading, so the server is always up to date and there's nothing stale to pull next time.

I did think about auto-syncing when you open a book, but haven't done it yet, partly for the reasons you mention. For now the manual gesture works well for me.

Genuine question, which ones? I searched a lot before building this and didn't find one that syncs both the reading position AND the reading time between a web reader and an e-reader. If you know one, I really want to hear it.

Small correction: OPDS is just for browsing/downloading books, it doesn't carry your reading position. KOReader syncs that through kosync, which is a different thing. And kosync only syncs the position, not the reading time. On top of that, the position is stored in a KOReader-only format (XPointer), while web readers use a different one (CFI), so they don't understand each other.

That's the whole reason I made the plugin + my own "pivot" format: so my Kobo and my phone actually land on the same spot, with the reading time too. Maybe not the only solution, but I couldn't find it ready-made.

Why I moved my Plex library to Jellyfin after 14 years

9d 11h ago in selfhosted from the.unknown-universe.co.uk

Funny timing, I've been playing with Jellyfin lately too and I ended up forking a little project to bridge Plex into Jellyfin: https://github.com/ndieschburg/xtream-to-strm-web

It syncs your Plex.tv libraries (even shared servers you don't own) into .strm and .nfo files, so Jellyfin just picks them up as a normal library and you can watch everything from any Jellyfin client. There's a built-in proxy that hides the Plex tokens from the STRM files, and for clients that don't follow HTTP redirects (like Findroid) there's an HLS proxy mode so it still plays fine.

Still a bit rough but it does the job if you want to keep a single Jellyfin frontend and still reach the stuff that only lives on Plex.