{"id":26895112,"url":"https://github.com/basecamp/kamal-skiff","last_synced_at":"2025-07-20T03:31:14.845Z","repository":{"id":203137615,"uuid":"707446104","full_name":"basecamp/kamal-skiff","owner":"basecamp","description":"Deploy static sites using nginx + SSI with Kamal","archived":false,"fork":false,"pushed_at":"2025-06-05T05:27:08.000Z","size":62,"stargazers_count":355,"open_issues_count":7,"forks_count":17,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-07-18T05:34:47.001Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/basecamp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-10-19T23:22:13.000Z","updated_at":"2025-07-14T13:37:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"b3f0e493-5fe0-4c9d-b572-27283432550a","html_url":"https://github.com/basecamp/kamal-skiff","commit_stats":null,"previous_names":["basecamp/kamal-skiff"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/basecamp/kamal-skiff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fkamal-skiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fkamal-skiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fkamal-skiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fkamal-skiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basecamp","download_url":"https://codeload.github.com/basecamp/kamal-skiff/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basecamp%2Fkamal-skiff/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266063095,"owners_count":23870716,"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":"2025-04-01T01:05:00.267Z","updated_at":"2025-07-20T03:31:14.825Z","avatar_url":"https://github.com/basecamp.png","language":"Ruby","funding_links":[],"categories":["Tools"],"sub_categories":[],"readme":"# Skiff\n\nSkiff uses [Kamal](https://kamal-deploy.org) to deploy static sites using nginx with Server-Side Includes (SSI).\n\nUnderstand the why and the how in this introduction video: https://www.youtube.com/watch?v=YoabUEzpM6k\n\n## Local development\n\nIf you have a Ruby environment available, you can install Skiff globally with:\n\n```sh\ngem install kamal-skiff\n```\n\nThen run `skiff dev` to start the development server.\n\n...otherwise, you can run a dockerized version via an alias (add this to your .bashrc or similar to simplify re-use). On macOS, use:\n\n```sh\nalias skiff-dev=\"docker build -t skiff-site . \u0026\u0026 docker run -it --rm -p 4000:80 -v ./public:/site/public --name skiff-site skiff-site nginx '-g daemon off;'\"\nalias skiff='docker run -it --rm -v \"${PWD}:/workdir\" -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock -e SSH_AUTH_SOCK=\"/run/host-services/ssh-auth.sock\" -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/basecamp/kamal-skiff:latest'\n```\n\nThen run `skiff-dev` to start the development server, and use `skiff [command]` for everything else.\n\n## Deploying the site for the first time\n\nFirst ensure that you've set `GIT_URL` to a repository address with a valid access token embedded in the `.env` file. This access token must have access to pull from the git repository in question (see [personal access tokens for GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) for an example).\n\nThen you must also setup an access token for your Docker image repository (see [Create and manage access tokens for Docker Hub](https://docs.docker.com/security/for-developers/access-tokens/) for an example).\n\nFinally, you must add the server address into `config/deploy.yml`, and ensure that the image and repository configurations are correct.\n\nNow you're ready to run `skiff deploy` to deploy your site to the server. This will install Docker on your server (using `apt-get`), if it isn't already available.\n\n## Deploying changes to production\n\nChanges checked into git are automatically pulled onto the Skiff server every 10 seconds. So all you have to do is checkin your changes and push them.\n\nIf you need to change the nginx configuration in `config/server.conf`, make your changes to that file, check them into git and push, and then run `skiff restart` to test the configuration file and restart the server if it's valid.\n\n## Deploying changes to staging first\n\nTo use a staging server, you must set `GIT_BRANCH` in .env to the branch you're using for staging. Then you can deploy the site to a staging server using `skiff deploy --staging`, which will use the configuration in `config/deploy.staging.yml`, and start pulling updates from the branch specified.\n\n## Flushing etag caches after changing include files\n\nSkiff uses [Server Side Includes](https://nginx.org/en/docs/http/ngx_http_ssi_module.html), which can change independently of your individual HTML files. When that happens, the caching etags for those latter files will not be updated automatically to reflect the change. You can run `skiff flush` to touch all the public HTML files, which will flush the etag cache.\n\n## License\n\nSkiff is released under the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fkamal-skiff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasecamp%2Fkamal-skiff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasecamp%2Fkamal-skiff/lists"}