Thank you for your interest in contributing to Lingomon!
This document provides guidelines for contributing to the project.
- Code of Conduct
- How Can I Contribute?
- Language Support Requests
- Reporting Bugs
- Suggesting Features
- Code Contributions
- Development Setup
- Pull Request Process
- Style Guidelines
Be respectful, inclusive, and constructive. This is a solo developer project, and I appreciate all help to make language learning better for everyone.
Expected behavior:
- Use welcoming and inclusive language
- Be respectful of differing viewpoints
- Gracefully accept constructive criticism
- Focus on what's best for the community
There are many ways to contribute to Lingomon:
The easiest way to contribute is by researching dictionary APIs for your language.
See: LANGUAGE_REQUEST_TEMPLATE.md
What you need to do:
- Find free dictionary/translation APIs for your language
- Test them with a few words
- Fill out the language request template
- Submit as a GitHub issue
- I'll implement it and credit you!
Found a bug? Please report it!
See: Bug Report Template
What makes a good bug report:
- Clear description of the issue
- Steps to reproduce
- Expected vs actual behavior
- Screenshots/recordings
- Browser and extension version
- Error messages from console (F12 → Console)
Have an idea? I'd love to hear it!
What makes a good feature request:
- Clear description of the feature
- Problem it solves
- Use cases and examples
- Mockups or references (optional)
Documentation improvements are always welcome:
- Fix typos or unclear explanations
- Add examples
- Translate documentation
- Create tutorials or guides
Submit code improvements, bug fixes, or new features!
See: Development Setup and Pull Request Process
Help improve the UI/UX:
- Icon designs
- UI mockups
- Animation improvements
- Color scheme suggestions
Help test new features and report issues:
- Test beta versions
- Try edge cases
- Test on different browsers/OS
- Test with different languages
- Share on social media
- Write blog posts or reviews
- Recommend to friends and teachers
- Leave a review on Chrome Web Store/Firefox Add-ons
The most impactful contribution! Adding a new language opens Lingomon to millions of users.
-
Check existing requests: Look at open language request issues to avoid duplicates
-
Read the guide: language_request.md has detailed instructions
-
Research APIs: Find free dictionary/translation APIs for your language
- Test them with actual requests
- Verify they return good quality data
- Check rate limits and terms of service
-
Submit request: Create a new language request issue
-
I implement: Usually takes 1-2 weeks depending on complexity
-
Get credited: You'll be credited in the changelog and README!
- Spanish (500M+ speakers)
- French (280M+ speakers)
- German (135M+ speakers)
- Japanese (125M+ speakers)
- Portuguese (260M+ speakers)
- Mandarin Chinese (1B+ speakers)
- Arabic (420M+ speakers)
- Hindi (600M+ speakers)
- Russian (260M+ speakers)
- Check existing issues: Search open issues to avoid duplicates
- Update to latest version: Make sure you're using the latest version
- Check the console: Press F12 → Console tab and look for errors
- Try to reproduce: Can you make it happen consistently?
Use the Bug Report Template
Include:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- Screenshots or screen recording
- Browser, OS, and extension version
- Error messages from console
- Language mode (English/Korean/etc)
I love feature ideas!
- Check existing requests: Search feature requests
- Consider scope: Does this fit Lingomon's purpose?
- Think about users: Who would benefit from this?
Use the Feature Request Template
Include:
- Clear description of the feature
- Problem it solves
- How you envision it working
- Examples from other apps (if applicable)
- Who would benefit
- Vanilla JavaScript (no frameworks - keeping it lightweight)
- Chrome Extension Manifest V3
- Local Storage (Chrome Storage API)
- Supabase
- Google OAuth
- External APIs:
- Free Dictionary API (English definitions)
- Datamuse API (word frequency)
- Korean Learners' Dictionary (Korean)
- MyMemory Translation API (translations)
libs/supabase.min.js: Minimal supabase script to call foranimations.js- Animation logic herebackground.js- Service worker, context menu, API callsbattle.js- battle queueing and animation hereconfig.js- .env but in jscontent.js- Content script for word catching.i18n.js- Internationalization/translation systemkofi-widget.js- Only source of income heremanifest.json- Extension configurationpopup.html/popup.js- Extension popup UIprivacy.html/privacy.md- Privacy policiesprofile.js- Profile display logicquiz.js- Quiz page herestats.js- Stat blocks all hereworddex.js- Main page or worddex herewordFrequency.js- Local word frequency database
- A Chromium-based browser (Chrome, Edge, Brave, etc.) or Firefox
- Text editor (VS Code, Sublime, etc.)
- Basic JavaScript knowledge
-
Fork the repository
# Click "Fork" on GitHub, then clone your fork git clone https://github.com/YOUR-USERNAME/lingomon.git cd lingomon
-
Create API config (for Korean support)
cp config.example.js config.js # Edit config.js and add your Korean API key (or leave blank) -
Load extension in browser
Chrome/Edge/Brave:
- Go to
chrome://extensions/ - Enable "Developer mode" (toggle in top right)
- Click "Load unpacked"
- Select the
lingomonfolder
Firefox:
- Go to
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on"
- Select
manifest.jsonfrom the folder
- Go to
-
Make changes and test
- Edit code files
- Click "Reload" button on extension card to see changes
- Test by right-clicking words on any webpage
-
Check for errors
- Open browser console (F12)
- Look for errors in red
- Check extension's service worker console (in chrome://extensions → inspect views)
-
Create a branch
git checkout -b feature/your-feature-name # or git checkout -b fix/bug-description -
Make your changes
- Follow Style Guidelines
- Test thoroughly
- Comment your code where needed
-
Test in multiple scenarios
- Test in Chrome AND Firefox (if possible)
- Test in English and Korean modes
- Test in dark mode
- Test edge cases
-
Commit your changes
git add . git commit -m "feat: add Spanish language support" # or git commit -m "fix: quiz mode not showing definitions"
Commit message format:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style (formatting, etc.)refactor:- Code refactoringperf:- Performance improvementstest:- Adding testschore:- Maintenance tasks
-
Push to your fork
git push origin feature/your-feature-name
-
Create Pull Request
- Go to GitHub
- Click "Compare & pull request"
- Fill out the PR template
- Link related issues
- Automated checks: (if we add them)
- Code review: Maintainer reviews your code
- Feedback: You may be asked to make changes
- Approval: Once approved, PR will be merged
- Credit: You'll be added to contributors!
Do:
- Keep PRs focused (one feature/fix per PR)
- Write clear commit messages
- Add comments for complex logic
- Test thoroughly before submitting
- Respond to feedback promptly
Don't:
- Submit huge PRs with multiple unrelated changes
- Break existing functionality
- Ignore code style guidelines
- Add unnecessary dependencies
- Submit untested code
// Use camelCase for variables and functions
const wordFrequency = 123;
function fetchDefinition(word) { ... }
// Use descriptive names
const userWordCount = 50; // Good
const x = 50; // Bad
// Add comments for complex logic
// Calculate rarity based on frequency per million words
function mapFrequencyToRarity(frequency) {
if (frequency >= 100) return 'common';
// ... etc
}
// Use const by default, let when needed, avoid var
const API_KEY = 'abc123';
let currentIndex = 0;
// Use async/await instead of .then() chains
async function getData() {
const response = await fetch(url);
const data = await response.json();
return data;
}
// Handle errors gracefully
try {
const data = await fetchData();
} catch (err) {
console.error('Error fetching data:', err);
showErrorMessage('Could not load data');
}<!-- Use semantic HTML -->
<button class="sort-btn" data-sort="alpha">A-Z</button>
<!-- Keep CSS organized -->
<style>
/* Group related styles */
.word-entry {
border-bottom: 1px solid #e0e0e0;
padding: 10px 0;
}
/* Dark mode variants */
body.dark-mode .word-entry {
border-bottom-color: #404040;
}
</style>- Keep files focused (one responsibility)
- Use clear file names
- Add comments at the top explaining file's purpose
- Group related functions together
- DRY (Don't Repeat Yourself): Avoid duplicating code
- KISS (Keep It Simple): Simple solutions are better
- YAGNI (You Aren't Gonna Need It): Don't over-engineer
- Readable > Clever: Clear code > clever one-liners
- 💬 Open a Discussion
- 🐛 Report an Issue
- 📧 Email: [your-email@example.com]
- 🐦 Twitter: [@YourHandle]
Thank you for contributing to Lingomon! 🙏
Every contribution, no matter how small, helps make language learning better for everyone.