Avant: _sidebar_data() utilisait asyncio.run() → RuntimeWarning + 302 redirects Après: gitea_workspace.html appelle loadSidebarTree() → fetch API → injecte dans #sidebar-workspace-items - base.html: ajout id='sidebar-workspace-items' sur le <ul> workspace - dashboard.py: _sidebar_data() ne fait plus de fetch serveur, juste passe owner/repo