Skip to content

Architecture

Budi is one pnpm monorepo, poktalabs/budi. The api does all the work: it keeps the accounts and the data, and it starts a fresh Tenki session for each Run. Claude Code and career-ops run inside that session, on the User’s Workspace, never inside the api.

System overview: the surfaces, the api, its stores, the Tenki sessions and the model
Figure 1. System overview. Solid lines are calls. The session exists only during one Run; the Volume stays.
Service Path Built with Runs on
landing apps/landing Astro, static. Spanish at /, English at /en/. Cloudflare Pages, budi.lat
web apps/web React 19, Vite, React Router, TanStack Query. Privy for sign-in. Mobile first. Cloudflare Pages, app.budi.lat
api apps/api Hono, Drizzle ORM, Postgres. Starts and watches the Runs. Railway, next to a Railway Postgres
docs apps/docs Astro Starlight, static. This site. Cloudflare Pages, docs.budi.lat
session image apps/api/src/image career-ops at a fixed commit, Claude Code at a fixed version, Playwright and Chromium. Tenki

The shared contract between the api and the web is packages/shared: the request bodies, the views, the Run kinds and states. The design system for every web surface is packages/design-system.

  • Privy: sign-in by email code or Google. The api checks each Privy identity token against Privy’s public keys.
  • Tenki: one Volume for each Pro or Max User (the Workspace) and one short-lived session for each Run.
  • Anthropic: the Claude model that Claude Code uses inside the session. Each Claude Code call has a dollar cap.
  • Cloudflare R2: the files the web app shows: uploaded CVs, Tailored CV PDFs and the Proof screenshots. The bucket is private.
  • PostHog: product analytics for the landing and the web app. Metadata only.
  • The web calls only the api. It never talks to Tenki, R2 or the model.
  • The api is the only service that holds the Tenki, R2 and model keys, and the only one that writes to Postgres.
  • The model key lives in the Claude Code process for one Run. It is never written to the Volume.
  • The bounty board (troopdegen/budi-bounty, public) is a separate repository. It never imports code from this one.