+ {/* Author row */}
+
+ {spark.profiles.avatar_url && (
+

+ )}
+
+
+ @{spark.profiles.username}
+
+
+ {new Date(spark.created_at).toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ })}
+
+
+
+
+
+ {spark.title}
+
+
+
+ {spark.description_markdown.replace(/[#*`>\[\]!]/g, "").slice(0, 200)}
+
+
+ {spark.tech_stack && spark.tech_stack.length > 0 && (
+
+ {spark.tech_stack.map(tech => (
+
+ {tech}
+
+ ))}
+
+ )}
+
+
+
+
+ {spark.status}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/web/src/components/SparkFeed.tsx b/web/src/components/SparkFeed.tsx
new file mode 100644
index 0000000..3c9af3c
--- /dev/null
+++ b/web/src/components/SparkFeed.tsx
@@ -0,0 +1,40 @@
+import { createClient } from "@/utils/supabase/server";
+import SparkCard from "./SparkCard";
+
+export default async function SparkFeed() {
+ const supabase = await createClient();
+
+ const { data: sparks, error } = await supabase
+ .from("sparks")
+ .select("*, profiles!sparks_author_id_fkey(username, avatar_url)")
+ .order("created_at", { ascending: false });
+
+ if (error) {
+ console.error("Supabase query error:", error);
+ return (
+