diff --git a/loop/agent.go b/loop/agent.go
index 438d326..5e28bfc 100644
--- a/loop/agent.go
+++ b/loop/agent.go
@@ -34,6 +34,12 @@
 	userCancelMessage = "user requested agent to stop handling responses"
 )
 
+// EndFeedback represents user feedback when ending a session
+type EndFeedback struct {
+	Happy   bool   `json:"happy"`
+	Comment string `json:"comment"`
+}
+
 type MessageIterator interface {
 	// Next blocks until the next message is available. It may
 	// return nil if the underlying iterator context is done.
@@ -128,6 +134,10 @@
 	CurrentStateName() string
 	// CurrentTodoContent returns the current todo list data as JSON, or empty string if no todos exist
 	CurrentTodoContent() string
+	// GetEndFeedback returns the end session feedback
+	GetEndFeedback() *EndFeedback
+	// SetEndFeedback sets the end session feedback
+	SetEndFeedback(feedback *EndFeedback)
 }
 
 type CodingAgentMessageType string
@@ -378,6 +388,9 @@
 
 	// Port monitoring
 	portMonitor *PortMonitor
+
+	// End session feedback
+	endFeedback *EndFeedback
 }
 
 // NewIterator implements CodingAgent.
@@ -476,6 +489,20 @@
 	return string(content)
 }
 
+// SetEndFeedback sets the end session feedback
+func (a *Agent) SetEndFeedback(feedback *EndFeedback) {
+	a.mu.Lock()
+	defer a.mu.Unlock()
+	a.endFeedback = feedback
+}
+
+// GetEndFeedback gets the end session feedback
+func (a *Agent) GetEndFeedback() *EndFeedback {
+	a.mu.Lock()
+	defer a.mu.Unlock()
+	return a.endFeedback
+}
+
 func (a *Agent) URL() string { return a.url }
 
 // Title returns the current title of the conversation.
diff --git a/loop/server/loophttp.go b/loop/server/loophttp.go
index e62947e..53776aa 100644
--- a/loop/server/loophttp.go
+++ b/loop/server/loophttp.go
@@ -95,6 +95,7 @@
 	OutsideWorkingDir    string                        `json:"outside_working_dir,omitempty"`
 	InsideWorkingDir     string                        `json:"inside_working_dir,omitempty"`
 	TodoContent          string                        `json:"todo_content,omitempty"` // Contains todo list JSON data
+	End                  *loop.EndFeedback             `json:"end,omitempty"`          // End session feedback
 }
 
 type InitRequest struct {
@@ -121,6 +122,8 @@
 	terminalSessions map[string]*terminalSession
 	sshAvailable     bool
 	sshError         string
+	// WaitGroup for clients waiting for end
+	endWaitGroup sync.WaitGroup
 }
 
 func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -676,7 +679,9 @@
 
 		// Parse the request body (optional)
 		var requestBody struct {
-			Reason string `json:"reason"`
+			Reason  string `json:"reason"`
+			Happy   *bool  `json:"happy,omitempty"`
+			Comment string `json:"comment,omitempty"`
 		}
 
 		decoder := json.NewDecoder(r.Body)
@@ -691,6 +696,16 @@
 			endReason = requestBody.Reason
 		}
 
+		// Store end feedback if provided
+		if requestBody.Happy != nil {
+			feedback := &loop.EndFeedback{
+				Happy:   *requestBody.Happy,
+				Comment: requestBody.Comment,
+			}
+			s.agent.SetEndFeedback(feedback)
+			slog.Info("End session feedback received", "happy", feedback.Happy, "comment", feedback.Comment)
+		}
+
 		// Send success response before exiting
 		w.Header().Set("Content-Type", "application/json")
 		json.NewEncoder(w).Encode(map[string]string{"status": "ending", "reason": endReason})
@@ -701,9 +716,29 @@
 		// Log that we're shutting down
 		slog.Info("Ending session", "reason", endReason)
 
-		// Exit the process after a short delay to allow response to be sent
+		// Wait for skaband clients that are waiting for end (with timeout)
 		go func() {
-			time.Sleep(100 * time.Millisecond)
+			startTime := time.Now()
+			// Wait up to 2 seconds for waiting clients to receive the end message
+			done := make(chan struct{})
+			go func() {
+				s.endWaitGroup.Wait()
+				close(done)
+			}()
+
+			select {
+			case <-done:
+				slog.Info("All waiting clients notified of end")
+			case <-time.After(2 * time.Second):
+				slog.Info("Timeout waiting for clients, proceeding with shutdown")
+			}
+
+			// Ensure we've been running for at least 100ms to allow response to be sent
+			elapsed := time.Since(startTime)
+			if elapsed < 100*time.Millisecond {
+				time.Sleep(100*time.Millisecond - elapsed)
+			}
+
 			os.Exit(0)
 		}()
 	})
@@ -1023,6 +1058,17 @@
 		}
 	}
 
+	// Check if this client is waiting for end
+	waitForEnd := r.URL.Query().Get("wait_for_end") == "true"
+	if waitForEnd {
+		s.endWaitGroup.Add(1)
+		defer func() {
+			if waitForEnd {
+				s.endWaitGroup.Done()
+			}
+		}()
+	}
+
 	// Ensure 'from' is valid
 	currentCount := s.agent.MessageCount()
 	if fromIndex < 0 {
@@ -1138,6 +1184,12 @@
 			// Get updated state
 			state = s.getState()
 
+			// Check if end feedback is present and this client was waiting for it
+			if waitForEnd && state.End != nil {
+				s.endWaitGroup.Done()
+				waitForEnd = false // Mark that we've handled the end condition
+			}
+
 			// Send updated state after the state transition
 			fmt.Fprintf(w, "event: state\n")
 			fmt.Fprintf(w, "data: ")
@@ -1165,6 +1217,12 @@
 			// Get updated state
 			state = s.getState()
 
+			// Check if end feedback is present and this client was waiting for it
+			if waitForEnd && state.End != nil {
+				s.endWaitGroup.Done()
+				waitForEnd = false // Mark that we've handled the end condition
+			}
+
 			// Send updated state after the message
 			fmt.Fprintf(w, "event: state\n")
 			fmt.Fprintf(w, "data: ")
@@ -1211,6 +1269,7 @@
 		FirstMessageIndex:    s.agent.FirstMessageIndex(),
 		AgentState:           s.agent.CurrentStateName(),
 		TodoContent:          s.agent.CurrentTodoContent(),
+		End:                  s.agent.GetEndFeedback(),
 	}
 }
 
diff --git a/loop/server/loophttp_test.go b/loop/server/loophttp_test.go
index cedf6aa..54cfcd3 100644
--- a/loop/server/loophttp_test.go
+++ b/loop/server/loophttp_test.go
@@ -29,6 +29,7 @@
 	branchName               string
 	workingDir               string
 	sessionID                string
+	endFeedback              *loop.EndFeedback
 }
 
 func (m *mockAgent) NewIterator(ctx context.Context, nextMessageIdx int) loop.MessageIterator {
@@ -245,7 +246,69 @@
 func (m *mockAgent) SuggestReprompt(ctx context.Context) (string, error) { return "", nil }
 func (m *mockAgent) IsInContainer() bool                                 { return false }
 func (m *mockAgent) FirstMessageIndex() int                              { return 0 }
-func (m *mockAgent) DetectGitChanges(ctx context.Context) error          { return nil } // TestSSEStream tests the SSE stream endpoint
+func (m *mockAgent) DetectGitChanges(ctx context.Context) error          { return nil }
+func (m *mockAgent) GetEndFeedback() *loop.EndFeedback                   { return m.endFeedback }
+func (m *mockAgent) SetEndFeedback(feedback *loop.EndFeedback)           { m.endFeedback = feedback }
+
+// TestEndFeedback tests the end session feedback functionality
+func TestEndFeedback(t *testing.T) {
+	// Test basic EndFeedback struct functionality
+	feedback := &loop.EndFeedback{
+		Happy:   true,
+		Comment: "Great experience!",
+	}
+
+	if feedback.Happy != true {
+		t.Errorf("Expected Happy to be true, got %v", feedback.Happy)
+	}
+	if feedback.Comment != "Great experience!" {
+		t.Errorf("Expected Comment to be 'Great experience!', got %s", feedback.Comment)
+	}
+
+	// Test mock agent methods
+	mockAgent := &mockAgent{
+		sessionID:    "test-session",
+		workingDir:   "/test",
+		messageCount: 0,
+	}
+
+	// Test initial state (no feedback)
+	if mockAgent.GetEndFeedback() != nil {
+		t.Error("Expected initial feedback to be nil")
+	}
+
+	// Test setting feedback
+	mockAgent.SetEndFeedback(feedback)
+	retrieved := mockAgent.GetEndFeedback()
+	if retrieved == nil {
+		t.Error("Expected feedback to be set, got nil")
+	} else {
+		if retrieved.Happy != true {
+			t.Errorf("Expected Happy to be true, got %v", retrieved.Happy)
+		}
+		if retrieved.Comment != "Great experience!" {
+			t.Errorf("Expected Comment to be 'Great experience!', got %s", retrieved.Comment)
+		}
+	}
+
+	// Test setting different feedback
+	negativeFeedback := &loop.EndFeedback{
+		Happy:   false,
+		Comment: "Could be better",
+	}
+	mockAgent.SetEndFeedback(negativeFeedback)
+	retrieved = mockAgent.GetEndFeedback()
+	if retrieved == nil {
+		t.Error("Expected feedback to be set, got nil")
+	} else {
+		if retrieved.Happy != false {
+			t.Errorf("Expected Happy to be false, got %v", retrieved.Happy)
+		}
+		if retrieved.Comment != "Could be better" {
+			t.Errorf("Expected Comment to be 'Could be better', got %s", retrieved.Comment)
+		}
+	}
+} // TestSSEStream tests the SSE stream endpoint
 func TestSSEStream(t *testing.T) {
 	// Create a mock agent with initial messages
 	mockAgent := &mockAgent{
diff --git a/webui/src/types.ts b/webui/src/types.ts
index 53cc96f..5bb9f55 100644
--- a/webui/src/types.ts
+++ b/webui/src/types.ts
@@ -61,6 +61,11 @@
 	tool_uses: { [key: string]: number } | null;
 }
 
+export interface EndFeedback {
+	happy: boolean;
+	comment: string;
+}
+
 export interface State {
 	state_version: number;
 	message_count: number;
@@ -87,6 +92,7 @@
 	outside_working_dir?: string;
 	inside_working_dir?: string;
 	todo_content?: string;
+	end?: EndFeedback | null;
 }
 
 export interface TodoItem {
diff --git a/webui/src/web-components/sketch-app-shell.ts b/webui/src/web-components/sketch-app-shell.ts
index 0659241..43ae3bd 100644
--- a/webui/src/web-components/sketch-app-shell.ts
+++ b/webui/src/web-components/sketch-app-shell.ts
@@ -1014,19 +1014,26 @@
       event.preventDefault();
       event.stopPropagation();
     }
-    // Show confirmation dialog
-    const confirmed = window.confirm(
-      "Ending the session will shut down the underlying container. Are you sure?",
-    );
-    if (!confirmed) return;
+
+    // Show custom dialog with survey
+    const surveyResult = await this.showEndSessionSurvey();
+    if (!surveyResult) return; // User cancelled
 
     try {
+      const requestBody: any = { reason: "user requested end of session" };
+
+      // Add survey data if provided
+      if (surveyResult.happy !== null) {
+        requestBody.happy = surveyResult.happy;
+        requestBody.comment = surveyResult.comment;
+      }
+
       const response = await fetch("end", {
         method: "POST",
         headers: {
           "Content-Type": "application/json",
         },
-        body: JSON.stringify({ reason: "user requested end of session" }),
+        body: JSON.stringify(requestBody),
       });
 
       if (!response.ok) {
@@ -1155,6 +1162,173 @@
     this.style.setProperty("--chat-input-height", `${bottomOffset}px`);
   }
 
+  /**
+   * Show end session survey dialog
+   */
+  private async showEndSessionSurvey(): Promise<{
+    happy: boolean | null;
+    comment: string;
+  } | null> {
+    return new Promise((resolve) => {
+      // Create modal overlay
+      const overlay = document.createElement("div");
+      overlay.style.cssText = `
+        position: fixed;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        background: rgba(0, 0, 0, 0.5);
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        z-index: 10000;
+      `;
+
+      // Create modal content
+      const modal = document.createElement("div");
+      modal.style.cssText = `
+        background: white;
+        border-radius: 8px;
+        padding: 24px;
+        max-width: 500px;
+        width: 90%;
+        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+      `;
+
+      modal.innerHTML = `
+        <h3 style="margin: 0 0 16px 0; font-size: 18px; font-weight: 600;">End Session</h3>
+        <p style="margin: 0 0 20px 0; color: #666;">Ending the session will shut down the underlying container. Are you sure?</p>
+        
+        <div style="margin-bottom: 20px;">
+          <p style="margin: 0 0 12px 0; font-weight: 500;">How was your experience?</p>
+          <div style="display: flex; gap: 12px; margin-bottom: 16px;">
+            <button id="thumbs-up" style="
+              background: #f8f9fa;
+              border: 2px solid #dee2e6;
+              border-radius: 6px;
+              padding: 8px 16px;
+              cursor: pointer;
+              display: flex;
+              align-items: center;
+              gap: 8px;
+              font-size: 14px;
+            ">
+              👍 Good
+            </button>
+            <button id="thumbs-down" style="
+              background: #f8f9fa;
+              border: 2px solid #dee2e6;
+              border-radius: 6px;
+              padding: 8px 16px;
+              cursor: pointer;
+              display: flex;
+              align-items: center;
+              gap: 8px;
+              font-size: 14px;
+            ">
+              👎 Not so good
+            </button>
+          </div>
+          
+          <label style="display: block; margin-bottom: 8px; font-weight: 500;">Any additional feedback? (optional)</label>
+          <textarea id="feedback-text" placeholder="Tell us what went well or what could be improved..." style="
+            width: 100%;
+            min-height: 80px;
+            padding: 8px;
+            border: 1px solid #ccc;
+            border-radius: 4px;
+            resize: vertical;
+            font-family: inherit;
+            font-size: 14px;
+            box-sizing: border-box;
+          "></textarea>
+        </div>
+        
+        <div style="display: flex; gap: 12px; justify-content: flex-end;">
+          <button id="cancel-btn" style="
+            background: #f8f9fa;
+            border: 1px solid #dee2e6;
+            color: #495057;
+            padding: 8px 16px;
+            border-radius: 4px;
+            cursor: pointer;
+          ">Cancel</button>
+          <button id="end-btn" style="
+            background: #dc3545;
+            border: 1px solid #dc3545;
+            color: white;
+            padding: 8px 16px;
+            border-radius: 4px;
+            cursor: pointer;
+          ">End Session</button>
+        </div>
+      `;
+
+      overlay.appendChild(modal);
+      document.body.appendChild(overlay);
+
+      let selectedRating: boolean | null = null;
+
+      // Handle thumbs up/down selection
+      const thumbsUp = modal.querySelector("#thumbs-up") as HTMLButtonElement;
+      const thumbsDown = modal.querySelector(
+        "#thumbs-down",
+      ) as HTMLButtonElement;
+      const feedbackText = modal.querySelector(
+        "#feedback-text",
+      ) as HTMLTextAreaElement;
+      const cancelBtn = modal.querySelector("#cancel-btn") as HTMLButtonElement;
+      const endBtn = modal.querySelector("#end-btn") as HTMLButtonElement;
+
+      const updateButtonStyles = () => {
+        thumbsUp.style.background =
+          selectedRating === true ? "#d4edda" : "#f8f9fa";
+        thumbsUp.style.borderColor =
+          selectedRating === true ? "#28a745" : "#dee2e6";
+        thumbsDown.style.background =
+          selectedRating === false ? "#f8d7da" : "#f8f9fa";
+        thumbsDown.style.borderColor =
+          selectedRating === false ? "#dc3545" : "#dee2e6";
+      };
+
+      thumbsUp.addEventListener("click", () => {
+        selectedRating = true;
+        updateButtonStyles();
+      });
+
+      thumbsDown.addEventListener("click", () => {
+        selectedRating = false;
+        updateButtonStyles();
+      });
+
+      cancelBtn.addEventListener("click", () => {
+        document.body.removeChild(overlay);
+        resolve(null);
+      });
+
+      endBtn.addEventListener("click", () => {
+        const result = {
+          happy: selectedRating,
+          comment: feedbackText.value.trim(),
+        };
+        document.body.removeChild(overlay);
+        resolve(result);
+      });
+
+      // Close on overlay click
+      overlay.addEventListener("click", (e) => {
+        if (e.target === overlay) {
+          document.body.removeChild(overlay);
+          resolve(null);
+        }
+      });
+
+      // Focus the modal
+      modal.focus();
+    });
+  }
+
   render() {
     return html`
       <div id="top-banner">
