diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/components/StreamingMessage.tsx b/components/StreamingMessage.tsx
new file mode 100644
index 0000000..2d9545f
--- /dev/null
+++ b/components/StreamingMessage.tsx
@@ -0,0 +1,100 @@
+/**
+ * StreamingMessage — renders a single AI assistant message that arrives via
+ * streaming.
+ *
+ * Props:
+ * - lines List of output strings received from the stream
+ * - isStreaming Whether more tokens are expected
+ * - error Non-null string when the stream errored
+ *
+ * The component renders each line in order with a blinking cursor appended
+ * while `isStreaming` is true, so the user can see tokens arrive in real-time.
+ */
+
+import React from 'react';
+
+// ─── Types ────────────────────────────────────────────────────────────────────
+
+export interface StreamingMessageProps {
+ /** Output lines received from the SSE stream */
+ lines: string[];
+ /** Whether the stream is still open */
+ isStreaming: boolean;
+ /** Error message — if provided, shows an error badge below the content */
+ error?: string | null;
+ /** Optional CSS class applied to the wrapper div */
+ className?: string;
+}
+
+// ─── Component ────────────────────────────────────────────────────────────────
+
+/**
+ * StreamingMessage
+ *
+ * @example
+ * ```tsx
+ * const { lines, isStreaming, error } = useStream();
+ *
+ * return (
+ *
+ {line} +
+ ))} + + {/* Blinking cursor shown only while streaming */} + {isStreaming && ( + + )} +