diff --git a/setup.py b/setup.py
index 1572b2f..6d87cbf 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@ install_requires = [
 ]
 
 setup(
-    name='starttls_policy',
+    name='starttls_policy_cli',
     version=version,
     description="Policy API for STARTTLS Preload",
     url='https://github.com/EFForg/starttls-everywhere',
@@ -54,7 +54,7 @@ setup(
     },
     entry_points={
         'console_scripts': [
-            'starttls-policy = starttls_policy.main:main',
+            'starttls-policy-cli = starttls_policy_cli.main:main',
         ],
     }
 )
diff --git a/starttls_policy/__init__.py b/starttls_policy_cli/__init__.py
similarity index 100%
rename from starttls_policy/__init__.py
rename to starttls_policy_cli/__init__.py
diff --git a/starttls_policy/configure.py b/starttls_policy_cli/configure.py
similarity index 97%
rename from starttls_policy/configure.py
rename to starttls_policy_cli/configure.py
index 5aae81d..8ec010d 100644
--- a/starttls_policy/configure.py
+++ b/starttls_policy_cli/configure.py
@@ -6,9 +6,9 @@ import abc
 import os
 import six
 
-from starttls_policy import constants
-from starttls_policy import policy
-from starttls_policy import util
+from starttls_policy_cli import constants
+from starttls_policy_cli import policy
+from starttls_policy_cli import util
 
 class ConfigGenerator(object):
     # pylint: disable=useless-object-inheritance
diff --git a/starttls_policy/constants.py b/starttls_policy_cli/constants.py
similarity index 100%
rename from starttls_policy/constants.py
rename to starttls_policy_cli/constants.py
diff --git a/starttls_policy/main.py b/starttls_policy_cli/main.py
similarity index 96%
rename from starttls_policy/main.py
rename to starttls_policy_cli/main.py
index 60ef916..2963964 100644
--- a/starttls_policy/main.py
+++ b/starttls_policy_cli/main.py
@@ -2,7 +2,7 @@
 import argparse
 import os
 
-from starttls_policy import configure
+from starttls_policy_cli import configure
 
 GENERATORS = {
     "postfix": configure.PostfixGenerator,
diff --git a/starttls_policy/policy.json b/starttls_policy_cli/policy.json
similarity index 100%
rename from starttls_policy/policy.json
rename to starttls_policy_cli/policy.json
diff --git a/starttls_policy/policy.py b/starttls_policy_cli/policy.py
similarity index 99%
rename from starttls_policy/policy.py
rename to starttls_policy_cli/policy.py
index 0252cf5..f011232 100644
--- a/starttls_policy/policy.py
+++ b/starttls_policy_cli/policy.py
@@ -5,8 +5,8 @@ import datetime
 import io
 import json
 import six
-from starttls_policy import util
-from starttls_policy import constants
+from starttls_policy_cli import util
+from starttls_policy_cli import constants
 
 logger = logging.getLogger(__name__)
 logger.addHandler(logging.StreamHandler())
diff --git a/starttls_policy/util.py b/starttls_policy_cli/util.py
similarity index 100%
rename from starttls_policy/util.py
rename to starttls_policy_cli/util.py
diff --git a/tools/release.sh b/tools/release.sh
new file mode 100755
index 0000000..f5e05f4
--- /dev/null
+++ b/tools/release.sh
@@ -0,0 +1,71 @@
+#!/bin/sh -xe
+
+# Note: running this file will require you to enter the PGP card pin. Have it
+# memorized or in the clipboard before running this script.
+# After the release, run:
+#   `twine upload "./dist.$version/*/*"`
+
+DEV_RELEASE_BRANCH="$1"
+PORT=4000
+
+# Release dev packages to PyPI
+version="0.0.0.dev$(date +%Y%m%d)"
+tag="v$version"
+git tag --delete "$tag" || true
+
+# Check out dev branch in fresh repo clone
+root="$(mktemp -d -t starttls-policy-cli.$version.XXX)"
+git clone . $root
+cd $root
+git branch -f "$DEV_RELEASE_BRANCH"
+git checkout "$DEV_RELEASE_BRANCH"
+
+# Update version number
+sed -i "s/^version.*/version = '$version'/" setup.py
+
+# Sign tagged commit
+git add -p
+git -c commit.gpgsign=true commit -m "Release $version"
+git tag --local-user "842AEA40C5BCD6E1" \
+    --sign --message "Release $version" "$tag"
+
+# Build
+python setup.py clean
+rm -rf build dist
+python setup.py sdist
+python setup.py bdist_wheel
+
+# GPG-sign wheels
+for x in dist/*.tar.gz dist/*.whl
+do
+  gpg --detach-sign --armor --sign --local-user "842AEA40C5BCD6E1" $x
+done
+
+cd -
+
+mkdir "dist.$version"
+mv $root/dist "dist.$version/starttls-policy-cli"
+for pkg_dir in $subpkgs_dirs
+do
+  mv $pkg_dir/dist "dist.$version/$pkg_dir/"
+done
+
+echo "Testing packages"
+cd "dist.$version"
+# start local PyPI
+python -m SimpleHTTPServer $PORT &
+# cd .. is NOT done on purpose: we make sure that all subpacakges are
+# installed from local PyPI rather than current directory (repo root)
+virtualenv --no-site-packages ../venv
+. ../venv/bin/activate
+# Now, use our local PyPI. --pre allows installation of pre-release (incl. dev)
+pip install \
+  --pre \
+  --extra-index-url http://localhost:$PORT \
+  starttls-policy-cli
+# stop local PyPI
+kill $!
+
+echo "In order to upload packages run the following command:"
+echo twine upload "$root/dist.$version/*/*"
+

Publish package in python package index
[PyPI](https://pypi.org/) is a convenient way to deploy python packages using pip and central repo. No matter if code is still alpha or beta - PyPI allows that and has appropriate classifiers for such packages. I think such move almost without efforts allows wider spread of package usage.
diff --git a/starttls_policy/tests/__init__.py b/starttls_policy_cli/tests/__init__.py
similarity index 100%
rename from starttls_policy/tests/__init__.py
rename to starttls_policy_cli/tests/__init__.py
diff --git a/starttls_policy/tests/configure_test.py b/starttls_policy_cli/tests/configure_test.py
similarity index 96%
rename from starttls_policy/tests/configure_test.py
rename to starttls_policy_cli/tests/configure_test.py
index dc864de..5bd4b2e 100644
--- a/starttls_policy/tests/configure_test.py
+++ b/starttls_policy_cli/tests/configure_test.py
@@ -6,8 +6,8 @@ import os
 
 import mock
 
-from starttls_policy import configure
-from starttls_policy.tests.util import param, parametrize_over
+from starttls_policy_cli import configure
+from starttls_policy_cli.tests.util import param, parametrize_over
 
 class MockGenerator(configure.ConfigGenerator):
     """Mock config generator for testing"""
@@ -44,7 +44,7 @@ class TestConfigGenerator(unittest.TestCase):
     def test_manual_instructions(self):
         with TempPolicyDir(test_json) as testdir:
             generator = MockGenerator(testdir)
-            with mock.patch("starttls_policy.configure.six.print_") as mock_print:
+            with mock.patch("starttls_policy_cli.configure.six.print_") as mock_print:
                 generator.manual_instructions()
                 mock_print.assert_called_once_with("\n"
                     "--------------------------------------------------\n"
diff --git a/starttls_policy/tests/main_test.py b/starttls_policy_cli/tests/main_test.py
similarity index 96%
rename from starttls_policy/tests/main_test.py
rename to starttls_policy_cli/tests/main_test.py
index 4b19c21..7c4a593 100644
--- a/starttls_policy/tests/main_test.py
+++ b/starttls_policy_cli/tests/main_test.py
@@ -3,7 +3,7 @@ import unittest
 import sys
 import mock
 
-from starttls_policy import main
+from starttls_policy_cli import main
 
 class TestArguments(unittest.TestCase):
     """Testing argument parser"""
@@ -52,7 +52,7 @@ class TestPerform(unittest.TestCase):
         parser.error = mock.MagicMock(side_effect=Exception)
         self.assertRaises(Exception, main._perform, parser.parse_args(), parser)
 
-    @mock.patch("starttls_policy.main._ensure_directory")
+    @mock.patch("starttls_policy_cli.main._ensure_directory")
     def test_generate(self, ensure_directory):
         # pylint: disable=protected-access, unused-argument
         main.GENERATORS = {"exists": mock.MagicMock()}
diff --git a/starttls_policy/tests/policy_test.py b/starttls_policy_cli/tests/policy_test.py
similarity index 98%
rename from starttls_policy/tests/policy_test.py
rename to starttls_policy_cli/tests/policy_test.py
index dc913a3..0a8b252 100644
--- a/starttls_policy/tests/policy_test.py
+++ b/starttls_policy_cli/tests/policy_test.py
@@ -5,8 +5,8 @@ import datetime
 import json
 import mock
 
-from starttls_policy import policy
-from starttls_policy import util
+from starttls_policy_cli import policy
+from starttls_policy_cli import util
 
 test_json = '{\
     "author": "Electronic Frontier Foundation",\
@@ -43,7 +43,7 @@ class TestConfig(unittest.TestCase):
         self.conf.policies = {'eff.org': self.sample_policy}
 
     def test_flush(self):
-        with mock.patch("starttls_policy.policy.open", mock.mock_open()) as m:
+        with mock.patch("starttls_policy_cli.policy.open", mock.mock_open()) as m:
             self.conf.flush("lol.txt")
             m.assert_called_with("lol.txt", "w")
             m().write.assert_called_once()
diff --git a/starttls_policy/tests/testdata/bigger_test_config.json b/starttls_policy_cli/tests/testdata/bigger_test_config.json
similarity index 100%
rename from starttls_policy/tests/testdata/bigger_test_config.json
rename to starttls_policy_cli/tests/testdata/bigger_test_config.json
diff --git a/starttls_policy/tests/testdata/config.json b/starttls_policy_cli/tests/testdata/config.json
similarity index 100%
rename from starttls_policy/tests/testdata/config.json
rename to starttls_policy_cli/tests/testdata/config.json
diff --git a/starttls_policy/tests/testdata/utf8.json b/starttls_policy_cli/tests/testdata/utf8.json
similarity index 100%
rename from starttls_policy/tests/testdata/utf8.json
rename to starttls_policy_cli/tests/testdata/utf8.json
diff --git a/starttls_policy/tests/util.py b/starttls_policy_cli/tests/util.py
similarity index 100%
rename from starttls_policy/tests/util.py
rename to starttls_policy_cli/tests/util.py
diff --git a/starttls_policy/tests/util_test.py b/starttls_policy_cli/tests/util_test.py
similarity index 97%
rename from starttls_policy/tests/util_test.py
rename to starttls_policy_cli/tests/util_test.py
index 6d22d8f..5ceb70d 100644
--- a/starttls_policy/tests/util_test.py
+++ b/starttls_policy_cli/tests/util_test.py
@@ -2,7 +2,7 @@
 import unittest
 from functools import partial
 
-from starttls_policy import util
+from starttls_policy_cli import util
 
 class TestEnforceUtil(unittest.TestCase):
     """ Unittests for "enforcer" functions."""

pip install -e .[dev]
parse_log_pytest
requirements.txt
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
astroid==3.3.9
coverage==7.8.0
DateTime==5.5
dill==0.3.9
exceptiongroup==1.2.2
iniconfig==2.1.0
isort==6.0.1
mccabe==0.7.0
mock==5.2.0
packaging==24.2
platformdirs==4.3.7
pluggy==1.5.0
pylint==3.3.6
pytest==8.3.5
pytest-cov==6.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
six==1.17.0
-e git+https://github.com/EFForg/starttls-policy-cli.git@21fde1a352aa22dd885d4c2bd25e713470740582#egg=starttls_policy
tomli==2.2.1
tomlkit==0.13.2
typing_extensions==4.13.0
zope.interface==7.2

name: starttls-policy-cli
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
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - astroid==3.3.9
      - coverage==7.8.0
      - datetime==5.5
      - dill==0.3.9
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - isort==6.0.1
      - mccabe==0.7.0
      - mock==5.2.0
      - packaging==24.2
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pylint==3.3.6
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - six==1.17.0
      - tomli==2.2.1
      - tomlkit==0.13.2
      - typing-extensions==4.13.0
      - zope-interface==7.2
prefix: /opt/conda/envs/starttls-policy-cli

starttls_policy_cli/tests/configure_test.py::TestConfigGenerator::test_generate starttls_policy_cli/tests/configure_test.py::TestConfigGenerator::test_manual_instructions starttls_policy_cli/tests/configure_test.py::TestPostfixGenerator::test_expired_policy starttls_policy_cli/tests/configure_test.py::TestPostfixGenerator::test_instruct_string starttls_policy_cli/tests/configure_test.py::TestPostfixGenerator::test_mta_name starttls_policy_cli/tests/configure_test.py::TestPostfixGenerator::test_simple_policy starttls_policy_cli/tests/main_test.py::TestArguments::test_default_dir starttls_policy_cli/tests/main_test.py::TestArguments::test_generate_arg starttls_policy_cli/tests/main_test.py::TestArguments::test_generate_no_arg starttls_policy_cli/tests/main_test.py::TestArguments::test_no_args_require_generate starttls_policy_cli/tests/main_test.py::TestArguments::test_policy_dir starttls_policy_cli/tests/main_test.py::TestPerform::test_ensure_directory starttls_policy_cli/tests/main_test.py::TestPerform::test_generate_unknown starttls_policy_cli/tests/policy_test.py::TestConfig::test_basic_parsing starttls_policy_cli/tests/policy_test.py::TestConfig::test_flush starttls_policy_cli/tests/policy_test.py::TestConfig::test_iter_policies starttls_policy_cli/tests/policy_test.py::TestConfig::test_iter_policies_aliased starttls_policy_cli/tests/policy_test.py::TestConfig::test_merge_keeps_old_policies starttls_policy_cli/tests/policy_test.py::TestConfig::test_merge_keeps_old_settings starttls_policy_cli/tests/policy_test.py::TestConfig::test_no_aliasing_in_alias starttls_policy_cli/tests/policy_test.py::TestConfig::test_set_aliased_policy starttls_policy_cli/tests/policy_test.py::TestConfig::test_set_author starttls_policy_cli/tests/policy_test.py::TestConfig::test_set_pins_for_policy starttls_policy_cli/tests/policy_test.py::TestConfig::test_set_policies starttls_policy_cli/tests/policy_test.py::TestConfig::test_timestamp_and_exipres_required starttls_policy_cli/tests/policy_test.py::TestConfig::test_update_drops_old_policies starttls_policy_cli/tests/policy_test.py::TestConfig::test_update_drops_old_settings starttls_policy_cli/tests/policy_test.py::TestPolicy::test_alias_valid starttls_policy_cli/tests/policy_test.py::TestPolicy::test_merge_keeps_old_mxs starttls_policy_cli/tests/policy_test.py::TestPolicy::test_mode_default starttls_policy_cli/tests/policy_test.py::TestPolicy::test_mode_valid starttls_policy_cli/tests/policy_test.py::TestPolicy::test_mta_sts starttls_policy_cli/tests/policy_test.py::TestPolicy::test_mxs starttls_policy_cli/tests/policy_test.py::TestPolicy::test_no_alias_policy_cant_set_alias starttls_policy_cli/tests/policy_test.py::TestPolicy::test_pins_valid starttls_policy_cli/tests/policy_test.py::TestPolicy::test_tls_report starttls_policy_cli/tests/policy_test.py::TestPolicy::test_tls_version_default starttls_policy_cli/tests/policy_test.py::TestPolicy::test_tls_version_valid starttls_policy_cli/tests/policy_test.py::TestPolicy::test_update_drops_old_mxs starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_enforce_bad_fields starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_enforce_fields starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_enforce_in starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_enforce_list starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_enforce_type starttls_policy_cli/tests/util_test.py::TestEnforceUtil::test_parse_bad_datestring
starttls_policy_cli/tests/main_test.py::TestPerform::test_generate
setup.py starttls_policy/constants.py starttls_policy/main.py starttls_policy/configure.py starttls_policy/policy.py starttls_policy/__init__.py tools/release.sh starttls_policy/policy.json starttls_policy/util.py
starttls_policy_cli/constants.py setup.py starttls_policy_cli/policy.py starttls_policy_cli/policy.json starttls_policy_cli/main.py starttls_policy_cli/util.py tools/release.sh starttls_policy_cli/configure.py starttls_policy_cli/__init__.py