Astro Persona: One Deployment, No Ambiguity
April 7–8, 2026
Astro Persona had been running two separate Cloudflare deployments: a Worker for the API and a Pages site for the frontend. They shared a domain, which meant routing requests between them was a constant source of conflicts. The fix was obvious once we named the problem: one Worker, everything served from it.
Cloudflare Workers support an [assets] binding that serves static files directly from the Worker, without a separate Pages deployment. Move the HTML/CSS/JS into site/public/, configure the binding, and the Worker handles both API routes and static asset serving. One wrangler deploy, one artifact, no ambiguity about which system is handling which request. GitHub Actions CI replaced the Pages Git integration. Simpler and more predictable.
The proxy authentication also got fixed in this session. The old pattern had the client pass an API key in the request body — workable for an internal tool, wrong for anything customer-facing. The new pattern uses a PROXY_SECRET environment variable: clients send Authorization: Bearer <secret>, the Worker holds the Anthropic API key server-side, and the client never touches a key that can generate charges. Standard practice, should have been there from the start.
Two new internal tool tabs: Synthesize and Charts. Synthesize takes birth data, builds a natal chart, assembles the persona, runs a three-question interview via Haiku, and auto-evaluates the result — all in one view, side by side. Charts browses all stored chart records in KV, lets you filter by text, and passes any chart into Synthesize pre-populated. Together they make the tool useful for testing and for doing actual readings.
The landing page got a p5.js celestial animation — procedurally generated planetary orbits rendered on a dark background. It was the last piece the public-facing site needed before launch.