[HN Gopher] Show HN: I send myself automated emails to practice ...
___________________________________________________________________
Show HN: I send myself automated emails to practice Dutch
Author : tr97
Score : 129 points
Date : 2024-12-27 13:05 UTC (9 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| tr97 wrote:
| Everything 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 wrote:
| Goed gedaan!
| TheJoeMan wrote:
| Could 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 wrote:
| Honestly 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 ...
| bambax wrote:
| The 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 wrote:
| > 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
| tr97 wrote:
| Yep, might be a bit overkill, but as mentioned in other
| comments, this project was more for fun and learning, less
| for efficiency :)
| dataflow wrote:
| For anyone else trying to achieve the same thing from scratch:
| if you have a Google account, Google Apps scripts might be able
| to do the same thing for free and without having to worry about
| VMs, storage, or anything else. You could store stuff on your
| Drive, or literally just search your own inbox for the existing
| word to check if it's already sent.
| throwaway3b03 wrote:
| What's the source of the words/dictionary? Where are you storing
| them?
| tr97 wrote:
| The words are generated by ChatGpt Api, and I store them in
| DynamoDB.
| ix101 wrote:
| You 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 wrote:
| cool 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 wrote:
| I 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 wrote:
| ..videoland ;)
| oulipo wrote:
| Cool 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;
| }
| tr97 wrote:
| I wouldn't argue that it's rather complex for what it does. The
| reason I still did it this way was that I want to get them
| automated, without doing anything manually. Even if I would
| need to just open my laptop, or run a script once, I think I
| would just stop at one point, and I don't think it would ever
| become a habit. Are there other tools that could probably get
| this project done with less complexity? Probably, but I have
| the pride of an engineer and wanted to brush up on my Terraform
| ;)
| oulipo wrote:
| the val.town way doesn't require you to open your laptop...
| it's just "lighter" than having a whole terraform infra
| ruthmarx wrote:
| Is that code from an LLM?
| triyambakam wrote:
| Based on the style with comments above each block it seems
| very likely to be from chatgpt or claude
| ruthmarx wrote:
| Yeah.
|
| Kind of weird we have people submitting GPT samples to
| people that likely have GPT themselves and could ask it for
| one if that's what they wanted.
|
| But then plenty of people link google searches as though
| that makes sense.
| oulipo wrote:
| yes, basically just asked the val.town AI bot to write it,
| probably need a few bugfixes here and there, but the idea was
| to show that there are services that do that in 50 lines of
| codes, rather than spanning a big infra
| tithos wrote:
| How much does it cost to run???
| scrollaway wrote:
| A dozen events and seconds of runtime per month? If free tier
| itself had a free tier, it would be a blip on it.
| tr97 wrote:
| Indeed, it's peanuts :) I didn't calculate it as I find that
| cost insignificant.
| ramon156 wrote:
| Good busy!
| jimkleiber wrote:
| I 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 wrote:
| I am in Amsterdam right now and yes, I have yet to encounter a
| Dutch person that doesn't speak very fluent English.
| contravariant wrote:
| Oh 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.
| Muromec wrote:
| I don't have an active memory of hearing either of them
| speaking poor English. Can't be true.
| mi_lk wrote:
| Clearly a dig at Mark Rutte...
| Freak_NL wrote:
| As 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.
| thijsvandien wrote:
| Exactly that. You'll have a harder time not speaking
| English than not speaking Dutch.
| lucb1e wrote:
| It's not the norm anywhere outside of Amsterdam I'd say,
| but indeed, we had a server/waiter(?) in a Greek restaurant
| in Limburg yesterday who spoke German but not Dutch (who
| looked like they might be from Greece so I doubt they were
| simply from Germany). Especially since the pandemic I've
| been noticing this more. I like the culture mingling, all
| the better that the Limburgians see foreigners aren't scary
| and evil, but I'm curious if it's a trend or if I'm just
| randomly noticing it more
| melvinmelih wrote:
| I speak Dutch fluently (born and raised) and even I have a
| hard time to speak Dutch with Dutch people. If you don't fit
| the profile (blond hair/blue eyes) they automatically assume
| you're a foreigner.
| lucb1e wrote:
| Try a less touristy areas though, or people you don't
| normally interact with much (who will, conversely, also not
| have much experience interacting with non-Dutch people). My
| grandma couldn't say more than yes or no and understand not
| much more
|
| Working an IT job in a company of ~30 employees, someone
| joined who didn't speak Dutch. They would always excuse
| themselves and have lunch in their office1 because it was
| very obvious that half the people just didn't really interact
| with the previously lively conversation anymore and were just
| biding their time to get back to work. Those who did speak,
| it worked but it's not as jovial as before. Sure, these
| people can all hold a presentation about their field of work,
| or order a sandwich with the correct words in England, but a
| spontaneous conversation about something random? It's a
| different set of vocabulary that you need every day, and far
| from everyone has that
|
| 1 yes, we made clear they shouldn't do that and they should
| feel invited and part of the team. Many people did interact.
| And many of us made sure they were, at least, not having
| lunch alone in their office. Situation unfortunately remained
| as it was until I left
| usrnm wrote:
| It is a rather big problem, yes. You can absolutely get by
| without speaking any Dutch, I know people who have spent 10+
| years in the country with just very basic knowledge of the
| language. Absolutely kills the motivation for a lot of people.
| andrepd wrote:
| Also Dutch is, let's put it this way, not the prettiest
| language, nor the most useful. I'm sure that also kills
| plenty of motivation.
| com wrote:
| I'd disagree, on the pretty front.
|
| As I've learned it, I found it very charming and often
| surprisingly sweet - as an example idiomatic terms for
| urination and defecation are very funny: plassen (making a
| large pond) and klaaivormen (forming clay) - add to that a
| rather easy to rhyme language with a tendency towards
| charming and heartfelt emotional range, and the end result
| is quite nice.
|
| Add lots of domestic and Caribbean regional variation in
| the home countries, close sister languages: Vlaams
| (certainly in its higher form a very different register of
| the language than the Hollands standard form), Afrikaans
| and West-Frisk, Papiamento etc and you've got a very cosy
| (gezellig!) and dynamic inter-language community!
|
| The aggressive simplification of standard Dutch initially
| offended my tastes, but later I've found that particular
| discipline improved my English by accident and I'm now a
| fan of the sparse elegance and surprising nuance of that
| style ...
| lucb1e wrote:
| What makes a language pretty? I'm not sure I ever saw/heard
| one that was pretty beyond what I'd say is in the eye/ear
| of the beholder
|
| But agreed on it being pretty useless outside of a few
| small regions / couple million speakers. I've been saying
| we should apply winning team joining and get to something
| more internationally useful, as everyone here seems to
| already agree we are small and that trade and cooperation
| has brought the current prosperity. The area I'm from,
| though, people clutch to local dialects as cultural
| heritage that should be continued to be spoken... it
| doesn't even have a writing system... whatever, I don't
| mind so long as people are okay with a useful language
| alongside
| myflash13 wrote:
| What 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 wrote:
| What 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 wrote:
| > 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
|
| Rust: https://github.com/ankitects/anki/tree/main/rslib via
| Protobuf:
| https://github.com/ankitects/anki/tree/main/proto/anki
|
| Rough DB Schema (outdated, but sufficient):
| https://github.com/ankidroid/Anki-Android/wiki/Database-Stru...
| tr97 wrote:
| I agree that spaced repetition is essential and Anki is just
| the main player. I think the ideal product would combine: a
| flashcard app like anki, automated emails you can reply to,
| audio nudges and more ...
| Ilasky wrote:
| This 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
| MarcelOlsz wrote:
| I love the design so much.
| poetril wrote:
| The design is superb! Seriously such an incredible looking site
| maeil wrote:
| hwaiting!
|
| You've made some cool stuff, inspirational.
| huhtenberg wrote:
| An end-to-end example of a single question would be helpful to
| see.
| dutchblacksmith wrote:
| Goed bezig!
| cinntaile wrote:
| You could add tracking to build an anki like system for
| repetition and learning.
| tr97 wrote:
| I 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 wrote:
| Using 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 wrote:
| > 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
| farceSpherule wrote:
| Duo Lingo?
| sailorganymede wrote:
| I 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 wrote:
| With 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 wrote:
| Fair 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. :)
| delduca wrote:
| I do the same on my personal projects. Big over engineering
| projects for learning purposes :-)
| jedberg wrote:
| > 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/...
| QuinnyPig wrote:
| You're not kidding about AWS's own architecture diagrams.
| huijzer wrote:
| I think this is where Cloudflare shines. They just focussed
| on the essentials with Workers ("serverless") at the core of
| everything instead of VPS at the core of everything.
| jedberg wrote:
| Yes, DBOS has a similar philosophy. Strip away all the hard
| and annoying parts, let you just code. Our other philosophy
| is "just do it in Postgres". :)
|
| FWIW you can't really do the same thing on Cloudflare
| workers -- their crons are "best effort", and you'd still
| need to get storage somewhere else. With DBOS the storage
| is built right in.
| piperswe wrote:
| Cloudflare Durable Objects have alarms you can use to
| imitate cron, and have storage built-in (there's even
| support for SQLite databases attached to DOs in beta)
| singron wrote:
| This is a great fit for Google AppScript.
| behnamoh wrote:
| Who likes to learn a niche scripting language that only works
| on one platform?
| IanCal wrote:
| Although if you drew that out you'd have about the same.
|
| Cron trigger.
|
| Process.
|
| Gpt API.
|
| Database for persistence.
|
| Email sender.
|
| Which part of that wouldn't you have?
| sosborn wrote:
| I 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 wrote:
| I 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 wrote:
| The 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 wrote:
| I 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 wrote:
| Is 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 wrote:
| Tried 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 wrote:
| Yes, 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 wrote:
| The 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 wrote:
| I 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 wrote:
| I 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
|
| The things you can do with language learning and LLMs is just
| incredible :)
| Alex-Programs wrote:
| Oh 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&...
|
| (ofc rendered nicely in the client).
| tempodox wrote:
| Or you can just read books, comics and newspapers, and watch tv
| shows and movies.
| triyambakam wrote:
| See 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 wrote:
| this 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
| andrewshadura wrote:
| My 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 wrote:
| great 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.
___________________________________________________________________
(page generated 2024-12-27 23:00 UTC)