iMessage calorie tracking assistant powered by AI.
- Runtime: Bun + Turborepo monorepo
- API: Hono on Nitro (deployed to Vercel, 3 regions)
- iMessage: Chat SDK + Sendblue adapter
- AI: AI SDK v6 + GPT-4.1 (vision + agent)
- Database: Upstash Redis (global, 3 regions)
- Workflows: Vercel Workflow SDK for durable pipelines
- Nutrition: USDA FoodData Central API
bun installcp .env.example .envFill in the required keys:
| Variable | Source |
|---|---|
SENDBLUE_API_KEY / SENDBLUE_API_SECRET |
sendblue.co |
SENDBLUE_FROM_NUMBER |
Your Sendblue phone number |
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN |
console.upstash.com |
REDIS_URL |
Same Upstash Redis in redis:// format |
OPENAI_API_KEY |
platform.openai.com |
USDA_API_KEY |
fdc.nal.usda.gov (free) |
bun run devvercel deployDeploys to 3 regions: US East (iad1), London (lhr1), Tokyo (hnd1).
Point your Sendblue incoming message webhook to:
https://your-app.vercel.app/webhooks/sendblue
caltext/
apps/
api/ # Hono API server
src/
index.ts # Routes + webhook handler
bot.ts # Chat SDK singleton
router.ts # Onboarding vs assistant routing
workflows/
handle-message.ts # Main message handler
onboarding.ts # Multi-step onboarding
reminder-loop.ts # Daily reminders + summaries
packages/
ai/ # AI agent + tools
db/ # Upstash Redis data layer
shared/ # Types, locale, timezone utils
- User texts the Caltext number via iMessage
- Sendblue forwards the message via webhook
- New users go through conversational onboarding (name, stats, goal)
- Returning users interact with the AI assistant
- Photos are analyzed with GPT-4.1 vision, then grounded in USDA nutrition data
- Text descriptions are matched against USDA database directly
- Daily reminders at breakfast/lunch/dinner times (timezone-aware)
- End-of-day summaries with calorie/macro breakdown
- Weekly recaps with progress bars and trends