diff --git a/app/models/user.rb b/app/models/user.rb
index 379658a509ada63ec96bc0deace84c2ac3613d77..429f19a9aa993a2cf4d046c46028ed9bde503832 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,2 +1,31 @@
 class User < ApplicationRecord
+  after_initialize :set_avatar_color
+
+  def text_color
+    r, g, b = avatar_color.delete_prefix('#').chars.each_slice(2).map { |hex| hex.join.to_i(16) }
+
+    # Calculate relative luminance (WCAG 2.0 formula)
+    luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255
+
+    # Choose text color based on luminance threshold
+    luminance > 0.5 ? "#000000" : "#ffffff"
+  end
+
+  def initials
+    name.split(/\s+/).map(&:first).join('')
+  end
+
+  def set_avatar_color
+    return unless self.avatar_color.nil?
+
+    r = rand(256)
+    g = rand(256)
+    b = rand(256)
+
+    # r = [r, 128].max
+    # g = [g, 128].max
+    # b = [b, 128].max
+
+    self.avatar_color = "##{r.to_s(16).rjust(2, '0')}#{g.to_s(16).rjust(2, '0')}#{b.to_s(16).rjust(2, '0')}"
+  end
 end
diff --git a/app/views/application/_user_avatar.html.erb b/app/views/application/_user_avatar.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..ff2f9b420ac3cd07e337796ef4c4d03a43d4333b
--- /dev/null
+++ b/app/views/application/_user_avatar.html.erb
@@ -0,0 +1,3 @@
+<div class="relative inline-flex items-center justify-center h-8 p-2 overflow-hidden rounded-full" style="background-color: <%= user.avatar_color %>" title="<%= user.name %>">
+    <span class="font-medium" style="color: <%= user.text_color %>"><%= user.name %></span>
+</div>
diff --git a/app/views/conferences/show.html.erb b/app/views/conferences/show.html.erb
index 767c8a166152ee3dbc1b6bca0e7251a6f08e655d..8cba38aa8ad49e24c064e1d39cfbef7f33c98e7d 100644
--- a/app/views/conferences/show.html.erb
+++ b/app/views/conferences/show.html.erb
@@ -59,7 +59,7 @@ current_time = @sessions_by_date[@conference.days.first].first.starts_at.advance
               <ul class="list-disc">
                 <% session.assignments.each do |assignment| %>
                   <li>
-                    <span class="assigned-user"><%= assignment.user.name %></span>
+                    <span class="assigned-user"><%= render partial: 'application/user_avatar', locals: { user: assignment.user } %></span>
                     <%= link_to '[Remove]', conference_session_assignments_path(session.conference, session, user_id: assignment.user_id), data: { turbo_method: :delete, confirm: 'Are you sure?' } %>
                   </li>
                 <% end %>
diff --git a/app/views/sessions/_assignment_form.html.erb b/app/views/sessions/_assignment_form.html.erb
index 3092c101e39fa87e4e32f8c28cf99cc1fb962aef..d9a4d98e4c91f9637464cc9cec38541d16c42126 100644
--- a/app/views/sessions/_assignment_form.html.erb
+++ b/app/views/sessions/_assignment_form.html.erb
@@ -1,5 +1,5 @@
 <%= form_with url: conference_session_assignments_path(session.conference, session), method: :post, local: true do |f| %>
-  <%= f.select :user_id, options_from_collection_for_select(@users, :id, :name) %>
+  <%= f.select :user_id, options_from_collection_for_select(@users - session.assignments.collect(&:user), :id, :name) %>
   <%= f.submit "Assign", class: 'primary' %>
   <% if @assignment&.errors&.any? %>
     <div class="alert alert-danger">
diff --git a/app/views/sessions/show.html.erb b/app/views/sessions/show.html.erb
index c77f77974be51b14cb7994defdcb54116d8a8740..e98f4221a8797696945dae3ecb2982efe9820b77 100644
--- a/app/views/sessions/show.html.erb
+++ b/app/views/sessions/show.html.erb
@@ -10,7 +10,7 @@
   <ul>
     <% @session.assignments.each do |assignment| %>
       <li>
-        <%= assignment.user.name %>
+        <%= render partial: 'application/user_avatar', locals: { user: assignment.user } %>
         <%= link_to '[Remove]', conference_session_assignments_path(@session.conference, @session, user_id: assignment.user_id), data: { turbo_method: :delete, confirm: 'Are you sure?' } %>
       </li>
     <% end %>
diff --git a/db/migrate/20240524124124_add_avatar_color_to_users.rb b/db/migrate/20240524124124_add_avatar_color_to_users.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c082e378ac3067877cceb43293377363755e67c3
--- /dev/null
+++ b/db/migrate/20240524124124_add_avatar_color_to_users.rb
@@ -0,0 +1,5 @@
+class AddAvatarColorToUsers < ActiveRecord::Migration[7.1]
+  def change
+    add_column :users, :avatar_color, :string
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index eff275dd45355b447281057086c23c2dbcf6140f..322e2d2d508f6c815cb8d4362c4c29a3331ec001 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.1].define(version: 2024_05_24_091736) do
+ActiveRecord::Schema[7.1].define(version: 2024_05_24_124124) do
   create_table "assignments", force: :cascade do |t|
     t.integer "user_id", null: false
     t.integer "session_id", null: false
@@ -187,6 +187,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_24_091736) do
     t.string "email"
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
+    t.string "avatar_color"
   end
 
   add_foreign_key "assignments", "sessions"
diff --git a/db/seeds.rb b/db/seeds.rb
index 766011bb79a257594a522f844088145c87add8ec..20d6c022a15ef4320fa9302e23d47dc8e1b426a5 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -32,4 +32,5 @@ end
 
 User.find_or_create_by!(email: "teal@teal.is") do |user|
   user.name = "Teal"
+  user.avatar_color = "#14bfb5"
 end