🖼️

AI Image Discovery

Frame-only Farcaster mini dApp with semantic search

Claude Sonnet 4.5
OpenAI Embeddings
Supabase Vector
Farcaster Frame v2
🏗️ Architecture
Production-ready AI-powered image discovery with semantic search

🧠 Claude Sonnet 4.5

  • • Parse natural language queries
  • • Infer tags, style, mood, colors
  • • Generate frame-friendly captions
  • • NOT used for embeddings

🔢 OpenAI Embeddings

  • • text-embedding-3-large model
  • • 3072-dimensional vectors
  • • Dedicated embedding layer
  • • High-quality semantic search

💾 Supabase Vector

  • • PostgreSQL with pgvector
  • • Cosine similarity search
  • • IVFFlat index optimization
  • • Scalable vector storage

🖼️ Farcaster Frame v2

  • • Single image per frame
  • • Button-based navigation
  • • Stateful pagination
  • • Fast response times
🚀 Access the Frame
The actual app runs in Farcaster - paste this URL in a frame-enabled client
/api/frame

Share this URL in Warpcast or any Farcaster client to use the Frame interface

⚙️ Setup Instructions

1. Environment Variables

ANTHROPIC_API_KEY=your_claude_api_key
OPENAI_API_KEY=your_openai_api_key
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_KEY=your_supabase_service_key
NEXT_PUBLIC_BASE_URL=https://your-domain.vercel.app

2. Database Setup (Supabase)

Run this SQL in your Supabase SQL Editor:

-- Enable pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;

-- Create images table
CREATE TABLE images (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  url TEXT NOT NULL,
  caption TEXT NOT NULL,
  style_tags TEXT[] NOT NULL,
  mood TEXT NOT NULL,
  colors TEXT[] NOT NULL,
  embedding VECTOR(3072) NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Create vector index for fast similarity search
CREATE INDEX ON images USING ivfflat (embedding vector_cosine_ops)
  WITH (lists = 100);

-- Create RPC function for vector search
CREATE OR REPLACE FUNCTION match_images(
  query_embedding VECTOR(3072),
  match_threshold FLOAT,
  match_count INT
)
RETURNS TABLE (
  id UUID,
  url TEXT,
  caption TEXT,
  style_tags TEXT[],
  mood TEXT,
  colors TEXT[],
  created_at TIMESTAMPTZ,
  updated_at TIMESTAMPTZ,
  similarity FLOAT
)
LANGUAGE SQL STABLE
AS $$
  SELECT
    id,
    url,
    caption,
    style_tags,
    mood,
    colors,
    created_at,
    updated_at,
    1 - (embedding <=> query_embedding) AS similarity
  FROM images
  WHERE 1 - (embedding <=> query_embedding) > match_threshold
  ORDER BY similarity DESC
  LIMIT match_count;
$$;

3. Ingest Images

Use the Ingest tab above or call the API:

curl -X POST https://your-domain.com/api/ingest \
  -H "Content-Type: application/json" \
  -d '{"image_url": "https://example.com/image.jpg"}'

4. Test the Frame

Share the Frame URL in Warpcast to see it in action!