Skip to content

System redesign - #2

Merged
coderback merged 4 commits into
mainfrom
system-redesign
Jun 24, 2026
Merged

coderback merged 4 commits into
mainfrom
system-redesign

Conversation

@coderback

Copy link
Copy Markdown
Owner

No description provided.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a redesigned Windrush product flow and UI shell (sidebar + new pages), adds onboarding/status routing, and expands the backend to support job feed endpoints and PDF export for generated application documents.

Changes:

  • Added an AppShell + Sidebar layout and new top-level pages for Dashboard, Jobs, Job Details, Careers, and Applications.
  • Implemented onboarding flow with onboarding completion tracking and root-page routing based on onboarding status.
  • Added PDF generation/download endpoints and persisted additional application data (including tailored CV) in the tracker DB.

Reviewed changes

Copilot reviewed 20 out of 21 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
frontend/src/components/Sidebar.tsx New sidebar navigation and logout control.
frontend/src/components/JobCard.tsx New job card UI + navigation to job detail.
frontend/src/components/AppShell.tsx Wraps app pages with sidebar except for auth/onboarding routes.
frontend/src/app/layout.tsx Wraps all pages with AppShell.
frontend/src/app/page.tsx Root now routes to login/dashboard/onboarding based on token + onboarding status.
frontend/src/app/onboarding/page.tsx New 3-step onboarding (CV upload → credentials → persona confirm).
frontend/src/app/dashboard/page.tsx New dashboard UI (stats, recent applications, skill risk summary).
frontend/src/app/jobs/page.tsx New job feed UI (search, filter chips, sorting, results grid).
frontend/src/app/jobs/[id]/page.tsx New job detail flow (analysis, tailored CV + letter generation, browser-agent apply, PDF export).
frontend/src/app/applications/page.tsx New application tracker UI with status updates + notes.
frontend/src/app/careers/page.tsx New careers page (skill exposure risk + roadmap generation).
frontend/src/app/profile/page.tsx Adds “Application Credentials” section to persona profile UI.
frontend/src/app/app/page.tsx Replaces legacy app flow with a redirect to /jobs.
api/requirements.txt Adds PDF-related dependencies.
api/app/tracker.py Adds onboarding flag + tailored CV persistence and default status changes.
api/app/pdf_generator.py New PDF generator module (CV + cover letter).
api/app/models.py Extends persona core info with job-board credential fields.
api/app/main.py Adds onboarding endpoints, job feed endpoints, per-job SSE endpoints, and PDF endpoints; adjusts apply flow.
api/app/agent.py Adds tailored CV tool and tweaks risk/fit scoring outputs.
api/app/browser_agent.py Updates Groq adapter for browser-use integration.
.idea/workspace.xml Adds IDE workspace changes.
Files not reviewed (1)
  • .idea/workspace.xml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +66 to +71
const sorted = [...filtered].sort((a, b) => {
if (sort === "fit") return norm(b.exposure_score) - norm(a.exposure_score);
if (sort === "risk") return norm(a.exposure_score) - norm(b.exposure_score);
return 0;
});

Comment on lines +99 to +104
// Load job from sessionStorage
useEffect(() => {
const raw = sessionStorage.getItem(`job_${decodedId}`);
if (raw) {
try { setJob(JSON.parse(raw) as Job); } catch {}
}
Comment on lines +164 to +166
} catch {}
setStreamingCv(false);
setAppStep("cv_done");
Comment thread api/app/main.py
Comment on lines +335 to 353
user_confirmed = False
try:
async for chunk in run_apply(
current_user.id, job_id, job_url, cover_letter, risks, session_id, q, fq,
job_email=job_email, job_password=job_password, cv_path=cv_path,
job_email=effective_email, job_password=effective_password, cv_path=cv_path,
):
# Detect successful completion from done event
try:
payload = json.loads(chunk.removeprefix("data: ").strip())
if payload.get("type") == "done":
applied_successfully = True
user_confirmed = True
except Exception:
pass
yield chunk
finally:
_browser_queues.pop(session_id, None)
_browser_frames.pop(session_id, None)
if app_id and applied_successfully:
if app_id and user_confirmed:
tracker.update_status(app_id, "Applied")

Comment thread api/app/main.py
Comment on lines 437 to 443
):
status = body.get("status", "")
notes = body.get("notes")
# In a multi-user system, we should verify the app_id belongs to current_user.id
# but for now update_status is global. Let's fix tracker later if needed.
ok = tracker.update_status(app_id, status, notes)
if not ok:
raise HTTPException(status_code=400, detail=f"Invalid status: {status!r}")
return {"id": app_id, "status": status, "updated": True}
Comment on lines +226 to +233
<label className="text-xs text-zinc-400 uppercase tracking-widest">Master password</label>
<div className="relative">
<input
type={showPassword ? "text" : "password"}
value={jobPassword}
onChange={(e) => setJobPassword(e.target.value)}
placeholder="••••••••"
className="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-2.5 text-sm text-zinc-100 focus:outline-none focus:border-teal-500 transition-colors pr-12"
Comment on lines +310 to +317
<label className="text-xs text-zinc-500 uppercase">Master password</label>
<input
type="password"
className="w-full bg-zinc-950 border border-zinc-800 rounded p-2 text-sm focus:border-teal-500 outline-none"
value={persona.core_info.job_password ?? ""}
onChange={(e) => handleChange("core_info", "job_password", e.target.value)}
placeholder="••••••••"
/>
Comment thread api/requirements.txt
groq>=0.9
langchain-groq>=0.2
fpdf2>=2.7.9
markdown>=3.5
Comment thread .idea/workspace.xml
Comment on lines 4 to +10
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="657acfba-7aae-4604-a67f-31eee75bbb05" name="Changes" comment="refactor agent.py to switch LLM backend between Ollama and Groq based on environment variable">
<list default="true" id="657acfba-7aae-4604-a67f-31eee75bbb05" name="Changes" comment="feat: implement AppShell and Sidebar components for improved layout and navigation">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/app/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/api/app/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/api/requirements.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frontend/src/app/app/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/app/app/page.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frontend/src/app/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/app/page.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frontend/src/components/BrowserView.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/components/BrowserView.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frontend/src/app/profile/page.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/src/app/profile/page.tsx" afterDir="false" />
Comment thread api/app/main.py
Comment on lines +618 to +619
except Exception as exc:
raise HTTPException(status_code=500, detail=str(exc))
@coderback
coderback merged commit 1c17245 into main Jun 24, 2026
1 check passed
@coderback
coderback deleted the system-redesign branch October 9, 2026 09:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants