diff --git a/pages/guides/agentverse/avctl/avctl-ci-github.mdx b/pages/guides/agentverse/avctl/avctl-ci-github.mdx
new file mode 100644
index 00000000..6d3492bb
--- /dev/null
+++ b/pages/guides/agentverse/avctl/avctl-ci-github.mdx
@@ -0,0 +1,211 @@
+import { Callout } from 'nextra/components'
+import agentverse_secret from 'src/images/guides/agentverse/avctl/agentverse_secret.png';
+import github_secret from 'src/images/guides/agentverse/avctl/github_secret.png';
+import action from 'src/images/guides/agentverse/avctl/action.png';
+import { ImageByTheme } from "components/mdx"
+import {CodeSegment, GithubCodeSegment} from "../../../../components/code";
+
+# CI with AVCTL and github actions
+
+This guide explains how we deploy an agent, or update a deployed agent on agentverse using AVCTL.
+
+## Structure
+
+We have a [github repo](https://github.com/fetchai/avctl-ci-example) where you can clone this code.
+
+It is made up of three parts, but really two we have our deployment scripts in .github/workflows and in scripts/ and our agen is under agent/.
+
+```
+├── README.md
+├── .github
+│ └── workflows
+│ └── deploy-agent.yaml
+├── agent
+│ ├── README.md
+│ ├── agent.py
+│ ├── poetry.lock
+| └── pyproject.toml
+└── scripts
+ └── deploy-agent.sh
+```
+
+This logic is very simple, we have a github workflow that triggers when the branch main is updated. It then call the
+deployment script in `scripts/deploy-agent.sh`, this script works as follows:
+
+Check if the agent already has an address defined in `.avctl/config.toml`, if it does is this agent registered? If
+it isn't, let's register this agent. If it is registered let's stop this agent and sync it.
+
+You can see the deplot script below, or on [github](https://github.com/fetchai/avctl-ci-example/blob/main/scripts/deploy-agent.sh)
+
+
+
+
+
+
+
+ ```py copy filename="deploy-agent.sh"
+
+ # Define the function
+ get_agent_address() {
+ local file=".avctl/config.toml "
+
+ # Check if the file exists
+ if [ -f "$file" ]; then
+ # Extract the address value
+ agent_address=$(grep 'address =' "$file" | sed -E 's/.*= "(.*)"/\1/')
+
+ # Check if the address is not empty
+ if [ -n "$agent_address" ]; then
+ echo $agent_address
+ else
+ echo ""
+ fi
+ else
+ echo ""
+ fi
+ }
+
+ # Define the specific directory to work on
+ defined_directory="agent/"
+
+ # Change to the specified agent directory
+ cd "$defined_directory"
+
+ # Create a .staging.avctl folder for new agents if it doesn't exist
+ avctl hosting init
+
+ # get the agent address if it exists
+ agent_address=$(get_agent_address)
+
+ # Get the agent's name from the README.md top line header
+ agent_name=$(head -n 1 README.md | sed -e 's/#//g' | xargs)
+
+
+ # If the address exists...
+ if [ -n "$agent_address" ]; then
+ avctl hosting get agent -a "$agent_address"
+ response=$(avctl hosting get agent -a "$agent_address")\
+
+ # Check if the agent is already in existence, if it isn't, deploy as new, else sync.
+ if [ $? -eq 0 ]; then
+ avctl hosting stop -a "$agent_address"
+ avctl hosting sync -a "$agent_address"
+ else
+ avctl hosting deploy -n "$agent_name" --no-dependency-check || true
+ fi
+ # Agent doesn't exist, so let's deploy
+ else
+ avctl hosting deploy -n "$agent_name" --no-dependency-check || true
+ fi
+
+```
+
+
+
+
+
+
+## Getting started
+
+Head on over to [agentverse.ai](https://agentverse.ai) and sign in, under your profile link (top right) there is an
+option for `API Keys`:
+
+
+
+Click this take syou to an API Key window, here click new `+ New API Key`, give the key a name and give this api key
+full permissions. Click generate API Key at the bottom of the page, and copy the output. Detailed instructions can
+also be found [here](/guides/apis/agent-function-creation-apis#how-to-get-agentverse-api-tokens)
+
+Once you've got your API_KEY, be sure to have forked the [github repo](https://github.com/fetchai/avctl-ci-example),
+and visit that repo. Go to settings, on the left hand menu select Secrets and variables, and click actions from the
+drop down. You'll get a window like shown below:
+
+
+
+Click New Repository secret and enter the API_KEY, we have named ours `AGENTVERSE_API_KEY`.
+
+Great with that set, copy in your agent code under agent. It is assumed here that your agent is tested, and you have
+an account on agentverse.
+
+Now, let's push:
+
+```
+git add .
+git commit -m "updating agent"
+git push
+```
+Vistit your forked repo github page, and under actions you should see the runner in action:
+
+
+
+### Possible error
+
+You may need to locally run:
+
+```
+sudo git update-index --chmod=+x scripts/deploy-agent.sh
+```
+
+This tells git to update the permission on the executable script. Then push up the changes for them to take effect.
+
+## Running this locally:
+
+Please follow the installation guide [here](guides/agentverse/avctl/avctl#installation)
+
+Update the permissions on deploy-agent.sh (You should only need to do this once):
+
+```
+chmod +x scripts/deploy-agent.sh
+```
+
+Login to agentverse from terminal:
+
+```
+avctl auth login
+```
+
+Then from terminal run:
+
+```
+./scripts/deploy-agent.sh
+```
+
+You should see output similar too, dependent on your agents deployed state:
+
+```
+josh@vm avctl-ci-example % ./scripts/deploy-agent.sh
+Project already initialized
+Agent exists on agentverse under address: 'agent1qfx5mmewjs4x9ysyxemsaxv6empds4mmpx4sav84yagmhed5yczdwtqkcxu'
+Agent agent1qfx5mmewjs4x9ysyxemsaxv6empds4mmpx4sav84yagmhed5yczdwtqkcxu has been stopped.
+Pushing latest code...
+Everything is up to date. Nothing to push
+Agent agent1qfx5mmewjs4x9ysyxemsaxv6empds4mmpx4sav84yagmhed5yczdwtqkcxu is now running!
+josh@vm avctl-ci-example %
+
+```
+
+## Quirks
+
+Agentvese for security defines your agent address and stores your private key. An address you set locally will not be applied on agentverse using the above method.
+
+## Further steps
+
+To get familiar with AVCTl we recommend reading the other guides in this series: [avctl](guides/agentverse/avctl/avctl), [avct hosting](guides/agentverse/avctl/avctl-hosting).
+
diff --git a/src/images/guides/agentverse/avctl/action.png b/src/images/guides/agentverse/avctl/action.png
new file mode 100644
index 00000000..4652fb7a
Binary files /dev/null and b/src/images/guides/agentverse/avctl/action.png differ
diff --git a/src/images/guides/agentverse/avctl/agentverse_secret.png b/src/images/guides/agentverse/avctl/agentverse_secret.png
new file mode 100644
index 00000000..43828b14
Binary files /dev/null and b/src/images/guides/agentverse/avctl/agentverse_secret.png differ
diff --git a/src/images/guides/agentverse/avctl/github_secret.png b/src/images/guides/agentverse/avctl/github_secret.png
new file mode 100644
index 00000000..597fd319
Binary files /dev/null and b/src/images/guides/agentverse/avctl/github_secret.png differ