Code of Conduct
Be respectful, professional, and constructive. TypeSteps is a community project focused on privacy and user experience.Ways to Contribute
Report Issues
Found a bug or have a feature request? Open an issue on GitHub:- Check existing issues to avoid duplicates
- Use descriptive titles
- Include:
- macOS version
- Xcode version (if building from source)
- Steps to reproduce
- Expected vs actual behavior
- Screenshots if applicable
Submit Pull Requests
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Make your changes following our code standards
- Test thoroughly
- Commit with clear messages
- Push to your fork
- Open a pull request
Code Standards
Swift Style
Follow Swift best practices:Naming Conventions
- Classes/Structs: PascalCase (
StorageManager,KeystrokeListener) - Functions/Variables: camelCase (
incrementCount,isAuthorized) - Constants: camelCase with descriptive names (
statsKey,hourlyKey) - Published properties: camelCase (
dailyStats,isPaused)
SwiftUI Patterns
Use StateObject for singletons:Documentation
Add comments for complex logic:File Organization
Keep related code together:Architecture Principles
Separation of Concerns
- Models: Data structures only
- Managers: Business logic and state
- Views: UI rendering and user interaction
Single Responsibility
Each class should have one clear purpose:KeystrokeListener: Monitor keyboard eventsStorageManager: Persist and retrieve dataWakaTimeManager: WakaTime API integration
Observable Pattern
Use@Published for reactive state updates:
Testing
Manual Testing Checklist
Before submitting a PR:- App builds without warnings
- Onboarding flow works for new users
- Keystroke counting is accurate
- Menu bar displays correct stats
- Dashboard charts render properly
- Theme switching works
- Pause/resume functions correctly
- Data export/import works
- App survives quit and relaunch
Test on Multiple macOS Versions
If possible, test on:- macOS 13 (Ventura) - minimum supported
- macOS 14 (Sonoma)
- macOS 15 (Sequoia)
Privacy Guidelines
NEVER:- Record actual keystrokes or text
- Send data to external servers (except WakaTime if enabled)
- Access user files without permission
- Use analytics or tracking
- Store data locally only
- Use UserDefaults for simple data
- Ask for explicit permission (Accessibility)
- Document what data is collected
Performance Guidelines
Event Handler Efficiency
The keystroke handler runs on every key press:Memory Management
Limit stored data:Git Commit Messages
Write clear, descriptive commits:Commit Message Format
feat: New featurefix: Bug fixrefactor: Code restructuringperf: Performance improvementdocs: Documentationstyle: Formatting, no code changetest: Adding tests