diff --git a/backend/package.json b/backend/package.json
index 68bbcda..1c168e0 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "jama-backend",
- "version": "0.11.19",
+ "version": "0.11.20",
"description": "TeamChat backend server",
"main": "src/index.js",
"scripts": {
diff --git a/build.sh b/build.sh
index cbb52f6..15c8ddb 100644
--- a/build.sh
+++ b/build.sh
@@ -13,7 +13,7 @@
# ─────────────────────────────────────────────────────────────
set -euo pipefail
-VERSION="${1:-0.11.19}"
+VERSION="${1:-0.11.20}"
ACTION="${2:-}"
REGISTRY="${REGISTRY:-}"
IMAGE_NAME="jama"
diff --git a/frontend/package.json b/frontend/package.json
index ef9253c..4f13189 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "jama-frontend",
- "version": "0.11.19",
+ "version": "0.11.20",
"private": true,
"scripts": {
"dev": "vite",
diff --git a/frontend/src/components/ChatWindow.jsx b/frontend/src/components/ChatWindow.jsx
index ea947b1..340ca0d 100644
--- a/frontend/src/components/ChatWindow.jsx
+++ b/frontend/src/components/ChatWindow.jsx
@@ -8,6 +8,12 @@ import { useSocket } from '../contexts/SocketContext.jsx';
import './ChatWindow.css';
import GroupInfoModal from './GroupInfoModal.jsx';
+// Must match Avatar.jsx and Sidebar.jsx exactly so header colours are consistent with message avatars
+const AVATAR_COLORS = ['#1a73e8','#ea4335','#34a853','#fa7b17','#a142f4','#00897b','#e91e8c','#0097a7'];
+function nameToColor(name) {
+ return AVATAR_COLORS[(name || '').charCodeAt(0) % AVATAR_COLORS.length];
+}
+
export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMessage, onMessageDeleted, onlineUserIds = new Set() }) {
const { user: currentUser } = useAuth();
const { socket } = useSocket();
@@ -237,13 +243,21 @@ export default function ChatWindow({ group, onBack, onGroupUpdated, onDirectMess
{isOnline && }
+ ) : isDirect && !group.is_managed ? (
+ // No custom avatar — use same per-user colour as Avatar.jsx and Sidebar.jsx
+