{"id":24833564,"url":"https://github.com/lob2018/sudokufx","last_synced_at":"2026-03-11T21:24:20.054Z","repository":{"id":259409636,"uuid":"746532649","full_name":"Lob2018/SudokuFX","owner":"Lob2018","description":"🚧 Work in progress... ▪ Sudoku game ▪ Cross-platform desktop application developed in Java using JavaFX, Maven, FXML, Spring Boot, HSQLDB, and SonarCloud, following the Model-View-ViewModel-Coordinator (MVVM-C) architecture.","archived":false,"fork":false,"pushed_at":"2026-03-05T14:19:17.000Z","size":91837,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-05T17:29:27.943Z","etag":null,"topics":["debian-based","fxml","hsqldb-embedded-database","java","javafx","linux","macos","sonarcloud","spring-boot","windows"],"latest_commit_sha":null,"homepage":"https://lob2018.github.io/SudokuFX/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lob2018.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":"FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","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":{"ko_fi":"lob2018"}},"created_at":"2024-01-22T07:40:05.000Z","updated_at":"2026-03-05T14:04:53.000Z","dependencies_parsed_at":"2024-11-10T18:23:00.234Z","dependency_job_id":"0193f024-754f-496a-8de0-6a56e9f0701f","html_url":"https://github.com/Lob2018/SudokuFX","commit_stats":null,"previous_names":["lob2018/sudofx2024","lob2018/sudokufx"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/Lob2018/SudokuFX","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lob2018%2FSudokuFX","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lob2018%2FSudokuFX/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lob2018%2FSudokuFX/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lob2018%2FSudokuFX/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lob2018","download_url":"https://codeload.github.com/Lob2018/SudokuFX/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lob2018%2FSudokuFX/sbom","scorecard":{"id":84726,"data":{"date":"2025-08-11T06:55:23Z","repo":{"name":"github.com/Lob2018/SudokuFX","commit":"665f72f380d8e5b52af834ca6c2dde1cf709f5c2"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":7.6,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"CI-Tests","score":-1,"reason":"no pull request found","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:30","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:31","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/codeql.yml:32","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/qodana_code_quality.yml:18","Warn: jobLevel 'checks' permission set to 'write': .github/workflows/qodana_code_quality.yml:20","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:187","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:23","Warn: topLevel 'checks' permission set to 'write': .github/workflows/coverage_report.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/coverage_report.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency_review.yml:13","Info: topLevel permissions set to 'read-all': .github/workflows/openssf_score_card.yml:18","Warn: topLevel 'checks' permission set to 'write': .github/workflows/pre_commit_autoupdate.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/pre_commit_autoupdate.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/qodana_code_quality.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/release.yml:8"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"SAST","score":10,"reason":"SAST tool detected","details":["Info: SAST configuration detected: Sonar","Info: SAST configuration detected: Qodana","Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":5,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Info: codeowner review is required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Warn: no status checks found to merge onto branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":9,"reason":"dependency not pinned by hash detected -- score normalized to 9","details":["Warn: pipCommand not pinned by hash: .github/workflows/pre_commit_autoupdate.yml:32","Info:  32 out of  32 GitHub-owned GitHubAction dependencies pinned","Info:  16 out of  16 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Contributors","score":0,"reason":"project has 0 contributing companies or organizations -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T06:40:59.238Z","repository_id":259409636,"created_at":"2025-08-15T06:40:59.238Z","updated_at":"2025-08-15T06:40:59.238Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30401648,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T21:02:20.017Z","status":"ssl_error","status_checked_at":"2026-03-11T20:59:32.667Z","response_time":84,"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":["debian-based","fxml","hsqldb-embedded-database","java","javafx","linux","macos","sonarcloud","spring-boot","windows"],"created_at":"2025-01-31T02:12:30.670Z","updated_at":"2026-03-11T21:24:20.048Z","avatar_url":"https://github.com/Lob2018.png","language":"Java","funding_links":["https://ko-fi.com/lob2018"],"categories":[],"sub_categories":[],"readme":"# 🎲 SudokuFX\n\nDive into the world of Sudoku with a game that offers:\n- 🧩 **Play challenging 9x9 puzzles**: Enjoy grids ranging from beginner to expert levels.\n- 🤖️ **Solve any 9x9 Sudoku grid**: Let the game solve your puzzles or input custom ones.\n- ✨ **Create profiles**: Save progress and manage personalized profiles for each player.\n- 💾 **Save anytime**: Effortlessly continue your puzzle-solving journey.\n\nChallenge your mind and enjoy hours of logical fun with SudokuFX!\n\n[![License](https://img.shields.io/badge/license-GPLv3.0-brightgreen.svg)](https://github.com/Lob2018/SudokuFX/blob/main/LICENSE.txt)\u003cbr\u003e\n[![Accessibility](https://img.shields.io/badge/accessibility-WCAG%202.1%20AA-brightgreen)](https://www.w3.org/WAI/WCAG21/quickref/)\u003cbr\u003e\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10875/badge)](https://www.bestpractices.dev/projects/10875)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Lob2018/SudokuFX/badge)](https://scorecard.dev/viewer/?uri=github.com/Lob2018/SudokuFX)\n[![Snyk Scan](https://img.shields.io/badge/Snyk%20Scan-authentication%20required-brightgreen?logo=snyk)](https://app.snyk.io/org/lob2018/project/eb67e66c-32ab-4713-af25-6438d35db490)\n[![CodeQL Analysis](https://github.com/lob2018/SudokuFX/actions/workflows/codeql.yml/badge.svg)](https://github.com/lob2018/SudokuFX/actions/workflows/codeql.yml)\u003cbr\u003e\n[![Dependabot Updates](https://github.com/Lob2018/SudokuFX/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/Lob2018/SudokuFX/actions/workflows/dependabot/dependabot-updates)\n[![Qodana](https://github.com/Lob2018/SudokuFX/actions/workflows/qodana_code_quality.yml/badge.svg)](https://github.com/Lob2018/SudokuFX/actions/workflows/qodana_code_quality.yml)\u003cbr\u003e\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Lob2018_SudoFX2024\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Lob2018_SudoFX2024)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=Lob2018_SudoFX2024\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=Lob2018_SudoFX2024)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=Lob2018_SudoFX2024\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=Lob2018_SudoFX2024)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Lob2018_SudoFX2024\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=Lob2018_SudoFX2024)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=Lob2018_SudoFX2024\u0026metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=Lob2018_SudoFX2024)\u003cbr\u003e\n[![JaCoCo line covered ratio (pom.xml)](https://github.com/Lob2018/SudokuFX/actions/workflows/coverage_report.yml/badge.svg)](https://github.com/Lob2018/SudokuFX/actions/workflows/coverage_report.yml)\n[![Open Issues](https://img.shields.io/github/issues/lob2018/SudokuFX)](https://github.com/Lob2018/SudokuFX/issues)\n[![Open Pull Requests](https://img.shields.io/github/issues-pr/lob2018/SudokuFX)](https://github.com/Lob2018/SudokuFX/pulls)\n[![GitHub release](https://img.shields.io/github/v/release/lob2018/SudokuFX)](https://github.com/Lob2018/SudokuFX/releases)\n[![Downloads](https://img.shields.io/github/downloads/Lob2018/sudokufx/total?logo=github)](https://github.com/Lob2018/sudokufx/releases)\n\n# [![SudokuFX in action](https://raw.githubusercontent.com/Lob2018/SudokuFX/master/.myresources/design_and_modeling/images/SudokuFX_in_action.jpg)](https://github.com/Lob2018/SudokuFX/releases/latest)\n\n## Contents\n\n- [System requirements](#system-requirements)\n- [Installation](#installation)\n  - [Verifying downloaded assets](#verifying-downloaded-assets)\n- [Use](#use)\n- [Examples](#examples)\n- [Update](#update)\n- [Uninstallation](#uninstallation)\n- [Documentation](https://lob2018.github.io/SudokuFX/)\n- [Security](https://github.com/Lob2018/SudokuFX?tab=security-ov-file#readme)\n- [Project](#project)\n  - [Overview](#overview)\n  - [Package structure](#package-structure)\n  - [Roadmap](#roadmap)\n  - [Mockup](#mockup)\n  - [Build with](#build-with)\n  - [Required Application Properties to Run](#required-application-properties-to-run)\n  - [How to develop on Windows with IntelliJ IDEA](#how-to-develop-on-windows-with-intellij-idea)\n    - [DEV Debugging with Remote JVM](#dev-debugging-with-remote-jvm)\n    - [DEV Runtime monitoring with VisualVM](#dev-runtime-monitoring-with-visualvm)\n    - [DEV Diagnostic Commands Examples](#dev-diagnostic-commands-examples)\n- [Contributing](#contributing)\n- [Code of Conduct](#code-of-conduct)\n- [Contributors](#contributors)\n- [Licence](https://github.com/Lob2018/SudokuFX/blob/main/LICENSE.txt)\n\n## System requirements\n\n### Minimum specifications\n- **Operating System:** Windows 10/11, macOS 11 (Big Sur) or later, Ubuntu 20.04 LTS (64-bit)\n- **Processor:** Dual-core 2.0 GHz (Intel x86_64 or Apple Silicon ARM64)\n- **Memory:** 4 GB RAM\n- **Storage:** 1 GB free disk space\n- **Audio:** Sound card (integrated or dedicated)\n- **Display:** 1024 × 768 pixels\n- **Other:** Java JRE (included in MSI/DEB/DMG versions)\n\n### Recommended specifications\n- **Processor:** Quad-core 2.5 GHz or higher (Intel x86_64 or Apple Silicon ARM64)\n- **Memory:** 8 GB RAM\n- **Storage:** 2 GB free disk space (SSD recommended)\n- **Display:** 1920 × 1080 pixels\n- **Audio:** Stereo audio system for optimal experience\n\n## Installation\n\n[![Windows](https://img.shields.io/badge/Windows-Compatible-brightgreen)](https://github.com/Lob2018/SudokuFX/releases/latest)\n[![Linux](https://img.shields.io/badge/Linux-Compatible-brightgreen)](https://github.com/Lob2018/SudokuFX/releases/latest)\n[![MacOS_Arm64,_x86__64](https://img.shields.io/badge/MacOS_Arm64,_x86__64-Compatible-brightgreen)](https://github.com/Lob2018/SudokuFX/releases/latest)\n\n\n- Windows\n  - Application with Java Runtime Environment (JRE) included\n    - Download and install the latest Windows version of the MSI file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n    - The MSI file does not have a code signing certificate, Microsoft Defender SmartScreen can inform you of this during installation; to continue the installation click on **additional information**, then **Run anyway**.\n  - Application without Java Runtime Environment (JRE) included\n    - [The latest Adoptium Temurin JRE](https://adoptium.net/temurin/releases/?package=jre) must be installed on your machine with the corresponding JAVA_HOME environment variable set\n    - Download, unzip, and keep all the files together, from the latest Windows version of the ZIP file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n\n- Linux (Debian-based distributions)\n  - Application with Java Runtime Environment (JRE) included\n    - Download and install the latest Linux version of the DEB file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n    - Run `sudo apt install ./sudokufx-jvm_v.v.v.v_amd64.deb`\n  - Application without Java Runtime Environment (JRE) included\n    - [The latest Adoptium Temurin JRE](https://adoptium.net/temurin/releases/?package=jre) must be installed on your machine with the corresponding JAVA_HOME environment variable set\n    - Download, untar, and keep all the files together, from the latest Linux version of the TAR file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n\n- MacOS\n  - Application with Java Runtime Environment (JRE) included\n    - Download and install the latest MacOS version of the DMG file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n  - Application without Java Runtime Environment (JRE) included\n    - [The latest Adoptium Temurin JRE](https://adoptium.net/temurin/releases/?package=jre) must be installed on your machine with the corresponding JAVA_HOME environment variable set\n    - Download, unzip, and keep all the files together, from the latest MacOS version of the ZIP file, [available in Assets.](https://github.com/Lob2018/SudokuFX/releases/latest)\n\n### Verifying downloaded assets\n\nTo ensure the integrity of downloaded assets, import the GPG public key with `gpg --import sudokufx-public-key.asc`, then verify the files, e.g., the MSI file, using `gpg --verify SudokuFX_JVM-v.v.v.v.msi.asc SudokuFX_JVM-v.v.v.v.msi`. For more information, refer to the [GnuPG Manual](https://www.gnupg.org/gph/en/manual.html).\n\n## Use\n\n### Launch and play SudokuFX\n\n#### Windows\n- **Application with Java Runtime Environment (JRE) included**: Launch SudokuFX from the Start Menu after installing the MSI file.\n- **Application without Java Runtime Environment (JRE) included**: Run from the extracted ZIP folder:\n```\n./SudokuFX-v.v.v.v.bat\n```\n\n#### Linux\n- **Application with Java Runtime Environment (JRE) included**: Launch from the applications menu or run from the terminal in the folder where the DEB file was installed:\n```\n/opt/sudokufx-jvm/bin/SudokuFX-JVM\n```\n- **Application without Java Runtime Environment (JRE) included**: Navigate to the extracted TAR folder and run:\n```\n./SudokuFX-v.v.v.v.sh\n```\n\n#### MacOS\n- **Application with Java Runtime Environment (JRE) included**: Launch from the Applications folder or Launchpad after installing the DMG file.\n- **Application without Java Runtime Environment (JRE) included**: Navigate to the extracted ZIP folder and run:\n```\n./SudokuFX-v.v.v.v.sh\n```\n\n### Basic gameplay\n\n1. **Select difficulty**: Choose from Easy, Medium, or Difficult levels to start a new game.\n2. **Fill the grid**: Click on any empty cell and enter numbers 1-9.\n3. **Check progress**: The game automatically validates your entries.\n4. **Save and load**:\n    - Progress is automatically saved for the **current player**, so ongoing games are preserved.\n    - You can also **switch between players** and **resume previously saved games**.\n\n### Features\n\n- **Multiple difficulty levels**: From beginner-friendly to difficult challenges.\n- **Auto save**: Your progress is automatically saved.\n- **Clean interface**: Modern, intuitive design.\n- **Cross-platform**: Works seamlessly on Windows, Linux, and MacOS.\n\n### Troubleshooting\n\nIf you encounter any issues:\n\n1. **Game won't start**: Ensure you have the correct Java version if using the non-JRE version.\n2. **Performance issues**: Try closing other applications to free up system resources.\n3. **Display problems**: Check your system's display scaling settings.\n4. **Save and load issues**: Verify that SudokuFX has write permissions to your user directory.\n\nFor additional help, check the application logs or [file an issue](https://github.com/Lob2018/SudokuFX/issues) on GitHub.\n\n## Examples\n\n## Update\n\n- Windows\n  - Application with Java Runtime Environment (JRE) included (from MSI file)\n    - [Follow the installation instructions](#installation)\n  - Application without Java Runtime Environment (JRE) included (ZIP file with the .bat file and the JAR)\n    - Delete your old unzipped folder from the ZIP file, and follow [the installation instructions](#installation)\n\n- Linux\n  - Application with Java Runtime Environment (JRE) included (from .deb file)\n    - [Follow the installation instructions](#installation)\n  - Application without Java Runtime Environment (JRE) included (TAR file with the .sh file and the JAR)\n    - Delete your old untarred folder from the TAR, and follow [the installation instructions](#installation)\n\n- MacOS\n  - Application with Java Runtime Environment (JRE) included (from .dmg file)\n    - [Follow the installation instructions](#installation)\n  - Application without Java Runtime Environment (JRE) included (ZIP file with the .sh file and the JAR)\n    - Delete your old unzipped folder from the ZIP file, and follow [the installation instructions](#installation)\n\n## Uninstallation\n\n- Windows\n  - Application with Java Runtime Environment (JRE) included (from MSI file)\n    - **Uninstall from the Control Panel (for programs)**\n        1. In the search box on the taskbar, type **Control Panel** and select it from the results.\n        2. Select **Programs \u003e Programs and Features**.\n        3. Press and hold (or right-click) on the program you want to remove and select **Uninstall** or *\n           *Uninstall/Change**. Then follow the directions on the screen.\n  - Application without Java Runtime Environment (JRE) included (ZIP file with the .bat file and the JAR)\n    - **Delete your unzipped folder from SudokuFX-v.v.v.v_windows.zip**\n\n- Linux\n  - Application with Java Runtime Environment (JRE) included (from .deb file)\n    - Run `sudo apt purge sudokufx-jvm`\n  - Application without Java Runtime Environment (JRE) included (TAR file with the .sh file and the JAR)\n    - **Delete your untarred folder from SudokuFX-v.v.v.v_linux.tar.gz**\n\n- MacOS\n  - Application with Java Runtime Environment (JRE) included (from .dmg file)\n    - Drag the application to the Trash\n  - Application without Java Runtime Environment (JRE) included (ZIP file with the .sh file and the JAR)\n    - **Delete your unzipped folder from SudokuFX-v.v.v.v_macos.zip**\n\n\u003e [!IMPORTANT]\n\u003e **To completely remove your application data and logs, delete the following folder (this action is irreversible):**\n\u003e- Windows:\n   \u003e\n   \u003e     C:/Users/\\\u003cUSERNAME\\\u003e**[^1]**/AppData/Local/Soft64.fr/SudokuFX\n\u003e- Linux:\n   \u003e\n   \u003e     /home/\\\u003cUSERNAME\\\u003e**[^1]**/.local/share/Soft64.fr/SudokuFX **[^2]**\n\u003e- MacOS:\n   \u003e\n   \u003e     /Users/\\\u003cUSERNAME\\\u003e**[^1]**/Library/Application Support/Soft64.fr/SudokuFX\n\n[^1]:Replace \\\u003cUSERNAME\\\u003e with your actual username on the system.\n[^2]: `.local/share` may be replaced by `$XDG_DATA_HOME` if defined.\n\n## Project\n\n### Overview\n\nCross-platform desktop application developed in Java using JavaFX, Spring Boot, HSQLDB, Maven, and SonarCloud, following the Model-View-ViewModel-Coordinator (MVVM-C) architecture.\n\n### Package structure\n\n```\n.\n├── benchmark           // performance and load testing utilities\n├── common              // shared utilities, annotations, enums, exceptions, interfaces\n│   ├── annotation      // custom annotations\n│   ├── enums           // shared enums and constants\n│   ├── exception       // common exception classes\n│   ├── interfaces      // reusable interfaces\n│   │   └── mapper      // data mapping interfaces\n│   └── util            // general utility classes\n│       └── sudoku      // sudoku-related utilities\n├── config              // application configuration (database, OS settings)\n│   ├── database        // database configurations\n│   └── os              // operating system specific configs\n├── dto                 // data transfer objects\n│   └── github          // github-specific DTOs\n├── model               // domain/business models\n├── navigation          // navigation management for the Coordinator\n├── repository          // data access layer\n├── service             // business services and logic\n│   ├── business        // core business services\n│   ├── external        // integration with external APIs or systems\n│   └── ui              // services interacting with the UI (audio, file processing, etc.)\n├── view                // UI views and components\n│   ├── main            // MainView\n│   └── component       // reusable UI components\n│   │   ├── list        // list components\n│   │   └── toaster     // toaster notifications\n│   └── util            // utilities for bindings and factories\n└── viewmodel           // view models for MVVM pattern\n    └── state           // state holders (observable state for ViewModels, e.g., PlayerStateHolder)\n```\n\n### Roadmap\n\n- [The project roadmap](https://github.com/users/Lob2018/projects/4)\n\n### Mockup\n\n- [The application mockup (Figma)](https://www.figma.com/design/GiSwlg2mZofXalf1Quaa5w/SudokuFX?node-id=0-1\u0026t=smJqt7CQuD0zZuUP-1)\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e### Required Application Properties to Run\n\u003e\n\u003eFor the application to work properly, the following application properties must be set at the JVM level:\n\u003e\n\u003e- **app.name**: This property specifies the name of the application.\n\u003e- **app.version**: Specifies the application version in stable SemVer format with numeric MAJOR, MINOR, and PATCH only (e.g. 1.2.3; not 1.2.3-beta.1 or 1.2.3+build.5).\n\u003e- **app.organization**: Specifies the organization responsible for the application.\n\u003e- **app.license**: Specifies the license under which the application is distributed.\n\n### Build with\n\n- Java LTS (e.g. 25)\n- JavaFX\n- WiX Toolset v3.11\n- Dependencies:\n    - Development\n        - javafx-controls\n        - javafx-fxml\n        - commons-lang3 (utility classes for strings, objects, numbers, etc.)\n    - DTOs\n        - MapStruct\n    - SGBDR \u0026 SPRING BOOT\n        - HSQLDB\n        - Spring boot\n            - Starter\n            - Gluon Ignite with Spring\n            - Starter data JPA\n            - Starter validation\n        - flyway (database migration)\n        - passay (generate and validate secrets)\n        - datasource-proxy-spring-boot-starter (intercepts and logs SQL queries for debugging and performance analysis)\n    - Logs\n        - logback from Spring Boot\n    - Build dependencies:\n        - spotless-maven-plugin (ensures consistent code formatting across the project)\n        - maven-checkstyle-plugin (static code analysis to enforce code style rules)\n        - maven-compiler-plugin\n            - annotationProcessorPaths:\n                - MapStruct processor (for code generation)\n        - maven-enforcer-plugin (to define the minimum Maven version)\n        - javafx-maven-plugin\n        - spring-boot-maven-plugin (create the uber JAR)\n        - exec-maven-plugin (for scripts generating the packages)\n        - jmh (for temporary performance evaluation)\n    - Test dependencies:\n        - spring boot starter test (JUnit, Mockito, Hamcrest)\n        - surefire\n        - jacoco\n        - testfx-junit5 (ex.:FxRobot to execute actions within the UI, or custom Hamcrest matchers org.testfx.matcher.*.)\n\n### How to develop on Windows with IntelliJ IDEA\n\n- Download and install [the LTS version of the Adoptium Temurin JDK Downloads](https://adoptium.net/temurin/releases/?package=jdk)\n- Download and install [WiX Toolset v3.11](https://github.com/wixtoolset/wix3/releases/tag/wix3112rtm) (in order to package the application)\n    - Activate .NET framework 3.5.1 (Control Panel \u003e Programs \u003e Programs and Features \u003e Turn Windows features on or off)\n    - Launch wix311.exe\n- Configured the necessary environment variables\n    - JDK\n        - name:JAVA_HOME\n        - value LTS (e.g. 25):C:\\Program Files\\Eclipse Adoptium\\jdk-25.0.1\n    - WiX\n        - name:WIX\n        - value:C:\\Program Files (x86)\\WiX Toolset v3.11\\\n- IntelliJ IDEA\n    - Clone the repository\n    - Select the project's JDK\n        - File \u003e Project Structure \u003e SDK \u003e Add SDK from disk (select the JDK)\n    - Run Maven configurations (in the top right corner)\n        - SudoMain.java is the main class\n        - Maven run configurations are saved as project files in .idea/runConfigurations\n            - Temporary performance evaluation with Java Microbenchmark Harness (JMH):\n                1. Comment out `\u003cexcludeGroupIds\u003eorg.openjdk.jmh\u003c/excludeGroupIds\u003e`\n                   and `\u003cexclude\u003efr/softsf/sudokufx/benchmark/**/*.java\u003c/exclude\u003e` in the `pom.xml`\n                2. Run `mvn clean` and execute the `[Jmh init.]` configuration\n                3. Manage your benchmark tests in the `fr.softsf.sudokufx.benchmark` package\n                4. **Once benchmarking is complete, uncomment `\u003cexcludeGroupIds\u003eorg.openjdk.jmh\u003c/excludeGroupIds\u003e`\n                   and `\u003cexclude\u003efr/softsf/sudokufx/benchmark/**/*.java\u003c/exclude\u003e` in the `pom.xml`**\n\n#### DEV Debugging with Remote JVM\n\n- Use the following IntelliJ Run Configurations to debug the application via a suspended JVM:\n    - Run Configuration: `SudokuFX [debug]`\n      Launches the application using Maven with JDWP enabled on port `5005`, using `suspend=y` to pause execution until a debugger is attached\n        - Command: `clean javafx:run -Pdev -f pom.xml`\n        - Environment variable: `JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005`\n        - JVM starts and waits for debugger connection\n    - Run Configuration: `Debug JavaFX Maven`\n      Attaches IntelliJ's debugger to the suspended JVM on port `5005`\n        - Configuration type: Remote JVM Debug\n        - Host: `localhost`, Port: `5005`, Transport: `Socket`\n\n- Debug workflow:\n    - Add breakpoints in the source code\n    - Run `SudokuFX [debug]` (Run mode) to start the JVM in suspended state\n    - Immediately launch `Debug JavaFX Maven` (Debug mode) to attach and resume execution\n    - Application starts with breakpoints active\n\n#### DEV Runtime monitoring with VisualVM\n\n- Install [VisualVM](https://visualvm.github.io/) and the following plugins:\n    - **VisualVM-MBeans**\n      Enables real-time monitoring of JMX-exposed metrics (e.g., internal HikariCP connection pool metrics) via the MBeans tab\n      - Add `config.setRegisterMbeans(true)` in HikariCP configuration or `config.properties`\n      - Plugin adds a new **MBeans** tab\n    - **VisualGC**\n      Visualizes JVM memory regions and garbage collection activity; useful for diagnosing memory usage and detecting leaks\n      - Plugin adds a new **Visual GC** tab\n\n- Use the dedicated Maven profile `visualvm-monitoring` to launch the application with JMX and GC logging enabled\n    - Profile declared in `pom.xml`\n    - Run Configuration: `SudokuFX run with VisualVM Monitoring`\n      - Command: `clean javafx:run -Pvisualvm-monitoring -f pom.xml`\n      - Enables VisualVM sampling and MBeans access via JMX (`localhost:9010`)\n      - In VisualVM, **Add JMX Connection for localhost:9010** in order to access full JMX metrics, otherwise only a local jvmstat connection is available.\n\n#### DEV Diagnostic Commands Examples\n\nDetecting **classloader leaks**, **Metaspace growth**, and **heap retention patterns** in JVM applications. Each command is paired with actionable indicators to support reproducible analysis.\n\nRun Configuration: `SudokuFX run with VisualVM Monitoring`\n\n| Component | Commands | Purpose | Diagnostic Indicators                                                                                                                                                                                                                        |\n|:--|:--|:--|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **🧠 Native Memory** | `jcmd \u003cpid\u003e VM.native_memory summary`\u003cbr\u003e**with** `-XX:MaxMetaspaceSize=128m` (adjust as needed) | Monitor off-heap growth and Metaspace usage under constrained conditions | **Off-Heap Leak:** Sustained increase in `Internal` or `Unknown` regions\u003cbr\u003e**Metaspace Growth:** Continued increase in committed size and class count after application has reached steady state                                            |\n| **📦 Classloaders** | `jcmd \u003cpid\u003e GC.run` **THEN** `jmap -clstats \u003cpid\u003e` (requires full JDK)\u003cbr\u003e**with** `-XX:MaxMetaspaceSize=128m` (adjust as needed) | Trigger GC and validate loader retention under constrained Metaspace | **Leak Evidence:** Loader count remains stable (e.g., 80) after forced GC\u003cbr\u003e**Metaspace Pressure:** Class count per loader remains high despite GC\u003cbr\u003e**OOM Trigger:** `OutOfMemoryError: Metaspace` occurs earlier if loaders are retained |\n| **🧮 Heap Objects** | `jcmd \u003cpid\u003e GC.class_histogram` **OR** `jmap -histo:live \u003cpid\u003e \\| head -50` (requires full JDK) | Identify dominant heap objects and retention | **Dominant heap objects:** 32Mo domain object (e.g. `Model.Grid`)                                                                                                                                                                            |\n\n## Contributing\n\nWe welcome all contributions to SudokuFX — whether it's bug fixes, new features, documentation, or ideas.\n\nPlease read our [Contributing Guide](./CONTRIBUTING.md) to get started.\nIt includes setup instructions, coding standards, commit conventions, and more.\n\n## Code of Conduct\n\nWe are committed to fostering a welcoming and respectful community.\nPlease read our [Code of Conduct](./CODE_OF_CONDUCT.md) before participating.\n\n## Contributors\n\n[Lob2018](https://github.com/Lob2018)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flob2018%2Fsudokufx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flob2018%2Fsudokufx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flob2018%2Fsudokufx/lists"}