{"id":13681500,"url":"https://github.com/stackbuilders/hapistrano","last_synced_at":"2025-04-05T16:09:19.095Z","repository":{"id":17232114,"uuid":"20001143","full_name":"stackbuilders/hapistrano","owner":"stackbuilders","description":"Deploy tool for Haskell applications, like Capistrano for Rails","archived":false,"fork":false,"pushed_at":"2024-05-23T07:10:10.000Z","size":432,"stargazers_count":100,"open_issues_count":8,"forks_count":16,"subscribers_count":40,"default_branch":"main","last_synced_at":"2024-05-23T07:33:46.265Z","etag":null,"topics":["capistrano","continuous-deployment","deployment","hacktoberfest","hacktoberfest2023","haskell","haskell-applications"],"latest_commit_sha":null,"homepage":"https://hackage.haskell.org/package/hapistrano","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jianfengye/nginx-1.0.14_comment","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stackbuilders.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"docs/CODE_OF_CONDUCT.md","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":"2014-05-20T23:27:52.000Z","updated_at":"2024-06-04T07:43:50.090Z","dependencies_parsed_at":"2023-01-13T19:13:45.987Z","dependency_job_id":"9b8d1ba5-8255-4776-bc71-34d08fe48a12","html_url":"https://github.com/stackbuilders/hapistrano","commit_stats":{"total_commits":317,"total_committers":36,"mean_commits":8.805555555555555,"dds":0.7949526813880126,"last_synced_commit":"caf471f478690478c6ab49a4b7cccd33099f44a1"},"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackbuilders%2Fhapistrano","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackbuilders%2Fhapistrano/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackbuilders%2Fhapistrano/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackbuilders%2Fhapistrano/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stackbuilders","download_url":"https://codeload.github.com/stackbuilders/hapistrano/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247361691,"owners_count":20926643,"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":["capistrano","continuous-deployment","deployment","hacktoberfest","hacktoberfest2023","haskell","haskell-applications"],"created_at":"2024-08-02T13:01:31.605Z","updated_at":"2025-04-05T16:09:19.072Z","avatar_url":"https://github.com/stackbuilders.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"[![Build](https://github.com/stackbuilders/hapistrano/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/stackbuilders/hapistrano/actions/workflows/build.yml)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-27-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n[![Draft](https://github.com/stackbuilders/hapistrano/actions/workflows/draft.yml/badge.svg)](https://github.com/stackbuilders/hapistrano/actions/workflows/draft.yml)\n[![Release](https://github.com/stackbuilders/hapistrano/actions/workflows/release.yml/badge.svg)](https://github.com/stackbuilders/hapistrano/actions/workflows/release.yml)\n\n# Hapistrano\n\n## Description\n\nHapistrano is a deployment library for Haskell applications similar to\nRuby's [Capistrano](http://capistranorb.com/).\n\n## Purpose\n\nWe created Hapistrano because:\n\n* Deploys should be simple, but as close to atomic as possible (eg,\n  they shouldn't require much application downtime).\n* Rollback should be trivial to achieve to bring the application back\n  to the last-deployed state.\n* Deploys shouldn't fail because of dependency problems.\n\n## How it Works\n\nHapistrano (like Capistrano for Ruby) deploys applications to a new\ndirectory marked with a timestamp on the remote host. It creates this\nnew directory quickly by placing a git repository for caching purposes\non the remote server.\n\nWhen the build process completes, it switches a symlink to the `current`\nrelease directory, and optionally restarts the web server.\n\nBy default, Hapistrano keeps the last five releases on the target host\nfilesystem and deletes previous releases to avoid filling up the disk.\n\n## Usage\n\nHapistrano 0.4.0.0 looks for a configuration file called `hap.yaml` that\ntypically looks like this:\n\n```yaml\ndeploy_path: '/var/projects/my-project'\nhost: user@myserver.com\nport: 2222\n# To perform version control operations\nrepo: 'https://github.com/stackbuilders/hapistrano.git'\nrevision: origin/main\n# To copy the contents of the directory\nlocal_directory: '/tmp/my-project'\nbuild_script:\n  - stack setup\n  - stack build\nrestart_command: systemd restart my-app-service\n```\n\nThe following parameters are required:\n\n* `deploy_path` — the root of the deploy target on the remote host.\n* Related to the `source` of the repository, you have the following options:\n  - _Git repository_ **default** — consists of two parameters. When these are set,\n    hapistrano will perform version control related operations.\n    **Note:** Only GitHub is supported.\n    * `repo` — the origin repository.\n    * `revision` — the SHA1 or branch to deploy. If a branch, you will need to\n      specify it as `origin/branch_name` due to the way that the cache repo is\n      configured.\n  * `local_directory` — when this parameter is set, hapistrano will copy the\n    contents of the directory.\n\nThe following parameters are *optional*:\n\n* `host` — the target host, if missing, `localhost` will be assumed (which\n  is useful for testing and playing with `hap` locally). You can specify the\n  user that is going to connect to the server here. Example: `user@server.com`.\n* `port` — SSH port number to use. If missing, 22 will be used.\n* `shell` — Shell to use. Currently supported: `zsh` ans `bash`. If missing, `Bash` will be used.\n* `ssh_args` — Optional ssh arguments. Only `-p` is passed via the `port` variable.\n* `build_script` — instructions how to build the application in the form of\n  shell commands.\n* `restart_command` — if you need to restart a remote web server after a\n  successful rollback, specify the command that you use in this variable. It\n  will be run after both deploy and rollback.\n* `vc_action` - Controls if version control related activity should\n  take place. It defaults to true. When you don't want activity like\n  cloning, fetching etc. to take place, set this to `false`.\n* `linux` - Specify, whether or not, the target system where Hapistrano will\n  deploy to is a GNU/Linux or other UNIX (g.e. BSD, Mac). This is set to `true`\n  by default so unless the target system is not GNU/Linux, this should not be\n  necessary. The platform where Hapistrano is running won't affect the\n  available options for commands (g.e. A Mac deploying to an Ubuntu machine,\n  doesn't need this flag)\n* `release_format` - The release timestamp format, the\n  '--release-format' argument passed via the CLI takes precedence over this\n  value. If neither CLI nor configuration file value is specified, it defaults\n  to 'short'\n* `keep_releases` - The number of releases to keep, the\n  '--keep-releases' argument passed via the CLI takes precedence over this\n  value. If neither CLI nor configuration file value is specified, it defaults\n  to '5'\n* `keep_one_failed` - A boolean specifying whether to keep all failed releases\n  or just one (the latest failed release), the '--keep-one-failed' flag passed via\n  the CLI takes precedence over this value. If neither CLI nor configuration file value is specified,\n  it defaults to false (i.e. keep all failed releases).\n* `linked_files:`- Listed files that will be symlinked from the `{deploy_path}/shared` folder\ninto each release directory during deployment. Can be used for configuration files\nthat need to be persisted (e.g. dotenv files).  **NOTE:** The directory structure _must_\nbe similar in your release directories in case you need to link a file inside a\nnested directory (e.g. `shared/foo/file.txt`).\n* `linked_dirs:`- Listed directories that will be symlinked from the `{deploy_path}/shared` folder\ninto each release directory during deployment. Can be used for data directories\nthat need to be persisted (e.g. upload directories). **NOTE:** Do not add a slash `/`\nat the end of the directory (e.g. `foo/`) because we use `parseRelFile` to create\nthe symlink.\n* `run_locally:`- Instructions to run locally on your machine in the\n  form of shell commands. Example:\n\n```\nrun_locally:\n  - pwd\n  - bash deploy.sh\n```\n\nNote how we are even able to execute a bash script named `deploy.sh`\nabove. Be sure to use `set -e` in your bash script to avoid\nheadaches. Hapistrano will stop the execution on non-zero exit\ncodes. Without the usage of `set -e`, there is a possibility that your\nbash script may return a zero exit code even if your intermediate\ncommand resulted in an error.\n\nAfter creating a configuration file as above, deploying is as simple as:\n\n```bash\n$ hap deploy\n```\n\nRollback is also trivial:\n\n```bash\n$ hap rollback # to rollback to previous successful deploy\n$ hap rollback -n 2 # go two deploys back in time, etc.\n```\n* `maintenance_directory:`- The name of the directory on which the maintenance file will be placed. `{deploy_path}/{maintenance_directory}`. The default directory name is `maintenance`\n* `maintenance_filename:`- The name of the file that is going to be created in the maintenance_directory. It has to have the `.html` extension to be seen in the browser. `{deploy_path}/{maintenance_directory}/{maintenance_filename}`. The default filename is `maintenance.html`\n\n### Environment Variables\n\nConfiguration files are parsed using\n[loadYamlSettings](http://hackage.haskell.org/package/yaml-0.10.2.0/docs/Data-Yaml-Config.html#v:loadYamlSettings),\ntherefore, variable substitution is supported. Considering the following configuration file:\n\n```yaml\nrevision: \"_env:HAPISTRANO_REVISION:origin/main\n...\n```\n\nThe `revision` value could be overwritten as follows:\n\n```sh\nHAPISTRANO_REVISION=origin/feature_branch hap deploy\n```\n\n## What to do when compiling on server is not viable\n\nSometimes the target machine (server) is not capable of compiling your\napplication because e.g. it has not enough memory and GHC exhausts it all.\nYou can copy pre-compiled files from local machine or CI server using\n`copy_files` and `copy_dirs` parameters:\n\n```haskell\ncopy_files:\n  - src: '/home/stackbuilders/my-file.txt'\n    dest: 'my-file.txt'\ncopy_dirs:\n  - src: .stack-work\n    dest: .stack-work\n```\n\n`src` maybe absolute or relative, it's path to file or directory on local\nmachine, `dest` may only be relative (it's expanded relatively to cloned\nrepo) and specifies where to put the files/directories on target machine.\nDirectories and files with clashing names will be overwritten. Directories\nare copied recursively.\n\n## Deploying to multiple machines concurrently\n\nBeginning with Hapistrano 0.3.1.0 it's possible to deploy to several\nmachines concurrently. The only things you need to do is to adjust your\nconfiguration file and use `targets` parameter instead of `host` and `port`,\nlike this:\n\n```yml\ntargets:\n  - host: myserver-a.com\n    port: 2222\n  - host: myserver-b.com\n# the rest is the same\n```\n\nAdditionally, starting with 0.4.9.0 it is possible to run commands only on the\nlead target during a concurrent deploying process ensuring that certain tasks\nonly get executed once. The lead target is considered the first entry in the\n`targets` list:\n\n```yml\ntargets:\n  - host: app1.example.com # lead server\n  - host: app2.example.com\n\nbuild_script:\n  - command: ./run_database_migrations\n    only_lead: true\n  - ./build\n# the rest is the same\n```\n\nA few things to note here:\n\n* `host` item is required for every target, but `port` may be omitted and\n  then it defaults to `22`.\n\n* The deployment will run concurrently and finish when interactions with all\n  targets have finished either successfully or not. If at least one\n  interaction was unsuccessful, the `hap` tool will exit with non-zero exit\n  code.\n\n* The log is printed in such a way that messages from several machines get\n  intermixed, but it's guaranteed that they won't overlap (printing itself\n  is sequential) and the headers will tell you exactly which machine was\n  executing which command.\n\nIf you don't specify `host` and `targets`, `hap` will assume `localhost` as\nusually, which is mainly useful for testing.\n\n## Docker\n\nStarting with version `0.4.4.0` all new Docker images would be published to\n[GitHub's Container Registry][ghcr], while the old versions remain available on\n[Docker Hub][dockerhub]. To download the `latest` version available, change the\nimage reference as follows:\n\n```diff\n- stackbuilders/hapistrano:latest\n+ ghcr.io/stackbuilders/hapistrano:latest\n```\n\n## GH Actions\n\nCheck the documentation [here](.github/workflows/README.md)\n\n## Development\n\n### Requirements\n\n- Install [Zsh](https://www.zsh.org/)\n- Use [GHCup][ghcup] to install:\n  - GHC 8.10.x or 9.0.x (it is recommended to try both for backward\n    compatibility)\n  - Cabal 3.x\n\nAlternatively, install only Nix following the instructions detailed\n[here](docs/NIX.md).\n\n### Getting Started\n\nUpdate package index:\n\n```sh\ncabal update\n```\n\nEnable tests:\n\n```sh\ncabal configure --enable-tests\n```\n\nInstall project dependencies:\n\n```sh\ncabal build --only-dependencies\n```\n\nCompile the project:\n\n```sh\ncabal build\n```\n\nRun tests:\n\n```sh\ncabal test\n```\n\n## Enable/disable maintenance mode\n\nPresent a maintenance page to visitors. Disables your application's web interface by writing a {maintenance_filename} file to each web server. The servers must be configured to detect the presence of this file, and if it is present, always display it instead of performing the request.\n\nThe maintenance page will just say the site is down for maintenance, and will be back shortly.\n\nTo enable maintenance mode run:\n\n```bash\nhap maintenance enable\n```\nDisabling maintenance mode will remove the file from the {maintenance_directory} it can be done with the following command:\n\n```bash\nhap maintenance disable\n```\n\n## Notes\n\n* Hapistrano is not supported on Windows. Please check: [Issue #96](https://github.com/stackbuilders/hapistrano/issues/96).\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://juancarlos.io/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/2164411?v=4?s=100\" width=\"100px;\" alt=\"Juan Paucar\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJuan Paucar\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=juanpaucar\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.stackbuilders.com/news/author/justin-leitgeb\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/9977?v=4?s=100\" width=\"100px;\" alt=\"Justin S. Leitgeb\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJustin S. Leitgeb\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=jsl\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/DavidMazarro\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/22799724?v=4?s=100\" width=\"100px;\" alt=\"David Mazarro\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Mazarro\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=DavidMazarro\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/sestrella\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/2049686?v=4?s=100\" width=\"100px;\" alt=\"Sebastián Estrella\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSebastián Estrella\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=sestrella\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://markkarpov.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/8165792?v=4?s=100\" width=\"100px;\" alt=\"Mark Karpov\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMark Karpov\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=mrkkrp\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/jpvillaisaza\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/584947?v=4?s=100\" width=\"100px;\" alt=\"Juan Pedro Villa Isaza\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJuan Pedro Villa Isaza\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=jpvillaisaza\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://cristhianmotoche.github.io/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/8370088?v=4?s=100\" width=\"100px;\" alt=\"Cristhian Motoche\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eCristhian Motoche\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=CristhianMotoche\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://psibi.in/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/737477?v=4?s=100\" width=\"100px;\" alt=\"Sibi Prabakaran\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSibi Prabakaran\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=psibi\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ibarrae\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/22796877?v=4?s=100\" width=\"100px;\" alt=\"Esteban Ibarra\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEsteban Ibarra\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=ibarrae\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/cptrodolfox\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/20303685?v=4?s=100\" width=\"100px;\" alt=\"William R. Arellano\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eWilliam R. Arellano\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=cptrodolfox\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://wikipedia.org/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/2220440?v=4?s=100\" width=\"100px;\" alt=\"Götz\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGötz\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=goetzc\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/javcasas\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/4497839?v=4?s=100\" width=\"100px;\" alt=\"Javier Casas\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJavier Casas\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=javcasas\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://blog.jakuba.net/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/123374?v=4?s=100\" width=\"100px;\" alt=\"Jakub Arnold\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJakub Arnold\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=darthdeus\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/nickovivar\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1821812?v=4?s=100\" width=\"100px;\" alt=\"Nicko Vivar D.\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNicko Vivar D.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=nickovivar\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/felixminom\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/42775600?v=4?s=100\" width=\"100px;\" alt=\"Felix Miño\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFelix Miño\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=felixminom\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/elcuy\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/11718997?v=4?s=100\" width=\"100px;\" alt=\"Luis Fernando Alvarez\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLuis Fernando Alvarez\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=elcuy\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/fefi95\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/12057338?v=4?s=100\" width=\"100px;\" alt=\"Stefani Castellanos\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eStefani Castellanos\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=fefi95\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/alexisbcc\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/38666191?v=4?s=100\" width=\"100px;\" alt=\"Alexis Crespo\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlexis Crespo\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=alexisbcc\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://giovannipro.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/6964464?v=4?s=100\" width=\"100px;\" alt=\"David Proaño\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Proaño\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=GioDavid\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/FranzGB\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/46214532?v=4?s=100\" width=\"100px;\" alt=\"Franz Guzmán\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFranz Guzmán\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=FranzGB\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://hughjfchen.github.io/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/5584544?v=4?s=100\" width=\"100px;\" alt=\"Hugh JF Chen\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHugh JF Chen\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=hughjfchen\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.facebook.com/CSOFTWAREESPE/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/26729748?v=4?s=100\" width=\"100px;\" alt=\"Jean Karlo Obando Ramos\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJean Karlo Obando Ramos\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=boceto1\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.linkedin.com/in/ng2906/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/26463272?v=4?s=100\" width=\"100px;\" alt=\"Nitin Gupta\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNitin Gupta\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=ng29\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://nebtrx.github.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1876959?v=4?s=100\" width=\"100px;\" alt=\"Omar García\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eOmar García\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=nebtrx\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/wanderer163\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/93438190?v=4?s=100\" width=\"100px;\" alt=\"wanderer163\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ewanderer163\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=wanderer163\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://gautier.difolco.dev/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1362807?v=4?s=100\" width=\"100px;\" alt=\"Gautier DI FOLCO\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGautier DI FOLCO\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=blackheaven\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/oscar-izval\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/25722135?v=4?s=100\" width=\"100px;\" alt=\"Óscar Izquierdo Valentín\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eÓscar Izquierdo Valentín\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stackbuilders/hapistrano/commits?author=oscar-izval\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n  \u003ctfoot\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" size=\"13px\" colspan=\"7\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/all-contributors/all-contributors-cli/1b8533af435da9854653492b1327a23a4dbd0a10/assets/logo-small.svg\"\u003e\n          \u003ca href=\"https://all-contributors.js.org/docs/en/bot/usage\"\u003eAdd your contributions\u003c/a\u003e\n        \u003c/img\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tfoot\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## License\n\nMIT, see [the LICENSE file](LICENSE).\n\n## Contributing\n\nDo you want to contribute to this project? Please take a look at our [contributing guideline](/docs/CONTRIBUTING.md) to know how you can help us build it.\n\n---\n\u003cimg src=\"https://cdn.stackbuilders.com/media/images/Sb-supports.original.png\" alt=\"Stack Builders\" width=\"50%\"\u003e\u003c/img\u003e\n[Check out our libraries](https://github.com/stackbuilders/) | [Join our team](https://www.stackbuilders.com/join-us/)\n\n[ghcup]: https://www.haskell.org/ghcup/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackbuilders%2Fhapistrano","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstackbuilders%2Fhapistrano","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackbuilders%2Fhapistrano/lists"}