{"id":17658652,"url":"https://github.com/ruuda/hoff","last_synced_at":"2025-08-22T00:22:45.133Z","repository":{"id":45688206,"uuid":"61156312","full_name":"ruuda/hoff","owner":"ruuda","description":"A gatekeeper for your commits","archived":false,"fork":false,"pushed_at":"2023-10-11T07:46:46.000Z","size":674,"stargazers_count":8,"open_issues_count":2,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-31T10:11:18.765Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Haskell","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/ruuda.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":"2016-06-14T21:17:06.000Z","updated_at":"2024-01-28T13:30:59.000Z","dependencies_parsed_at":"2025-03-11T04:31:18.167Z","dependency_job_id":"105c7bed-6c5c-4010-b8b9-537cc01379b3","html_url":"https://github.com/ruuda/hoff","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Fhoff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Fhoff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Fhoff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruuda%2Fhoff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruuda","download_url":"https://codeload.github.com/ruuda/hoff/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252881295,"owners_count":21819141,"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-10-23T15:27:54.974Z","updated_at":"2025-05-07T12:44:42.442Z","avatar_url":"https://github.com/ruuda.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hoff\n\nHoff is a bot for GitHub that enforces a clean history, and ensures that master\nalways builds.\n\n**Note, there is a more active fork at \u003chttps://github.com/channable/hoff\u003e.**\n\nHoff intends to replace the merge button in the GitHub UI. Unlike GitHub\\* and\nmany other tools, Hoff integrates changes into master using a *rebase*. This\nkeeps the history clean, free of random fork points and merge commits. (TODO:\nIn the future Hoff will also enforce a commit message format.)\n\n\\* [This is no longer true.](https://github.com/blog/2243-rebase-and-merge-pull-requests)\n\nFurthermore, Hoff implements the [Not Rocket Science Principle][not-rocket-science]\nof software engineering:\n\n\u003e Automatically maintain a repository of code that always passes all the tests.\n\nThe application watches a repository for new pull requests. Once a pull request\nhas been approved (through an LGTM comment left by a reviewer), it integrates\nthe changes into master, and pushes those to a testing branch. When CI reports a\nsuccessful build for this branch, master is forwarded to it. If the build fails,\nthe commits never make it into master, keeping the build green at all times.\n\n## Installing\n\nSee the [installation guide](doc/installing.md) if you want to run a self-hosted\nversion of Hoff.\n\nTODO: Write a proper guide to build a package.\nTODO: Publish official deb packages?\n\n## Building\n\nHoff is written in Haskell and builds with [Stack][stack]:\n\n    $ stack setup\n    $ stack build\n    $ stack test\n\nTo run the application locally:\n\n    $ cp package/example-config.json config.json\n    $ stack exec hoff config.json\n\nYou probably want to edit the config file before running.\n\nTo run Hoff on a server, you can build a self-contained squashfs file system\nimage with [Nix][nix]:\n\n    $ nix build --out-link hoff.img\n    $ cp package/example-config.json config.json\n    $ sudo systemd-nspawn \\\n      --ephemeral         \\\n      --image hoff.img    \\\n      --bind-ro=$PWD:/etc \\\n      -- /usr/bin/hoff /etc/config.json\n\nThe image includes Hoff and all of its dependencies (Git, SSH). You can run it\nwith systemd. TODO: Make it work with portablectl.\n\n## Further reading\n\nMore information is available in the doc directory:\n\n * [Background](doc/background.md): My original intention was more ambitious\n   than building a GitHub bot. This document gives some background about what I\n   want to build.\n * [Approach](doc/approach.md): Progress is made in many small steps. This\n   document outlines the current goals.\n * [Design](doc/design.md): Outlines the architecture of the application.\n * [Installing](doc/installing.md): The installation guide.\n\n## License\n\nHoff is free software. It is licensed under the [Apache 2.0][apache2] license.\nIt may be used both for commercial and non-commercial use under the conditions\ngiven in the license.\n\n[not-rocket-science]: https://graydon2.dreamwidth.org/1597.html\n[stack]:              https://haskellstack.org\n[nix]:                https://nixos.org/nix/\n[apache2]:            https://www.apache.org/licenses/LICENSE-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruuda%2Fhoff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruuda%2Fhoff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruuda%2Fhoff/lists"}