{"id":18299992,"url":"https://github.com/chorusone/hackomatic","last_synced_at":"2026-03-08T14:31:35.232Z","repository":{"id":244026657,"uuid":"812203117","full_name":"ChorusOne/hackomatic","owner":"ChorusOne","description":"Hackathon facilitator and voting tool","archived":false,"fork":false,"pushed_at":"2024-06-12T09:16:44.000Z","size":268,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-01-11T14:46:31.376Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChorusOne.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}},"created_at":"2024-06-08T08:22:03.000Z","updated_at":"2024-06-13T07:23:47.000Z","dependencies_parsed_at":"2024-06-12T15:11:49.981Z","dependency_job_id":"1954ff5b-bb59-4267-91dd-2f5f8d1f567d","html_url":"https://github.com/ChorusOne/hackomatic","commit_stats":null,"previous_names":["chorusone/hackomatic"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChorusOne%2Fhackomatic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChorusOne%2Fhackomatic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChorusOne%2Fhackomatic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChorusOne%2Fhackomatic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChorusOne","download_url":"https://codeload.github.com/ChorusOne/hackomatic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241262182,"owners_count":19936046,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-05T15:11:02.961Z","updated_at":"2026-03-08T14:31:35.204Z","avatar_url":"https://github.com/ChorusOne.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hack-o-matic\n\nThe Hack-o-matic is a simple webapp that facilitates remote and on-site\nhackathons. It handles team registration, quadratic voting, and presenting the\noutcome of the vote. It needs an external system such as [OAuth2 Proxy][o2proxy]\nfor user management and authentication.\n\n\u003cimg alt=\"Registration screenshot\" src=\"screenshots/registration.png\" width=\"49%\"\u003e \u003cimg alt=\"Celebration screenshot\" src=\"screenshots/celebration.png\" width=\"49%\"\u003e\n\nA hackathon has the following phases:\n\n * **Registration** — Any user can start a team. Teams have a name and short\n   description. Users can also join teams that others have created.\n * **Presentation** — At this point teams can no longer be changed. In this\n   phase teams can present what they built.\n * **Evaluation** — Any user (also those not in a team) can cast their vote.\n   Users cannot vote for teams that they are a member of. The voting system\n   is [quadratic voting][quadratic]. Although it is not the simplest system,\n   it worked out well at Chorus One.\n * **Revelation** — The admin can see the outcome of the vote, but it is still\n   hidden from regular users. The teams are sorted with the winner at the bottom\n   of the page. This enables the admin to present their screen and simply scroll\n   down to reveal the winners. All of the votes are public.\n * **Celebration** — At this point every user can view the outcome of the vote,\n   and teams are sorted by descending points, with the winner at the top of the\n   page.\n\n[quadratic]: https://en.wikipedia.org/wiki/Quadratic_voting\n\n## Building\n\nThe Hack-o-matic is written in Rust and builds with Cargo:\n\n    cargo build --release\n    target/release/hackomatic hackomatic.toml\n\n## Deploying\n\nThe binary starts a webserver that listens on the [configured](#configuration)\nport. This webserver is expected to be protected by a reverse-proxy that sets\nthe `X-Email` header. The reverse proxy should handle authentication and\nauthorization. This is a convenient way to ensure that all people in your\norganization can join and vote without having to create an account anywhere.\n\nOne possible setup is to use Nginx and [OAuth2 Proxy][o2proxy]. To make OAuth2\nProxy pass the user’s email address, enable the `--set-xauthrequest` option.\nThe documentation [contains an example][o2-nginx] for how to configure Nginx to\nset the `X-Email` header when using `auth_request`.\n\nThe Hack-o-matic stores all data in a SQLite database. To start a new hackathon,\nsimply change the database file in the configuration. To back up a database, one\nconvenient way is to use [`VACUUM INTO`][vacuum]:\n\n    $ sqlite3 hackomatic.sqlite3\n    sqlite\u003e VACUUM INTO 'hackomatic-backup.sqlite3';\n\n[o2proxy]:  https://oauth2-proxy.github.io/oauth2-proxy/\n[o2-nginx]: https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#configuring-for-use-with-the-nginx-auth_request-directive\n[vacuum]:   https://sqlite.org/lang_vacuum.html\n\n## Configuration\n\nThere is a single toml configuration file. See `hackomatic.toml` for an example.\nSee `src/config.rs` for documentation of the fields.\n\nFor local testing where no reverse proxy to set the `X-Email` header is\navailable, you can set `debug.unsafe_default_email` to an email address that\nwill be used when no `X-Email` header is present. This feature is of course\nunsafe to use in production.\n\n## License\n\nThe Hack-o-matic is licensed under the Apache 2.0 License. A copy of the license\nis included in the root of the repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchorusone%2Fhackomatic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchorusone%2Fhackomatic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchorusone%2Fhackomatic/lists"}