diff --git a/README.rst b/README.rst
index c6602be..ccbd4a7 100644
--- a/README.rst
+++ b/README.rst
@@ -238,6 +238,13 @@ To ignore these warnings, you can run the deployment with the flag ``--ignore-wa
 In that case, the warning is printed, but the script continues and waits for a successful
 deployment until it times out.
 
+Deployment timeout
+==================
+The deploy and scale actions allow defining a timeout (in seconds) via the ``--timeout`` parameter.
+This instructs ecs-deploy to wait for ECS to finish the deployment for the given number of seconds.
+
+To run a deployment without waiting for the successful or failed result at all, set ``--timeout`` to the value of ``-1``.
+
 Scaling
 -------
 
diff --git a/ecs_deploy/cli.py b/ecs_deploy/cli.py
index 45cdfee..869a0bc 100644
--- a/ecs_deploy/cli.py
+++ b/ecs_deploy/cli.py
@@ -37,7 +37,7 @@ def get_client(access_key_id, secret_access_key, region, profile):
 @click.option('--access-key-id', required=False, help='AWS access key id')
 @click.option('--secret-access-key', required=False, help='AWS secret access key')
 @click.option('--profile', required=False, help='AWS configuration profile name')
-@click.option('--timeout', required=False, default=300, type=int, help='Amount of seconds to wait for deployment before command fails (default: 300)')
+@click.option('--timeout', required=False, default=300, type=int, help='Amount of seconds to wait for deployment before command fails (default: 300). To disable timeout (fire and forget) set to -1')
 @click.option('--ignore-warnings', is_flag=True, help='Do not fail deployment on warnings (port already in use or insufficient memory/CPU)')
 @click.option('--newrelic-apikey', required=False, help='New Relic API Key for recording the deployment')
 @click.option('--newrelic-appid', required=False, help='New Relic App ID for recording the deployment')
@@ -113,7 +113,7 @@ def deploy(cluster, service, tag, image, command, env, secret, role, task, regio
 @click.option('--access-key-id', help='AWS access key id')
 @click.option('--secret-access-key', help='AWS secret access key')
 @click.option('--profile', help='AWS configuration profile name')
-@click.option('--timeout', default=300, type=int, help='AWS configuration profile')
+@click.option('--timeout', default=300, type=int, help='Amount of seconds to wait for deployment before command fails (default: 300). To disable timeout (fire and forget) set to -1')
 @click.option('--ignore-warnings', is_flag=True, help='Do not fail deployment on warnings (port already in use or insufficient memory/CPU)')
 def scale(cluster, service, desired_count, access_key_id, secret_access_key, region, profile, timeout, ignore_warnings):
     """
@@ -202,10 +202,15 @@ def run(cluster, task, count, command, env, secret, region, access_key_id, secre
 def wait_for_finish(action, timeout, title, success_message, failure_message,
                     ignore_warnings):
     click.secho(title, nl=False)
-    waiting = True
     waiting_timeout = datetime.now() + timedelta(seconds=timeout)
     service = action.get_service()
     inspected_until = None
+
+    if timeout == -1:
+        waiting = False
+    else:
+        waiting = True
+
     while waiting and datetime.now() < waiting_timeout:
         click.secho('.', nl=False)
         service = action.get_service()

Deploy without timeout or wait
Hi,

I want to thank you guys for this fantastic utility program to simplify deployment on ECS. Are there plans to support deployments without a timeout option?

For certain deployments (especially launch type Fargate) it appears ECS Cluster manager takes a while to shutdown/deregister from ASG and reach steady state. The default 300s is not really enough, but it is hard to know when to arbitrarily increase it to

In certain projects, it may be better to not have a timeout. Is this an functionality being considered?
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 043a894..d29f1de 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -1,3 +1,5 @@
+from datetime import datetime
+
 import pytest
 from click.testing import CliRunner
 from mock.mock import patch
@@ -484,6 +486,30 @@ def test_deploy_with_timeout(get_client, runner):
            u"https://github.com/fabfuel/ecs-deploy#timeout" in result.output
 
 
+@patch('ecs_deploy.cli.get_client')
+def test_deploy_with_wait_within_timeout(get_client, runner):
+    get_client.return_value = EcsTestClient('acces_key', 'secret_key', wait=2)
+    result = runner.invoke(cli.deploy, (CLUSTER_NAME, SERVICE_NAME, '--timeout', '10'))
+    assert result.exit_code == 0
+    assert u'Deploying new task definition...' in result.output
+
+
+@patch('ecs_deploy.cli.get_client')
+def test_deploy_without_timeout(get_client, runner):
+    get_client.return_value = EcsTestClient('acces_key', 'secret_key', wait=2)
+
+    start_time = datetime.now()
+    result = runner.invoke(cli.deploy, (CLUSTER_NAME, SERVICE_NAME, '--timeout', '-1'))
+    end_time = datetime.now()
+
+    assert result.exit_code == 0
+
+    # assert task is not waiting for deployment
+    assert u'Deploying new task definition\n' in result.output
+    assert u'...' not in result.output
+    assert (end_time - start_time).total_seconds() < 1
+
+
 @patch('ecs_deploy.cli.get_client')
 def test_deploy_unknown_task_definition_arn(get_client, runner):
     get_client.return_value = EcsTestClient('acces_key', 'secret_key')

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-mock mock requests boto3
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
boto3==1.23.10
botocore==1.26.10
certifi==2021.5.30
charset-normalizer==2.0.12
click==6.7
coverage==6.2
-e git+https://github.com/fabfuel/ecs-deploy.git@5a098eb69b19476f7befcb8b1a58213238b648d7#egg=ecs_deploy
future==1.0.0
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jmespath==0.10.0
mock==5.2.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-cov==4.0.0
pytest-mock==3.6.1
python-dateutil==2.9.0.post0
requests==2.27.1
s3transfer==0.5.2
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tomli==1.2.3
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: ecs-deploy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - boto3==1.23.10
      - botocore==1.26.10
      - charset-normalizer==2.0.12
      - click==6.7
      - coverage==6.2
      - future==1.0.0
      - idna==3.10
      - jmespath==0.10.0
      - mock==5.2.0
      - pytest-cov==4.0.0
      - pytest-mock==3.6.1
      - python-dateutil==2.9.0.post0
      - requests==2.27.1
      - s3transfer==0.5.2
      - six==1.17.0
      - tomli==1.2.3
      - urllib3==1.26.20
prefix: /opt/conda/envs/ecs-deploy

tests/test_cli.py::test_deploy_without_timeout
tests/test_cli.py::test_get_client tests/test_cli.py::test_ecs tests/test_cli.py::test_deploy_without_credentials tests/test_cli.py::test_deploy_with_invalid_cluster tests/test_cli.py::test_deploy_with_invalid_service tests/test_cli.py::test_deploy tests/test_cli.py::test_deploy_with_rollback tests/test_cli.py::test_deploy_without_deregister tests/test_cli.py::test_deploy_with_role_arn tests/test_cli.py::test_deploy_new_tag tests/test_cli.py::test_deploy_one_new_image tests/test_cli.py::test_deploy_two_new_images tests/test_cli.py::test_deploy_one_new_command tests/test_cli.py::test_deploy_one_new_environment_variable tests/test_cli.py::test_deploy_change_environment_variable_empty_string tests/test_cli.py::test_deploy_new_empty_environment_variable tests/test_cli.py::test_deploy_empty_environment_variable_again tests/test_cli.py::test_deploy_previously_empty_environment_variable_with_value tests/test_cli.py::test_deploy_exclusive_environment tests/test_cli.py::test_deploy_exclusive_secret tests/test_cli.py::test_deploy_one_new_secret_variable tests/test_cli.py::test_deploy_without_changing_environment_value tests/test_cli.py::test_deploy_without_changing_secrets_value tests/test_cli.py::test_deploy_without_diff tests/test_cli.py::test_deploy_with_errors tests/test_cli.py::test_deploy_with_client_errors tests/test_cli.py::test_deploy_ignore_warnings tests/test_cli.py::test_deploy_with_newrelic tests/test_cli.py::test_deploy_with_newrelic_errors tests/test_cli.py::test_deploy_task_definition_arn tests/test_cli.py::test_deploy_with_timeout tests/test_cli.py::test_deploy_with_wait_within_timeout tests/test_cli.py::test_deploy_unknown_task_definition_arn tests/test_cli.py::test_scale_with_invalid_cluster tests/test_cli.py::test_scale_with_invalid_service tests/test_cli.py::test_scale tests/test_cli.py::test_scale_with_errors tests/test_cli.py::test_scale_with_client_errors tests/test_cli.py::test_scale_ignore_warnings tests/test_cli.py::test_scale_with_timeout tests/test_cli.py::test_scale_without_credentials tests/test_cli.py::test_run_task tests/test_cli.py::test_run_task_with_command tests/test_cli.py::test_run_task_with_environment_var tests/test_cli.py::test_run_task_without_diff tests/test_cli.py::test_run_task_with_errors tests/test_cli.py::test_run_task_without_credentials tests/test_cli.py::test_run_task_with_invalid_cluster tests/test_cli.py::test_record_deployment_without_revision tests/test_cli.py::test_record_deployment_without_apikey tests/test_cli.py::test_record_deployment_without_appid tests/test_cli.py::test_record_deployment
README.rst ecs_deploy/cli.py
README.rst ecs_deploy/cli.py