diff --git a/branding/scripts/check-ca-crt.py b/branding/scripts/check-ca-crt.py
new file mode 100755
index 0000000000000000000000000000000000000000..646246784addf8f42cdba2c0b20e6a629199e60b
--- /dev/null
+++ b/branding/scripts/check-ca-crt.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+import re
+import sys
+import urllib.request
+
+SCRIPT_NAME = 'check-ca-crt.py'
+
+USAGE = '''Check that the stored provider CA matches the one announced online.
+Usage: {name} <provider> <uri>
+
+Example: {name} riseup black.riseup.net'''.format(name=SCRIPT_NAME)
+
+
+def getLocalCert(provider):
+    sanitized = re.sub(r'[^\w\s-]', '', provider).strip().lower()
+    with open('config/{provider}-ca.crt'.format(provider=sanitized)) as crt:
+        return crt.read().strip()
+
+
+def getRemoteCert(uri):
+    fp = urllib.request.urlopen('https://' + uri + '/ca.crt')
+    remote_cert = fp.read().decode('utf-8').strip()
+    fp.close()
+    return remote_cert
+
+
+if __name__ == '__main__':
+
+    if len(sys.argv) != 3:
+        print('[!] Not enough arguments')
+        print(USAGE)
+        sys.exit(1)
+
+    provider = sys.argv[1]
+    uri = sys.argv[2]
+
+    local = getLocalCert(provider)
+    remote = getRemoteCert(uri)
+
+    try:
+        assert local == remote
+    except AssertionError:
+        print('[!] ERROR: remote and local CA certs do not match')
+        sys.exit(1)
+    else:
+        print('OK')
diff --git a/branding/scripts/vendorize.py b/branding/scripts/vendorize.py
new file mode 100755
index 0000000000000000000000000000000000000000..46cc1e69ab6f4f04562a60cc96d12757b16017cd
--- /dev/null
+++ b/branding/scripts/vendorize.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+from string import Template
+import configparser
+
+OUTFILE = 'config.go'
+INFILE = 'config.go.tmpl'
+CONFIGFILE = 'config/vendor.conf'
+SCRIPT_NAME = 'vendorize'
+
+
+def getProviderData(config):
+    default = config['default']['provider']
+    print("[+] Configured provider:", default)
+
+    c = config[default]
+    d = dict()
+
+    keys = ('name', 'applicationName', 'binaryName',
+            'providerURL', 'tosURL', 'helpURL',
+            'donateURL', 'apiURL', 'geolocationAPI', 'caCertString')
+
+    for value in keys:
+        d[value] = c.get(value)
+
+    return d
+
+
+def addCaData(data, configfile):
+    provider = data.get('name').lower()
+    folder, f = os.path.split(configfile)
+    caFile = os.path.join(folder, provider + '-ca.crt')
+    if not os.path.isfile(caFile):
+        bail('[!] Cannot find CA file in {path}'.format(path=caFile))
+    with open(caFile) as ca:
+        data['caCertString'] = ca.read().strip()
+
+
+def writeOutput(data, infile, outfile):
+
+    with open(infile) as infile:
+        s = Template(infile.read())
+
+    with open(outfile, 'w') as outf:
+        outf.write(s.substitute(data))
+
+
+def bail(msg=None):
+    if not msg:
+        print('Usage: {scriptname}.py <template> <config> <output>'.format(
+            scriptname=SCRIPT_NAME))
+    else:
+        print(msg)
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+    infile = outfile = ""
+
+    if len(sys.argv) > 4:
+        bail()
+
+    elif len(sys.argv) == 1:
+        infile = INFILE
+        outfile = OUTFILE
+        configfile = CONFIGFILE
+    else:
+        try:
+            infile = sys.argv[1]
+            configfile = sys.argv[2]
+            outfile = sys.argv[3]
+        except IndexError:
+            bail()
+
+    if not os.path.isfile(infile):
+        bail('[!] Cannot find template in {path}'.format(
+            path=os.path.abspath(infile)))
+    elif not os.path.isfile(configfile):
+        bail('[!] Cannot find config in {path}'.format(
+            path=os.path.abspath(configfile)))
+    else:
+        print('[+] Using {path} as template'.format(
+            path=os.path.abspath(infile)))
+        print('[+] Using {path} as config'.format(
+            path=os.path.abspath(configfile)))
+
+    config = configparser.ConfigParser()
+    config.read(configfile)
+
+    data = getProviderData(config)
+    addCaData(data, configfile)
+    writeOutput(data, infile, outfile)
+
+    print('[+] Wrote configuration for {provider} to {outf}'.format(
+        provider=data.get('name'),
+        outf=os.path.abspath(outfile)))
diff --git a/branding/template/config.go b/branding/template/config.go
new file mode 100644
index 0000000000000000000000000000000000000000..c3a9a330ae1ddc1ca029ccb8a0a85c28a9d39648
--- /dev/null
+++ b/branding/template/config.go
@@ -0,0 +1,32 @@
+/*
+   DO NOT EDIT --------------------------------------------------
+
+   This file has been automatically generated by `go generate`.
+   Any changes will be overriden.
+
+   DO NOT EDIT --------------------------------------------------
+*/
+
+package config
+
+/* All these constants are defined in the vendor.conf file
+*/
+const (
+	Provider        = "$providerURL"
+	ApplicationName = "$applicationName"
+	BinaryName      = "$binaryName"
+	DonateURL       = "$donateURL"
+	HelpURL         = "$helpURL"
+	TosURL          = "$tosURL"
+	APIURL          = "$apiURL"
+	GeolocationAPI  = "$geolocationAPI"
+)
+
+/*
+
+CaCert : a string containing a representation of the provider CA, used to
+        sign the webapp and openvpn certificates. should be placed in
+        config/[provider]-ca.crt
+
+*/
+var CaCert = []byte(`$caCertString`)