This server pipes astrology data from alchm.kitchen directly into Claude. You get live planetary transits, natal chart positions, synastry overlays, and transit-by-natal aspect calculations without leaving your editor. It's built on Bun and the Swiss Ephemeris via their FastAPI backend, with per-user API keys you mint at /profile/api-keys and tier-based rate limits tied to their ESMS token economy (Spirit, Essence, Matter, Substance). Reach for it when you're building anything that mixes celestial mechanics with meal planning, recipe generation, or personalized food recommendations based on chart data. The MCP integration is new in v3.1 and works with Claude Desktop, Cursor, and Cline.
The world's first astrological meal-planning system. Alchm.kitchen bridges ancient alchemical wisdom with modern AI to deliver personalized food recommendations based on natal charts, live planetary positions, elemental harmony, and thermodynamic resonance.
Production: alchm.kitchen
agents.alchm.kitchen. Unified agent profiles featuring live natal chart overlays, viewer↔agent synastry, and consciousness sigils. Agents actively publish weekly menus and share activities (chat, recipe generation) directly into the public feed_events via authenticated internal bridges./api/generate-recipe endpoint, ensuring strictly structured JSON responses via the shared CosmicRecipe schema./profile/api-keys, and buy ESMS top-ups via Stripe. Tier-aware per-key rate limiting + full telemetry./admin: per-flow system status, live activity stream, onboarding funnel watch, today's highlights, and API-route health — all from existing signals, each panel degrading independently. Hourly health snapshots + Slack/email/DB alerting, plus 5 synthetic probes._migrations table + scripts/migrate.ts run on every Railway deploy, closing the schema-drift gap that caused prior signup/dashboard outages.src/lib/serviceUrls.ts), and DB/calc/security guards.degraded flag surfaces silent astronomy fallbacks and degenerate calculations on /quantities instead of letting them masquerade as live data.See CHANGELOG.md for the full 3.1 detail.
(alchm) route group with the dark #07060B shellsrc/contexts/menu-planner/?prompt=natal soft-prompt banner_aspects array no longer contaminates planet positions dict (three-layer defense)See CHANGELOG.md for the full history.
| Layer | Technology |
|---|---|
| Frontend | Next.js 15 (App Router), React 19, Tailwind CSS, Framer Motion |
| Toolchain | Bun 1.3.13 (package manager + runtime) |
| Backend | Python FastAPI + pyswisseph (Swiss Ephemeris) on Railway |
| Database | PostgreSQL on Railway (internal: postgres.railway.internal) |
| Auth | NextAuth.js v5 (Auth.js) — Google OAuth, JWT, device sessions |
| Payments | Stripe Checkout + Connect (card, stablecoins, ESMS reserve settlement) |
| Resend | |
| Analytics | Vercel Analytics + OpenTelemetry |
| Frontend hosting | Vercel (alchm-kitchen-pro project) |
| Backend hosting | Railway |
Requirement: Bun 1.3.13+. Never use
npmoryarnin this repo.
# 1. Clone
git clone https://github.com/gregcastro23/WhatToEatNext.git
cd WhatToEatNext
# 2. Install (fast — Bun lockfile committed)
bun install
# 3. Copy env template and fill in values
cp .env.example .env.local
# 4. Start dev server
bun run dev
# → http://localhost:3000
# 5. Run tests
bun run test
# 6. Build for production (must pass before every PR)
bun run build
# 7. Lint (must be zero warnings)
bun run lint
src/
├── app/ # Next.js App Router pages
│ ├── (alchm)/ # Dark-shell app pages (auth-gated)
│ │ ├── layout.tsx # Dark #07060B chrome, hides public header
│ │ ├── page.tsx # Home feed (/)
│ │ ├── lab/ # /lab — Alchemical Laboratory
│ │ ├── ingredients/[id]/ # /ingredients/:id — ingredient detail
│ │ ├── profile/ # /profile/* — all profile sub-pages
│ │ ├── commensal/ # /commensal — group recommendations
│ │ ├── feed/ # /feed — activity feed
│ │ ├── birth-chart/ # /birth-chart
│ │ ├── current-chart/ # /current-chart
│ │ ├── recipe-generator/ # /recipe-generator
│ │ ├── planetary-chart/ # /planetary-chart
│ │ ├── restaurant-creator/ # /restaurant-creator
│ │ ├── cosmic-recipe/ # /cosmic-recipe
│ │ ├── generated-recipe/ # /generated-recipe + /generated-recipe/[id]
│ │ └── food-tracking/ # /food-tracking
│ ├── api/ # API route handlers
│ ├── login/ # /login (chromeless)
│ ├── upgrade/ # /upgrade (chromeless)
│ ├── onboarding/ # /onboarding (chromeless)
│ ├── auth/ # /auth/* — NextAuth callbacks + establishing
│ ├── premium/ # /premium — marketing pricing page
│ └── layout.tsx # Root layout: RedesignedHeader + AppChrome
│
├── components/
│ ├── nav/
│ │ ├── AppChrome.tsx # AppChromeFooter + AppChromeTabBar gates
│ │ ├── CommandPalette.tsx # ⌘K global palette
│ │ ├── RedesignedHeader.tsx # 5-slot primary nav with mega-menus
│ │ ├── MobileGlassTabBar.tsx
│ │ └── RedesignedFooter.tsx
│ └── auth/
│ └── AuthFollowups.tsx # AuthHandshake, WelcomeBack, UpgradeGate, AccountSessions
│
├── config/
│ └── navigation.ts # NAV_IA — single source of truth for all nav surfaces
│
├── contexts/
│ ├── MenuPlannerContext.tsx # Barrel re-export (28 lines)
│ └── menu-planner/ # Split modules
│ ├── types.ts # All interfaces (244 lines)
│ ├── useMealSlots.ts # Slot CRUD hook (498 lines)
│ ├── useWeekNavigation.ts # Week cursor hook (65 lines)
│ └── MenuPlannerProvider.tsx # Composes above (1280 lines)
│
├── lib/
│ ├── auth/
│ │ ├── auth.ts # NextAuth v5 full config (Node.js runtime)
│ │ └── auth.config.ts # Edge-safe auth config (middleware)
│ ├── validation/
│ │ └── railway.ts # Zod schemas for Railway API responses
│ └── rateLimit.ts # Sliding-window rate limiter
│
├── services/
│ ├── subscriptionService.ts # Tier management, feature gates
│ ├── TokenEconomyService.ts # Spirit/Essence/Matter/Substance economy
│ ├── HistoricalStatsService.ts
│ └── ...
│
├── types/
│ ├── subscription.ts # TIER_LIMITS, SubscriptionTier
│ └── next-auth.d.ts # JWT augmentation (sessionId, deviceSessionId)
│
└── database/
└── init/ # SQL migrations (01 – 33)
└── 33-device-sessions.sql
Copy .env.example to .env.local and fill in values. All secrets are in Vercel (frontend) and Railway (backend).
# Database (Railway internal — used in production, not local dev)
DATABASE_URL=postgresql://postgres:<pw>@postgres.railway.internal:5432/railway
# Auth
AUTH_SECRET=<32-char-random>
AUTH_GOOGLE_ID=<google-oauth-client-id>
AUTH_GOOGLE_SECRET=<google-oauth-client-secret>
AUTH_ADMIN_EMAIL=<your-email>
AUTH_URL=https://alchm.kitchen # production
AUTH_TRUST_HOST=true
# APIs
API_BASE_URL=https://whattoeatnext-production.up.railway.app
NEXT_PUBLIC_BACKEND_URL=https://whattoeatnext-production.up.railway.app
INTERNAL_API_SECRET=<shared-secret-with-fastapi>
GALILEO_API_KEY=<galileo-key>
# Payments & Email
STRIPE_SECRET_KEY=sk_live_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...
RESEND_API_KEY=re_...
The spacetime-module/ Rust module owns the live culinary catalog plus
per-user real-time state (meal plans, grocery carts, feed events, commensal
sessions). The frontend connects through SpacetimeProvider
(src/contexts/SpacetimeContext.tsx) only when NEXT_PUBLIC_SPACETIME_URI
is set; five NEXT_PUBLIC_SPACETIME_LIVE_* flags gate each consumer surface
(see .env.example). Every surface falls back silently to its legacy
localStorage/REST path when the flag is off or the connection drops. Seed the
culinary catalog with bun scripts/spacetime/seedCulinary.ts; regenerate TS
bindings after module changes with
spacetime generate --lang typescript --module-path spacetime-module --out-dir src/lib/spacetime/generated.
See docs/adr/ for full Architecture Decision Records.
| ADR | Decision |
|---|---|
| ADR-001 | 5-slot primary nav IA |
| ADR-002 | Two-tier pricing (Apprentice / Alchemist) |
| ADR-003 | Token economy as the primary AI throttle |
| ADR-004 | Device sessions via DB + JWT jti |
| ADR-005 | Denormalized read_model JSONB for sub-100ms recipe loads |
| ADR-008 | SpacetimeDB live-state layer (flag-gated, silent legacy fallback) |
Automatic on merge to master. Project: alchm-kitchen-pro, team: cookingwithcastro-llc.
# Manual deploy (if needed)
vercel --prod
Auto-deploys from master if Railway is connected. Manual:
cd backend
railway login
railway up
Migrations live in database/init/. Apply in sequence (01 → 33). Railway runs them on first boot via the db_init.py script.
bun run dev # Start dev server (localhost:3000)
bun run build # Production build (must pass before PR)
bun run lint # ESLint (must be zero warnings)
bun run typecheck # TypeScript typecheck
bun run test # Jest unit tests
bun run storybook # Component dev (dev only, excluded from prod build)
See CONTRIBUTING.md. Branch off master; never target main (stale). Always use Bun.
MIT — see LICENSE.
MCP_USER_API_KEYsecretYour alchm.kitchen API key — mint one at https://alchm.kitchen/profile/api-keys. Optional; unlocks per-user quotas and invocation telemetry. The server runs anonymously without it.
DATABASE_URLsecretPostgreSQL connection string. Optional; enables the token gate and invocation logging. Omit for anonymous mode (all tools still function).