{"id":26546839,"url":"https://github.com/sandergi/concussionassessment","last_synced_at":"2026-04-14T18:32:49.987Z","repository":{"id":282649191,"uuid":"836632111","full_name":"SanderGi/ConcussionAssessment","owner":"SanderGi","description":"An online sport concussion assessment for English speaking athletes across the world compliant with the international SCAT6 standard","archived":false,"fork":false,"pushed_at":"2026-03-02T21:09:28.000Z","size":9038,"stargazers_count":0,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-02T23:39:01.160Z","etag":null,"topics":["computer-vision","concussion","medical-image-processing","pose-detection","scat6","webapp"],"latest_commit_sha":null,"homepage":"https://scat6-web.web.app/","language":"HTML","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/SanderGi.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}},"created_at":"2024-08-01T08:42:11.000Z","updated_at":"2026-03-02T21:09:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"254fe601-b321-4936-b604-30a600e0b85a","html_url":"https://github.com/SanderGi/ConcussionAssessment","commit_stats":null,"previous_names":["sandergi/concussionassessment"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SanderGi/ConcussionAssessment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SanderGi%2FConcussionAssessment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SanderGi%2FConcussionAssessment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SanderGi%2FConcussionAssessment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SanderGi%2FConcussionAssessment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SanderGi","download_url":"https://codeload.github.com/SanderGi/ConcussionAssessment/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SanderGi%2FConcussionAssessment/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31810737,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"ssl_error","status_checked_at":"2026-04-14T18:05:01.765Z","response_time":153,"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":["computer-vision","concussion","medical-image-processing","pose-detection","scat6","webapp"],"created_at":"2025-03-22T05:28:05.313Z","updated_at":"2026-04-14T18:32:49.974Z","avatar_url":"https://github.com/SanderGi.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Online Sport Concussion Assessment\n\n[![LOC](./.badges/lines-of-code.svg)](https://github.com/SanderGi/ConcussionAssessment)\n[![FileCount](./.badges/file-count.svg)](https://github.com/SanderGi/ConcussionAssessment)\n[![WebsiteStatus](https://img.shields.io/website?url=https://scat6-web.web.app)](https://scat6-web.web.app)\n\nAn online sport concussion assessment for English speaking athletes across the world compliant with the international SCAT6 standard. Initially motivated by helping student athletes in Washington, USA, the goal is to make concussion tests more accessible and remove some of the subjective nature of the tests. The tool also allows health professionals to easily compare test results over time to make more informed decisions about patient health. URL: [https://scat6-web.web.app/](https://scat6-web.web.app/).\n\n**Contact**: scat6@sandergi.com\n\n### Walkthrough Video\n\n[![YouTube video walkthrough](https://github.com/user-attachments/assets/8e04dd6c-d3f5-4125-af1e-cd494f763aa5)](https://www.youtube.com/watch?v=ugI7OpvPAlY)\n\n### Features\n- CISG approved SCAT6 assessment with 16 assessed domains (memory, balance, coordination, orientation, delayed recall, etc.)\n- Automatically sync data via your own Google Account (login via OAuth2)\n- Works completely locally in the browser for maximum privacy and offline use\n- Simple and easy to use UI to administer concussion tests, compare results over time/against baselines, and follow up with post injury assessments\n- Automated Balance Error Scoring System (BESS) with 6 poses, implemented using Machine Learning with TensorFlow.js (pose detection, face landmark detection) and traditional computer vision techniques\n- Lovely graphs and charts and extensive use of Web APIs (LocalStorage/SessionStorage, MediaDevices, Speech Recognition, Speech Synthesis, etc.)\n- Standardized subjective tests with objective machine calculated results\n- Cross platform compatibility and responsive design (works on desktop, tablet, and mobile)\n- Export the full assessment results as CSV, PDF report, and traditional paper SCAT6 (without having to manually do the paper assessment)\n- Free to use (for any amount of athletes) and open source. Note that some optional features that require paying for server hosting, e.g., shared workspaces, may require self-hosting or reimbursing me for providing pre-hosted servers \n\n### Screenshots\n![main menu](./main-menu.png)\n![pose assessment with no human](./pose-assess.png)\n![pose assessments with human visible](./pose-assess-with-human.png)\n![pose assessments results](./pose-results.png)\n\n### Frequently Asked Questions (FAQ)\n\n\u003e How do I know if Google Drive Sync was successful?\n\nIf sync is successful, you should see the \"Sync\" button turn green, change text to \"Synced\", and display your linked Google Drive account photo:\u003cbr\u003e\n\u003cimg height=\"57\" alt=\"green button saying Synced\" src=\"./sync-button.png\" /\u003e\u003cbr\u003e\nYou can click on the button to see details about when the data was last successfully synced with your Google Drive.\n\n\u003e When sync is enabled, where are documents saved in my Google Drive?\n\nYou won't find the data in your regular documents. It is instead stored in the app data which you can find in your Google Drive Settings by selecting \"Administer Apps\" and scrolling down until you see \"Concussion Assessment (Unverified)\" like this:\n\u003cimg alt=\"row in the Google Drive app data administration settings for the SCAT6 Web tool, shows 13 kB of data saved\" src=\"./drive-app-data.png\" /\u003e\u003cbr\u003e\nMake sure you are using the same account that you have linked with the SCAT6 Web Tool.\n\nIf you want to delete the data, you could do it from here in the Google Drive Settings. However it is recommended to do it from the SCAT6 Web Tool (by clicking on the green \"Synced\" button and selecting to delete drive data) to make sure nothing gets corrupted and everything is fully deleted. The data synced to Google Drive is encrypted. This means you won't be able to view individual test data from Google Drive.\n\n\u003e Is it correctly understood that data will only be stored on my computer/synced with Google Drive and not be sent to a third party?\n\nYes, all information stays locally on your computer, no third parties.\n\nIf you choose to activate \"Sync\", data will also be saved on your personal Google Drive. Access to your Google Drive remains local, so there is no risk of it being compromised. Due to the way syncing with Google Drive works, we do have to track a list of Gmails using \"Sync\" and when they have last saved data. This list is never shared with third parties.\n\n\u003e Is data stored permanently if I don't sync with Google Drive?\n\nIn most scenarious, yes. However it is still recommended to activate Google Drive sync to be on the safe side. It happens rarely, but depending on your browser settings, the browser may force the Web App to delete the local copy of data if your device runs out of memory. There is also the chance of loosing your device or it getting damaged. An alternative solution, if you prefer not to use Google Drive, would be to \"Export\" each test after completing it to save its information somewhere else.\n\n\u003e I have found a bug, have an idea for improvements, or want to get involved in making this tool better. How can I help?\n\nFeel free to reach out to scat6@sandergi.com or [post an issue here on GitHub](https://github.com/SanderGi/ConcussionAssessment/issues). We also have [a feedback form](https://docs.google.com/forms/d/e/1FAIpQLSdBolyOESnMwdJW6ONJ-8MLbwcpHxQsrV5nChIqOiDfMF6YgQ/viewform?usp=dialog) you can fill out.\n\n## Development\n\nRun `npm install -g firebase-tools` to install the Firebase CLI.\n\nRun `firebase serve` to run the development server locally.\n\nRun `firebase deploy` to deploy the project to Firebase.\n\n### Shared Workspace Backend (Hono + Cloudflare Workers)\n\nThe collaborative multi-account workspace backend lives in:\n\n- `workers/shared-workspace`\n\nIt uses:\n\n- `hono` for API routes\n- Cloudflare Worker runtime\n- Cloudflare D1 for workspace/membership/data storage\n\n#### Setup\n\n1. Create a D1 database and copy its ID into `workers/shared-workspace/wrangler.toml` (`database_id`).\n2. Install deps:\n\n```bash\ncd workers/shared-workspace\nnpm install\n```\n\n3. Apply D1 migrations:\n\n```bash\nnpm run d1:migrate\n```\n\n4. Set Worker secrets (required for admin dashboard + analytics):\n\n```bash\nwrangler secret put ADMIN_DASHBOARD_PASSWORD\nwrangler secret put ADMIN_SESSION_SECRET\nwrangler secret put ANALYTICS_HMAC_SECRET\n```\n\nGenerate strong secret values with OpenSSL:\n\n```bash\nopenssl rand -base64 48\n```\n\nLocal development (`workers/shared-workspace/.dev.vars`) example:\n\n```bash\nADMIN_DASHBOARD_PASSWORD=change-me-admin-password\nADMIN_SESSION_SECRET=dev_admin_session_secret_4mTQHk0j2M4I9m1aY8rM9eS3E2nJ6qkP\nANALYTICS_HMAC_SECRET=dev_analytics_hmac_secret_Xk9pQ2dL7zN1vA5fR3uT8wB6cY0mH4sD\n```\n\n5. Run locally:\n\n```bash\nnpm run dev\n```\n\n6. Deploy:\n\n```bash\nnpm run deploy\n```\n\nFrontend calls `window.__SCAT6_WORKSPACE_API_BASE + '/api/*'`.\nAt the end of index.html, we set `window.__SCAT6_WORKSPACE_API_BASE` to `http://localhost:8787` in local development and `https://scat6-shared-workspace.alexander-le.workers.dev` in production.\n\n### Internationalization Build\n\nWe use template-driven static generation for language variants:\n\n- Templates: `templates/index.template.html`\n- Language config: `i18n/languages.json`\n- Per-language translation data: `public/i18n/translations/\u003clang\u003e.json`\n- Generated catalog of English source + locations: `i18n/catalog.en.json`\n- Build script: `scripts/build-i18n.mjs`\n\nRun:\n\n```bash\nnode scripts/build-i18n.mjs\n```\n\nWhat it does:\n\n- Regenerates `public/index.html` (default English)\n- Generates each localized page in `public/\u003clang\u003e/index.html`\n- Keeps shared libraries/scripts/assets in `public/` (no duplicated `lib/` copies per language)\n- Syncs translation files so each entry includes:\n  - `source` (English source string)\n  - `locations` (where it appears in templates)\n  - `value` (translated string for that language)\n\n## Sources\n- [SCAT6 Instructions](https://www.sportsconcussion.co.za/sportconcussion/wp-content/uploads/2023/07/SCAT6-Instructions-v9.pdf)\n- [SCAT6 Assessment](https://bjsm.bmj.com/content/bjsports/57/11/622.full.pdf)\n- [BESS Manual](https://atriumhealth.org/documents/carolinasrehab/bess_manual_.pdf)\n- [BESS and Gait Study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7987555/)\n- [Immediate and Delayed Recall Study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6109942/)\n- [Symptom Severity Study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8583872/)\n- [SCAT6 Results Study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6326330/)\n- [Google Fonts](https://fonts.google.com/icons)\n- [Font Awesome](https://fontawesome.com/search)\n\n## License\n\nThe SCAT6 content itself is not mine to license, but the code is licensed under the [MIT License](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsandergi%2Fconcussionassessment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsandergi%2Fconcussionassessment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsandergi%2Fconcussionassessment/lists"}