diff --git a/README.md b/README.md
index c0760e0445cdc89874087047a449f7837894dbee..4d98b72f05e40301ed2a9646e70e22669e268c4d 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,57 @@
 
 resource management tooling & experiments
 
-TODO ...
+
+
+## running locally
+
+*this is a quick setup version for running
+standalone on your local machine (will be
+merged into the full docs later)*
+
+### database setup
+
+  * set the value of `sqlalchemy.url`
+    in `alembic.ini` to point to a writeable file, e.g.
+    ```python
+        sqlalchemy.url = sqlite:////absolute/path/to/foo.db
+    ```
+  * create the database by running the alembic
+    migration from the top-level directory
+    ```bash
+        alembic upgrade head
+    ```
+
+### running the app
+
+
+  * create a settings filename
+    (see `config-example.json` for an example) ... something like:
+    ```json
+      {
+        "db": "sqlite:////tmp/test.db",
+        "ssh": {
+            "username": "ro-username",
+            "private-key": "/absolute/path/to/private/key"
+        }
+      }
+    ```
+  * run the app like this
+    (`app.py` starts the server on port 44444):
+    ```bash
+        SETTINGS_FILENAME=/absolute/path/to/config.json python -m resource_management.app
+    ```
+
+### examples
+
+  * get the version
+    ```bash
+        curl http://localhost:44444/api/version
+    ```
+  * load interfaces from a router
+    ```bash
+        curl -X POST http://localhost:44444/api/initialize-router/router.host.name
+    ```
+  * view the docs by loading `http://localhost:44444/docs`
+    in your browser (there are requests for reserving
+    lags and physical lag interfaces)
diff --git a/config-example.json b/config-example.json
new file mode 100644
index 0000000000000000000000000000000000000000..a3181baefdae7eafdab12a4fb0898b144c8db443
--- /dev/null
+++ b/config-example.json
@@ -0,0 +1,7 @@
+{
+  "db": "sqlite:////tmp/test.db",
+  "ssh": {
+      "username": "ro-username",
+      "private-key": "/absolute/path/to/private/key"
+  }
+}
\ No newline at end of file
diff --git a/resource_management/alembic.ini b/resource_management/alembic.ini
index 01d7a46c79aea3b4c60203d6572783ccf26a3067..0aad7a6e5e6cd079ffb64a6c68f290e6dcec4973 100644
--- a/resource_management/alembic.ini
+++ b/resource_management/alembic.ini
@@ -3,5 +3,7 @@
 # make sure the right line is un / commented depending on which schema you want
 # a migration for
 script_location = migrations
-# change this to run migrations from the command line
-sqlalchemy.url = mysql://dummy:dummy-pass@localhost/resources_test
+sqlalchemy.url = sqlite:////absolute/path/to/foo.db
+sqlalchemy.url = sqlite:////Users/reid/workspace/nat/resource-management/resource_management/foo.db
+# or here is an example of a mysql dsn
+# sqlalchemy.url = mysql://dummy:dummy-pass@localhost/resources_db_name
diff --git a/resource_management/app.py b/resource_management/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..47da1ce6f81f0a107ba43a3b7c2e91407b2034a5
--- /dev/null
+++ b/resource_management/app.py
@@ -0,0 +1,14 @@
+"""
+default app creation
+"""
+import resource_management
+
+app = resource_management.create_app()
+
+if __name__ == "__main__":
+    import uvicorn
+    uvicorn.run(
+        'resource_management.app:app',
+        host='0.0.0.0',
+        port=44444,
+        log_level='debug')
diff --git a/resource_management/db/__init__.py b/resource_management/db/__init__.py
index 661cc76cc4d2782824633e99f7657199429a790b..f833291783cebe323040785a6a64ec11b659c7ce 100644
--- a/resource_management/db/__init__.py
+++ b/resource_management/db/__init__.py
@@ -38,8 +38,9 @@ def init_db_model(dsn):
 
     # cf. https://docs.sqlalchemy.org/en
     #        /latest/orm/extensions/automap.html
-    engine = create_engine(
-        dsn, pool_size=10, pool_recycle=3600)
+    engine = create_engine(dsn)
+    # engine = create_engine(
+    #     dsn, pool_size=10, pool_recycle=3600)
     # engine = create_engine(
     #     dsn, pool_size=10, max_overflow=0, pool_recycle=3600)
 
diff --git a/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py b/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py
deleted file mode 100644
index ed1d804cf7bc6c1e4eac001bc00d54163a6f0066..0000000000000000000000000000000000000000
--- a/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""create initial tables
-
-Revision ID: 1983660b3e64
-Revises:
-Create Date: 2022-12-18 14:16:34.695912
-
-"""
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision = '1983660b3e64'
-down_revision = None
-branch_labels = None
-depends_on = None
-
-
-def upgrade() -> None:
-    op.create_table(
-        'nodes',
-        sa.Column('id', sa.Integer, primary_key=True),
-        sa.Column('fqdn', sa.String(256), nullable=False))
-
-    op.create_table(
-        'line_cards',
-        sa.Column('id', sa.Integer, primary_key=True),
-        sa.Column('slot', sa.Integer, nullable=False),
-        sa.Column('model', sa.String(256), nullable=False),
-        sa.Column('serial', sa.String(256), nullable=False),
-        sa.Column('description', sa.String(256), nullable=False),
-        sa.Column(
-            'node_id',
-            sa.Integer,
-            sa.ForeignKey('nodes.id'),
-            nullable=False))
-
-    op.create_table(
-        'ports',
-        sa.Column('id', sa.Integer, primary_key=True),
-        sa.Column('pic', sa.Integer, nullable=False),
-        sa.Column('position', sa.Integer, nullable=False),
-        sa.Column('interface', sa.String(256), nullable=True),
-        sa.Column('cable', sa.String(256), nullable=True),
-        sa.Column('cable', sa.String(256), nullable=True),
-        sa.Column(
-            'line_card_id',
-            sa.Integer,
-            sa.ForeignKey('line_cards.id'),
-            nullable=False))
-
-    op.create_table(
-        'port_speed_capabilities',
-        sa.Column('id', sa.Integer, primary_key=True),
-        sa.Column('speed', sa.String(256), nullable=True),
-        sa.Column(
-            'port_id',
-            sa.Integer,
-            sa.ForeignKey('ports.id'),
-            nullable=False))
-
-
-def downgrade() -> None:
-    op.drop_table('port_speed_capabilities')
-    op.drop_table('ports')
-    op.drop_table('line_cards')
-    op.drop_table('nodes')
diff --git a/resource_management/migrations/versions/1ec562888fd6_initial_tables.py b/resource_management/migrations/versions/1ec562888fd6_initial_tables.py
new file mode 100644
index 0000000000000000000000000000000000000000..34fabf1e874ca1b34843a80e0ba8191231373b9e
--- /dev/null
+++ b/resource_management/migrations/versions/1ec562888fd6_initial_tables.py
@@ -0,0 +1,74 @@
+"""initial tables
+
+Revision ID: 1ec562888fd6
+Revises: N/A
+Create Date: 2023-03-20 07:05:18.984767
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '1ec562888fd6'
+down_revision = None
+branch_labels = None
+depends_on = None
+
+
+def upgrade() -> None:
+
+    op.create_table(
+        'routers',
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('fqdn', sa.String(256), nullable=False))
+
+    op.create_table(
+        'lags',
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('name', sa.String, nullable=False),
+        sa.Column(
+            'availability',
+            sa.Enum('AVAILABLE', 'USED', 'RESERVED', name='lag_availability'),
+            nullable=False),
+        sa.Column(
+            'router_id',
+            sa.Integer,
+            sa.ForeignKey('routers.id'),
+            nullable=False))
+
+    op.create_table(
+        'physical_interfaces',
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('name', sa.String, nullable=False),
+        sa.Column(
+            'availability',
+            sa.Enum('AVAILABLE', 'USED', 'RESERVED', name='lag_availability'),
+            nullable=False),
+        sa.Column(
+            'router_id',
+            sa.Integer,
+            sa.ForeignKey('routers.id'),
+            nullable=False),
+        sa.Column(
+            'lag_id',
+            sa.Integer,
+            sa.ForeignKey('lags.id'),
+            nullable=True))
+
+    op.create_table(
+        'logical_interfaces',
+        sa.Column('id', sa.Integer, primary_key=True),
+        sa.Column('name', sa.String, nullable=False),
+        sa.Column(
+            'physical_id',
+            sa.Integer,
+            sa.ForeignKey('physical_interfaces.id'),
+            nullable=False))
+
+
+def downgrade() -> None:
+    op.drop_table('logical_interfaces')
+    op.drop_table('physical_interfaces')
+    op.drop_table('lags')
+    op.drop_table('routers')