Manga Kotoba: Manga Frequency Lists and Stats

I think I have this cleaned up now. I’ll be doing more review on this as I implement an audit trail for series/volume changes (something I’ve been meaning to do for a long time now). Once I get that implementation live, I can then put together something that can clean up any rogue series statuses I may have missed.

Is the bugginess just being slow, or are you seeing other issues?

Slowness shouldn’t be an issue, but if you’re seeing slowness then there’s something I’ll need to look into there.

I haven’t forgotten about this. I had looked into it a bit initially, but at the time misunderstood what you were seeing versus expectation. I need to check a few hooks in the code that occur on various scenarios.

1 Like

no worries…i’m not in any hurry and haven’t fully committed yet to mk…so even if we need to ditch it all and reimport guinea pig mode is still doable…

1 Like

Mostly just being really slow in registering marking words as known (I’m doing this on pc, on chrome, but mobile is similarly unresponsive)

So when I clicked to mark a word as known yesterday, mostly two things happened (or didn’t happen):
1- The word is not removed from the word list
2- The browser will sometimes show a bar under the address bar as if it is loading a new page, really really slowly (I’m talking more than ten seconds, sometimes another 5 seconds just to start showing the bar). After it has completed, nothing happens on the frontend. The site is still usable while it’s doing it.
3- If I then reload the page, it will have actually marked the word and removed it from the page, but it seems to do it only if that loading is fully completed.
I testes this by clicking through a dozen words to mark them as known in rapid sequence, nothing happened, no “loading bar” was showing, and when I reloaded the page, no words had been marked as known.

1 Like

Once I properly understood the issue, the fix was simple. Now if you navigate to the known words list and use the option to clear all known words, it will reset your percentages for all series to 0 for everything (back to a clean slate).

@Sisthra, thanks for the info! This is next up for me to look into. I need to optimize how the site updates stats when marking known words that are used in many series/volumes.

3 Likes

success!!! :star:

suggestion… since this is a fairly “final” thing… consider adding just a “yes” click button… a pop up or something that you have to type in the word in all caps DELETE or some other way to prevent an accidental goof. Kitsun has done this and it saved me a couple of times when computer glitzed/went slow…

I don’t have a lot of time to play with it now though… but looking forward to being able to do this export import and get whole entries working!

Thanks!!!

1 Like

As it turns out, during a code rewrite, I mistakenly had it so the row disappears only after the site has processed the update (including updating stats) whereas before the row would disappear immediately, then processing occurs in the background. I’ve now fixed this.

Although this won’t win any awards for appearance, how’s this look? Room for improvement in various ways, but it’s better than the initial implementation:

1 Like

perfect…good enough to make sure that if the data is deleted it had to be intentional right?

no user can claim it was a goof. :wink:

also like the option to download a backup (ideally that could be reimported later) for no idea why but some reason LOL

Testing it a bit right now (on chrome on pc and kiwi browser on mobile) but I’m still seeing the same behaviour!

1 Like

Looks like I did insufficient testing. I tested on low-frequency words (those process faster). Now that I’ve tested on high-frequency words, I can clearly see the issue and have corrected the bug in my code.

You’ll still see the green bar at the top of the screen when it’s updating the progress bar, but the rows should disappear immediately now.

Thanks for bringing this up, as I might not have noticed it for some time otherwise!

2 Likes

I think this is still very slow for me. As well as not having a clear hit box for where to click. For example sending to Anki works perfect and indicates nicely when it is about to be pressed. Tried a few different times with different setting on compact or not as well as the general vocabulary list and the vocabulary per page,

Side note: I really appreciate the site and all the hard work put into it. Especially being able to see vocab per page helps a lot when reading.

Technical post, for anyone interested in that sort of thing.

AdonisJS

Manga Kotoba is built on Node.js using the AdonisJS framework. AdonisJS is an “opinionated” framework, meaning it’s built on the “correct” libraries for handling certain things. For someone who wants to build a site without worrying about choosing the right library or developing their own, it’s a great framework. (If you’re not interested in the “opinionated” aspect, you can still use other libraries, but at the point AdonsiJS starts to lose a bit of its purpose for a project.)

SSR vs CSR

A primary objective with Manga Kotoba was to have it use SSR (server-side rendering), meaning the server generates the web page and sends it to the user. The alternative, CSR (client-side rendering) means the server sends a page template and data, and the user’s browser puts it together using Javascript. That’s great for the 99.9% of people who browse the web with JavaScript completely enabled.

For the 0.1% (not an accurate percentage, by the way), CSR websites, such as AniList, tend to look like this:

And if I visit the Discourse meta forum?

As such, I built MangaKotoba with Edge templates, which AdonisJS opinions to be the right way to template pages in an SSR world.

On the CSR side, there’s things like Svelte and Vue.

But AdonisJS also has an opinion on how to develop pages that are SSR when first sent to the user, and CSR the rest of the time (if JavaScript is available), using Inertia.

Implementing Intertia + Svelte

Manual Efforts

Back in 2025, I created a Git branch of Manga Kotoba and set to work attempting to port the site to Inertia and Svelte, two things I basically knew nothing about. (But I also knew nothing about TypeScript and Edge etc. when I first built the site.)

I quickly found it was too big of a lift. There were too many pages to convert over, especially considering Interia uses its own routing separately from Edge, and I wasn’t even certain at the time if it was possible to use both routers. (As it turns out, it is possible.)

I gave up on that plan, although I did later create some Svelte components (for progress bars and the reading status dropdown). The downside here is that I had to create everything in a component twice: an SSR version and a CSR version. This did have benefits (it was easier to update the vocabulary progress bar when marking vocabulary words as known), but also made it more complex, and thus more work to maintain.

Enter AI

A month ago, I decided to see if I could get Claude Sonnet 4.5 to convert the site over the Inertia. It failed so miserably that I wasn’t ready to spend the API code to try Claude Opus 4.5 on it.

image

We’ll just pretend this branch doesn’t exist.

Recently, I’ve been wanting to leave my “safe space” of using Claude Sonnet 4.5 and try out OpenAI’s Codex. And with GPT 5.3 Codex’s recent release and general availability, I decided this would be a good project to throw its way.

I did do things a bit differently this time. Rather than just tell the AI “convert this site from Edge to Inertia and Svelte”, I used Copilot’s Plan mode and have it save that as a Markdown file so I could have the AI tackle it piece by piece.

Codex hasn’t been perfect at it. It leaves some elements out when converting a page over. It also tries to improve some things, which can be good (I’ve kept some of its changes) or bad (I’ve had to revert some changes that were not okay).

Example of a good fix:

Before After
image image

How did I miss including the 日? Was it was intentional or something?

A conversion project that would likely have taken me several months, while stagnating any other work on the site, will instead take under a week (not counting testing and minor clean-up). And I’m learning more about Svelte along the way.

I estimate the majority of the work will total around $5 in API costs. Cheaper if I had an OpenAI subscription (subsidized) versus Copilot (full-price API calls). That’s well worth the time saved versus trying to do all the work myself, and getting a vastly subpar result after many months of effort.

Mobile Layout

I’m also using this opportunity to start improving the mobile layout. While I’m not yet completely on board with having CSS declarations appear directly in the same Svelte file as HTML (and JavaScript), as I expect it to lead to duplicating some of the CSS that’s used the same for different components, it makes it a lot easier to locate the CSS related to a component. The mental processing required to update CSS falls drastically. I don’t think it will take too long to make me a convert, and I’ll likely wonder why I accepted using unencapsulated CSS for the past quarter of a century. :old_man:t2:

Current library on mobile:

Updated library on mobile (not live yet):

No promises on the whole site being better on mobile when the Inertia version goes live, but the encapsulated CSS will make it a lot easier to manage and maintain responsive design.

Considering most of the site’s visitors (the majority of whom are people in Japan looking to download manga without paying for it) use mobile devices, I probably should put a little more focus into the mobile interface. (Or I can use my existing search position and convert the site into a manga :pirate_flag: site with ads.)

But for now, I need to get back to checking every site route one by one to find broken things to get fixed.

4 Likes

Most mobile visits for a Japanese learning tool being native japanese people accidentally landing on the site is very funny to me.
Thanks for all the hard work you are putting into this project!

1 Like

im so surprised by this figure because for me, if im in the japanese learning mode, i just sit in front of the computer and have my entire workstation laid down in front of me, i cant just half-ass japanese on my phone xdd

but you’re probably right that the SEO of the website is attracting a different demographic of the people, so hey, good luck on figuring the SEO out ^^

1 Like