{"id":19030843,"url":"https://github.com/hackclub/hack-hour","last_synced_at":"2026-06-22T22:31:30.393Z","repository":{"id":232912789,"uuid":"784239539","full_name":"hackclub/hack-hour","owner":"hackclub","description":"Every Hour = More Power. Keep track of each hour of work you get done on your project.","archived":false,"fork":false,"pushed_at":"2026-06-04T15:25:58.000Z","size":1401,"stargazers_count":33,"open_issues_count":19,"forks_count":29,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-06-05T05:27:41.101Z","etag":null,"topics":["hackclub"],"latest_commit_sha":null,"homepage":"https://hackhour.hackclub.com","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/hackclub.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}},"created_at":"2024-04-09T13:13:34.000Z","updated_at":"2026-04-14T03:16:58.000Z","dependencies_parsed_at":"2025-01-02T15:47:42.364Z","dependency_job_id":null,"html_url":"https://github.com/hackclub/hack-hour","commit_stats":null,"previous_names":["hackclub/hack-hour"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hackclub/hack-hour","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Fhack-hour","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Fhack-hour/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Fhack-hour/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Fhack-hour/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hackclub","download_url":"https://codeload.github.com/hackclub/hack-hour/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Fhack-hour/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34668500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["hackclub"],"created_at":"2024-11-08T21:19:46.965Z","updated_at":"2026-06-22T22:31:30.374Z","avatar_url":"https://github.com/hackclub.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hack Hour \nHack Hour is a ~~trash collection service~~ project tracker \u0026 pomodoro timer for hacking on projects. It was used to track hours as a part of [Hack Club's Arcade](https://hackclub.com/arcade). She's on slack as `@hakkuun` and hangs out in the `#hack-hour` channel!\n\n![](https://api.checklyhq.com/v1/badges/checks/271a416b-7810-47b0-b58c-7cd9e9e37f82?style=flat\u0026theme=default\u0026responseTime=false)\n\n## API\n_Note: There is no guarantee for the reliability of the API. If data is lost and/or is not registered for Arcade, there's not much we can do - use at your own risk._\n\nAll endpoints require an authorization header with the api key, as such: `Authorization: Bearer \u003capikey\u003e`\n\n### GET `/api/session/:slackId`\nGets the latest session for the user.\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": {\n        \"id\": \"slackId\",\n        \"createdAt\": \"2024-06-23T02:49:17.900Z\",\n        \"time\": 60,\n        \"elapsed\": 12,\n        \"remaining\": 48,\n        \"endTime\": \"2024-06-23T03:08:00.000Z\",\n        \"goal\": \"No Goal\",\n        \"paused\": true,\n        \"completed\": false,\n        \"messageTs\": \"messageTs\",\n    }\n}\n```\n\n### GET `/api/stats/:slackId`\nGets the stats for the user.\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": {\n        \"sessions\": 0,\n        \"total\": 0,\n    }\n}\n```\n\n### GET `/api/goals/:slackId`\nGets the goals for the user.\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": [\n        {\n            \"name\": \"No Goal\",\n            \"minutes\": 0\n        }\n    ]\n}\n```\n\n### GET `/api/history/:slackId`\nGets the history for the user.\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": [\n        {\n            \"createdAt\": \"2024-06-23T05:09:04.105Z\",\n            \"time\": 60,\n            \"elapsed\": 23,\n            \"goal\": \"No Goal\",\n            \"ended\": false,\n            \"work\": \"123\"\n        }\n    ]\n}\n```\n\n### POST `/api/start/:slackId`\nStarts a new session for the user.\n\nRequires a JSON body with the following fields:\n- `work`: what the user is working on (string)\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": {\n        \"id\": \"sessionId\",\n        \"slackId\": \"slackId\",\n        \"createdAt\": \"createdAt\",\n    }\n}\n```\n\n### POST `/api/pause/:slackId`\nPauses or resumes the current session for the user, depending on the current state.\n\nRequires an authorization header with the api key, as such: `Authorization: Bearer \u003capikey\u003e`\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": {\n        \"id\": \"sessionId\",\n        \"slackId\": \"slackId\",\n        \"createdAt\": \"createdAt\",\n        \"paused\": true,\n    }\n}\n```\n\n### POST `/api/cancel/:slackId`\nCancels the current session for the user.\n\nRequires an authorization header with the api key, as such: `Authorization Bearer \u003capikey\u003e`\n\nExample Response:\n```json\n{\n    \"ok\": true,\n    \"data\": {\n        \"id\": \"sessionId\",\n        \"slackId\": \"slackId\",\n        \"createdAt\": \"createdAt\",\n    }\n}\n```\n\n## API - No Auth\n\n### GET `/ping`\nReturns with `pong`. Check if the thing is alive\n\n### GET `/status`\nGet specific details on the status of hack hour (heidi)\n\nExample Response:\n```json\n{\n    \"activeSessions\": -1,\n    \"airtableConnected\": false,\n    \"slackConnected\": false,\n}\n```\n\n### GET `/api/clock/:slackId`\nDepreciated.\n\nResponds with unix timestamp of the expected end time of the current session for the user.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackclub%2Fhack-hour","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhackclub%2Fhack-hour","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackclub%2Fhack-hour/lists"}