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.
Services
Section titled “Services”| 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.
Outside services
Section titled “Outside services”- 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.