{"id":23613671,"url":"https://github.com/freckle/stackctl","last_synced_at":"2025-10-13T13:08:07.344Z","repository":{"id":37796874,"uuid":"471449337","full_name":"freckle/stackctl","owner":"freckle","description":"Manage CloudFormation Stacks through specifications","archived":false,"fork":false,"pushed_at":"2025-04-13T08:15:02.000Z","size":414,"stargazers_count":14,"open_issues_count":1,"forks_count":1,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-04-13T09:24:54.892Z","etag":null,"topics":["ghvm-managed"],"latest_commit_sha":null,"homepage":"","language":"Haskell","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/freckle.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-03-18T16:58:10.000Z","updated_at":"2025-04-13T08:15:04.000Z","dependencies_parsed_at":"2023-09-28T16:47:40.744Z","dependency_job_id":"5d4aec07-5d7a-4a0c-9ac7-11fce6577ab6","html_url":"https://github.com/freckle/stackctl","commit_stats":{"total_commits":154,"total_committers":2,"mean_commits":77.0,"dds":0.00649350649350644,"last_synced_commit":"ecf19c5acd2d2dc738d812cb6317d13e18689899"},"previous_names":[],"tags_count":50,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fstackctl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fstackctl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fstackctl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freckle%2Fstackctl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freckle","download_url":"https://codeload.github.com/freckle/stackctl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253827448,"owners_count":21970525,"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":["ghvm-managed"],"created_at":"2024-12-27T17:18:40.392Z","updated_at":"2025-10-13T13:08:02.301Z","avatar_url":"https://github.com/freckle.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stackctl\n\n[![Hackage](https://img.shields.io/hackage/v/stackctl.svg?style=flat)](https://hackage.haskell.org/package/stackctl)\n[![CI](https://github.com/freckle/stackctl/actions/workflows/ci.yml/badge.svg)](https://github.com/freckle/stackctl/actions/workflows/ci.yml)\n\nManage CloudFormation Stacks through specifications.\n\n## About\n\n`stackctl` is a command-line tool for working with [Stack Specifications][spec]. A Stack\nSpecification is a file-system format for describing deployed (or\nto-be-deployed) CloudFormation Stacks including the Template, Parameters, and\nTags. `stackctl` can be used to pretty-print, diff, and deploy these\nspecifications.\n\n[spec]: https://freckle.github.io/stackctl/#STACK-SPECIFICATIONS\n\nThis project also contains a Haskell library for doing the same.\n\n## Install\n\n### Pre-requisites\n\n- Have `~/.local/bin` on your `$PATH`\n- Have `~/.local/share/man` on your `$MANPATH` (for documentation)\n- If on OSX, `brew install coreutils` (i.e. have `ginstall` available)\n- If on OSX, `brew install jq`\n\n### Scripted\n\n```console\ncurl -L https://raw.githubusercontent.com/freckle/stackctl/main/install | bash\n```\n\n\u003e [!NOTE]\n\u003e Some in the community have expressed [concerns][curlsh-bad] about the\n\u003e security of so-called \"curl-sh\" installations. We think the argument has been\n\u003e [pretty well debunked][curlsh-ok], but feel free to use the manual steps\n\u003e instead.\n\n[curlsh-bad]: https://0x46.net/thoughts/2019/04/27/piping-curl-to-shell/\n[curlsh-ok]: https://www.arp242.net/curl-to-sh.html\n\n### Manual\n\nGo to the [latest release][latest] and download the `.tar.gz` asset appropriate\nfor your OS. Navigate to the directory containing the downloaded file and run:\n\n[latest]: https://github.com/freckle/stackctl/releases/latest\n\n```console\ntar xvf stackctl-*.tar.gz\ncd stackctl\n```\n\nUser installation:\n\n```console\nmake install PREFIX=\"$HOME/.local\"\n```\n\nGlobal installation\n\n```console\nsudo make install\n```\n\n## Usage\n\nOnce installed, see:\n\n- `stackctl --help`,\n- `stackctl \u003ccommand\u003e --help`,\n- `man 1 stackctl`, or\n- `man 1 stackctl \u003ccommand\u003e`\n\nThe man pages are also available [online](https://freckle.github.io/stackctl/),\nbut contain documentation as of `main`, and not your installed version.\n\n## Release\n\nTo trigger a release in this project, merge a commit to `main` with a\nconventionally-formatted commit message. In short, one that starts with:\n\n1. `fix:` to trigger a patch release,\n1. `feat:` for minor, or\n1. `feat!:` for major\n\nConventional commits are not required generally for this project, though you're\nfree to always use them. They are only required when you want to trigger a\nrelease.\n\n## Comparison to AWS CloudFormation Git Sync\n\n[AWS CloudFormation Git Sync][aws-git-sync] was recently released by AWS. It\nallows you to link a repository on GitHub to a CloudFormation Stack. The\nrepository contains a \"deployment file\" that defines a `template-file-path`,\n`parameters`, and `tags` -- effectively, a Stack Specification.\n\nWhen AWS notices updates to the deployment or template file land on a defined\nbranch, it updates the configured Stack accordingly, emitting events to SNS as\nit does.\n\nThis is great for simple use-cases, and we fully expect they'll improve and\nextend it such that it obviates Stackctl one day. In the meantime, there are\ncurrently the following limitations when compared to Stackctl:\n\n1. A repository can only target a single account and region\n1. There is no changeset flow amenable to previewing changes via PRs. You update\n   the file(s) on `main` and it syncs, that's it. If you're using a PR, you have\n   only linting and human review as possible pre-deployment steps.\n1. There is no way to specify description, capabilities, or dependencies\n1. As of 12/23, there seemed to be some bugs, and the setup installs a managed\n   event bridge that \"phones home\", sending events about your updates to some\n   other AWS account ([source][first-look-blog])\n\n[aws-git-sync]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/git-sync.html\n[first-look-blog]: https://medium.com/@mattgillard/first-look-git-sync-for-cloudformation-stacks-9e2f39c311ac\n\n## Relationship to CloudGenesis\n\n[CloudGenesis][] is a project that also takes a directory of Stack\nSpecifications and deploys them when changed. Its on-disk format inspired ours\nand, in fact, directories built for CloudGenesis can be managed by `stackctl`\n(not necessarily the other way around).\n\n[cloudgenesis]: https://github.com/LifeWay/CloudGenesis\n\nThe key differences are:\n\n- CloudGenesis supplies AWS CodeBuild tooling for handling changes to your\n  GitOps repository; Stackctl expects you to implement a GitHub Action that\n  installs and executes `stackctl` commands as appropriate\n\n  This makes Stackctl better if you need or want to also run the same tooling in\n  a local context, but it makes CloudGenesis better if you need or want this\n  activity to remain within the boundaries of your AWS VPC.\n\n- CloudGenesis reacts to file-change events in S3, which only happens when you\n  synchronize from `main`; Stackctl can run on any branch and easily be scoped\n  to files changed in the PR or push.\n\n  This enables Stackctl features like commenting with ChangeSet details on PRs,\n  which are not possible in CloudGenesis as it's currently implemented.\n\n- Stackctl adds the `Depends` key, for ordering multi-Stack processing\n\n---\n\n[CHANGELOG](./CHANGELOG.md) | [LICENSE](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreckle%2Fstackctl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreckle%2Fstackctl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreckle%2Fstackctl/lists"}