If nothing else, It should be possible with a user stylesheet. I’ll see if I can figure out an appropriate selector when I’m back at the computer.
Here’s a CSS rule to use the “KanjiStrokeOrders” font from the excellent Unobtrusive Kanji Stroke Order userscript:
#ss_quiz [lang="ja"] {
font-family: "KanjiStrokeOrders", "Meiryo", "Yu Gothic", "Hiragino Kaku Gothic Pro", "TakaoPGothic", "Yu Gothic", "ヒラギノ角ゴ Pro W3", "メイリオ", "Osaka", "MS PGothic", "MS Pゴシック", sans-serif;
}
Replace “KanjiStrokeOrders” at the front of the list with any Japanese font you have installed and want to use. The rest are just progressive fallbacks (the defaults from the script).
Detailed instructions
Since Chrome, at least, no longer supports user stylesheets out of the box, you’ll need to install a stylesheet manager. I use stylus.
Once it’s installed, click on the jigsaw icon then Stylus:
Then click on “Manage”:

Then click on “Write new style” with the “as userCSS” checkbox checked:
This will bring up a screen like this:
Change the example.com domain to “wanikani.com”, then replace the comment line where it says “Insert code here” with the rule at the top of this comment. You can also change the name and version at the top to whatever you like. It should look something like this when you’re done:
Finally, click “save” and you should see your desired font the next time you launch the self-study quiz.
thanks, but i add font in the original script after seeing this and that also work
That works, of course, but the advantage of creating a separate stylesheet is that you can keep getting updates to the original script without having to re-do your edits.
You can also style anything else you might want to (on Wanikani or elsewhere).
In my next update (probably in the next day or two), I’ll update the style to match Wanikani’s. It used to match, but WK updated theirs, and I just hadn’t updated the script yet.
@rfindley Have you seen my message?
Also, I’m thinking of submitting a patch that opens the corresponding page when a user clicks/taps on a radical/kanji/vocabulary. Does that sound good?
Yeah, I saw it. I haven’t looked into it yet.
The think the click-to-open will be fine. I can’t think of a down side other than the fact that there’s no indication that it’s visible. Would be nice to have a button or something, but that’s more work than I have time for at the moment.
Anyway, yeah… I’ll merge your click-to-open patch as long as it’s reasonably clean. Most likely not something you’ll have to worry about ![]()
@rfindley One question - is the fact that many times self-study quiz is missing alternative meanings that WaniKani has (for example for 色, “colour” is not accepted even though it’s both a valid spelling and on Wanikani) something easy to fix? Or is it just a result of how the script is made? Because many times I have to rewrite answers because what I’ve written is accepted on WaniKani but the self-study script doesn’t like it!
I’m assuming it probably isn’t an easy fix, and if that’s the case then don’t worry about it, just wanted to check in case it’s quick to solve ![]()
It sounds like you may not have typo forgiveness turned on in the settings. I’m not at my PC, so I can’t check exactly what the option is called, but probably something like “Allow typos”.
(I know that’s not actually a typo, but Wanikani treats it as a “close enough” typo if it doesn’t specifically appear as one of the accepted meanings.)
Ah - that’s totally my mistake then, sorry. I already had Allow typos turned on, but for some reason thought even if I got “close enough” I had to hit backspace and retype it otherwise it would mark it as incorrect! Not sure where I got that idea from…
Well, if you run across another example that you think it should accept (and it didn’t), let me know the specifics and I’ll see if there’s a problem.
Thanks!
I’m sorry to report that I had a quiz re-start again today with the help still showing (even with toggle_help('off') added to requiz()). While that seems to have helped, it doesn’t seem to have eliminated the problem entirely.
Unfortunately, I wasn’t paying close attention so I’m not sure how I triggered the problem.
I think but I’m not 100% certain that adding toggle_help('off') to the top of next_question() instead of to requiz() closes off the remaining paths. It’s not necessary to put it in both places since requiz() eventually calls next_question() via quiz.next.
I hope you don’t mind me creating a mirror?..
That’s fine, I just wanted to be sure you noticed the message. And while you’re at it, here’s some more info. What I meant is that this block is executed for both meanings and readings. Along with this line:
quiz.gender = (quiz.gender === 'female' ? 'male' : 'female');
Which makes the default mode pointless. What you probably want is:
-if (qinfo.item.type === 'vocabulary') {
+if (qinfo.item.type === 'vocabulary' && qinfo.answer.type == 'reading') {
What do you think the button could look like (appearance and location)?
And the click-to-open patch.
Sorry if i’m missing something! This is a great plugin and is extremely helpful after lessons. Recently i’ve been trying to learn some vocab outside of wanikani and I was wondering if there was a way to import your own words into the quiz?
There isn’t an existing way, though I have a template for a plug-in for the script that you could use to add stuff. Let me see if I can find it…
edit: Here it is. If you’re comfortable doing so, just copy the code as-is, paste it in a new TamperMonkey script window, add your kanji and vocab by following the pattern near the top of the script, and save.
edit2: The error that Hubbit200 mentioned below is fixed now. Thanks!!
script
// ==UserScript==
// @name Wanikani Custom Items (for Self-Study Quiz)
// @namespace rfindley
// @description Source for custom items in Self-Study Quiz
// @version 1.0.0
// @include https://www.wanikani.com/*
// @copyright 2022+, Robin Findley
// @license MIT; http://opensource.org/licenses/MIT
// @run-at document-end
// @grant none
// ==/UserScript==
window.ss_custom_items = {};
(function(gobj) {
/* global $, wkof */
/* eslint no-multi-spaces: "off" */
//===================================================================
// Kanji list
//-------------------------------------------------------------------
var custom_kanji = [
// [characters, meanings, kunyomi, onyomi]
['人', 'person', 'ひと,り,と', 'じん,にん'],
['日', 'day,sun,Japan,counter for days', 'ひ,び,か', 'にち,じつ'],
['同', 'same,agree,equal', 'おな', 'どう'],
['会', 'meeting,meet,party,association,interview,join', 'あ,あつ', 'かい,え'],
['内', 'inside,within,between,among,house,home', 'うち', 'ない,だい'],
['政', 'politics,government', 'まつりごと,まん', 'せい,しょう'],
['村', 'village,town', 'むら', 'そん'],
['党', 'party,faction,clique', 'なかま', 'とう'],
['氏', 'family name,surname,clan', 'うじ', 'し'],
['統', 'overall,relationship,ruling,governing', 'す,ほび', 'とう'],
];
//===================================================================
// Vocabulary list
//-------------------------------------------------------------------
var custom_vocabulary = [
// [characters, meanings, readings]
['学校', 'school', 'がっこう'],
['川', 'river,stream', 'かわ'],
['腕', 'arm', 'うで'],
['人形', 'doll,puppet,figure', 'にんぎょう'],
['正直', 'honest,frank,candid,straightforward', 'しょうじき'],
['博物館', 'museum', 'はくぶつかん'],
['儀式', 'ceremony,rite,ritual,service', 'ぎしき'],
['職人', 'craftsman,artisan,tradesman,worker,workman', 'しょくにん'],
['切り', 'end,finish,stop', 'きり'],
['農場', 'farm', 'のうじょう'],
];
//===================================================================
// Initialization of the Wanikani Open Framework.
//-------------------------------------------------------------------
var script_name = 'Custom Items (for Self-Study Quiz)';
var wkof_version_needed = '1.0.45';
if (!window.wkof) {
if (confirm(script_name+' requires Wanikani Open Framework.\nDo you want to be forwarded to the installation instructions?')) {
window.location.href = 'https://community.wanikani.com/t/instructions-installing-wanikani-open-framework/28549';
}
return;
}
if (wkof.version.compare_to(wkof_version_needed) === 'older') {
if (confirm(script_name+' requires Wanikani Open Framework version '+wkof_version_needed+'.\nDo you want to be forwarded to the update page?')) {
window.location.href = 'https://greasyfork.org/en/scripts/38582-wanikani-open-framework';
}
return;
}
wkof.include('ItemData');
wkof.ready('ItemData').then(startup);
//===================================================================
function custom_fetcher() {
if (!gobj.custom_items) gobj.custom_items = parse_items();
return Promise.resolve(gobj.custom_items);
}
//===================================================================
function parse_items() {
var custom_items = {};
var items, item, idx;
var id_cnt = 0;
//------------------
for (idx in custom_kanji) {
item = custom_kanji[idx];
custom_items['custom_' + id_cnt++] = {
object: 'kanji',
data: {
characters: item[0],
meanings: to_meanings(item[1]),
readings: to_yomi(item[2], item[3])
}
};
}
//------------------
for (idx in custom_vocabulary) {
item = custom_vocabulary[idx];
custom_items['custom_' + id_cnt++] = {
object: 'vocabulary',
data: {
characters: item[0],
meanings: to_meanings(item[1]),
readings: to_readings(item[2], item[3])
}
};
}
//-------------------------------------------------------------------
function to_meanings(text) {
return split_list(text).map(function(meaning){return {meaning:meaning, primary:true, accepted_answer:true};});
}
//-------------------------------------------------------------------
function to_yomi(kunyomi, onyomi) {
return split_list(kunyomi).map(function(reading){return {type:'kunyomi', reading:reading, primary:true, accepted_answer:true};}).concat(
split_list(onyomi).map(function(reading){return {type:'onyomi', reading:reading, primary:true, accepted_answer:true};})
);
}
//-------------------------------------------------------------------
function to_readings(text) {
return split_list(text).map(function(reading){return {reading:reading, primary:true, accepted_answer:true};});
}
//-------------------------------------------------------------------
return custom_items;
}
//-------------------------------------------------------------------
function split_list(str) {return str.replace(/^\s+|\s*(,)\s*|\s+$/g, '$1').split(',').filter(function(name) {return (name.length > 0);});}
//===================================================================
var item_type_filter = {
type: 'multi',
label: 'Item type',
default: [],
content: {kanji:'Kanji',vocabulary:'Vocabulary'},
filter_func: function(filter_value, item){return filter_value[item.object] === true;},
hover_tip: 'Filter by item type (kanji, vocabulary)'
};
//===================================================================
function startup() {
wkof.ItemData.registry.sources.custom_items = {
description:"Custom Items",
fetcher:custom_fetcher,
filters:{
item_type:item_type_filter,
},
options:{}
};
}
})(window.ss_custom_items);
Just in case @parasyte does want to try that script - there seem to be two surplus } in the code, which stops it working. They’re on lines 99 and 113 once you paste the code into a new blank Tapermonkey script, just make sure to delete them.
This is actually a function I’ve wanted in self-study quiz for a while, but didn’t want to trouble you with, so I’m definitely going to make use of it. Thank you!
Thanks for the correction, Hubbit200! I’ve fixed it in my post above.
And I’ve had a chance to test it now that I’m on a PC. It works. ![]()
One more feature request if anyone has time - being able to have multiple fonts used by self-study quiz for the items would be great! (like Jitai, but for self-study quiz)
Either choosing randomly from fonts installed on the computer, or having an editable list of font names in the script , etc. Any method would be fine - just having the ability to use it with each item using a random font would be amazing!
After burning out at level 28 and taking a long break, I’ve reset to level 1 and I’m making a new pass through wanikani.
This time, I adding an extra “Listening Quiz” at the end of the day, using Self-Study Quiz to listen to all vocab from the last 24 hours, so I’m learn to hear not just read all the vocab.
This is wonderful listening practice, but I’d also love to listen to all the “Context” examples for each vocab at the end of the day.
Anyone have an idea how to add these to Self-Study quiz? Or any other way to listen to these? During lessons, I just select each phrase (i.e. “大人になりたい”) and press opt-J and my Mac reads them to me. This text to speech is close enough for my use, so I don’t need a custom audio recording for each context item.
I don’t know of any audio source for the WK context sentences.
I was recently turned on to Satori reader. While it isn’t free and I use it more for reading practice than listening, their curated in-context audio is fantastic. It isn’t terribly expensive (well worth it, IMHO).







