diff --git a/bin/geomag_webservice.py b/bin/geomag_webservice.py
new file mode 100755
index 0000000000000000000000000000000000000000..039f401531353065143ddeed20a6fa9e5da7c9c1
--- /dev/null
+++ b/bin/geomag_webservice.py
@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+
+from __future__ import absolute_import, print_function
+
+import os
+import sys
+from wsgiref.simple_server import make_server
+# ensure geomag is on the path before importing
+try:
+    import geomagio  # noqa (tells linter to ignore this line.)
+except ImportError:
+    path = os.path
+    script_dir = path.dirname(path.abspath(__file__))
+    sys.path.append(path.normpath(path.join(script_dir, '..')))
+    import geomagio
+
+
+if __name__ == '__main__':
+    # read configuration from environment
+    edge_host = os.getenv('EDGE_HOST', 'cwbpub.cr.usgs.gov')
+    edge_port = int(os.getenv('EDGE_PORT', '2060'))
+    factory_type = os.getenv('GEOMAG_FACTORY_TYPE', 'edge')
+    webservice_host = os.getenv('GEOMAG_WEBSERVICE_HOST', '')
+    webservice_port = int(os.getenv('GEOMAG_WEBSERVICE_PORT', '7981'))
+
+    # configure factory
+    if factory_type == 'edge':
+        factory = geomagio.edge.EdgeFactory(host=edge_host, port=edge_port)
+    else:
+        raise "Unknown factory type '%s'" % factory_type
+
+    print("Starting webservice on %s:%d" % (webservice_host, webservice_port))
+    app = geomagio.WebService(factory)
+    httpd = make_server(webservice_host, webservice_port, app)
+    httpd.serve_forever()
diff --git a/geomagio/WebService.py b/geomagio/WebService.py
index 411ab6b80f9c2eac0f9188b453a94f9b1d66821c..416381a36e7389ba44d6a0c691b70bdba4e55288 100644
--- a/geomagio/WebService.py
+++ b/geomagio/WebService.py
@@ -74,8 +74,8 @@ def _get_param(params, key, required=False):
 
 
 class WebService(object):
-    def __init__(self, factory, metadata=None):
-        self.factory = factory
+    def __init__(self, factory=None, metadata=None):
+        self.factory = factory or EdgeFactory()
         self.metadata = metadata or ObservatoryMetadata().metadata
         base = os.path.dirname(__file__)
         filepath = os.path.abspath(os.path.join(base, '..', 'package.json'))
@@ -343,11 +343,3 @@ class WebServiceQuery(object):
 class WebServiceException(Exception):
     """Base class for exceptions thrown by web services."""
     pass
-
-
-if __name__ == '__main__':
-    from wsgiref.simple_server import make_server
-
-    app = WebService(EdgeFactory())
-    httpd = make_server('', 7981, app)
-    httpd.serve_forever()
diff --git a/geomagio/__init__.py b/geomagio/__init__.py
index d871a122884b9940dd200d5ac436c9b2414b5d50..036d81bf40a799727e7af6c27970f87436b65e66 100644
--- a/geomagio/__init__.py
+++ b/geomagio/__init__.py
@@ -5,14 +5,15 @@ from __future__ import absolute_import
 
 from . import ChannelConverter
 from . import StreamConverter
+from . import TimeseriesUtility
+from . import Util
 
 from .Controller import Controller
 from .ObservatoryMetadata import ObservatoryMetadata
 from .PlotTimeseriesFactory import PlotTimeseriesFactory
 from .TimeseriesFactory import TimeseriesFactory
 from .TimeseriesFactoryException import TimeseriesFactoryException
-from . import TimeseriesUtility
-from . import Util
+from .WebService import WebService
 
 __all__ = [
     'ChannelConverter',
@@ -25,5 +26,5 @@ __all__ = [
     'TimeseriesFactoryException',
     'TimeseriesUtility',
     'Util',
-    'Url'
+    'WebService'
 ]
diff --git a/setup.py b/setup.py
index a48b62df0bd1ce5de44e63e87e0215e517295414..051486b3bb55387d5b2b25f8851bdac296f5362f 100644
--- a/setup.py
+++ b/setup.py
@@ -26,6 +26,7 @@ setup(
     ],
     scripts=[
         'bin/geomag.py',
-        'bin/make_cal.py',
+        'bin/geomag_webservice.py',
+        'bin/make_cal.py'
     ]
 )