I haven't eaten cereal as a meal since I was in college
Or some other unclear title that's actually about what I've been working on recently.
A pal of mine reached out to me the other day and decided to flex on me. Totally unprompted. Unprecedented. The nerve of this guy. We’ve known each other since we worked together at comiXology and he’s always been a clever scamp, so I shouldn’t have been surprised when he dropped a cool little code thing in my Discord DMs out of the blue.
But, oh, my friends, the flex continued. Not only did he show off a little project he was working on, he gave me a clue into how he pulled it off. He, too, was scanning around the internet for information and he, too, needed a quick way to parse information from websites. And he found one. A simple solution. Dare I say, an elegant solution. A solution not without it’s own set of issues but one that side-stepped so much of the frustration I was feeling about my own built-out solutions.
Perhaps it was a friendly nudge to say, “Hey! I like what you’re working on and I think this could help!” or perhaps he was simply trying to rile me with his prowess of solving a problem I was facing, turning our friendship into a Vegeta x Goku shonen-manga-style rivalry1.
I’ll never truly know what my pal was doing when they sent me that DM2 and perhaps I’ll never know, but it lit a fire under me. Not one of pure rivalry but more of an “Oh my god, why didn’t I think of that?” and it all funneled down to one thing: Cheerio
Whatchu know about jQuery?
Oh, the days of jQuery. I mean, we’re still in the days of jQuery but when I first got into building things on the web, jQuery was a godsend. Back then, I used vanilla JavaScript a lot but I, honestly, barely understood it. After a a long while of constant guessing and blindly copy/pasting from various blogs and StackOverfly, I fell deeply in love with the early versions of mooTools3. Eventually, either due to annoyance of mooTools’ (then) lack of features or a sheer random spark of enlightenment, jQuery became my mainstay and (like mooTools) made all of the manipulation of HTML DOM so, so easy.
Back in my early development days, I was just building websites that did stuff on the page with very little backend function. Case and Point4. When I finally made the switch over to jQuery, I remember strangely spending hours learning all of the ins-and-outs of how it worked, the infrastructure used to course-correct for all of the browser-funniness, and how to build very complex front-end systems based solely on a few AJAX requests with jQuery and a whole myriad of copy/paste plugins5. And while jQuery continues to be used massively across the internet (because, honestly, it’s so damn easy), I’ve moved on to different methods of building things--namely React and, ironically, vanilla JavaScript. But that jQuery knowledge… it never left.
Now, in the year 2024, someone has taken all of that mess and put it into a nice and quaint little NodeJS utility. Cheerio. As they say it: “The fast, flexible & elegant library for parsing and manipulating HTML and XML.” But I see it as: DOM Manipulation in Node using (almost) all of the jQuery bits I still (sort of) know off the top of my head.
Nice.
Parsing The Business
Previously, I talked about all of the little jobs and runners I was working on and for that, I had decided on using Puppeteer, a super robust, highly supported, Google-backed testing tool that has proven to be very good at what it does, but not without being pretty cumbersome to setup. I’ve written over a dozen little jobs to do my bidding for Just Read Comics but not without lamenting some of the, well, inherent brittleness of the solution.
After talking to my bud, I decided, “You know what, let’s see if this Cheerio thing is actually all it’s cracked up to be.”
Little did I know I would spend the next two hours yelling “YES” over and over in my office at 11:30pm on a Friday night.
From the depths of my mind came a slurry of jQuery knowledge. Suddenly so many of the hoops and side-steps I needed to take in order to get my jobs to run with Puppeteer were simply gone. Cheerio could parse HTML and perform obtuse HTML DOM lookups without needing dozens of lines of extra code--all thanks to the jQuery-like interface and shortcut methods that I used to revel in back in the day.
Normally, I would worry about performance on these kinds of things because doing something like:
$(‘#selectorId, #selector2Id a[href*=”a/ch”]’).parent().find(‘a’)
is kind of messy for a selector and could be a little problematic in a browser, but in Node… I don’t even care. This processor executes so fast, it’s not even close.
So many little things I needed to workaround or find hacks for are just non-existent now because of the power of jQuery via this package. And now (many) of my jobs are fast6.
So where are we now?
Well, I’ve spent the last week or so putting in an hour or three into rewriting these little jobs, cleaning up a lot of code and bugs, and making the Admin of Just Read Comics run these new jobs at will. It’s been a lot of interesting restructuring of my mental model of Just Read Comics and given me a lot of ideas of where this can go next.
I haven’t put together a Full-Fledged Roadmap, but I have a few Larger things mapped out in my head right now that I want to get to next to get this thing closer to a potential launch.
Allowing Users to submit updates to Series data
As much as I’ve been able to take care of things myself, I know there are still tons of comic series out there I do not already have in my database and I need to build out ways to add data; one series at a time and (maybe) multiple series at a time.
The idea here is this: Allowing a very small list of users who aren’t me to submit updates to series on the site or provide missing data for approval (or auto-approval if they have permissions). This would be things like: Availability on a service, missing credits, incorrect titles or series description, etc.
In an ideal world, one of these select users would be able to go throughout the site and update existing series submit without much hassle. The bones of this exist already in the site, it’s now just a matter of getting the UI to do that in place without feeling too janky.
I still nee to think a bit about how to update multiple series.
User-Submission Data Queue
A place for admins (aka: me) to approve/deny data updates from the previous point.
I had a really fun time building this exact thing for jobs and while I think I’ll be able to reuse 95% of that, I’ll need to do some tweaking to support user submissions.
And reconsidering the previous point, when it comes to accepting multi-series submissions… there’s some thinking to be done. Maybe it’s could be easier than I’m imagining. CSVs? JSON? Something else?

User Accounts
Note: There are other things I want to get to that aren’t listed here in this post, but I think it’s worth mentioning my thoughts on User Account, even the work to do them is far down the list of priorities.
User Accounts are tricky because I’m paranoid. I honestly do not want to handle user credentials because that comes with a whole slew of annoyances (namely, people trying to hack your shit7). Handling password resets and everything that comes with authentication is so… boring. This is just a little utility site for people who like to read comics, why add all of the complication of user account management to it?
That being said, the thing I’m trying to keep in mind is this: Just Read Comics is not a social network. Unless someone can convince me that there is some seriously important reason for why people would need to be logged in to keep track of anything on Just Read Comics, I don’t foresee everyday average folks needing to log in to this site8.
If I can find some way to easily integrate a 3rd-party solution for Just Read Comics, I’ll do it, but as I’ve said before, authentication is not something I really want to deal with. But it feels like an inevitability. Once I get those other two parts done, I’m gonna guess my gut will tell me it’s time to do the hard (read: annoying) business around user authentication and just get it done.
We’ll see.
Next Time
Okay, so maybe I have a bit of a Roadmap. And maybe it’s because my pal put a competitive fire under my butt, but we’re making progress. Are you excited? I’m excited.
Next time: Let’s talk about what’s missing.
Remember when Goku when super saiyan before Vegeta? Dude was piiiiissed
I’d have to ask him and be vulnerable! Yikes! 🥴
Simply because I was (and somehow continue to find myself always attempting to be) a contrarian and thought at the time, “jQuery is dumb, mooTools is better because it’s not popular”
Besides updating a few things to work with PHP 8, this site has gone 99.9% unchanged since I first built it… over a decade ago.
A small caveat in my setup is around how Cheerio processes, we’ll say “asynchronous,” data. That has me falling back to some of the Puppeteer business still, but for a majority of my jobs, Cheerio does the work and it does it well.
Am I so full of myself that I think someone is going to try to hack this little site I’m building? No, but I also know that little sites like this one are prime culprits for people to exploit bad user authentication because it’s definitely happened to me before (RIP DestroyTheCyb.org!)
Maybe there’s an alternate universe where we somehow integrate with League of Comic Geeks or something to provide a “where to read this” kind of Chrome/TamperMonkey script, but I do not see that as a reality that ever comes to pass.