diff --git a/loop/agent.go b/loop/agent.go
index c4cbd05..4a27ab0 100644
--- a/loop/agent.go
+++ b/loop/agent.go
@@ -143,6 +143,8 @@
 	// CompactConversation compacts the current conversation by generating a summary
 	// and restarting the conversation with that summary as the initial context
 	CompactConversation(ctx context.Context) error
+	// GetPortMonitor returns the port monitor instance for accessing port events
+	GetPortMonitor() *PortMonitor
 }
 
 type CodingAgentMessageType string
@@ -2337,3 +2339,8 @@
 
 	return nil
 }
+
+// GetPortMonitor returns the port monitor instance for accessing port events
+func (a *Agent) GetPortMonitor() *PortMonitor {
+	return a.portMonitor
+}
diff --git a/loop/port_monitor.go b/loop/port_monitor.go
index 514e928..9614db2 100644
--- a/loop/port_monitor.go
+++ b/loop/port_monitor.go
@@ -10,15 +10,27 @@
 	"time"
 )
 
+// PortEvent represents a port change event
+type PortEvent struct {
+	Type      string    `json:"type"`      // "opened" or "closed"
+	Port      string    `json:"port"`      // "proto:address:port" format
+	Timestamp time.Time `json:"timestamp"` // when the event occurred
+}
+
 // PortMonitor handles periodic monitoring of listening ports in containers
 type PortMonitor struct {
-	mu        sync.Mutex // protects following
-	lastPorts string     // last netstat/ss output for comparison
+	mu        sync.Mutex  // protects following
+	lastPorts string      // last netstat/ss output for comparison
+	events    []PortEvent // circular buffer of recent port events
+	maxEvents int         // maximum events to keep in buffer
 }
 
 // NewPortMonitor creates a new PortMonitor instance
 func NewPortMonitor() *PortMonitor {
-	return &PortMonitor{}
+	return &PortMonitor{
+		maxEvents: 100, // keep last 100 events
+		events:    make([]PortEvent, 0, 100),
+	}
 }
 
 // Start begins periodic port monitoring in a background goroutine
@@ -74,11 +86,17 @@
 func (pm *PortMonitor) logPortDifferences(ctx context.Context, oldPorts, newPorts string) {
 	oldPortSet := parseSSPorts(oldPorts)
 	newPortSet := parseSSPorts(newPorts)
+	now := time.Now()
 
 	// Find newly opened ports
 	for port := range newPortSet {
 		if !oldPortSet[port] {
 			slog.InfoContext(ctx, "New port detected", slog.String("port", port))
+			pm.addEvent(PortEvent{
+				Type:      "opened",
+				Port:      port,
+				Timestamp: now,
+			})
 		}
 	}
 
@@ -86,10 +104,53 @@
 	for port := range oldPortSet {
 		if !newPortSet[port] {
 			slog.InfoContext(ctx, "Port closed", slog.String("port", port))
+			pm.addEvent(PortEvent{
+				Type:      "closed",
+				Port:      port,
+				Timestamp: now,
+			})
 		}
 	}
 }
 
+// addEvent adds a port event to the circular buffer (must be called with mutex held)
+func (pm *PortMonitor) addEvent(event PortEvent) {
+	// If buffer is full, remove oldest event
+	if len(pm.events) >= pm.maxEvents {
+		// Shift all events left by 1 to remove oldest
+		copy(pm.events, pm.events[1:])
+		pm.events = pm.events[:len(pm.events)-1]
+	}
+	// Add new event
+	pm.events = append(pm.events, event)
+}
+
+// GetRecentEvents returns a copy of recent port events since the given timestamp
+func (pm *PortMonitor) GetRecentEvents(since time.Time) []PortEvent {
+	pm.mu.Lock()
+	defer pm.mu.Unlock()
+
+	// Find events since the given timestamp
+	var result []PortEvent
+	for _, event := range pm.events {
+		if event.Timestamp.After(since) {
+			result = append(result, event)
+		}
+	}
+	return result
+}
+
+// GetAllRecentEvents returns a copy of all recent port events
+func (pm *PortMonitor) GetAllRecentEvents() []PortEvent {
+	pm.mu.Lock()
+	defer pm.mu.Unlock()
+
+	// Return a copy of all events
+	result := make([]PortEvent, len(pm.events))
+	copy(result, pm.events)
+	return result
+}
+
 // parseSSPorts extracts listening ports from ss -lntu output
 // Returns a map with "proto:address:port" as keys
 // ss output format: Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
diff --git a/loop/port_monitor_test.go b/loop/port_monitor_test.go
index 8f474e0..a1dad57 100644
--- a/loop/port_monitor_test.go
+++ b/loop/port_monitor_test.go
@@ -3,6 +3,7 @@
 import (
 	"context"
 	"testing"
+	"time"
 )
 
 // TestPortMonitoring tests the port monitoring functionality
@@ -131,3 +132,74 @@
 		})
 	}
 }
+
+// TestPortEventStorage tests the new event storage functionality
+func TestPortEventStorage(t *testing.T) {
+	pm := NewPortMonitor()
+
+	// Initially should have no events
+	allEvents := pm.GetAllRecentEvents()
+	if len(allEvents) != 0 {
+		t.Errorf("Expected 0 events initially, got %d", len(allEvents))
+	}
+
+	// Simulate port changes that would add events
+	ctx := context.Background()
+	oldPorts := "Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port\ntcp   LISTEN 0      128    0.0.0.0:8080         0.0.0.0:*"
+	newPorts := "Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port\ntcp   LISTEN 0      128    0.0.0.0:9090         0.0.0.0:*"
+
+	pm.logPortDifferences(ctx, oldPorts, newPorts)
+
+	// Should now have events
+	allEvents = pm.GetAllRecentEvents()
+	if len(allEvents) != 2 {
+		t.Errorf("Expected 2 events (1 opened, 1 closed), got %d", len(allEvents))
+	}
+
+	// Check event types
+	foundOpened := false
+	foundClosed := false
+	for _, event := range allEvents {
+		if event.Type == "opened" && event.Port == "tcp:0.0.0.0:9090" {
+			foundOpened = true
+		}
+		if event.Type == "closed" && event.Port == "tcp:0.0.0.0:8080" {
+			foundClosed = true
+		}
+	}
+
+	if !foundOpened {
+		t.Error("Expected to find 'opened' event for port tcp:0.0.0.0:9090")
+	}
+	if !foundClosed {
+		t.Error("Expected to find 'closed' event for port tcp:0.0.0.0:8080")
+	}
+}
+
+// TestPortEventFiltering tests the time-based filtering
+func TestPortEventFiltering(t *testing.T) {
+	pm := NewPortMonitor()
+	ctx := context.Background()
+
+	// Record time before adding events
+	beforeTime := time.Now()
+	time.Sleep(1 * time.Millisecond) // Small delay to ensure timestamp difference
+
+	// Add some events
+	oldPorts := "Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port\ntcp   LISTEN 0      128    0.0.0.0:8080         0.0.0.0:*"
+	newPorts := "Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port\ntcp   LISTEN 0      128    0.0.0.0:9090         0.0.0.0:*"
+	pm.logPortDifferences(ctx, oldPorts, newPorts)
+
+	// Get events since beforeTime - should get all events
+	recentEvents := pm.GetRecentEvents(beforeTime)
+	if len(recentEvents) != 2 {
+		t.Errorf("Expected 2 recent events, got %d", len(recentEvents))
+	}
+
+	// Get events since now - should get no events
+	nowTime := time.Now()
+	recentEvents = pm.GetRecentEvents(nowTime)
+	if len(recentEvents) != 0 {
+		t.Errorf("Expected 0 recent events since now, got %d", len(recentEvents))
+	}
+}
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)
+	}
+}
