Thank you for your interest in contributing to Elimu AI! This project is part of the AbiliLife ecosystem and aims to make education accessible for all learners.
Project Phase: Phase 4 Complete (December 2025)
Accepting Contributions: Starting Phase 5 (January 2026)
Maintainer: Solo developer (AbiliLife founder)
Found a bug? Please create an issue with:
- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Screenshots (if applicable)
- Device & OS version
Have an idea? We'd love to hear it! Please:
- Check existing issues first
- Explain the use case
- Describe how it helps PWDs or learners
- Consider accessibility implications
Help make our docs clearer:
- Fix typos or unclear explanations
- Add tutorials or guides
- Translate docs to Swahili, or other languages
- Create video walkthroughs
Help us reach more learners:
- UI text translations
- Sample document translations
- Voice preference defaults for your language
- Test on your device (iOS/Android)
- Try with assistive technologies (VoiceOver, TalkBack)
- Report UX issues or confusion
- Suggest improvements
- Node.js 18+ and npm
- Expo CLI (
npm install -g expo-cli) - iOS Simulator or Android Emulator (or physical device with Expo Go)
- Google Gemini API key (free tier available)
# 1. Fork the repository
# (Click "Fork" button on GitHub)
# 2. Clone your fork
git clone https://github.com/YOUR_USERNAME/elimu-ai-app
cd elimu-ai-app
# 3. Install dependencies
npm install
# 4. Create .env file
cp .env.example .env
# Add your EXPO_PUBLIC_GEMINI_API_KEY
# 5. Start development server
npx expo start
# 6. Create a feature branch
git checkout -b feature/your-feature-name- TypeScript: All new code must be TypeScript
- Formatting: We use Prettier (run
npm run format) - Linting: ESLint must pass (run
npm run lint) - Naming: Use camelCase for variables, PascalCase for components
// ✅ Good: Typed props, clear names
interface ButtonProps {
title: string;
onPress: () => void;
variant?: 'primary' | 'secondary';
}
export function Button({ title, onPress, variant = 'primary' }: ButtonProps) {
// Implementation
}
// ❌ Bad: Untyped, unclear
export function Btn(props: any) {
// Implementation
}Every contribution MUST consider accessibility:
- All interactive elements have accessibility labels
- Color contrast ratio ≥ 4.5:1 (WCAG AA)
- Support for screen readers (VoiceOver, TalkBack)
- Keyboard navigation (where applicable)
- Font scaling respects user preferences
Follow Conventional Commits:
feat: add personal notes feature
fix: resolve dark mode toggle bug
docs: update API documentation
refactor: simplify audio playback logic
test: add unit tests for flashcards
chore: update dependenciesBefore submitting a PR, test:
- Works on iOS (simulator or device)
- Works on Android (emulator or device)
- Dark mode looks correct
- All font sizes render properly (Small/Medium/Large)
- Screen reader announces elements correctly
- No console errors or warnings
- Handles errors gracefully (network issues, invalid input)
npm run test
npm run test:watch
npm run test:coverage- Code follows style guidelines
- Commits follow conventional commit format
- All tests pass
- Documentation updated (if needed)
- Accessibility requirements met
- PR description explains changes clearly
- Screenshots included (for UI changes)
## Description
Brief summary of changes
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactoring
## Testing
How was this tested?
## Screenshots
(If applicable)
## Accessibility
How does this impact accessibility?
## Checklist
- [ ] Code follows guidelines
- [ ] Tests pass
- [ ] Docs updated- Automated Checks: CI/CD runs linting, type checking, tests
- Maintainer Review: I'll review within 2-3 days
- Feedback: May request changes or clarifications
- Approval: Once approved, I'll merge the PR
- Recognition: Contributors listed in CONTRIBUTORS.md
- Be respectful and inclusive
- Focus on accessibility and user needs
- Welcome beginners and provide helpful feedback
- No harassment, discrimination, or hate speech
- Assume good intentions
- GitHub Issues: Bug reports, feature requests
- Discussions: General questions, ideas
- Pull Requests: Code contributions with clear descriptions
We value all contributions:
| Type | Examples | Recognition |
|---|---|---|
| Bug Fixes | Fix crashes, UI issues | Listed in release notes |
| Features | New study tools, integrations | Listed in CONTRIBUTORS.md |
| Docs | Guides, translations | Mentioned in docs |
| Testing | Report bugs, test PRs | Thank you in issues |
| Ideas | Feature suggestions | Credited in implementation |
Need help with:
- Personal Notes Feature - Rich text editor integration
- Study Streak Tracking - Gamification logic
- Analytics Integration - Firebase setup
- Accessibility Audit - VoiceOver/TalkBack testing
- Translations - Swahili, French UI text
- Performance - Bundle size optimization
- Unit Tests - Jest test coverage
See docs/PHASE_5_TODO.md for details.
All contributors will be:
- Listed in CONTRIBUTORS.md
- Mentioned in release notes
- Credited in documentation
- Thanked in commit messages
Top contributors may be invited to join the AbiliLife Learn team!
- Technical: Open a GitHub Discussion
- Security: Email muthokaelikeli@gmail.com / abililifekenya@gmail.com (when available)
- General: Comment on relevant issues
By contributing, you agree that your contributions will be licensed under the MIT License.