{"id":22403367,"url":"https://github.com/springload/slack-harvest","last_synced_at":"2026-05-01T01:31:40.256Z","repository":{"id":66138742,"uuid":"37532825","full_name":"springload/slack-harvest","owner":"springload","description":"Integrations between slack and harvest, such as the timesheet nagger. ","archived":false,"fork":false,"pushed_at":"2016-12-07T19:01:36.000Z","size":12,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-03-27T00:54:37.583Z","etag":null,"topics":["harvest","slack"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/springload.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":"2015-06-16T13:46:05.000Z","updated_at":"2020-12-05T06:54:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"56420360-6376-47ee-b8c6-674cddc41c30","html_url":"https://github.com/springload/slack-harvest","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/springload/slack-harvest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/springload%2Fslack-harvest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/springload%2Fslack-harvest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/springload%2Fslack-harvest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/springload%2Fslack-harvest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/springload","download_url":"https://codeload.github.com/springload/slack-harvest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/springload%2Fslack-harvest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32482460,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"ssl_error","status_checked_at":"2026-04-30T13:12:06.837Z","response_time":57,"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":["harvest","slack"],"created_at":"2024-12-05T09:16:56.569Z","updated_at":"2026-05-01T01:31:40.223Z","avatar_url":"https://github.com/springload.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Harvester\n\nPlumbing between Slack and Harvest with node.js\n\nRight now, it runs a bot to generate a message asking users to do their timesheets.\nThe bot options can be configured in `config/default.json`. You'll need a webhook\nURL, which you can get from `https://[account].slack.com/services/`.\n\nYou'll also need Harvest API credentials (store them safely away from git/GitHub, eg. in a password manager).\n\n### TODO\n* [ ] Get Public Holidays from an API and respect them.\n* [ ] Humanise the message some more \"tom, dick __and__ harry\"\n* [ ] Handle leave, other calendar events with a nice integration?\n\n\n## Installation\n\n```bash\nnpm install\n```\n\nYou'll need to copy the example config JSON file:\n\n```\nnpm run config\n```\n\n## Running the app in development\n\nHarvester uses nodemon for development.\n\n```bash\nnpm start\n```\n\nTo bug users on, just `curl` the URLs:\n\n```bash\ncurl http://localhost:3000/timesheets-plz/\ncurl http://localhost:3000/percentage-plz/\n```\n\nThere's also a scheduler via `node-schedule` that automatically runs at\n6pm on weekdays.\n\n\n## Production\n\nPut the app on an internal server. It doesn't need to be\naccessible by the general public, no need for a reverse proxy set up.\n\n```bash\ncurl http://10.0.0.10:3444/timesheets-plz/\ncurl http://10.0.0.10:3444/percentage-plz/\n```\n\n\nHarvester relies on the fantastic PM2 library in production.\n\nInstall it on your server with:\n\n```bash\nnpm install pm2 -g\n```\n\nStart the application (with baked-in Babel support!) via:\n\n\n```bash\n# Start all apps\n$ pm2 start processes.json\n\n# Stop\n$ pm2 stop processes.json\n\n# Restart\n$ pm2 start processes.json\n## Or\n$ pm2 restart processes.json\n\n# Reload\n$ pm2 reload processes.json\n\n# Graceful Reload\n$ pm2 gracefulReload processes.json\n\n# Delete from PM2\n$ pm2 delete processes.json\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspringload%2Fslack-harvest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspringload%2Fslack-harvest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspringload%2Fslack-harvest/lists"}