diff --git a/AGENTS.md b/AGENTS.md
index 6305adc..d07cd73 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -28,6 +28,10 @@ When you run into a repeatable problem during testing (e.g. port assignment coll
- Rollback tests must fetch Player/Obstacle/Challenge/Vote rows again by ID after `apply_game_state`; it deletes and recreates those rows, so old ORM instances cannot be refreshed.
+- The project `.venv` uses Python 3.9. Use `Optional[T]` (or postponed annotations) instead of evaluated `T | None` annotations, which fail during import.
+
+- Multi-socket TestClient tests must use `with TestClient(app) as client` so sockets share one event loop; separate portals can hang on cross-socket broadcasts. Close sockets explicitly before asserting disconnect messages. Override lifespan when using an isolated test database.
+
## Versioning & changelog
The app shows its version number and a player-facing changelog in the ☰ menu → About. Both come from `frontend/src/lib/changelog.js` (rendered by `frontend/src/components/AboutModal.svelte`).
diff --git a/TODO.md b/TODO.md
index c9f27f0..4384c1e 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,10 +1,10 @@
## Features
-- [ ] Add a note taking area to store game state between sessions
-- [ ] Add an online indicator that displays if a player is connected
+- [x] Add an online indicator that displays if a player is connected
- [ ] PvP challenges should linger in the UI after completion so that players can see the result
-- [ ] Add hat/gun icons next to player names on the player list to indicate if they're the captain and/or have a gat
+- [x] Add hat/gun icons next to player names on the player list to indicate if they're the captain and/or have a gat
- [ ] Replace red/green borders of successful/failed cards with checks and crosses in the upper corner of the card.
+- [ ] Add a note taking area to store game state between sessions
## Polish
diff --git a/frontend/src/components/CrewSidebar.svelte b/frontend/src/components/CrewSidebar.svelte
index 5618dd6..0494f32 100644
--- a/frontend/src/components/CrewSidebar.svelte
+++ b/frontend/src/components/CrewSidebar.svelte
@@ -1,4 +1,5 @@
+
+
+ {online ? '●' : '○'}
+ {#if player.id === state.game.captain_player_id}🎩{/if}
+ {#if player.completed_personal_1}🔫{/if}
+
+
+
diff --git a/frontend/src/components/scene/CrewColumn.svelte b/frontend/src/components/scene/CrewColumn.svelte
index 23f0a73..7925122 100644
--- a/frontend/src/components/scene/CrewColumn.svelte
+++ b/frontend/src/components/scene/CrewColumn.svelte
@@ -1,4 +1,5 @@