import qrcode import io import base64 from datetime import datetime from fastapi import Request from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse from app.config import Settings from app.session_store import create_session, get_session from app.security import create_worker_join_token # Use a simple in-memory template for v1; Jinja2 templates directory if present templates = Jinja2Templates(directory="app/templates") def render_home(request: Request) -> HTMLResponse: return HTMLResponse(content=_home_html(), status_code=200) def render_worker_page(request: Request, session_id: str, token: str) -> HTMLResponse: return HTMLResponse(content=_worker_html(session_id, token), status_code=200) def render_session_dashboard(request: Request, session_id: str) -> HTMLResponse: session = get_session(session_id) if not session: return HTMLResponse(content="

Session not found

", status_code=404) public_url = Settings.get_public_url() worker_url = f"{public_url}/worker?session_id={session_id}&token={session.secret}" qr_b64 = make_worker_qr_code(worker_url) html = _dashboard_html(session_id, worker_url, qr_b64) return HTMLResponse(content=html, status_code=200) def make_worker_qr_code(worker_join_url: str) -> str: img = qrcode.make(worker_join_url) buf = io.BytesIO() img.save(buf, format="PNG") buf.seek(0) return base64.b64encode(buf.read()).decode() def make_api_example(session_id: str) -> dict: public_url = Settings.get_public_url() return { "create_job": f"POST {public_url}/api/session/{session_id}/job", "get_job": f"GET {public_url}/api/job/{{job_id}}", "get_receipt": f"GET {public_url}/api/receipt/{{receipt_id}}", } def _home_html() -> str: return """ PhoneGPU Space

PhoneGPU Space

Turn an iPhone into a temporary private ML compute worker.

""" def _worker_html(session_id: str, token: str) -> str: # This redirects to the static worker.html with query params return f""" PhoneGPU Worker """ def _dashboard_html(session_id: str, worker_url: str, qr_b64: str) -> str: return f""" Session Dashboard

Session Dashboard

Session: {session_id}

Connect iPhone

Scan this QR code with your iPhone camera:

Or open: {worker_url}

API

POST /api/session/{session_id}/job

GET /api/job/{{job_id}}

GET /api/receipt/{{receipt_id}}

"""