{"id":43557254,"url":"https://github.com/bramp/wordclock","last_synced_at":"2026-02-03T20:28:24.939Z","repository":{"id":331353157,"uuid":"1125372092","full_name":"bramp/wordclock","owner":"bramp","description":"A clone of the qlocktwo","archived":false,"fork":false,"pushed_at":"2026-02-03T06:48:27.000Z","size":23900,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-03T14:54:11.026Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bramp.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":null,"dco":null,"cla":null},"funding":{"github":"bramp","buy_me_a_coffee":"bramp"}},"created_at":"2025-12-30T15:58:41.000Z","updated_at":"2026-02-03T06:44:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bramp/wordclock","commit_stats":null,"previous_names":["bramp/wordclock"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bramp/wordclock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bramp%2Fwordclock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bramp%2Fwordclock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bramp%2Fwordclock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bramp%2Fwordclock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bramp","download_url":"https://codeload.github.com/bramp/wordclock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bramp%2Fwordclock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29056252,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T20:13:53.544Z","status":"ssl_error","status_checked_at":"2026-02-03T20:13:40.507Z","response_time":96,"last_error":"SSL_read: 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":[],"created_at":"2026-02-03T20:28:22.060Z","updated_at":"2026-02-03T20:28:24.933Z","avatar_url":"https://github.com/bramp.png","language":"Dart","funding_links":["https://github.com/sponsors/bramp","https://buymeacoffee.com/bramp"],"categories":[],"sub_categories":[],"readme":"# WordClock\n\n[![Test](https://github.com/bramp/wordclock/actions/workflows/test.yml/badge.svg)](https://github.com/bramp/wordclock/actions/workflows/test.yml)\n[![Deploy to GitHub Pages](https://github.com/bramp/wordclock/actions/workflows/deploy.yml/badge.svg)](https://github.com/bramp/wordclock/actions/workflows/deploy.yml)\n[![codecov](https://codecov.io/gh/bramp/wordclock/branch/main/graph/badge.svg)](https://codecov.io/gh/bramp/wordclock)\n[![Test Results](https://img.shields.io/badge/Codecov-Test_Results-blue)](https://codecov.io/gh/bramp/wordclock/tests)\n[![License](https://img.shields.io/github/license/bramp/wordclock)](https://github.com/bramp/wordclock/blob/main/LICENSE)\n[![Flutter](https://img.shields.io/badge/Flutter-%2302569B.svg?style=flat\u0026logo=Flutter\u0026logoColor=white)](https://flutter.dev)\n[![Dart](https://img.shields.io/badge/Dart-%230175C2.svg?style=flat\u0026logo=Dart\u0026logoColor=white)](https://dart.dev)\n[![Repo Size](https://img.shields.io/github/repo-size/bramp/wordclock)](https://github.com/bramp/wordclock)\n[![Last Commit](https://img.shields.io/github/last-commit/bramp/wordclock)](https://github.com/bramp/wordclock)\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/bramp/wordclock/graphs/commit-activity)\n\n A minimal, aesthetic word clock application built with Flutter. Inspired by [QLOCKTWO](https://www.qlocktwo.com/).\n\nFeatures:\n\n- **Time to Words**: Converts current time into a grid of lighted words (e.g., \"IT IS TWENTY FIVE TO TEN\").\n- **Stencil Design**: Uses a gradient background revealed by active letters.\n- **Cross-Platform**: Runs on Android and Web.\n\n## Getting Started\n\n### Prerequisites\n\n- [Flutter SDK](https://docs.flutter.dev/get-started/install) installed and configured.\n\n### Running the App\n\n#### Web\n\nTo run the app in your default browser (Chrome is recommended):\n\n```bash\nflutter run -d chrome\n```\n\n#### Android\n\nEnsure you have an Android device connected or an emulator running.\n\n```bash\nflutter run -d android\n```\n\n### Building for Release\n\n#### Web\n\n```bash\nflutter build web\n```\n\nThe build artifacts will be in `build/web/`.\n\n#### Android APK\n\n```bash\nflutter build apk\n```\n\nThe APK will be in `build/app/outputs/flutter-apk/app-release.apk`.\n\n## Development Setup\n\n### Pre-commit Hooks\n\nThis project uses [pre-commit](https://pre-commit.com/) to ensure code quality.\n\n1. Install `pre-commit` (e.g., via Homebrew on MacOS):\n\n   ```bash\n   brew install pre-commit\n   ```\n\n2. Install the hooks:\n\n   ```bash\n   pre-commit install\n   ```\n\nNow, every time you commit, the hooks (formatting, analysis, testing) will run automatically.\n\n### Firebase Analytics\n\nThis project uses Firebase Analytics to track user engagement and app usage.\n\n**Current Configuration:**\n- ✅ Web and Android platforms are configured\n- ✅ Google Analytics measurement ID: `G-8L3MVJBV65`\n- ✅ Firebase project: `wordclock-me`\n\n**Adding iOS or other platforms:**\n\nIf you need to add Firebase support for additional platforms (iOS, macOS, etc.):\n\n1. Install FlutterFire CLI:\n   ```bash\n   dart pub global activate flutterfire_cli\n   ```\n\n2. Reconfigure Firebase:\n   ```bash\n   flutterfire configure\n   ```\n\n3. Select the platforms you want to add when prompted\n\nThis will update `lib/firebase_options.dart` and add platform-specific configuration files (e.g., `GoogleService-Info.plist` for iOS).\n\n**Testing Analytics:**\n\nTo verify analytics is working:\n- **Web**: Check browser DevTools → Network for Firebase Analytics requests\n- **Android**: Enable debug mode with `adb shell setprop debug.firebase.analytics.app com.bramp.wordclock`\n- **Firebase Console**: View real-time events at [Firebase Console](https://console.firebase.google.com/) → Analytics → DebugView\n\n## Tools and Utilities\n\nThe project includes several CLI tools for development and visualization.\n\n### Grid Builder (`bin/grid_builder.dart`)\n\nGenerates, visualizes, and validates word grids.\n\n**Usage:**\n\n```bash\ndart run bin/grid_builder.dart \u003ccommand\u003e [arguments]\n```\n\n**Commands:**\n\n- **Solve**: Generate a new grid layout.\n  ```bash\n  # Generate a 11x10 grid for English using backtracking\n  dart run bin/grid_builder.dart solve --lang=en --width=11 --height=10\n  ```\n\n- **View**: Visualize an existing grid (color-coded).\n  ```bash\n  # View the default grid for Romanian\n  dart run bin/grid_builder.dart view --lang=ro --grid=default\n  ```\n\n- **Graph**: Generate dependency graph in DOT format.\n  ```bash\n  # Generate graph for English and save to PNG\n  dart run bin/grid_builder.dart graph --lang=en \u003e graph.dot\n  dot -Tpng graph.dot -o graph.png\n  ```\n\n- **Check**: Validate grid consistency.\n  ```bash\n  # Check all languages\n  dart run bin/grid_builder.dart check\n\n  # Check specific language\n  dart run bin/grid_builder.dart check --lang=ro\n  ```\n\n- **Debug**: Interactive debugger for backtracking failures.\n  ```bash\n  dart run bin/grid_builder.dart debug --lang=ro\n  ```\n\n### CLI Clock (`bin/cli.dart`)\n\nA command-line version of the word clock.\n\n```bash\n# Show current time in English\ndart run bin/cli.dart\n\n# Show a specific time in multiple languages\ndart run bin/cli.dart 10:15 --lang=en,fr,de\n```\n\n### Phrase Validation (`bin/validate_phrases.dart`)\n\nUses OpenAI's GPT models to validate that the generated phrases are grammatically correct and suitable for a word clock grid.\n\n**Usage:**\n\n```bash\n# Preview the prompts without sending them to OpenAI (default)\ndart run bin/validate_phrases.dart\n\n# Send prompts to OpenAI for validation (requires OPENAI_API_KEY)\nexport OPENAI_API_KEY=\"your-key\"\ndart run bin/validate_phrases.dart --no-dry-run\n```\n\nThe results are saved as Markdown files in the `phrases_validation/` directory, including scores, identified issues, and phrasing suggestions.\n\n## Related\n\n* https://www.qlocktwo.com/\n* https://www.kickstarter.com/projects/1629174995/word-clock-a-living-canvas\n  * Has lots of \"clever\" features.\n* Shaper Image Word Clock\n  * Review https://www.youtube.com/watch?v=e04TjcN8k2Y\u0026t=309s\n* https://www.kickstarter.com/projects/edcs/the-wordclock\n* https://www.kickstarter.com/projects/420233999/the-tempus-fugit-wordclock\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbramp%2Fwordclock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbramp%2Fwordclock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbramp%2Fwordclock/lists"}