A personalized language-learning tool that combines Duolingo-style lessons with your own curated vocabulary lists. Seamlessly add words from books, articles, or videos, and revisit them through interactive quizzes and LLM-generated lessons.
2,259
stars
18
commits
TypeScript
primary language
Aug 8, 2025
updated
Every word has a story.
A personalized language-learning app that brings the magic of Duolingo-style lessons to your own curated vocabulary lists and contexts.
We’ve started developing the mobile version of our web project 🚀 Right now, we’re in the beta testing phase and looking for testers to try the app and share their feedback.
If you’d like to become a tester: 📩 Send an email to [info@wordpeckerapp.com] with the subject "Tester Application".
In your email, please include:
Your name / username
A short note about yourself
Your feedback will help us make the app even better 💡 Thank you for your support! ❤️

Learning a new language can be straightforward, but mastering it is the real challenge. While it's relatively easy to grasp the basics, developing strong communication or reading skills depends on having a solid vocabulary. To build this, you must learn words and phrases at various levels, yet exposure is key. For instance, if you've studied English but don't live in an English-speaking country, advancing your skills becomes significantly harder. You can read books, watch movies, or browse blogs, but fully immersing yourself in the language is still difficult. Real progress often requires extra effort—studying and revisiting words and phrases encountered in your daily life.
However, this process can be inconvenient. You have to pause whatever you're doing to note new words, search their meanings, record them, and then review them later. This is time-consuming and tiring. As a result, although you might improve, the learning process can feel painfully slow and inefficient.
To solve this, I had an idea for an app that merges personalized learning with the efficiency of flashcards—a blend of Duolingo-like lessons and custom study lists.
In the previous version, you'd read your book, encounter new words, create a list, manually add each word, and then practice. You'd open the app, create a new list with details like "Harry Potter Book," add the words you found, and the app would provide meanings so you could continue reading without interruption. Later you'd practice with exercises and quizzes. This worked great when you were actively reading or consuming content, but what about when you just wanted to expand your vocabulary anytime, anywhere?
But here's where it gets exciting – we've added a new feature to discover and encounter new words. Instead of manually hunting down vocabulary, you can now encounter words naturally with much less effort:
Imagine looking at images and describing them to discover new vocabulary. You can use LLM-generated images or real stock photos, describe what you see, and agent analyzes your description to suggest contextual vocabulary words you might not know. It's like having a personal tutor who shows you pictures and helps you expand your vocabulary naturally. The agent considers your current vocabulary and suggests words that fit your learning level and context.
Choose any context or topic you're interested in (like "space exploration" or "cooking techniques"), select your difficulty level, and let agent generate vocabulary words you don't already have. Then dive into interactive learning sessions where you can:
No more manually searching for words – just pick a theme and difficulty, and get learning experience that adapts to your knowledge.
This is where things get really interactive. Using OpenAI's voice agents you can have actual spoken conversations with an LLM tutor about your vocabulary words. Practice pronunciation, ask questions, and get instant feedback through natural speech. It's like having a language exchange partner available 24/7 who knows exactly what words you're learning. The voice agent has access to your list and help you learn the words you already have and it can add new words to your lists by using the tool.
Once you've discovered words through these methods, you can:
Each word in your vocabulary gets its own comprehensive page where you can:
Pronunciation for immersive learning.
The app now supports learning any language using any language. Want to learn Japanese using Turkish? Or practice advanced English while getting explanations in Spanish? Just configure your native language (base) and target language in settings. The LLM even validates specific language variants like "Japanese with Hiragana" or "Brazilian Portuguese".
Jump-start your learning with curated vocabulary lists. Browse templates by category, difficulty, and tags, then clone them to create your own customized lists.
Of course, the original way still works! Create your own context-aware lists the traditional way:
This is still the most direct way to build your vocabulary when you know exactly what words you want to learn!
The key advantage is that the app keeps your learning tied to the context in which you originally saw the words. By returning to them in their original setting, you strengthen those specific neural pathways, speeding up retention and making learning significantly more effective.
In short, it's like having a personalized Duolingo where you can create and learn from your own lists, but with the added ehancements of natural word discovery and voice interaction. It's a powerful way to immerse yourself in the language and make steady progress.
Choose the approach that fits your learning style and situation:
Perfect when you want to expand your vocabulary without the effort of hunting for words:
Discover Words Naturally:
Build Your Collection:
Explore & Expand:
Practice & Reinforce:
Perfect when you encounter specific words and want to learn them immediately:
Create Context-Aware Lists:
Deep Dive Into Words:
Practice & Master:
Both paths lead to the same comprehensive learning experience—you can even combine them! The key is that WordPecker adapts to however you prefer to learn.
Clone the repository:
git clone https://github.com/baturyilmaz/wordpecker-app.git
cd wordpecker-app
Install dependencies:
# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm install
Install and start MongoDB:
Local MongoDB:
# macOS (with Homebrew)
brew install mongodb/brew/mongodb-community
brew services start mongodb/brew/mongodb-community
# Ubuntu
sudo apt-get install mongodb
sudo systemctl start mongodb
# Windows
# Download and install from https://www.mongodb.com/try/download/community
Or use MongoDB Atlas (cloud):
Create .env files:
Backend .env:
PORT=3000
NODE_ENV=development
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
PEXELS_API_KEY=your_pexels_api_key_here # Optional for Vision Garden stock photos
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here # Optional for audio features
MONGODB_URL=mongodb://localhost:27017/wordpecker
Frontend .env:
VITE_API_URL=http://localhost:3000
Note: For MongoDB Atlas, use your connection string for MONGODB_URL:
MONGODB_URL=mongodb+srv://username:password@cluster.mongodb.net/wordpecker
The database will be automatically created when you first start the backend. No manual database setup is required as MongoDB is schemaless and Mongoose will handle collection creation.
Start the backend:
cd backend
npm run dev
Start the frontend:
cd frontend
npm run dev
For the easiest setup experience, use Docker to run the entire application with MongoDB and hot reload for development:
git clone https://github.com/baturyilmaz/wordpecker-app.git
cd wordpecker-app
# Copy the Docker environment template
cp .env.docker .env
# Edit .env and add your API keys
OPENAI_API_KEY=your_actual_openai_api_key_here
PEXELS_API_KEY=your_actual_pexels_api_key_here # Optional for Vision Garden stock photos
ELEVENLABS_API_KEY=your_actual_elevenlabs_api_key_here # Optional for audio features
# Start development environment with hot reload
docker-compose up --build
# Start development environment with hot reload
docker-compose up --build
# Run in background
docker-compose up -d
# Stop all services
docker-compose down
# Stop and remove volumes (clears database)
docker-compose down -v
# View logs
docker-compose logs -f
# View logs for specific service
docker-compose logs -f backend
docker-compose logs -f frontend
# Rebuild specific service
docker-compose build backend --no-cache
When using Docker, MongoDB runs with these credentials:
You can connect to MongoDB using tools like MongoDB Compass or mongosh:
# Using mongosh
mongosh "mongodb://admin:password@localhost:27017/wordpecker?authSource=admin"
If you prefer to run only MongoDB in Docker and the backend/frontend locally:
# Start only MongoDB
docker-compose -f docker-compose.mongo.yml up -d
# Update your backend .env file to use:
MONGODB_URL=mongodb://admin:password@localhost:27017/wordpecker?authSource=admin
# Then run backend and frontend locally
cd backend && npm run dev
cd frontend && npm run dev
For convenience, use the provided startup script:
# Make sure you have Docker and Docker Compose installed
./scripts/docker-dev.sh
This script will:
Backend won't connect to MongoDB:
docker-compose psdocker-compose logs mongodbPort conflicts:
Container build issues:
docker-compose build --no-cachedocker system prune -aEnvironment variables:
docker-compose configContributions are welcome!
TypeScript
98.7%
A personalized language-learning tool that combines Duolingo-style lessons with your own curated vocabulary lists. Seamlessly add words from books, articles, or videos, and revisit them through interactive quizzes and LLM-generated lessons.
2,259
stars
18
commits
TypeScript
primary language
Aug 8, 2025
updated
Every word has a story.
A personalized language-learning app that brings the magic of Duolingo-style lessons to your own curated vocabulary lists and contexts.
We’ve started developing the mobile version of our web project 🚀 Right now, we’re in the beta testing phase and looking for testers to try the app and share their feedback.
If you’d like to become a tester: 📩 Send an email to [info@wordpeckerapp.com] with the subject "Tester Application".
In your email, please include:
Your name / username
A short note about yourself
Your feedback will help us make the app even better 💡 Thank you for your support! ❤️

Learning a new language can be straightforward, but mastering it is the real challenge. While it's relatively easy to grasp the basics, developing strong communication or reading skills depends on having a solid vocabulary. To build this, you must learn words and phrases at various levels, yet exposure is key. For instance, if you've studied English but don't live in an English-speaking country, advancing your skills becomes significantly harder. You can read books, watch movies, or browse blogs, but fully immersing yourself in the language is still difficult. Real progress often requires extra effort—studying and revisiting words and phrases encountered in your daily life.
However, this process can be inconvenient. You have to pause whatever you're doing to note new words, search their meanings, record them, and then review them later. This is time-consuming and tiring. As a result, although you might improve, the learning process can feel painfully slow and inefficient.
To solve this, I had an idea for an app that merges personalized learning with the efficiency of flashcards—a blend of Duolingo-like lessons and custom study lists.
In the previous version, you'd read your book, encounter new words, create a list, manually add each word, and then practice. You'd open the app, create a new list with details like "Harry Potter Book," add the words you found, and the app would provide meanings so you could continue reading without interruption. Later you'd practice with exercises and quizzes. This worked great when you were actively reading or consuming content, but what about when you just wanted to expand your vocabulary anytime, anywhere?
But here's where it gets exciting – we've added a new feature to discover and encounter new words. Instead of manually hunting down vocabulary, you can now encounter words naturally with much less effort:
Imagine looking at images and describing them to discover new vocabulary. You can use LLM-generated images or real stock photos, describe what you see, and agent analyzes your description to suggest contextual vocabulary words you might not know. It's like having a personal tutor who shows you pictures and helps you expand your vocabulary naturally. The agent considers your current vocabulary and suggests words that fit your learning level and context.
Choose any context or topic you're interested in (like "space exploration" or "cooking techniques"), select your difficulty level, and let agent generate vocabulary words you don't already have. Then dive into interactive learning sessions where you can:
No more manually searching for words – just pick a theme and difficulty, and get learning experience that adapts to your knowledge.
This is where things get really interactive. Using OpenAI's voice agents you can have actual spoken conversations with an LLM tutor about your vocabulary words. Practice pronunciation, ask questions, and get instant feedback through natural speech. It's like having a language exchange partner available 24/7 who knows exactly what words you're learning. The voice agent has access to your list and help you learn the words you already have and it can add new words to your lists by using the tool.
Once you've discovered words through these methods, you can:
Each word in your vocabulary gets its own comprehensive page where you can:
Pronunciation for immersive learning.
The app now supports learning any language using any language. Want to learn Japanese using Turkish? Or practice advanced English while getting explanations in Spanish? Just configure your native language (base) and target language in settings. The LLM even validates specific language variants like "Japanese with Hiragana" or "Brazilian Portuguese".
Jump-start your learning with curated vocabulary lists. Browse templates by category, difficulty, and tags, then clone them to create your own customized lists.
Of course, the original way still works! Create your own context-aware lists the traditional way:
This is still the most direct way to build your vocabulary when you know exactly what words you want to learn!
The key advantage is that the app keeps your learning tied to the context in which you originally saw the words. By returning to them in their original setting, you strengthen those specific neural pathways, speeding up retention and making learning significantly more effective.
In short, it's like having a personalized Duolingo where you can create and learn from your own lists, but with the added ehancements of natural word discovery and voice interaction. It's a powerful way to immerse yourself in the language and make steady progress.
Choose the approach that fits your learning style and situation:
Perfect when you want to expand your vocabulary without the effort of hunting for words:
Discover Words Naturally:
Build Your Collection:
Explore & Expand:
Practice & Reinforce:
Perfect when you encounter specific words and want to learn them immediately:
Create Context-Aware Lists:
Deep Dive Into Words:
Practice & Master:
Both paths lead to the same comprehensive learning experience—you can even combine them! The key is that WordPecker adapts to however you prefer to learn.
Clone the repository:
git clone https://github.com/baturyilmaz/wordpecker-app.git
cd wordpecker-app
Install dependencies:
# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm install
Install and start MongoDB:
Local MongoDB:
# macOS (with Homebrew)
brew install mongodb/brew/mongodb-community
brew services start mongodb/brew/mongodb-community
# Ubuntu
sudo apt-get install mongodb
sudo systemctl start mongodb
# Windows
# Download and install from https://www.mongodb.com/try/download/community
Or use MongoDB Atlas (cloud):
Create .env files:
Backend .env:
PORT=3000
NODE_ENV=development
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
PEXELS_API_KEY=your_pexels_api_key_here # Optional for Vision Garden stock photos
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here # Optional for audio features
MONGODB_URL=mongodb://localhost:27017/wordpecker
Frontend .env:
VITE_API_URL=http://localhost:3000
Note: For MongoDB Atlas, use your connection string for MONGODB_URL:
MONGODB_URL=mongodb+srv://username:password@cluster.mongodb.net/wordpecker
The database will be automatically created when you first start the backend. No manual database setup is required as MongoDB is schemaless and Mongoose will handle collection creation.
Start the backend:
cd backend
npm run dev
Start the frontend:
cd frontend
npm run dev
For the easiest setup experience, use Docker to run the entire application with MongoDB and hot reload for development:
git clone https://github.com/baturyilmaz/wordpecker-app.git
cd wordpecker-app
# Copy the Docker environment template
cp .env.docker .env
# Edit .env and add your API keys
OPENAI_API_KEY=your_actual_openai_api_key_here
PEXELS_API_KEY=your_actual_pexels_api_key_here # Optional for Vision Garden stock photos
ELEVENLABS_API_KEY=your_actual_elevenlabs_api_key_here # Optional for audio features
# Start development environment with hot reload
docker-compose up --build
# Start development environment with hot reload
docker-compose up --build
# Run in background
docker-compose up -d
# Stop all services
docker-compose down
# Stop and remove volumes (clears database)
docker-compose down -v
# View logs
docker-compose logs -f
# View logs for specific service
docker-compose logs -f backend
docker-compose logs -f frontend
# Rebuild specific service
docker-compose build backend --no-cache
When using Docker, MongoDB runs with these credentials:
You can connect to MongoDB using tools like MongoDB Compass or mongosh:
# Using mongosh
mongosh "mongodb://admin:password@localhost:27017/wordpecker?authSource=admin"
If you prefer to run only MongoDB in Docker and the backend/frontend locally:
# Start only MongoDB
docker-compose -f docker-compose.mongo.yml up -d
# Update your backend .env file to use:
MONGODB_URL=mongodb://admin:password@localhost:27017/wordpecker?authSource=admin
# Then run backend and frontend locally
cd backend && npm run dev
cd frontend && npm run dev
For convenience, use the provided startup script:
# Make sure you have Docker and Docker Compose installed
./scripts/docker-dev.sh
This script will:
Backend won't connect to MongoDB:
docker-compose psdocker-compose logs mongodbPort conflicts:
Container build issues:
docker-compose build --no-cachedocker system prune -aEnvironment variables:
docker-compose configContributions are welcome!
TypeScript
98.7%