Case study · P/02 Live on web, iOS & Android
Giftruly
An AI gift concierge: describe the person in a sentence and get a shortlist of ideas, each with a reason it fits.
- Role
- Founder & engineer: product, full-stack, infrastructure and AI
- Timeline
- 2023 – present
- Platforms
- Web · iOS · Android
- Status
- Live on web, iOS & Android
-
85K+
AI gift recommendations served
-
24K+
unique devices used the gift finder
-
1K+
downloads on Google Play
§ 1 · Overview
The product
Finding a thoughtful gift for someone whose tastes differ from yours can take hours. Giftruly turns a short questionnaire, or a single free-text description like "My mom turns 60, loves gardening and baking, under $75", into a shortlist of gift ideas, each with a sentence explaining why it fits, linked to the right local Amazon store.
I started Giftruly in March 2023, when LLM products were brand new, and have run it in production since: a website and native apps on both stores, a multi-account AWS backend, and an AI layer that has moved from OpenAI to Azure OpenAI to Claude on Amazon Bedrock. Giftruly 2.0, a ground-up rebuild of the web experience, is now in beta.
Key features
- A step-by-step gift finder: occasion, recipient, age, interests and budget
- A free-text concierge that treats budgets as hard limits
- 7 countries, each with its local Amazon store and currency
§ 2 · Engineering
How it's built
-
01 Client
- Next.js static site
- Expo iOS / Android
-
02 Edge
- CloudFront
- S3
-
03 Compute
- Lambda
- Spend limits (DynamoDB)
-
04 Intelligence
- Local ranking
- Embeddings
- Claude (Bedrock)
- 01
Automatic kill switches for LLM spend
CloudWatch alarms on the chat function trigger Lambdas that either disable the AI feature gracefully or throttle its concurrency, so a traffic spike or abuse can't turn into a surprise bill.
- 02
A recommender that degrades gracefully
Giftruly 2.0 ranks a gift catalog locally, adds semantic search with embeddings, and asks Claude on Bedrock for the final picks with structured output. Model results go through the same validation as local ones, and spend limits are reserved atomically before each call; when a limit trips, users get local results instead of an error.
- 03
Migrations without breaking shipped apps
The AI layer moved from OpenAI to Azure OpenAI to Claude on Bedrock. When Amazon retired its product API and an old Claude model reached end of life, I patched the production backend in place so the apps already on people's phones kept working without a new release.
§ 3 · Gallery
The app
-
Mobile app: step-by-step finder
§ 4 · Stack
Tools & services
| Web & mobile | |
|---|---|
| Backend | |
| AI |