diff --git a/loop/server/loophttp.go b/loop/server/loophttp.go
index 53776aa..784d20b 100644
--- a/loop/server/loophttp.go
+++ b/loop/server/loophttp.go
@@ -242,6 +242,44 @@
 		io.WriteString(w, "{}\n")
 	})
 
+	// Handler for /port-events - returns recent port change events
+	s.mux.HandleFunc("/port-events", func(w http.ResponseWriter, r *http.Request) {
+		if r.Method != http.MethodGet {
+			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
+			return
+		}
+
+		w.Header().Set("Content-Type", "application/json")
+
+		// Get the 'since' query parameter for filtering events
+		sinceParam := r.URL.Query().Get("since")
+		var events []loop.PortEvent
+
+		// Get port monitor from agent
+		portMonitor := agent.GetPortMonitor()
+		if portMonitor == nil {
+			// Return empty array if port monitor not available
+			events = []loop.PortEvent{}
+		} else if sinceParam != "" {
+			// Parse the since timestamp
+			sinceTime, err := time.Parse(time.RFC3339, sinceParam)
+			if err != nil {
+				http.Error(w, fmt.Sprintf("Invalid 'since' timestamp format: %v", err), http.StatusBadRequest)
+				return
+			}
+			events = portMonitor.GetRecentEvents(sinceTime)
+		} else {
+			// Return all recent events
+			events = portMonitor.GetAllRecentEvents()
+		}
+
+		// Encode and return the events
+		if err := json.NewEncoder(w).Encode(events); err != nil {
+			slog.ErrorContext(r.Context(), "Error encoding port events response", slog.Any("err", err))
+			http.Error(w, "Internal server error", http.StatusInternalServerError)
+		}
+	})
+
 	// Handler for /messages?start=N&end=M (start/end are optional)
 	s.mux.HandleFunc("/messages", func(w http.ResponseWriter, r *http.Request) {
 		w.Header().Set("Content-Type", "application/json")
diff --git a/loop/server/loophttp_test.go b/loop/server/loophttp_test.go
index d755717..a6dab62 100644
--- a/loop/server/loophttp_test.go
+++ b/loop/server/loophttp_test.go
@@ -3,6 +3,7 @@
 import (
 	"bufio"
 	"context"
+	"encoding/json"
 	"net/http"
 	"net/http/httptest"
 	"slices"
@@ -249,6 +250,7 @@
 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 }
+func (m *mockAgent) GetPortMonitor() *loop.PortMonitor          { return loop.NewPortMonitor() }
 
 // TestEndFeedback tests the end session feedback functionality
 func TestEndFeedback(t *testing.T) {
@@ -551,3 +553,69 @@
 	// No HTTP endpoint to test anymore - compaction is done via /compact message
 	t.Log("Mock CompactConversation works correctly")
 }
+
+// TestPortEventsEndpoint tests the /port-events HTTP endpoint
+func TestPortEventsEndpoint(t *testing.T) {
+	// Create a mock agent that implements the CodingAgent interface
+	agent := &mockAgent{}
+
+	// Create a server with the mock agent
+	server, err := server.New(agent, nil)
+	if err != nil {
+		t.Fatalf("Failed to create server: %v", err)
+	}
+
+	// Test GET /port-events
+	req, err := http.NewRequest("GET", "/port-events", nil)
+	if err != nil {
+		t.Fatalf("Failed to create request: %v", err)
+	}
+
+	rr := httptest.NewRecorder()
+	server.ServeHTTP(rr, req)
+
+	// Should return 200 OK
+	if status := rr.Code; status != http.StatusOK {
+		t.Errorf("Expected status code %d, got %d", http.StatusOK, status)
+	}
+
+	// Should return JSON content type
+	contentType := rr.Header().Get("Content-Type")
+	if contentType != "application/json" {
+		t.Errorf("Expected Content-Type application/json, got %s", contentType)
+	}
+
+	// Should return valid JSON (empty array since mock returns no events)
+	var events []any
+	if err := json.Unmarshal(rr.Body.Bytes(), &events); err != nil {
+		t.Errorf("Failed to parse JSON response: %v", err)
+	}
+
+	// Should be empty array for mock agent
+	if len(events) != 0 {
+		t.Errorf("Expected empty events array, got %d events", len(events))
+	}
+}
+
+// TestPortEventsEndpointMethodNotAllowed tests that non-GET requests are rejected
+func TestPortEventsEndpointMethodNotAllowed(t *testing.T) {
+	agent := &mockAgent{}
+	server, err := server.New(agent, nil)
+	if err != nil {
+		t.Fatalf("Failed to create server: %v", err)
+	}
+
+	// Test POST /port-events (should be rejected)
+	req, err := http.NewRequest("POST", "/port-events", nil)
+	if err != nil {
+		t.Fatalf("Failed to create request: %v", err)
+	}
+
+	rr := httptest.NewRecorder()
+	server.ServeHTTP(rr, req)
+
+	// Should return 405 Method Not Allowed
+	if status := rr.Code; status != http.StatusMethodNotAllowed {
+		t.Errorf("Expected status code %d, got %d", http.StatusMethodNotAllowed, status)
+	}
+}
