[New Feature] Vue 3 SPA frontend — replace Streamlit UI with Vite + Vue 3 + FastAPI #8
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Circuit-Forge/peregrine#8
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Overview
Design doc:
docs/plans/2026-03-03-nuxt-frontend-design.mdDesign system:
docs/plans/2026-03-03-nuxt-design-system.mdReplace the Streamlit UI with a purpose-built Vite + Vue 3 SPA served directly by FastAPI. Avocet's label tab (PR #1) is the proof-of-concept — this feature ports that architecture to Peregrine.
Motivation
Streamlit ceilings:
Vue 3 SPA unlocks:
Why not Nuxt?
Peregrine is a private self-hosted tool — SSR provides no SEO benefit and adds a second runtime process. The shared design system travels as a CSS file + component patterns without requiring the same framework.
Key Views
Stack
Privacy & Safety Requirements
DEMO_MODE=truereplaces all data with fixtures formenagerie.circuitforge.tech/peregrineConfirmModal.vuerequired for all destructive actionsAcceptance Criteria
./manage.sh build-spabuilds the SPA; FastAPI serves itProgress update — v0.7.0 (2026-03-24)
The Vue SPA has shipped its first full feature set and is live in the cloud instance at
menagerie.circuitforge.tech/peregrinebehind theprgn_ui=vuecookie (paid+ tier).What's been built
Scaffold & infrastructure
peregrine.cssdesign system — full dark/light theme-aware CSS vars matching CircuitForge design languagewebservice added tocompose.yml(nginx, port 8507 cloud / 8506 local)Views shipped
HomeViewJobReviewViewApplyView+ApplyWorkspaceViewInterviewsViewInterviewPrepViewSurveyViewDigestViewSettingsViewKey components
JobCardStack/JobCard— swipe-to-approve with spring snap-back suppressedApplyWorkspace— extracted component with job-removed emitInterviewCard,MoveToSheet,WorkflowButton,TaskIndicatorClassicUIButton— switch-back to Streamlit from within VueAppNav— sidebar with live badge countsUI switcher (Streamlit ↔ Vue)
app/components/ui_switcher.py—sync_ui_cookie(),switch_ui(), banner, settings toggle, sidebar buttonui_preferencefield inuser.yaml(persists across browser clears)vue_ui_betafeature key (paid+ required)prgn_ui=vue→ Vue nginx; absent/streamlit → Streamlit?prgn_switch=streamlitquery param for Vue-initiated switch-back?ui_fallback=1param for Caddy bounce-back when Vue SPA is down/account(website) for auto-provision recoveryRouting / cloud integration
prgn_uicookie per-user in cloud instancePEREGRINE_VUE_URLenv var bypasses Caddy for local devWhat's next
Merged in v0.8.0 (2026-03-16). Vue 3 SPA is live behind the
prgn_uicookie on paid tier. ResumeOptimizerPanel added in the same branch. Closing.pyr0ball referenced this issue2026-04-02 17:42:34 -07:00