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{
