in starlette-1.0 on_startup (and on_shutdown) parameters have been
 removed from Starlette (and Router). Code now needs to use the lifespan
 parameter.

--- a/platformio/home/run.py
+++ b/platformio/home/run.py
@@ -14,6 +14,8 @@
 
 import os
 from urllib.parse import urlparse
+import contextlib
+import contextvars
 
 import click
 import uvicorn
@@ -86,18 +88,29 @@ def run_server(host, port, no_open, shutdown_timeout, home_url):
     if path != "/":
         routes.append(Route("/", protected_page))
 
+    no_open_var.set(no_open)
+    home_url_var.set(home_url)
+
     uvicorn.run(
         Starlette(
             middleware=[Middleware(ShutdownMiddleware)],
             routes=routes,
-            on_startup=[
-                lambda: click.echo(
-                    "PIO Home has been started. Press Ctrl+C to shutdown."
-                ),
-                lambda: None if no_open else click.launch(home_url),
-            ],
+            lifespan=lifespan,
         ),
         host=host,
         port=port,
         log_level="warning",
     )
+
+
+no_open_var = contextvars.ContextVar('no_open')
+home_url_var = contextvars.ContextVar('home_url')
+
+@contextlib.asynccontextmanager
+async def lifespan(app):
+    no_open = no_open_var.get()
+    home_url = home_url_var.get()
+    click.echo("PIO Home has been started. Press Ctrl+C to shutdown.")
+    if not no_open:
+        click.launch(home_url)
+    yield
