diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..c3a6fa10bd106a2f61639d84cc43291fd08a175d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "frontend"]
+	path = frontend
+	url = git@gitlab.mi.hdm-stuttgart.de:griesshaber/evotree.git
diff --git a/api/__init__.py b/api/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/main.py b/api/main.py
index 50a44372796685eaf9b450612d1887bb75ffca5b..3226ba95d2547110125ef04b94ddcbb3cc3cd698 100644
--- a/api/main.py
+++ b/api/main.py
@@ -1,12 +1,35 @@
-from fastapi import FastAPI, Request
+from fastapi import FastAPI, Request, Response
+from fastapi.staticfiles import StaticFiles
+from requests import request as make_request
+
+from api.routers import runs
 
 # from api.optimization import Backend
 
 DEBUG = True
 
 app = FastAPI(debug=DEBUG, title="Prompt Optimization Backend")
+app.include_router(runs.router, prefix="/api/runs")
+if DEBUG:
+
+    @app.get("/{_:path}")
+    async def frontent_dev(request: Request):
+        response = make_request(
+            method=request.method,
+            url=f"{request.url.replace(port=3000)}",
+            headers=request.headers,
+            stream=True,
+        )
+        return Response(
+            content=response.raw.read(),
+            status_code=response.status_code,
+            headers=response.headers,
+            media_type=response.headers["content-type"],
+        )
+
+else:
+    app.mount("/", StaticFiles(directory="frontend/build/", html=True), name="frontend")
 
-# api = Backend(debug=DEBUG)
 
 def test():
     pass
@@ -37,8 +60,3 @@ async def evolve(prompt1: str, prompt2: str) -> str:
 @app.get("/family_tree/get")
 async def get_family() -> dict:
     return dict()
-
-
-@app.get("/")
-def main(request: Request) -> str:
-    return "server running"
diff --git a/api/routers/__init__.py b/api/routers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/routers/runs.py b/api/routers/runs.py
new file mode 100644
index 0000000000000000000000000000000000000000..20b1dafae25e8feb711f47d60079f24110bb5d34
--- /dev/null
+++ b/api/routers/runs.py
@@ -0,0 +1,24 @@
+import json
+from pathlib import Path
+
+from fastapi import APIRouter
+
+router = APIRouter()
+
+runs_directory = Path("runs")
+
+
+@router.get("/")
+async def list():
+    return [
+        run.name
+        for run in runs_directory.iterdir()
+        if run.is_dir() and (run / "snapshot.json").exists()
+    ]
+
+
+@router.get("/{run_name}/")
+async def get(run_name: str):
+    run_path = runs_directory / run_name
+    snapshot = run_path / "snapshot.json"
+    return json.load(snapshot.open("r"))
diff --git a/frontend b/frontend
new file mode 160000
index 0000000000000000000000000000000000000000..d430de1597342eedf0cede1873507a3ffaa28dbb
--- /dev/null
+++ b/frontend
@@ -0,0 +1 @@
+Subproject commit d430de1597342eedf0cede1873507a3ffaa28dbb