Your platform team, as a CLI.
Every new service costs the same week: scaffold, lint config, CI, versioning, deploy pipeline, IAM. Then the next one drifts from the last. Action Platform turns that week into one command and keeps every project on the same rails — without a control plane to host, a UI to learn, or a vendor to trust with your cloud.
pipx install action-platform
action-platform init web python fastapi --name "orders" --cloud aws/lambda
Thirty seconds later you have a FastAPI service with tests, lint, CI wired, a SAM template, a least-privilege IAM policy, and a GitHub repo already pushed (--no-push to keep it local).
Why teams pick it
| One command, whole lifecycle | init → release → deploy → rollback → diagnose → destroy. Same verbs for a Python API on Lambda, a Go service in Docker, a React app on Amplify. |
| Templates from production, not tutorials | Every project template is extracted from a real shipping product. Real layout, real CI, real gotchas already fixed. |
| Cloud is a layer, not a fork | Projects stay cloud-agnostic. --cloud aws/lambda overlays deploy files; swap to docker tomorrow with one command. |
| Your CI, your account, your git | Runs on GitHub Actions, GitLab CI or Jenkins you already have. Infra lands in your AWS account through OIDC — no long-lived keys, no agent, no SaaS in the loop. |
| Governance that ships with the code | Git-flow and Conventional Commits enforced by git hooks before a commit exists and by CI on every PR; changelog generated; AGENTS.md for humans and AI agents; Trivy scans; least-privilege IAM in requirements/. |
| Fix once, everywhere | CI logic lives in versioned shared repos (ci-scripts, ci-github, ci-gitlab, ci-jenkins). Bump v1, every project picks it up. |
What you get
action-platform init --list
| Type | Stacks | Ready with |
|---|---|---|
web |
python (FastAPI, FastMCP), go (Gin), node (React) | /ping, versioned API, tests, lint, CI |
library |
python, go, php, node, java, rust | packaging, version test, publish workflow |
docs |
mkdocs | Material theme, strict build in CI |
plugin |
chrome | Manifest V3, popup, background, tests, store zip |
empty |
— | platform.toml + code quality only |
| Cloud | Adds |
|---|---|
aws/lambda |
SAM template, HTTP API, custom domain, deploy workflow, IAM policy |
aws/amplify |
amplify.yml, security headers, start-job workflow, IAM policy |
docker |
Dockerfile per language, compose |
| Service | Providers |
|---|---|
postgres |
docker (local), aws-rds (Terraform/OpenTofu + SSM) |
Commands
action-platform init # interactive: type → stack → template → name → ci
action-platform init web go gin --ci gitlab # direct
action-platform init web python --cloud docker # project + deploy overlay
action-platform init ... --no-push # skip creating the remote repo
action-platform install [--dry-run] # existing repo: platform.toml, hooks, code quality, CI — never overwrites
action-platform cloud set aws/lambda # add or switch the deploy target
action-platform service add postgres --provider aws-rds
action-platform branch feature 42 login # develop (or main) → pull → feature/42-login → push
action-platform branch hotfix PROJ-7 # from main/master
action-platform gitflow # audit current branch + commits; --install-hooks
action-platform pr [--draft] [--dry-run] # PR for the current branch: target from git-flow, body from commits
action-platform release patch # bump, changelog, tag, GitHub release; off main/master → X.Y.Z-rc.N pre-release
action-platform deploy --stage prod
action-platform rollback
action-platform diagnose
action-platform destroy
Git-flow, enforced
Every project follows the same flow. Git hooks refuse the wrong move before it exists; CI refuses it on the pull request; the CLI and the MCP tools guide the right one.
gitGraph
commit id: "chore: bootstrap"
branch develop
checkout develop
commit id: "chore(release): 0.3.2-rc.1" tag: "v0.3.2-rc.1"
branch feature/42-login
checkout feature/42-login
commit id: "feat(login): form"
commit id: "test(login): cover form"
checkout develop
merge feature/42-login id: "PR #1 → develop"
branch release/0.3.2
checkout release/0.3.2
commit id: "chore(release): 0.3.2-rc.2" tag: "v0.3.2-rc.2"
checkout main
merge release/0.3.2 id: "PR #2 → main"
commit id: "chore(release): 0.3.2" tag: "v0.3.2"
checkout develop
merge main id: "back-merge"
checkout main
branch hotfix/PROJ-7
checkout hotfix/PROJ-7
commit id: "fix(auth): expiry"
checkout main
merge hotfix/PROJ-7 id: "PR #3 → main"
commit id: "chore(release): 0.3.3" tag: "v0.3.3"
checkout develop
merge main id: "back-merge hotfix"
| Branch | Starts from | Merges into | Release |
|---|---|---|---|
feature/<code>, bugfix/…, chore/…, docs/…, refactor/…, test/…, ci/…, perf/… |
develop (or the default branch when there is no develop) |
develop |
X.Y.Z-rc.N pre-release |
release/<version> |
develop |
main and develop |
X.Y.Z-rc.N until merged |
hotfix/<code> |
main |
main and develop |
X.Y.Z-rc.N until merged |
main / master |
— | — | stable X.Y.Z → PyPI / npm / … |
Rules the hooks and CI apply: branch names are <kind>/<code>[-slug]; commits are Conventional Commits; no direct commits on main, master or develop except chore(release):, chore(platform): and the bootstrap commit; a pull request may only target what the table allows.
action-platform branch feature 42 login # develop → pull → feature/42-login → push
action-platform gitflow # audit branch + commits
action-platform pr # target and body from the rules and the commits
action-platform release patch # rc off main, stable on main
Everything a project needs is declared in one file:
[project]
name = "orders"
type = "web"
stack = "python"
template = "fastapi"
ci = "github"
language = "python"
[source_host]
kind = "github"
repo = "acme/orders"
[deploy]
target = "aws/lambda"
[services]
postgres = "aws-rds"
Use it from an AI client
The platform ships as an MCP server. Claude Code, Codex, Cursor — anything that speaks MCP — gets 17 tools (list_matrix, init_project, install_platform, start_branch, gitflow_audit, propose_pull_request, release, deploy, diagnose, …), 6 prompts that put them in the right order (new_service, ship_feature, cut_release, deploy_project, adopt_repository, fix_gitflow) and 12 skills that make the agent preview and ask before anything leaves the machine.
pip install "action-platform[mcp]"
action-platform mcp # stdio
action-platform mcp --http # http://127.0.0.1:8765/mcp
Claude Code:
/plugin marketplace add actionplatform/action-platform
/plugin install action-platform@action-platform
Any client — add to .mcp.json:
{ "mcpServers": { "action-platform": { "command": "uvx", "args": ["--from", "action-platform[mcp]", "action-platform-mcp"] } } }
Extend it
Deploy targets are plugins. Implement the DeployTarget contract — preflight, create, deploy, switch_traffic, rollback, diagnose, delete — publish it under the action_platform.deploy_target entry-point group, and action-platform deploy finds it by name.
from action_platform import ActionPlatform, Config
from action_platform.providers import SourceGithub
tool = ActionPlatform(config=Config(source_host=SourceGithub(repo="acme/orders")))
tool.release("minor")
Templates are plain cookiecutters in actionplatform/templates. Add a stack or a cloud with a pull request — the CLI reads index.toml, nothing to redeploy. Point ACTION_PLATFORM_TEMPLATES at a local checkout while you work on them.
Ecosystem
| Repo | Role |
|---|---|
| templates | projects, clouds, services |
| ci-scripts | the one implementation of setup / check / release / commit lint |
| ci-github · ci-gitlab · ci-jenkins | thin wrappers per CI |
| strategy | why it is built this way |
License
Apache 2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file action_platform-0.2.0.tar.gz.
File metadata
- Download URL: action_platform-0.2.0.tar.gz
- Upload date:
- Size: 47.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62d6153f9c146aa2c9c6c35b30084de1d5ae076dcd9406a7387bd8b83b499d90
|
|
| MD5 |
03ba42314d1c1237018b77ff817a7eea
|
|
| BLAKE2b-256 |
1c6129ccd27a0759cf60db76c69e5fe6e49a52ae00c736fbe20705fbc24b4c1c
|
Provenance
The following attestation bundles were made for action_platform-0.2.0.tar.gz:
Publisher:
python-publish-pypi.yml on actionplatform/action-platform
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
action_platform-0.2.0.tar.gz -
Subject digest:
62d6153f9c146aa2c9c6c35b30084de1d5ae076dcd9406a7387bd8b83b499d90 - Sigstore transparency entry: 2804949927
- Sigstore integration time:
-
Permalink:
actionplatform/action-platform@2b6c908556a458471f7b1036b7e16e116b0d54f9 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/actionplatform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish-pypi.yml@2b6c908556a458471f7b1036b7e16e116b0d54f9 -
Trigger Event:
release
-
Statement type:
File details
Details for the file action_platform-0.2.0-py3-none-any.whl.
File metadata
- Download URL: action_platform-0.2.0-py3-none-any.whl
- Upload date:
- Size: 65.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fee9b5e39cb52ecf5193c07e96bbfaa54c426e4f455585826aeda66a08650ac1
|
|
| MD5 |
27d85df4de6a68f7d7131ea46319f07d
|
|
| BLAKE2b-256 |
0f305dfcfbece9afa1002c41ee10186eaa15f9c0fba5495baaa064cd66b66f3e
|
Provenance
The following attestation bundles were made for action_platform-0.2.0-py3-none-any.whl:
Publisher:
python-publish-pypi.yml on actionplatform/action-platform
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
action_platform-0.2.0-py3-none-any.whl -
Subject digest:
fee9b5e39cb52ecf5193c07e96bbfaa54c426e4f455585826aeda66a08650ac1 - Sigstore transparency entry: 2804949989
- Sigstore integration time:
-
Permalink:
actionplatform/action-platform@2b6c908556a458471f7b1036b7e16e116b0d54f9 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/actionplatform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish-pypi.yml@2b6c908556a458471f7b1036b7e16e116b0d54f9 -
Trigger Event:
release
-
Statement type: