diff --git a/.gitignore b/.gitignore
index ea4b5423fc44e409b96c6051207fa6ba96009f6d..08aaa8ee46cef6362c9395208a3ab9ba1f2b3f48 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,6 @@
 
 # build and conda-build artifacts
 build/*
+conda-bld/*
 dist/*
 *.egg-info/*
\ No newline at end of file
diff --git a/conda-recipe/publish.py b/conda-recipe/publish.py
new file mode 100644
index 0000000000000000000000000000000000000000..5bc524427410c203e90def73aaeb30b8eb85fef1
--- /dev/null
+++ b/conda-recipe/publish.py
@@ -0,0 +1,39 @@
+"""
+Automate registration of conda build artifacts to EMBL GitLab;
+assumes API access token is recorded in ~/.pypirc shell configuration file
+"""
+from configparser import ConfigParser
+import json
+from pathlib import Path
+import requests
+
+id = '5668'
+proj = 'model_server'
+root = Path('../conda-bld/')
+
+# get authentication info from local config file
+cfg = ConfigParser()
+cfg.read(Path.home() / '.pypirc')
+user = cfg['gitlab-model-server']['username']
+pwd = cfg['gitlab-model-server']['password']
+
+with open(root / 'channeldata.json', 'r') as fh:
+    chdata = json.load(fh)
+
+# upload to GitLab API
+res = []
+for sd in ['noarch', 'win-64']:
+    with open(root / sd / 'repodata.json', 'r') as fh:
+        dd = json.load(fh)
+    for fn in dd['packages'].keys():
+        ver = dd['packages'][fn]['version']
+        stem = fn.split('.tar.bz2')[0]
+        pkgname = f'conda_{sd}_{stem}'
+        res.append(
+            requests.put(
+                f'https://git.embl.de/api/v4/projects/{id}/packages/generic/{pkgname}/{ver}/{fn}?status=default',
+                headers={'PRIVATE-TOKEN': pwd},
+            )
+        )
+print('Finished')
+print(res)
\ No newline at end of file