In my last post I described OpinLog — a cross-user review graph where your "burger" and my "burger" resolve to the same canonical item via pgvector on Amazon Aurora PostgreSQL. This post is about the piece that makes the matching feel like magic: multimodal embeddings from Amazon Bedrock, feeding the matcher inside Aurora, all deployed on Vercel.
A photo of a burger should match the word "burger"
Users log items two ways: by typing a name, or by snapping a photo. If text and images lived in different vector spaces, I'd need two matchers and a fusion step. Instead I used Amazon Titan Multimodal Embeddings G1 (amazon.titan-embed-image-v1), which maps both text and images into the same 1024-dimensional space. One model, one index, one query.
The entire embedding contract is tiny:
export async function embed({ text, imageBase64 }: EmbedInput): Promise<number[]> {







