diff --git a/apps/editor/components/editor/index.tsx b/apps/editor/components/editor/index.tsx
index 2416d0e1..61759c9e 100644
--- a/apps/editor/components/editor/index.tsx
+++ b/apps/editor/components/editor/index.tsx
@@ -10,6 +10,7 @@ import { useAuth } from '@/features/community/lib/auth/hooks'
import { ZoneSystem } from '../systems/zone/zone-system'
import { ToolManager } from '../tools/tool-manager'
import { ActionMenu } from '../ui/action-menu'
+import { FeedbackDialog } from '../feedback-dialog'
import { PascalRadio } from '../pascal-radio'
import { PanelManager } from '../ui/panels/panel-manager'
import { HelperManager } from '../ui/helpers/helper-manager'
@@ -56,10 +57,13 @@ export default function Editor({ projectId }: EditorProps) {
{/* Top-right controls */}
-
-
-
-
-
-
-
- {/* Show selected address */}
- {address && (
-
-
Selected Address:
-
{address.formattedAddress}
-
- )}
-
- )}
-
{/* Privacy Toggle */}
diff --git a/apps/editor/features/community/lib/feedback/actions.ts b/apps/editor/features/community/lib/feedback/actions.ts
new file mode 100644
index 00000000..d232b0a5
--- /dev/null
+++ b/apps/editor/features/community/lib/feedback/actions.ts
@@ -0,0 +1,32 @@
+'use server'
+
+import { createId } from '@pascal-app/db'
+import { createServerSupabaseClient } from '../database/server'
+import { getSession } from '../auth/server'
+
+export async function submitFeedback(
+ message: string,
+): Promise<{ success: true } | { success: false; error: string }> {
+ try {
+ const trimmed = message.trim()
+ if (!trimmed) return { success: false, error: 'Message cannot be empty' }
+
+ const session = await getSession()
+ const supabase = await createServerSupabaseClient()
+
+ const { error } = await supabase.from('feedback').insert({
+ id: createId('feedback'),
+ user_id: session?.user?.id ?? null,
+ message: trimmed,
+ })
+
+ if (error) return { success: false, error: error.message }
+
+ return { success: true }
+ } catch (err) {
+ return {
+ success: false,
+ error: err instanceof Error ? err.message : 'Failed to submit feedback',
+ }
+ }
+}
diff --git a/packages/db/src/schema/feedback/feedback.ts b/packages/db/src/schema/feedback/feedback.ts
new file mode 100644
index 00000000..f49931e0
--- /dev/null
+++ b/packages/db/src/schema/feedback/feedback.ts
@@ -0,0 +1,15 @@
+import { pgTable } from 'drizzle-orm/pg-core'
+import { createInsertSchema, createSelectSchema } from 'drizzle-zod'
+import { id, createdAt } from '../../helpers'
+
+export const feedback = pgTable('feedback', (t) => ({
+ id: id('feedback'),
+ userId: t.text('user_id'), // nullable — stores Better Auth user ID or null for anonymous
+ message: t.text('message').notNull(),
+ createdAt,
+})).enableRLS()
+
+export type Feedback = typeof feedback.$inferSelect
+export type NewFeedback = typeof feedback.$inferInsert
+export const insertFeedbackSchema = createInsertSchema(feedback)
+export const selectFeedbackSchema = createSelectSchema(feedback)
diff --git a/packages/db/src/schema/index.ts b/packages/db/src/schema/index.ts
index 4265c8bd..745b8a7a 100644
--- a/packages/db/src/schema/index.ts
+++ b/packages/db/src/schema/index.ts
@@ -5,6 +5,9 @@ export * from './auth/sessions'
export * from './auth/users'
export * from './auth/verifications'
+// Feedback table
+export * from './feedback/feedback'
+
// Project tables
export * from './projects/addresses'
export * from './projects/likes'
diff --git a/packages/db/supabase/migrations/20240218000001_create_feedback_table.sql b/packages/db/supabase/migrations/20240218000001_create_feedback_table.sql
new file mode 100644
index 00000000..3c2124e4
--- /dev/null
+++ b/packages/db/supabase/migrations/20240218000001_create_feedback_table.sql
@@ -0,0 +1,24 @@
+-- Create feedback table
+CREATE TABLE IF NOT EXISTS feedback (
+ id TEXT NOT NULL PRIMARY KEY,
+ user_id TEXT,
+ message TEXT NOT NULL,
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+-- Enable Row Level Security
+ALTER TABLE feedback ENABLE ROW LEVEL SECURITY;
+
+-- Allow anyone (authenticated or anonymous) to submit feedback
+CREATE POLICY "Anyone can insert feedback"
+ ON feedback
+ FOR INSERT
+ TO anon, authenticated
+ WITH CHECK (true);
+
+-- Allow service role full access (for admin review)
+CREATE POLICY "Service role full access"
+ ON feedback
+ TO service_role
+ USING (true)
+ WITH CHECK (true);