Review Japanese vocab using LED Matrix Modules. Try it now!

Are you studying Japanese? Do you have too few distractions in your life? If so, I have the tool for you!

LED Matrix Vocab Randomizer

The app is live here: https://jpadgett314.github.io/led-matrix-vocab/

demo

The concept is simple! Each minute (by default), a new word appears. Leave the app running in the background while you work. If an unfamiliar word appears, return to the app for more info.

Offline use is supported! An install button will appear in/by the address bar, allowing you to save the app to your desktop and use it offline.

Inspired by https://github.com/FrameworkComputer/dotmatrixtool. Like dotmatrixtool, this app expects default firmware (or an identical serial interface).

Contributing

Github link

All code or suggestion contributions, big or small, are welcome. I’d love to work with you!

Goals

A few improvements are already on my todo list.

  • I’ll need to change the default word lists to be more useful (nobody wants to study the entirety of JLPT at once :sweat_smile:).
  • :white_check_mark: Custom lists are a must. Done!
  • UI improvements are desired, though I likely won’t, due to lack of skill in that area.
  • :white_check_mark: Move multi-firmware graphics to a separate repo. New repo created!
  • :white_check_mark: The animation framerate falls to 1hz when out of focus. Fix this, potentially by using a web worker. Moved to web worker!

I’m looking forward to hearing what you think :slight_smile:

9 Likes

This is very cool! Nice job!

2 Likes

Wow!! Very cool idea!

2 Likes

Thanks for the twitter shoutout :person_bowing:


Announcing minor update:

0.2.0 - 2025-11-21

Added

  • Support for LED Matrix Modules with the following firmware: sigroot/FW_LED_Matrix_Firmware. This firmware performs favorably on grayscale mode (though the default firmware also works perfectly fine on grayscale mode). Firmware type detected automatically.

The above change was a brief tangent from the main functionality, which I will now return to.

Check out @Sigroot 's LED Matrix tools:

Another minor update!

0.3.0 - 2025-11-24

Added

  • New “Custom Word Lists” panel with controls for creating, editing and deleting custom collections of words.

The multi-firmware support functionality is being split into a new repo.

This is really cool! (I’m the developer of the original firmware and software)

Thanks for working on this and also making it support multiple protocols - our firmware and community developed firmwares.

I think this is probably the best use-case of the LED matrix so far!

The font actually looks pretty good. Did you have to adjust it at all or are you directly using it?
I tried that for a bit (Add support for Chinese character font · Issue #85 · FrameworkComputer/inputmodule-rs · GitHub) but it didn’t really look good on a single matrix. I didn’t try it on two combined ones.

What do you think about the protocols, do you have a preference one over the others?

1 Like

Thank you for checking out the project! And thanks for your work on the modules. It’s been a lot of fun working with them.

I was fortunate to find a font that looked good even with anti-aliasing. I’m simply rendering it to an OffscreenCanvas, then ignoring pixels below 75% brightness. It’s a bitmap font, but the browser is clearly ignoring the bitmap strikes. Chrome’s Skia and/or DirectWrite (on Windows) are likely to blame, as DirectWrite ignores embedded bitmaps outside of very specific scenarios (source 1, source 2). Very few fonts actually fulfill the requirements to use bitmap strikes (MS Gothic is an example, and it looked perfect on the matrices). For text rendering, the browser has no option to disable anti-aliasing, which is absolutely detrimental for small CJK fonts.

I did end up converting the TrueType font to WOFF2, since the bitmaps weren’t being used. Sure enough, this dropped the EBDT/EBLC (embedded bitmap) tables. And sure enough, the final appearance was unchanged. Size reduced drastically.

To be truly cross platform, I should’ve sidestepped the browser’s font engine entirely and used sprite sheets. Something like Font To Bitmap Converter 🛠️ by stmn should’ve helped. (or, just render at double size and then downsample.)

Oooh a 9x9 bitmap font. Those are some incredibly compact characters :eyes:

I like how the official firmware abstracts away the two dimming mechanisms. For the others, I did have to learn why PWM is generally preferred for controlling brightness. On the other hand, the USB HID firmware is definitely less finicky than both serial ones. Web Serial’s underlying streams clearly have multiple optimizations and can break up and/or coalesce payloads on both reads and writes, and ironically, it costs so much more performance to deal with it. I totally blame it on Web Serial.

Very intersting, thanks for the explanation!

Oh I see, I guess we are kind of using serial not the way the API expects it.
I chose serial over HID because the bandwidth is much higher and theoretically allows users to render much faster animations.

I also just noticed your touchpad spacer looks 3d printed - nice!

1 Like

I love this tool and I would love it even further if we could choose the JLPT level :eyes:

1 Like

Oh wow yeah I wasn’t even aware of the bandwidth limitation until I looked it up just now. Seems like there’s some other gotchas I didn’t encounter personally.

Yep, I purchased the spacer from a member of the community! (Still hoping we get an official full-width touchpad module some day, haha)

Done :smiling_face_with_sunglasses:


0.3.2 - 2025-12-16

Added

  • Separate word lists for each JLPT level without removing existing all-level list.

Fixed

  • New service workers are activated as soon as available (#3).
  • Serial firmware detection works again.
1 Like

Arigato GIFs | Tenor

1 Like