{"id":20536410,"url":"https://github.com/stuypulse/attendance-kiosk","last_synced_at":"2026-03-01T09:32:09.872Z","repository":{"id":256329941,"uuid":"821522875","full_name":"StuyPulse/attendance-kiosk","owner":"StuyPulse","description":"Attendance kiosk for robotics meetings","archived":false,"fork":false,"pushed_at":"2026-02-15T04:48:03.000Z","size":3575,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-15T11:45:53.721Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StuyPulse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-28T18:28:19.000Z","updated_at":"2026-02-15T04:48:06.000Z","dependencies_parsed_at":"2025-05-13T08:30:14.077Z","dependency_job_id":null,"html_url":"https://github.com/StuyPulse/attendance-kiosk","commit_stats":null,"previous_names":["stuypulse/attendance-kiosk"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/StuyPulse/attendance-kiosk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuyPulse%2Fattendance-kiosk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuyPulse%2Fattendance-kiosk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuyPulse%2Fattendance-kiosk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuyPulse%2Fattendance-kiosk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StuyPulse","download_url":"https://codeload.github.com/StuyPulse/attendance-kiosk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuyPulse%2Fattendance-kiosk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29965590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T06:55:38.174Z","status":"ssl_error","status_checked_at":"2026-03-01T06:53:04.810Z","response_time":124,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":[],"created_at":"2024-11-16T00:36:36.330Z","updated_at":"2026-03-01T09:32:09.858Z","avatar_url":"https://github.com/StuyPulse.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"StuyPulse Attendance Kiosk\n==========================\n\nAttendance kiosk for robotics meetings. Designed for the Raspberry Pi 7\" touchscreen (800x480 resolution). Built with\nElectron and React.\n\n![Screenshot of app](docs/images/screenshot.png)\n\n## Exporting reports\n\nAttendance data is stored locally on the device in a SQLite database. To export attendance reports, insert a USB drive\nand long press on the 694 logo. The following report types are available:\n\n- **Attendance Report** - Number of meetings attended, attendance rate, number of checkouts, checkout rate, and average\n  and total time spent at meetings for each student\n- **Meeting Report** - Total unique checkins and checkout rate for each meeting day\n- **Checkin Data** - Checkin/checkout times and total time spent at meeting for each student on each meeting day\n  (basically raw swipe data grouped by student and day)\n\nEach of these reports is filtered by the specified date range and meeting threshold. The meeting threshold is the number\nof unique checkins required for a given day to be considered a meeting. This prevents presumably unofficial meetings\nfrom skewing the statistics.\n\nA student counts as having checked out on a given day if their first and last swipes on that day are more than 30\nminutes apart. This is to prevent multiple checkins in quick succession but no actual checkout (e.g. if the student\nforgot if they already swiped in and swiped in again) from bringing down the student's average time spent at meetings.\n\n## Importing Student Names\n\nStudents are stored in the database using their unique 9-digit ID number, but their names can be imported using a .csv file. It should follow the provided format below, including the necessary header.\n\n    id_number,first_name,last_name\n    123456789,John,Doe\n    694694694,Jane,Doe\n\n## Development\n\nTo run the app in development mode, run:\n\n```bash\nnpm start\n```\n\nThis will start the Electron app with hot reloading enabled. Changes to the frontend (renderer process) code will take\neffect automatically, but changes to the main process require restarting the app.\n\n## Building\n\nTo build an `arm64` deb package for the Raspberry Pi, ensure that Docker is installed and run:\n\n```bash\nnpm run build\n```\n\nThe package for the Raspberry Pi will be written to `out/make/deb/arm64/attendance-kiosk_1.0.0_arm64.deb`.\n\n## Raspberry Pi setup\n\nInstall the latest Raspberry Pi OS onto a microSD card using the Raspberry Pi Imager, then insert the microSD card into\nthe Raspberry Pi and boot. Connect to Wi-Fi.\n\nUpgrade and install packages:\n\n```bash\nsudo apt-get update\nsudo apt-get upgrade\n\n# Can't go without it\nsudo apt-get install vim\n\n# For debugging the SQLite database\nsudo apt-get install sqlite3\n```\n\nAdd the following to `/boot/firmware/config.txt` to enable charging the real-time clock battery (if applicable):\n\n```\ndtparam=rtc_bbat_vchg=3000000\n```\n\nIn the Raspberry Pi Configuration, set up the following:\n\n- Set the hostname to `attendance-kiosk`\n- Set the locale to `en_US.UTF-8`\n- Set the timezone to `America/New_York`\n- Set the keyboard layout to `Generic 104-key PC` with `English (US)`\n- Set the Wi-Fi country to `US`\n\nInstall the attendance kiosk package:\n\n```bash\nsudo dpkg -i attendance-kiosk_1.0.0_arm64.deb\n```\n\nSet up log directory (assuming the default user is `stuy694`):\n\n```bash\nsudo mkdir /var/log/attendance-kiosk\nsudo chown stuy694:stuy694 /var/log/attendance-kiosk\n```\n\nAdd the following to `~/.config/labwc/autostart` to autostart the attendance kiosk on boot, filling in the environment\nvariables accordingly:\n\n```bash\nSLACK_TOKEN=\"...\" \\\nSLACK_EXPORT_USER_ID=\"...\" \\\nMYPULSE_API_KEY=\"...\" \\\nAWS_REGION=\"...\" \\\nREPORT_EMAIL_TO_ADDRESS=\"...\" \\\nBACKUP_S3_BUCKET=\"...\" \\\nBACKUP_S3_PREFIX=\"...\" \\\nattendance-kiosk --kiosk \u003e\u003e /var/log/attendance-kiosk/out.log 2\u003e\u003e /var/log/attendance-kiosk/err.log\n```\n\nThen reboot the Raspberry Pi for everything to take effect.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuypulse%2Fattendance-kiosk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstuypulse%2Fattendance-kiosk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuypulse%2Fattendance-kiosk/lists"}