{"id":45665134,"url":"https://github.com/trystan2k/padelbuddy","last_synced_at":"2026-03-14T00:51:16.673Z","repository":{"id":339489752,"uuid":"1162143616","full_name":"trystan2k/padelbuddy","owner":"trystan2k","description":"A padel score tracking app for Amazfit watches running Zepp OS. Track match scores directly from your wrist with an intuitive interface designed for padel players.","archived":false,"fork":false,"pushed_at":"2026-02-27T00:48:38.000Z","size":3022,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-27T03:49:31.726Z","etag":null,"topics":["padel","score","sports","tennis","watch","zepp-os"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trystan2k.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-19T23:11:24.000Z","updated_at":"2026-02-27T00:47:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/trystan2k/padelbuddy","commit_stats":null,"previous_names":["trystan2k/padelscore","trystan2k/padelbuddy"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/trystan2k/padelbuddy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trystan2k%2Fpadelbuddy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trystan2k%2Fpadelbuddy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trystan2k%2Fpadelbuddy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trystan2k%2Fpadelbuddy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trystan2k","download_url":"https://codeload.github.com/trystan2k/padelbuddy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trystan2k%2Fpadelbuddy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30178389,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T12:39:21.703Z","status":"ssl_error","status_checked_at":"2026-03-06T12:36:09.819Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["padel","score","sports","tennis","watch","zepp-os"],"created_at":"2026-02-24T09:39:39.155Z","updated_at":"2026-03-14T00:51:16.668Z","avatar_url":"https://github.com/trystan2k.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Padel Buddy\n\nA padel score tracking app for Amazfit watches running Zepp OS. Track match scores directly from your wrist with an intuitive interface designed for padel players.\n\n## Features\n\n- **One-tap scoring** for both teams (Team A and Team B)\n- **Undo functionality** to correct scoring mistakes\n- **Real-time score display** showing current game points and set scores\n- **Match persistence** - resume interrupted games automatically\n- **Match summary screen** with scrollable match history\n- **Screen keep-awake** during active games to prevent interruptions\n- **Traditional padel scoring** including deuce, advantage, and tie-break at 6-6\n- **Responsive design** optimized for round (GTR-3) and square (GTS-3) watch faces\n\n## Supported Devices\n\n- Amazfit GTR 3 / GTR 3 Pro (gtr3, gtr3-w)\n- Amazfit GTS 3 / GTS 3 Pro (Zurich, ZurichW)\n\n## Screens\n\n1. **Home Screen** - Start new games or resume saved matches\n2. **Setup Screen** - Configure match settings before starting\n3. **Game Screen** - Main scoring interface with touch controls\n4. **Summary Screen** - View match history and final scores\n5. **History Screen** - Browse all past matches\n6. **History Detail Screen** - View full details of a specific match\n7. **Settings Screen** - Configure app preferences\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 24.x\n- Zeus CLI installed globally:\n  ```bash\n  npm i -g @zeppos/zeus-cli\n  ```\n- Zepp OS Simulator (for local testing)\n- Zepp mobile app with Developer Mode enabled for real-device testing\n- A Zepp/Open Platform account: https://console.zepp.com\n\n### Installation\n\n1. Clone the repository:\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd padelscore\n   ```\n\n2. Install dependencies:\n   ```bash\n   npm install\n   ```\n\n3. Run the development server:\n   ```bash\n   zeus dev\n   ```\n\n### Testing on Device\n\n1. Login to your Zepp account:\n   ```bash\n   zeus login\n   ```\n\n2. Generate a QR code and scan it with the Zepp app:\n   ```bash\n   zeus preview\n   ```\n\n3. Enable Developer Mode in Zepp App:\n   - Profile → Settings → About → Tap the Zepp icon 7 times\n\n### Building for Distribution\n\n```bash\nzeus build\n```\n\nThis generates a `.zab` package file ready for distribution.\n\n\u003e **Note**: This project uses automated releases via GitHub Actions. \n\u003e See [RELEASE.md](RELEASE.md) for details on the release process.\n\n## Development\n\n### Project Structure\n\n```\npadelscore/\n├── app.js                 # Main application entry point\n├── app.json               # App configuration (permissions, targets, i18n)\n├── page/                  # Watch UI screens\n│   ├── index.js          # Home screen entry point\n│   ├── setup.js          # Match setup screen\n│   ├── game.js           # Main game screen (orchestrator)\n│   ├── game/             # Game screen modules\n│   │   ├── logic.js      # Scoring/state logic\n│   │   ├── persistence.js # Match persistence\n│   │   └── ui-binding.js # UI rendering\n│   ├── summary.js        # Match summary screen\n│   ├── history.js        # Match history list\n│   ├── history-detail.js # Match history details\n│   ├── score-view-model.js # Score display view model\n│   ├── settings.js       # App settings\n│   └── i18n/             # Internationalization files (en-US, es-ES, pt-BR)\n├── utils/                 # Core business logic (key files shown)\n│   ├── scoring-engine.js # Padel scoring logic\n│   ├── match-state.js    # State management\n│   ├── match-storage.js  # Persistence layer\n│   └── history-stack.js  # Undo/redo functionality\n├── tests/                 # Test suite\n├── assets/                # Icons and resources\n├── scripts/               # Build and utility scripts\n└── docs/                  # Documentation and development logs\n```\n\n### Entry Points\n\nThe application has two key entry points:\n\n- **`app.js`**: Main application entry point that initializes global state, handles app lifecycle (onCreate/onDestroy), and manages match state persistence\n- **`page/index.js`**: Home screen entry point that provides the main user interface for starting new matches or resuming existing games\n\nBoth work together: `app.js` sets up the global context, while `page/index.js` provides the first user-facing screen.\n\n### App Identity Baseline\n\n- **appId**: `1108585`\n- **Version baseline**: `3.0.0` (`package.json`, `app.json`, and `utils/version.js` kept in sync)\n- **Module topology**: dedicated `app-side/` and `setting/` modules were removed after confirming they were placeholder-only and unused at runtime\n\n### Testing and Quality Assurance\n\nRun the complete quality check (linting, formatting, and tests):\n\n```bash\nnpm run complete-check\n```\n\nThis command runs:\n- **Biome linting** (`npm run lint:fix`) - Checks and fixes code quality issues\n- **Biome formatting** (`npm run format`) - Ensures consistent code style\n- **Unit tests** (`npm test`) - Runs the test suite\n\nIndividual commands are also available:\n\n```bash\nnpm test                  # Run tests only\nnpm run lint              # Check for lint errors\nnpm run lint:fix          # Fix lint errors automatically\nnpm run format            # Format code\nnpm run format:check      # Check formatting without changes\n```\n\n### Code Style\n\n- **Indentation**: 2 spaces\n- **Line endings**: LF\n- **Naming**: camelCase for variables/functions, kebab-case for files\n- **Responsive Units**: Use `rpx` for layouts, `px` only for fixed sizing\n\n### Code Quality Tools\n\nThis project uses an automated quality gate stack to enforce consistent code style, commit message conventions, and test health before any change reaches the repository.\n\n#### Biome\n\n[Biome](https://biomejs.dev/) is the linter and formatter for all JavaScript and JSON files.\n\n| Script | Command | Purpose |\n|--------|---------|---------|\n| `npm run lint` | `biome lint --error-on-warnings .` | Check all files for lint errors (warnings fail the check) |\n| `npm run lint:fix` | `biome lint --error-on-warnings --write .` | Auto-fix lint errors automatically |\n| `npm run format` | `biome format --error-on-warnings --write .` | Format all files (style only) |\n\nConfiguration is in [`biome.json`](./biome.json). Key settings:\n- Single quotes, no semicolons, 2-space indentation, LF line endings\n- Zepp OS globals declared (`hmUI`, `hmApp`, `hmSensor`, etc.) to suppress false-positive \"undeclared variable\" errors\n- `noConsole` disabled — intentional Zepp OS lifecycle logging is allowed\n\n#### Husky\n\n[Husky](https://typicode.github.io/husky/) manages git hooks. Hooks are installed automatically when you run `npm install` (via the `prepare` script).\n\n| Hook | Trigger | Action |\n|------|---------|--------|\n| `pre-commit` | Before every commit | Runs `lint-staged` on staged files |\n| `commit-msg` | After commit message written | Validates message against Conventional Commits |\n| `pre-push` | Before every push | Runs `npm test` — blocks push if any test fails |\n\n#### lint-staged\n\n[lint-staged](https://github.com/lint-staged/lint-staged) ensures Biome only runs on the files you staged, keeping pre-commit hooks fast regardless of project size. Configuration is in [`.lintstagedrc.json`](./.lintstagedrc.json).\n\n#### Commitlint\n\n[Commitlint](https://commitlint.js.org/) enforces the [Conventional Commits](https://www.conventionalcommits.org/) specification on every commit message. Configuration is in [`commitlint.config.js`](./commitlint.config.js).\n\nValid commit message examples:\n```\nfeat: add match history screen\nfix: resolve score reset on app resume\ndocs: update installation guide\nchore: upgrade biome to v2\n```\n\n## Scoring Rules\n\nThe app implements traditional padel/tennis scoring:\n\n- **Game Points**: 0 → 15 → 30 → 40 → Game\n- **Deuce/Advantage**: Enabled when both teams reach 40\n- **Set Win**: First to 6 games with a 2-game margin\n- **Tie-Break**: Played at 6-6 games (first to 7 points, win by 2)\n- **Match**: Best of 3 sets (first to 2 sets wins)\n\n## Key Technologies\n\n- **Runtime**: Zepp OS (Amazfit devices)\n- **Framework**: Zepp OS Mini Program Framework\n- **Language**: JavaScript (ES6+)\n- **UI System**: Zepp OS UI Widgets (Canvas-based rendering)\n- **Storage**: Local storage via `device:os.local_storage` permission\n\n## Documentation\n\n- [Getting Started Guide](docs/GET_STARTED.md)\n- [Release Process](RELEASE.md) - Automated release workflow and version management\n- [Changelog](CHANGELOG.md) - Version history and release notes\n\n### Product Requirements\n\n- [Main PRD](docs/PRD.md) - Core product requirements\n- [QA Remediation PRD v1.1](docs/PRD-QA-Remediation-v1.1.md) - Quality assurance improvements\n- [Refactor Layout PRD](docs/PRD-Refactor-Layout.md) - UI layout refactoring requirements\n- [Finish Match PRD](docs/PRD-Finish-Match.md) - Match completion flow requirements\n- [Review PRD](docs/PRD-Review.md) - Code review and quality requirements\n\n### Other Resources\n\n- [Development Logs](docs/development-logs/)\n- [Zepp OS Official Documentation](https://docs.zepp.com/docs/1.0/intro/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrystan2k%2Fpadelbuddy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrystan2k%2Fpadelbuddy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrystan2k%2Fpadelbuddy/lists"}