This is a small bug with a nice reason behind it. I speak Korean, so I will explain the Korean part first.

In a Korean Bible, most books are divided into 장 (jang, “chapters”). The Book of Psalms is the exception. Its sections are called 편 (pyeon), and people say “Psalms 23 pyeon”, not “Psalms chapter 23”. Both words are in normal use. A person might say either one, depending on habit.

My Bible app only understood the first word.

The Need: One Word Broke the Lookup

I use a “say a verse” button in the notes screen. I say a reference, the app shows a preview of the verse, and I tap to add it to my note. Most of the time it works. When I said “Psalms 1 pyeon 1 verse”, it found nothing. When I said “Psalms 1 jang 1 verse”, it worked.

A feature that works for 65 books and silently fails for one is worse than a feature that never works. I would not have known whether I had said something wrong.

The Proof: Both Ways Work Now

In the search box and in voice lookup, these all find the same verse:

  • Psalms 1 pyeon 1 verse
  • Psalms 1 jang 1 verse
  • the abbreviation form, 시 1:1

The same session fixed three other things I had been annoyed by:

  • Insert at the cursor. When I added a verse to a note, it always went to the end. Now it goes where my cursor is, with exactly one blank line above and one below.
  • Search by reference. The search box takes references such as 창세기 1장 1절, 창 1:1, 요 3:16-18 and 롬 8장. The abbreviation table was already in the app for my verse-pair feature, so I reused it.
  • Note search. A search box in the note list looks through titles and text, and a tap opens the note and scrolls to the first match.

These changes are built and deployed, but I have not yet written down my own test results. Voice also depends on how the phone’s speech recognition hears me on a given day, so I would call it “built, not battle-tested”.

The Story: A Notes App for Listening to Sermons

I made this app to take notes while I listen to a sermon. The pastor says “turn to Psalms 1”, and I want that verse in my note without hunting for it. Speed is the whole point. If the lookup fails, I have missed the next sentence of the sermon.

So every small friction counts. The cursor and the blank lines sound minor, but I was fixing them by hand every time.

The How: Read the Number, Then Allow Two Words After It

The voice and search code reads a reference in three parts: a book name, a number, and an optional word after the number. The only change for Psalms was to allow either word after the number.

Here is the idea, simplified. The real code also handles verse ranges and a verse number.

// book name, then a number, then optionally 장 (chapter), 편 (psalm), or ":"
const m = q.match(/^([가-힣]+)\s*(\d+)\s*(?:장|편|[:,.])?\s*(\d+)?/);

The (?:장|편|[:,.])? part is the fix. It says: after the number there may be 장, or 편, or a colon, comma or period, or nothing. Before, the voice parser had 장 only.

For the abbreviations, I did not write a new table. The app already had one (창 for Genesis, 롬 for Romans, 시 for Psalms) for matching verse pairs, so the new search simply uses it. That is a habit I now follow: before writing a new list, search the project for one that already exists.

💬 Prompt that worked “When I voice search, ‘Psalms 1 pyeon 1 verse’ can’t be found, but ‘Psalms 1 chapter 1 verse’ can. Other books use chapter and verse, but Psalms can use both chapter and pyeon, so please make ‘Psalms 1 pyeon 1 verse’ searchable too.”

The longer prompt that started the session asked for four things in one message: insert at the cursor, one blank line above and below, matching spacing between the viewer button and the search button, and search by reference or abbreviation. Putting everything that annoys me into one message worked well enough that I will keep doing it.

Cost: $0. No outside service is used, only the browser and my own server.