8 ms·
Show HN: I send myself automated emails to practice Dutch
- cinntaile 2y agoYou could add tracking to build an anki like system for repetition and learning.
- tr97 2y agoI want to do that if I ever find the time. Adding a date to the database entries, and some code to throw an old word in here and there based on spaced repetition best practices.
- ix101 2y agoUsing speech to text you could say the answer and it could validate your answer. If AI engine is powerful enough it could have you say the foreign word and rate your pronunciation. As for spaced repetition I developed an alternative which just has a column for number of times correct answer was given and order by descending order on that field. This gives you new words first followed by words you've barely gotten correct etc
- lucb1e 2y ago> build an anki like system ...or use Anki? Set a calendar reminder to open the app, then there's a similar notification area trigger as with emails
- cinntaile 2y agoToo much friction, it ruins the email system he made.
- tr97 2y agoEverything runs on AWS. The infrastructure is set up with Terraform. The Lambda retrieves three C1 level words in Dutch, their translations, and an example from ChatGpt. Those words are stored in DynamoDB so they will not be sent again. They are then sent to my email. I didn't want to pay for expensive vocabulary apps that often start with beginner words while I am looking for advanced vocabulary, so I built it myself.
- mrngm 2y agoGoed gedaan!
- TheJoeMan 2y agoCould there be a way to instead of having the direct english translation, having it define the word in (simple) Dutch? I think this immersion would help improve understanding the language directly as opposed to route memorization, especially at the more advanced level you are targeting.
- tr97 2y agoHonestly I was thinking about that. Or how to best display the new words, so I totally see your point. I might change this in the future, but for this first iteration I just thought: leave the English translation in and see how it works ...
- deleted 2y ago[deleted]
- deleted 2y ago[deleted]
- bambax 2y agoThe idea is really nice, but AWS sounds overkill? Using the same Python file with an Sqlite db (or a text file) and using an API like Mailgun to send the emails, it could run on any machine with a plain cron job? I built a comparable system that sends me an email every day that I can respond to, to maintain a journal; it works like described above and has been running for about 5 years now with zero downtime. Anyway the idea is really good!
- lucb1e 2y ago> using an API like Mailgun to send the emails Don't need that. You're already paying for (or self host) your primary email address right? That includes sending emails from that email address. Use those same login credentials to send emails to yourself, no need to contract a third party for sending a handful of emails per day, especially to yourself
- throwaway3b03 2y agoWhat's the source of the words/dictionary? Where are you storing them?
- tr97 2y agoThe words are generated by ChatGpt Api, and I store them in DynamoDB.
- ix101 2y agoYou could use the data you've collected in the DB to generate a quiz that tests your knowledge of the words. If you track how many times you entered the correct answer and sort by descending order on that field you will be presented with the least known words first. Easy alternative to spaced repetition.
- pedrosbmartins 2y agocool project! E-mail seems like a good channel for small chunks of language-learning content + reminders. If I may ask you, how do you plan on building vocabulary from these e-mails? Do you use anki or some other method?
- tr97 2y agoI did some language courses, so now I just want to improve my vocabulary. I used anki for a while but once I got out of it I found it hard to get in again. That's why I like those emails, they don't take much time and you can start every day again. Otherwise I just try to immerse myself in the language with youtube, netflix ... :)
- mrwww 2y ago..videoland ;)
- oulipo 2y agoCool project! Seems a bit complex though, compared to doing a shell script showing a notification or sending yourself an email each morning when you open it? Or just doing a light script on val.town? For instance this could be an example val.town script that does something similar (just need to bind to a data source for the dictionary) import { sqlite } from "https://esm.town/v/stevekrouse/sqlite"; import { OpenAI } from "https://esm.town/v/std/openai"; import { email } from "https://esm.town/v/std/email"; // Dutch words database const dutchWords = [ { word: "boek", translation: "book" }, { word: "huis", translation: "house" }, { word: "boom", translation: "tree" }, { word: "water", translation: "water" }, { word: "kat", translation: "cat" }, { word: "hond", translation: "dog" }, { word: "appel", translation: "apple" }, { word: "tafel", translation: "table" }, { word: "school", translation: "school" }, { word: "fiets", translation: "bicycle" } ]; export default async function generateDutchWordLearning() { const KEY = new URL(import.meta.url).pathname.split("/").at(-1); const openai = new OpenAI(); // Ensure SQLite table exists await sqlite.execute(` CREATE TABLE IF NOT EXISTS ${KEY}_dutch_words ( word TEXT PRIMARY KEY, translation TEXT, example TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) `); // Fetch words not previously used const usedWords = await sqlite.execute(` SELECT word FROM ${KEY}_dutch_words `); const availableWords = dutchWords.filter( w => !usedWords.rows.some(row => row.word === w.word) ); if (availableWords.length < 3) { // Reset if we've used all words await sqlite.execute(`DELETE FROM ${KEY}_dutch_words`); availableWords = dutchWords; } // Randomly select 3 unique words const selectedWords = []; for (let i = 0; i < 3; i++) { const randomIndex = Math.floor(Math.random() * availableWords.length); selectedWords.push(availableWords.splice(randomIndex, 1)[0]); } // Generate example sentences with ChatGPT const wordDetails = await Promise.all(selectedWords.map(async (wordObj) => { const exampleResponse = await openai.chat.completions.create({ model: "gpt-4o-mini", messages: [{ role: "user", content: `Geef een voorbeeld zin met het woord "${wordObj.word}" in het Nederlands.` }] }); const example = exampleResponse.choices[0].message.content || "Geen voorbeeld gevonden"; // Store in database await sqlite.execute(` INSERT INTO ${KEY}_dutch_words (word, translation, example) VALUES (?, ?, ?) `, [wordObj.word, wordObj.translation, example]); return { ...wordObj, example }; })); // Prepare HTML email const htmlContent = ` <html> <body> <h2>Dutch Word Learning </h2> ${wordDetails.map(w => ` <div> <h3>${w.word} (${w.translation})</h3> <p><em>Example:</em> ${w.example}</p> </div> `).join('')} </body> </html> `; // Send email await email({ subject: "Your Daily Dutch Words ", html: htmlContent, text: wordDetails.map(w => `${w.word} (${w.translation}): ${w.example}` ).join('\n') }); return wordDetails; }
- tithos 2y agoHow much does it cost to run???
- scrollaway 2y agoA dozen events and seconds of runtime per month? If free tier itself had a free tier, it would be a blip on it.
- tr97 2y agoIndeed, it's peanuts :) I didn't calculate it as I find that cost insignificant.
- ramon156 2y agoGood busy!
- jimkleiber 2y agoI remember reading a joke once... What's the hardest European language to learn? Dutch. Why? Because every time you speak to them in Dutch they respond to you in English. It seems this is a way around that :-D (I don't actually think it's the hardest language but have found that yes, many Dutch speak English very well)
- jjallen 2y agoI am in Amsterdam right now and yes, I have yet to encounter a Dutch person that doesn’t speak very fluent English.
- contravariant 2y agoOh yeah we only allow people to speak poor english in very public functions, like the head of state or the secretary general of NATO. It helps make the rest of us look good.
- Freak_NL 2y agoAs a Dutchman from outside of Amsterdam (you know, most of us): Hah! It's not even that they won't speak Dutch, often they can't! Sometimes you'll be hard-pressed to find someone capable of speaking Dutch in Amsterdam in some shops and restaurants. I've had people look sheepish/annoyed for presuming to use and expect Dutch in my own country.
- deleted 2y ago[deleted]
- _1tem 2y agoWhat I really want are automated emails interspersed during the workday with my overdue Anki cards. It should be one click straight from the email to answer the quiz card, and appropriately rescheduled to my inbox in case of a memory miss. Spaced repetition quizzing is essential to memorizing anything, and Anki is really the most popular app in the world for that purpose. I already spend all my time in the inbox and find it hard to ignore an email. Inbox zero habits would kick in and ensure that I do at least some memorization every day. A single Anki card in my inbox is far less daunting than the entire deck staring at me when I open the app. Unfortunately Anki doesn't have a proper API and isn't easy to reverse engineer. I tried to build something using a scraper that logs in to the Anki web app, but it turned out to be very janky, and couldn't identify overdue cards. Somebody with better desktop app/python skills could probably do it locally, but I gave up.
- JW_00000 2y agoWhat I do is put the Anki widget quite front-and-center on my phone. Whenever I absentmindedly unlock my phone, the red squircle containing a positive number activates my monkey brain and I want to get it to 0.
- david_allison 2y ago> Unfortunately Anki doesn't have a proper API and isn't easy to reverse engineer Tried any of the below? AnkiConnect (HTTP API): https://git.foosoft.net/alex/anki-connect https://git.foosoft.net/alex/anki-connect Rust: https://github.com/ankitects/anki/tree/main/rslib https://github.com/ankitects/anki/tree/main/rslib via Protobuf: https://github.com/ankitects/anki/tree/main/proto/anki https://github.com/ankitects/anki/tree/main/proto/anki Rough DB Schema (outdated, but sufficient): https://github.com/ankidroid/Anki-Android/wiki/Database-Structure https://github.com/ankidroid/Anki-Android/wiki/Database-Stru...
- rsanek 2y agoAnkiConnect is decent but still relies on an actual Anki desktop application to be running.
- 2y ago
- Ilasky 2y agoThis is eerily well-timed! My partner and I do something similar for Korean & English (she’s Korean native and is fluent in English and I’m learning Korean). We actually built it out for ourselves and some friends and just released it yesterday[0]. Still working out some kinks, but it sends a question every weekday via email that you’d respond to. It then sends back feedback on vocab & grammar, all with spaced repetition baked in to keep track of words you learn/use as you continue. It’s currently tailored towards those that can already read and have basics under their belt. [0] https://dailytokki.com/?ref=hn https://dailytokki.com/?ref=hn
- poetril 2y agoThe design is superb! Seriously such an incredible looking site
- MarcelOlsz 2y agoI love the design so much.
- maeil 2y ago화이팅! You've made some cool stuff, inspirational.
- huhtenberg 2y agoAn end-to-end example of a single question would be helpful to see.
- sjapps 2y ago[dead]
- dutchblacksmith 2y agoGoed bezig!
- farceSpherule 2y agoDuo Lingo?
- sailorganymede 2y agoI have built something similar except with a list of warm up exercises and with GitHub Actions. I suppose a bank of words on a .CSV, a script which selects words, and a job triggered via a ChronJob which opens an issue does the trick. I had it so when an issue is opened, I got emailed. The pro of this approach is you don’t have to deploy any infra. The con is that your emails never look as nice as you got it :’)
- lgessler 2y agoWith all respect and love to the OP, I must admit that I laughed out loud when I saw the AWS architectural diagram and wondered whether this might be a joke. Personally, I'd have implemented this as a few dozen lines of Python living as a cron job (or even as a long-lived process with a schedule), but I'm no pedigreed engineer.
- tr97 2y agoFair enough! As mentioned earlier, one reason I used AWS/Terraform is for personal learning. It may not be the most efficient approach, but I built it this way because it was the most enjoyable for me. :)
- jedberg 2y ago> With all respect and love to the OP, I must admit that I laughed out loud when I saw the AWS architectural diagram OP actually did it more efficiently than most! You should see the AWS suggested architecture. It uses something like 10 different AWS services. My company actually set out to solve this very problem. We have a cloud cron hosting that's more reliable than the AWS architecture but just requires a few lines of code. Literally this is all you have to do: @DBOS.scheduled('* * * * *') @DBOS.workflow() def example_scheduled_workflow(scheduled_time: datetime, actual_time: datetime): DBOS.logger.info("I am a workflow scheduled to run once a minute.") https://github.com/dbos-inc/dbos-demo-apps/blob/main/python/dbos-cron-starter/app/main.py https://github.com/dbos-inc/dbos-demo-apps/blob/main/python/...
- 2y ago
- sosborn 2y agoI built a small personal service to do this for Japanese. Five words + one idiom every day at 9 a.m. It's certainly not the best way to learn/study, but it is a nice passive way to stay engaged with the language.
- tr97 2y agoI think that's spot on. It's not about writing perfect software for learning a language. It's just a little extra to keep you engaged and reminded!!
- lucb1e 2y agoThe first example in the first screenshot isn't very idiomatic. I'd say hulp rather than 'guidance' when filling out a form. It works, but I don't know that anyone would say that The second one, I'd say either bepalen/beslissen (if you want to make a decision) or uitvinden ("out-finding", find out). The word from the screenshot, vaststellen (literally: "fixed setting", think of it as fixating), is still in common enough use, particularly in formal writing, but more of a word for "good to know" than to use in active vocabulary No comments on the third one :) That's idiomatic use (though I'd have thought of, just like in English, "not falling over" as opposed to "work-life balance" as the defining meaning of the word) The readme says the examples are generated using ChatGPT. Why not use an existing dataset instead of generating mediocre examples with lots of energy? Similar to what YouGlish(.com) does, you could get a lot of sentences spoken by native speakers from YouTube transcripts for example, or Wikipedia for written language, or other sources costing virtually no energy at all to find a word in and being better as well
- tr97 2y agoI see your point! I also wouldn't see ChatGpt as the ultimate source of language learning. I just occasionally used it to generate some words for me, and I found it helpful, so I just automated that. I like the idea of getting something out of transcripts, that would make it more realistic and practical!
- Waterluvian 2y agoIs this a decent fit for LLM? “Talk to me in <language> and point out my grammar errors in English” I imagine it’s risky, learning bad habits. But it seems like it might be very convenient. I believe the biggest issue for me is actually using a language regularly. But I’m way too socially afraid to do one of those “speak to a random person live” things. Or even some sort of, “translate all my emails to <language>, but show English when I mouse over.” I bolstered my French by setting almost all my video games to French in university. It helped me a ton, and was accessible because I understood the context. Translation tech has come a long way. Might not even need LLMs.
- lucb1e 2y agoTried having it generate German puzzles (normal sentence with a missing word like "der" or "dem" or so) after someone blogged about that it would be worth like 90% of a language teacher for 1% of the price. I'm not very good at German but most things it proposed seemed wrong to me. The whole point is that I don't have to talk to a native speaker but I decided to show the conversation to one who then said something like "yeah no, you're correct half the time and the computer is wrong even more times" Maybe I should feed it bits from Wikipedia and have it censor word classes for me (or is part-of-speech identification by human-made algorithms reliable?), but that's a lot more involved to code up than prompting it "hey just do this task". I'm sure I'm just holding it wrong and it can be a useful language teacher in some way, e.g. I have had good results with 1:1 translations, but don't expect it just does what you ask it when you can't verify the result
- hk__2 2y agoYes, as always it’s risky to use a LLM for something you’re not already familiar with. I guess for English or Spanish it’s good because it has a large corpus, but for a smaller language like Italian it’s quite bad.
- jacobgkau 2y agoThe one and only actually useful use-case I've found for ChatGPT in my life (since it can't handle assisting my extremely basic coding work) has been "break this Japanese sentence down word-by-word and explain the grammar." On the surface, it seems more helpful for understanding and learning than simply putting the words into a JP/EN dictionary (which doesn't explain grammar at all) or putting the entire phrase into Google/Bing Translate (which makes it too easy to mentally ignore the grammar points I need to learn). Reading the other couple of replies, though, maybe I should rethink doing even that.
- tmountain 2y agoI initially imagined a script that would send an email generated by an LLM that you could reply to in the target language. Basically, an LLM pen pal that will email you regularly. Seems like a fun idea.
- mrwww 2y agoI love this idea!! I'm working on Dutch learning as well and made a learners immersion dictionary for it; So going by the screenshot in the readme where you have vaststellen; https://hetnederlands.com/dictionary/vaststellen https://hetnederlands.com/dictionary/vaststellen The things you can do with language learning and LLMs is just incredible :)
- Alex-Programs 2y agoOh neat, how did you generate that data? Nuenki uses processed wiktionary data. Its definition for that word is this: https://dictionary.nuenki.app/get_definition?language=Dutch&word=vaststellen https://dictionary.nuenki.app/get_definition?language=Dutch&... (ofc rendered nicely in the client).
- mrwww 2y agojust pure o4 mini in a sequence of prompts. I haven't done any fine-tuning or involved any dict api (yet), but the accuracy/quality can definitely be improved from there. For dutch, I would use something like van dale or woordenlijst (het groene boekje), both have free online versions.
- tempodox 2y agoOr you can just read books, comics and newspapers, and watch tv shows and movies.
- triyambakam 2y agoSee also Dr Krashen's comprehensible (not comprehensive) input theory. Lots of YouTube channels that offer graded videos in this style (to various degrees of adhering to the theory, i.e. some are simply grammar lessons which is not CI). The most well known is probably Dreaming Spanish. I've had really great success with my children using national TV networks iOS apps with a VPN, e.g. SVT Barn (Swedish), WDR/ZDF/ARD (German), etc
- toisanji 2y agothis is similar except for learning Chinese and it publishes videos to youtube and they have simulations generated in the videos: https://www.youtube.com/watch?v=4R3zudq9v8M https://www.youtube.com/watch?v=4R3zudq9v8M
- andrewshadura 2y agoMy approach to learning Dutch is probably a bit unusual. I import and sell Dutch bicycles and bike parts. Turns out, this is very difficult to do without accidentally learning some Dutch :) (It's all the wrong variety of Dutch, though: I can talk about bike mechanics, but cannot ask for directions.)
- tonymet 2y agogreat idea. imo there's still tons of business opportunity in email, even if people see it as legacy. that makes it more compelling, because you'll face lots of addressable market and less competition. You could generalize this into all sorts of reminders , notices, affirmations, quotes.
- Ey7NFZ3P0nzAe 2y agoI made a somewhat similar zsh shell script the other day: U wanted to receive daily notifications about topics I'm comfortable with but in spanish b1 level and at semi random interval. It's just a couple lines of zsh : https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy
- joshdavham 2y agoSince you're using python, I may as well plug the py-fsrs project in case you wanna add spaced repetition to it: https://github.com/open-spaced-repetition/py-fsrs https://github.com/open-spaced-repetition/py-fsrs
- sagarpatil 2y agoWow. I was thinking of implementing spaced repetition for a project I’m working on, this will be very useful. Thank you for creating it.
- rachelgunn 2y ago[dead]
- skinnye 2y agoNice work
- skinnye98 2y agoNice work
- agopaul 2y agoI did something similar for German, but in my case I used Claude to generate a full dialog, plus the English translation. I was much more lazy, though, and set this up on Zapier.
- gumboshoes 2y agoAgree with others. This is overkill. You can have similar effect by following Dutch social media accounts (libraries, museums, and bookstores are particularly good), subscribing to Dutch news email newsletters, even changing your OS on your phone and computer to Dutch if your Dutch is already at a good enough level.
- tr97 2y agoYes, there are better ways for sure. This shall just be a small piece in the puzzle :)
- wkat4242 2y agoWhat I do is play language games with LLMs. And ask them to explain what I'm doing wrong, it's much nicer than Duolingo.