<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Raymond Marr</title>
    <description>The latest articles on Forem by Raymond Marr (@ray_).</description>
    <link>https://forem.com/ray_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3858012%2F7156d88b-9c5d-4521-b7a7-a287f15da0b4.jpg</url>
      <title>Forem: Raymond Marr</title>
      <link>https://forem.com/ray_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ray_"/>
    <language>en</language>
    <item>
      <title>Building a Language learning app - part 2</title>
      <dc:creator>Raymond Marr</dc:creator>
      <pubDate>Wed, 22 Apr 2026 08:00:07 +0000</pubDate>
      <link>https://forem.com/ray_/building-a-language-learning-app-part-2-eoo</link>
      <guid>https://forem.com/ray_/building-a-language-learning-app-part-2-eoo</guid>
      <description>&lt;p&gt;Back with an update on my language learning app to help me improve German (check out Part 1 &lt;a href="https://dev.to/ray_/building-my-own-language-learning-app-5hjb"&gt;here&lt;/a&gt;). I’ve recently added three major features: &lt;strong&gt;Pronunciation&lt;/strong&gt;, &lt;strong&gt;Audio Matching&lt;/strong&gt;, and my personal favorite &lt;strong&gt;Crosswords&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crosswords
&lt;/h2&gt;

&lt;p&gt;Crosswords are fantastic for language learners because they mimic the "tip of the tongue" moment we experience in real conversations. However, building a functional crossword UI for mobile was full of unexpected challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solving the Layout
&lt;/h3&gt;

&lt;p&gt;Originally, I tried a traditional newspaper layout (grid on top, clues below), but on small screens this meant constant scrolling and no room for longer clues.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix&lt;/strong&gt;: I switched to a directional toggle system. This kept the UI compact and allowed me to tuck in a Hint Button to reveal letters or words when you're stuck.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FaVsxQVj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FaVsxQVj.gif" alt="Crossword UI" width="400" height="898"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reclaiming the Keyboard
&lt;/h3&gt;

&lt;p&gt;The native mobile keyboard is a UX nightmare for crosswords. It hides half the screen and includes unnecessary clutter like emojis and auto-correct. Plus, clicking between cells meant constant "open-and-close" animations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix&lt;/strong&gt;: I built a compact, always-visible keyboard containing only the alphabet and a backspace. To keep the tactile feel, I added haptic feedback to every keypress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Polishing the UX
&lt;/h3&gt;

&lt;p&gt;To make the experience feel smooth, I added several quality of life tweaks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dbm3gj27rzrw49oabbi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dbm3gj27rzrw49oabbi.gif" alt="A person mouthing there's more" width="480" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart Highlighting&lt;/strong&gt;: Tapping a cell highlights the entire word and its corresponding clue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Directional Tapping&lt;/strong&gt;: Double-tapping a cell toggles between "Across" and "Down."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Advance&lt;/strong&gt;: Typing moves the cursor to the next empty cell automatically (skipping cells already marked as correct).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Feedback&lt;/strong&gt;: Optional "Red/Green" indicators to show if your answer is right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrated Learning&lt;/strong&gt;: Long-press any word in a clue to see an English translation or add it to your flashcards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variable difficulty&lt;/strong&gt;: Change difficulty from child's play to, your German teacher would struggle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;p&gt;German has some longs words, but to keep the UI easier to use, I've limited the grid size to 10x10 for now.&lt;/p&gt;

&lt;p&gt;Sadly, I'm not going to see&lt;br&gt;
"&lt;strong&gt;Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz&lt;/strong&gt;" in my crossword.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pronunciation practice
&lt;/h2&gt;

&lt;p&gt;In principle, an easy game where you're given a German word and you just have to say it correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical difficulties
&lt;/h3&gt;

&lt;p&gt;The way this works is really simple, its just a speech to text program which detects what you said, and it checks if what you said contains what you were supposed to say.&lt;/p&gt;

&lt;p&gt;So if for "Hund" you said "ummmm Hund?", you're correct!&lt;/p&gt;

&lt;p&gt;But a common issue I saw was compound nouns being recognised as seperate words. You were supposed to say "Handschuh" but you said "Hand Schuh", wrong!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: just ignore spaces. Now it feels much better. It gives a success if it recognises what you said, even if there was some slight pausing or umms and urrs. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1wh7tffqhlifdw1fwqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1wh7tffqhlifdw1fwqw.png" alt="Pronunciation game showing the user mispronounced their word" width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But it also doesn't feel too generous. Duolingo has a similar speech mode, but there if the word was "Apfel" and I said "Ampel", it would have been accepted.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxqymji6bmmw2s4lflvc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxqymji6bmmw2s4lflvc.gif" alt="Homer Simpson mouthing Ahh Close enough" width="480" height="366"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Audio matching
&lt;/h2&gt;

&lt;p&gt;Finally a little bit of listening practice. Click to match the German audio to the English word.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ubaapj8e9gyrpznfbq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ubaapj8e9gyrpznfbq5.png" alt="Audio matching game, the user has already solved 2 out of 4 pairs of words" width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also just like everywhere else in the app, any of the German words can be long pressed to see its definition with an example sentence and can be added straight to your flashcards for further practice later.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>uxdesign</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Building my own language learning app</title>
      <dc:creator>Raymond Marr</dc:creator>
      <pubDate>Tue, 07 Apr 2026 09:27:54 +0000</pubDate>
      <link>https://forem.com/ray_/building-my-own-language-learning-app-5hjb</link>
      <guid>https://forem.com/ray_/building-my-own-language-learning-app-5hjb</guid>
      <description>&lt;p&gt;After a 3 year streak of daily Duolingo, I decided to build my own app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;I actually quite like Duolingo. I completed the entire German language track &lt;strong&gt;twice&lt;/strong&gt; (they rebuilt it some years back) and it got me to a conversational level of German. So why wasn't I satisfied? &lt;/p&gt;

&lt;p&gt;A few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;constant ads&lt;/li&gt;
&lt;li&gt;having to dismiss 10 animations after every lesson&lt;/li&gt;
&lt;li&gt;Being shown the same lessons day after day &lt;/li&gt;
&lt;li&gt;Most importantly, no content above a B1 language level&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What did I build
&lt;/h2&gt;

&lt;p&gt;A language learning app with a bunch of features I thought could help me with progressing my German. It's not very useful for someone learning from level zero, but to go beyond what Duolingo offers, I think it's great.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ov7uukchjydlrw9g3sa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ov7uukchjydlrw9g3sa.gif" alt="Animation of Marques Brownlee saying " width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  App features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI chat bot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Corrects your mistakes without breaking the conversation (easy to ignore when you just want to focus on the conversation)&lt;/li&gt;
&lt;li&gt;Instant translations to english available with every message.&lt;/li&gt;
&lt;li&gt;Toggle the language level to the level you want at that moment&lt;/li&gt;
&lt;li&gt;Translation exercises with constructive feedback geared at your level&lt;/li&gt;
&lt;li&gt;TELC/Goethe exam style writing prompts, with feedback on your answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfb8au6wjif9qbp0uvxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfb8au6wjif9qbp0uvxj.png" alt="AI Chat selection options" width="800" height="1795"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Translate game
&lt;/h3&gt;

&lt;p&gt;This is basically Duolingo's main feature (click to build sentences) with some extras.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;↕️ Change the language level between A1-C2&lt;/li&gt;
&lt;li&gt;🐜 Generate sentences based on a specific topic you choose. Want to practice insect vocabulary, sure why not!&lt;/li&gt;
&lt;li&gt;🃏 Use words from your own flashcards (more on this later)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0rt811j5ohiqssyd96o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0rt811j5ohiqssyd96o.png" alt="Translation game with a B1 level sentence" width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stories game
&lt;/h3&gt;

&lt;p&gt;Fill in the blank words in a short story. Has all the same features of the translate game, but a bit more focus on reading comprehension.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtanm6aue40a2gp7hose.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtanm6aue40a2gp7hose.png" alt="Stories game with a C2 level short story about insects" width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flashcards
&lt;/h3&gt;

&lt;p&gt;A simple and effective way to learn vocabulary, with a few extras.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a collection of 19,000 built-in flashcards with example sentences for every word (thanks to open source project &lt;a href="https://github.com/vbvss199/Language-Learning-decks" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Spaced repetition to show you words you got wrong more often&lt;/li&gt;
&lt;li&gt;A collection of common sentence structure scraped from millions of published books &lt;a href="https://github.com/orgtre/google-books-ngram-frequency/tree/main?tab=readme-ov-file#the-underlying-corpus" rel="noopener noreferrer"&gt;open source project here&lt;/a&gt;. P.S. The most common 5 word phrases in books is not always a common phrase in everyday speech. A great example of this is the highly ranked phrase "er biss sich auf die Unterlippe" (he bit his lower lip 🫦)... Not sure I will be using that one!&lt;/li&gt;
&lt;li&gt;An auto-generated deck which collects words you struggled with while using the app&lt;/li&gt;
&lt;li&gt;Create my own custom flash card decks&lt;/li&gt;
&lt;li&gt;Mass edit or copy cards between decks&lt;/li&gt;
&lt;li&gt;Auto-generated translations and example sentences for any new vocabulary you add&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce7huhw25f070mmdd9xv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce7huhw25f070mmdd9xv.png" alt="A flashcard with the common sentence chunk " width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrated dictionary
&lt;/h3&gt;

&lt;p&gt;Throughout the app, you can long press any word to see a translation of that word, and save it to one of your flashcards if you wish.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqi1iagfh28gu7aw629u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqi1iagfh28gu7aw629u.png" alt="Dictionary translation of the word " width="800" height="1796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I started this project thinking of just building the AI chat feature with integrated corrections. But as I've built out more features, I've found that's what I use the least.&lt;/p&gt;

&lt;p&gt;Having a huge collection of flashcards and the ability to easily create my own collection has helped a ton. Im using this every day and constantly adding new words to my decks. (Today I added Rohre and Röhren, which means pipes and tubes, or was it tubes and pipes? Definitely going to mix those up...)&lt;/p&gt;

&lt;p&gt;In the last 30 days it has cost me $2.10 for AI usage. Not bad in comparison to what I'd pay for a Duolingo, Anki, or Memrise subscription.&lt;/p&gt;

&lt;p&gt;There are few more features I'd like to add or improve but so far I'm psyched about it.&lt;/p&gt;

&lt;p&gt;I've also spent more time building it than using it so far, so... Wir werden mal sehen ob es wirklich hilft!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
