A public job board and an internal operations console have different jobs.
The public site needs fast HTML, crawlable listings, useful filters, and correct job data. The operations console needs queues, tables, detail screens, bulk actions, and state that survives navigation.
I stopped forcing both jobs into the same interface.
Keep the public side simple
Account Executive Jobs still uses Astro for public pages. Job seekers can browse roles without loading an admin application. Search engines receive the listing content and structured data in the page response.
Employers also get focused public paths for posting and managing roles. The marketing and discovery layer does not need to become a large client application.
Give operations a real application
The protected admin area moved into one React Router application.
Jobs, sourcing runs, candidate reviews, Google indexing, companies, users, applications, and email work now have separate screens. Opening a record preserves the original queue, filters, sort order, and scroll position.
The browser does not receive provider secrets or direct database access. A protected server endpoint checks the administrator again for every read and action. Existing publishing, matching, email, and indexing rules remain on the server.
This split also made the interface easier to reason about. Astro owns public discovery. React owns long-running operations. Shared server code owns the business rules.
The tradeoff is more explicit architecture. The benefit is less accidental complexity on both sides.