Skip to content

Prepare CV Builder MVP for community testing#87

Merged
SaharPak merged 2 commits into
mainfrom
release/mvp-readiness
Jul 2, 2026
Merged

Prepare CV Builder MVP for community testing#87
SaharPak merged 2 commits into
mainfrom
release/mvp-readiness

Conversation

@SaharPak

@SaharPak SaharPak commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR prepares the CV Builder MVP for a community announcement. It is a finish-and-announce release — no new features, only honest copy, complete result rendering, a feedback collection flow, and three new docs that walk a new tester through running, evaluating, and reporting back.

What changed

Web UI

  • Home page copy rewritten (apps/web-ui/src/app/page.tsx): replaced the misleading "Tailor your resume / Shape the story / Export a focused CV" marketing claims with an honest description of the product as a CV evaluator. Adds a privacy callout and a link to the feedback guide.
  • Results page is now complete (apps/web-ui/src/app/results/page.tsx):
    • Renders the issues[] array with severity color-coding (critical/major/minor)
    • Renders the ATS verdict with explanation
    • Renders the detected archetype
    • Visual progress bars per dimension (was plain text)
    • Empty-state CTA back to the home page when /results is visited directly
    • Adds a "Was this useful?" footer linking to /feedback
  • New /feedback page (apps/web-ui/src/app/feedback/page.tsx): where to send feedback, what to include, anonymization checklist, sample anonymized feedback, five open-ended questions.
  • FileUpload is no longer misleading (apps/web-ui/src/app/components/FileUpload.tsx): .pdf removed from the accept attribute; PDF now produces a friendly inline status message instead of an alert. Other unsupported types get a non-blocking status message. Adds an inputId prop so each textarea's status message has a stable id for screen readers.
  • EvaluateForm passes inputId to each FileUpload so the new status messages are wired to the right input.

Docs

  • docs/LOCAL_DEMO.md — what the MVP does and doesn't do, install, run web UI, run CLI, sample fixtures, expected result shape, troubleshooting.
  • docs/FEEDBACK_GUIDE.md — where to send feedback, anonymization checklist, what NOT to include (real CV), sample anonymized feedback, five questions.
  • docs/COMMUNITY_ANNOUNCEMENT.md — ready-to-post announcements in Persian (short + long) and English (short), plus a posting checklist.

README

  • Updated tagline to reflect the actual product (evaluator, not builder)
  • Web UI marked MVP (local), not "coming soon"
  • Added a Privacy section: no telemetry, no upload, no cookies; reminder not to paste real CVs into GitHub issues
  • Roadmap v0.1 items marked complete

What is intentionally not included

Validation results

Command Result
pnpm install OK — up to date
pnpm test (turbo) 12/12 tasks successful
pnpm --filter @cv-builder/core test 21/21 passing
pnpm --filter @cv-builder/eval test 21/21 passing
pnpm lint 0 errors, 1 informational notice (biome migrate)
pnpm build 6/6 packages build; web emits /, /_not-found, /feedback, /results

How Sahar can announce it

  1. Read the posting checklist at the bottom of docs/COMMUNITY_ANNOUNCEMENT.md.
  2. Pick the announcement length that fits the channel (short Telegram, long Telegram/LinkedIn, short English).
  3. Replace the closing line with your sign-off (or "Sahar from Tech Immigrants").
  4. Pin the announcement.
  5. Watch the issues feed for the first 24 hours.

Links

  • Announcement pack: docs/COMMUNITY_ANNOUNCEMENT.md
  • Local demo guide: docs/LOCAL_DEMO.md
  • Feedback guide: docs/FEEDBACK_GUIDE.md
  • Privacy reminder: README § Privacy
  • Web UI feedback page: /feedback (live after merge)
  • Tracking issue for Cloudflare setup: Track Cloudflare Pages setup for PR #78 #86

Summary by CodeRabbit

  • New Features
    • Added a local-only web MVP with clearer scoring results, dimension breakdowns, issue summaries, strengths, and navigation to feedback/help pages.
    • Added a dedicated feedback guide page and community announcement docs.
  • Bug Fixes
    • Improved file upload behavior with clearer inline messages and support limited to .txt/.md files.
    • Expanded results and empty-state screens with clearer guidance and safer fallbacks.
  • Documentation
    • Updated README and added local demo, feedback, and privacy guidance, including usage notes and privacy expectations.

- Rewrite home page copy to honestly describe the product as a CV evaluator
- Render issues[], ATS verdict, and detected archetype on /results
- Add visual dimension bars and CTA back to evaluator on /results
- Add /feedback page with anonymization guidance and sample feedback
- Stop advertising PDF support; remove .pdf from accept list; show inline
  status messages instead of alerts in FileUpload
- Add docs/LOCAL_DEMO.md, docs/FEEDBACK_GUIDE.md, docs/COMMUNITY_ANNOUNCEMENT.md
- Update README with privacy note, MVP framing, and link to local demo guide
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@SaharPak, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 11 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f228694d-6b65-44e9-a172-6b350163a000

📥 Commits

Reviewing files that changed from the base of the PR and between 9f29699 and 2bc34a4.

📒 Files selected for processing (4)
  • apps/web-ui/src/app/components/FileUpload.tsx
  • apps/web-ui/src/app/results/page.tsx
  • docs/FEEDBACK_GUIDE.md
  • docs/LOCAL_DEMO.md
📝 Walkthrough

Walkthrough

README, Web UI pages (home, results, feedback), and FileUpload/EvaluateForm components are updated to reflect a "community MVP" positioning that scores an existing CV. FileUpload restricts uploads to .txt/.md with inline status messaging. Three new documentation files (community announcement, feedback guide, local demo) are added.

Changes

Web UI upload flow, page content, and results UI

Layer / File(s) Summary
FileUpload accessibility and inputId wiring
apps/web-ui/src/app/components/FileUpload.tsx, apps/web-ui/src/app/components/EvaluateForm.tsx
FileUpload accepts only .txt/.md, replaces alert()-based errors with an inline DOM status element keyed by inputId, and EvaluateForm passes inputId for CV and JD uploads.
Home page hero, steps, and privacy copy
apps/web-ui/src/app/page.tsx
Hero, step cards, and privacy section are rewritten with new MVP messaging and links to /results and /feedback.
Results page richer evaluation UI
apps/web-ui/src/app/results/page.tsx
Adds severity styling, ATS readiness section, dimension progress bars, issues-to-fix list, updated strengths section, and a "Was this useful?" feedback CTA.
New feedback guide page
apps/web-ui/src/app/feedback/page.tsx
New FeedbackPage route renders feedback guidance, privacy warning, sample feedback, and navigation links.

README and new community/demo documentation

Layer / File(s) Summary
README repositioning and roadmap updates
README.md
Intro, Web UI section, and roadmap checklist are rewritten to reflect MVP scope, local-only usage, and privacy model.
Feedback guide documentation
docs/FEEDBACK_GUIDE.md
New doc covering feedback routing, CV anonymization, remediation, and privacy promise.
Community announcement variants and checklist
docs/COMMUNITY_ANNOUNCEMENT.md
New doc with Persian/English announcement variants, personalization guidance, and posting checklist.
Local demo guide documentation
docs/LOCAL_DEMO.md
New doc covering setup, web/CLI usage, expected result schema, troubleshooting, and testing checklist.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

  • TechImmigrants/cv-builder#76: Touches the same EvaluateForm, FileUpload, and results page workflow that this PR extends with inputId and inline status messaging.

Suggested reviewers: rfatideh

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: preparing the CV Builder MVP for community testing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/mvp-readiness

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 5

🧹 Nitpick comments (2)
apps/web-ui/src/app/components/FileUpload.tsx (1)

13-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prefer React state over imperative DOM query for status messages.

setStatus reaches into the DOM via document.getElementById instead of using component state. This bypasses React's rendering model, is harder to test, and is fragile if the DOM node is ever conditionally unmounted/remounted (the query would silently no-op).

♻️ Suggested refactor using state
-export function FileUpload({ inputId, onContentLoaded }: FileUploadProps) {
-  const inputRef = useRef<HTMLInputElement>(null);
-
-  function setStatus(message: string) {
-    const el = document.getElementById(`${inputId}-message`);
-    if (el) {
-      el.textContent = message;
-    }
-  }
+export function FileUpload({ inputId, onContentLoaded }: FileUploadProps) {
+  const inputRef = useRef<HTMLInputElement>(null);
+  const [status, setStatus] = useState("");

Then render {status} inside the <p id={...} role="status" aria-live="polite"> element instead of leaving it empty.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web-ui/src/app/components/FileUpload.tsx` around lines 13 - 18, The
FileUpload status update logic is imperatively querying the DOM in setStatus
instead of using React state. Refactor FileUpload so status text is stored in
component state (for example, via the existing status setter logic around
setStatus) and rendered directly inside the <p role="status" aria-live="polite">
element, removing the document.getElementById lookup and keeping the status
message in React’s render flow.
apps/web-ui/src/app/results/page.tsx (1)

58-79: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Results page skips the shared Header.

Home and Feedback pages both wrap content in <Header /> (nav + theme toggle), but this page renders directly in <main>. Not a functional bug — "Evaluate another CV" covers navigation — but it's an inconsistent shell across the three pages in this cohort.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web-ui/src/app/results/page.tsx` around lines 58 - 79, The results page
is missing the shared app shell header, so it should use the same `<Header />`
component pattern as the Home and Feedback pages. Update the
`ResultsPage`/`page.tsx` layout to render `<Header />` above the `<main>`
content, keeping the existing “Evaluate another CV” link inside the page body if
needed. Use the `Header` component reference already used by the other pages to
keep the shell consistent across the cohort.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web-ui/src/app/results/page.tsx`:
- Around line 21-24: The results page is trusting parsed localStorage data too
much in the page component and can crash on older/stale records. In the results
rendering logic, treat `result.dimensions` the same way as `issues` and
`strengths` by defaulting to an empty array before mapping in the results view,
and make sure the `getEvaluationResult`/`setResult` flow in `page.tsx` handles
missing fields safely instead of relying on the `EvaluationResult` cast. Also
update the progress-bar percentage calculation in the dimensions render path to
handle `dimension.maxScore === 0` by falling back to a safe value before
dividing.

In `@docs/FEEDBACK_GUIDE.md`:
- Around line 103-109: The community feedback bullet is inconsistent with the
rest of the docs because it mentions Discord/Telegram instead of the documented
Tech Immigrants feedback channel. Update the wording in the “Other ways to give
feedback” section to match the repo’s standard phrasing, keeping the reference
to the `#feedback` channel consistent and avoiding any extra platform-specific
wording.

In `@docs/LOCAL_DEMO.md`:
- Around line 233-237: Replace the ad-hoc formatting command in the LOCAL_DEMO
docs with the repo-standard formatting script, and keep the surrounding guidance
about lint errors unchanged. Update the Lint reports errors section to reference
the existing docs-level command convention used elsewhere in the repo, so
readers are directed to the same formatting entrypoint rather than
biome-specific invocation.
- Around line 48-53: The prerequisites section in LOCAL_DEMO.md currently says
Node.js 22 or newer, which conflicts with the repo’s declared runtime. Update
the prerequisite text to match the repo metadata by lowering the Node
requirement to Node >= 20.0.0, and keep the rest of the setup guidance
unchanged. Locate the change in the prerequisites list that mentions Node.js and
align it with the supported toolchain used by the repository.
- Around line 160-162: The local demo docs are describing the EvaluationResult
shape incorrectly by marking rewrites as “reserved for future use” even though
it is already part of the current schema. Update the documentation around
EvaluationResult to clearly describe rewrites as an existing field, and align
the surrounding comments for atsCompatible and rewrites so the result shape
matches the actual API contract.

---

Nitpick comments:
In `@apps/web-ui/src/app/components/FileUpload.tsx`:
- Around line 13-18: The FileUpload status update logic is imperatively querying
the DOM in setStatus instead of using React state. Refactor FileUpload so status
text is stored in component state (for example, via the existing status setter
logic around setStatus) and rendered directly inside the <p role="status"
aria-live="polite"> element, removing the document.getElementById lookup and
keeping the status message in React’s render flow.

In `@apps/web-ui/src/app/results/page.tsx`:
- Around line 58-79: The results page is missing the shared app shell header, so
it should use the same `<Header />` component pattern as the Home and Feedback
pages. Update the `ResultsPage`/`page.tsx` layout to render `<Header />` above
the `<main>` content, keeping the existing “Evaluate another CV” link inside the
page body if needed. Use the `Header` component reference already used by the
other pages to keep the shell consistent across the cohort.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6210907e-4e88-4636-a750-94022d64fd3f

📥 Commits

Reviewing files that changed from the base of the PR and between 9f651cf and 9f29699.

📒 Files selected for processing (9)
  • README.md
  • apps/web-ui/src/app/components/EvaluateForm.tsx
  • apps/web-ui/src/app/components/FileUpload.tsx
  • apps/web-ui/src/app/feedback/page.tsx
  • apps/web-ui/src/app/page.tsx
  • apps/web-ui/src/app/results/page.tsx
  • docs/COMMUNITY_ANNOUNCEMENT.md
  • docs/FEEDBACK_GUIDE.md
  • docs/LOCAL_DEMO.md

Comment thread apps/web-ui/src/app/results/page.tsx
Comment thread docs/FEEDBACK_GUIDE.md
Comment thread docs/LOCAL_DEMO.md
Comment thread docs/LOCAL_DEMO.md
Comment thread docs/LOCAL_DEMO.md
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 2, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
❌ Deployment failed
View logs
cv-builder-web 2bc34a4 Jul 02 2026, 05:24 PM

- results/page.tsx: default dimensions/issues/strengths to [] on stale
  localStorage records; guard divide-by-zero when dimension.maxScore is 0;
  render shared Header so the page matches the home and feedback shell.
- FileUpload.tsx: replace imperative document.getElementById status updates
  with a React useState field rendered inside the aria-live status element.
- docs/LOCAL_DEMO.md: lower Node prerequisite to 20+ (matches package.json),
  use the repo's pnpm format script for auto-fix, document rewrites as
  Rewrite[] in the current EvaluationResult shape.
- docs/FEEDBACK_GUIDE.md: align feedback channel wording with the rest of
  the repo (Tech Immigrants community, not Discord/Telegram).

Validates: pnpm test (12/12 tasks), pnpm lint (0 errors), pnpm build (6/6).
@SaharPak SaharPak merged commit 7a27bbb into main Jul 2, 2026
3 checks passed
SaharPak pushed a commit that referenced this pull request Jul 2, 2026
Captures what is ready (web UI, CLI, eval harness, 8 archetypes,
6 dimensions), what is not (PDF parsing, hosted deployment,
rewriter mode, telemetry), and the local-only caveat. Includes
validation results from the post-PR #87 fresh build (pnpm test
12/12, pnpm lint 0 errors, pnpm build 6/6 with /, /results,
/feedback emitted as static). Points to docs/COMMUNITY_ANNOUNCEMENT.md
for the announcement templates.
SaharPak added a commit that referenced this pull request Jul 2, 2026
* docs: align repository documentation with MVP status

Documentation-only audit. No code, evaluator, or rule changes; no new
features; no Cloudflare work; no changes to PR #37 or #78.

User-facing copy fixed:
- README.md: replace misleading ASCII diagram (3 rewrites / Tailored CV)
  with the actual MVP outputs (Score, Issues, Strengths, ATS verdict,
  Archetype); clarify that /evaluate-cv ./my-resume.pdf works only
  because Claude Code reads PDFs natively (the local CLI/web UI parse
  .md and .txt only).
- apps/web-ui layout.tsx: Next.js metadata description replaced with
  honest CV-evaluator copy (no longer 'Build a tailored resume...').
- apps/web-ui/README.md: list all three routes (/, /results, /feedback),
  note the static-export + privacy-first posture.
- apps/cli/README.md: same PDF-clarification note as the root README.
- package.json descriptions (root + core + cli): remove 'tailor /
  build' wording; describe the deterministic evaluator.
- packages/intelligence/README.md: list the eight shipped roles
  (matches README and the actual implementation) and correct the
  default archetype (Backend Engineer, not Software Engineer).
- packages/eval/README.md: drop the outdated LLM-provider claim; the
  MVP is fully deterministic.
- .claude/skills/cv-evaluation/SKILL.md: 'local MVP', not 'hosted
  product'; default archetype corrected.
- ROADMAP.md: status note added; Phase-1 / #74 / #75 / #76 / #85 / #87
  marked as recently shipped; only #37 and #78 remain in progress.

Historical docs marked with status notes (not rewritten, just flagged
as pre-release context): ARCHITECTURE.md, PROPOSAL.md, PHASE-1.md,
V1_SCOPE.md, MVP_DEMO_PLAN.md, PR_CLEANUP_HANDOFF.md,
POST_MERGE_VALIDATION.md, REMAINING_PRS_PLAN.md, PR85_ROLLBACK_PLAN.md.
Each now points readers to docs/MVP_RELEASE_STATUS.md.

New:
- docs/REPO_DOCS_AUDIT.md records the audit date, files reviewed,
  files changed, outdated claims found and fixed, historical docs
  left intentionally unchanged, remaining risks, and the validation
  results.

Validates: pnpm test (12/12), pnpm lint (0 errors), pnpm build (6/6,
fresh --force: emits /, /_not-found, /feedback, /results).

* docs: fix remaining Node version reference

docs/MVP_DEMO_PLAN.md still said 'Node 22+' in the prereqs section,
which conflicts with the actual repo metadata (Node >= 20.0.0 in
package.json) and with the authoritative setup guide in
docs/LOCAL_DEMO.md. Replace the prereqs with a short pointer to
LOCAL_DEMO.md plus a one-line accurate summary, so this historical
demo-readiness doc no longer contradicts current setup instructions.

docs/REPO_DOCS_AUDIT.md: remove the corresponding entry from the
'remaining documentation risks' list, fix the resulting item
numbering, and add a note recording that the Node-version item was
resolved before merge.

No code, evaluator, or rule changes. No new features. PR #37 and
PR #78 untouched.

Validates: pnpm test 12/12, pnpm lint 0 errors, pnpm build 6/6
(fresh --force, emits /, /_not-found, /feedback, /results).

* docs: address remaining CodeRabbit comments on PR #88

Two unresolved CodeRabbit comments fixed in this commit:

1. README.md — replace hard-coded '5 issues' in the evaluator diagram
   with the non-fixed wording 'Issues'. evaluate() returns a
   variable-length issues array; a fixed count would drift as scoring
   changes. The other diagram labels (Score, Strengths, ATS verdict,
   Archetype) are kept as-is because they describe deterministic
   outputs that do not vary in count.

2. packages/intelligence/README.md — the previous audit pass claimed
   this package ships eight roles and falls back to Backend Engineer.
   But packages/intelligence/src/archetypes/index.ts registers only
   three archetypes (Software Engineer, Product Manager, Data & ML
   Engineer) and DEFAULT_ARCHETYPE is softwareEngineer. Update the
   README to reflect the actual registry. Add a note clarifying that
   @cv-builder/core has a separate, broader legacy/runtime registry
   (7 roles) used by the CLI and Web UI, and that unifying the two
   registries is a follow-up — see docs/ARCHETYPE_GAP_AUDIT.md.

docs/REPO_DOCS_AUDIT.md updated to record that the
packages/intelligence/README.md archetype-inventory row was
corrected in two steps (the audit pass incorrectly bumped the
package claim to 8; this commit brings it back to 3 and adds the
@cv-builder/core note).

No code changes. No new features. PR #37 and PR #78 untouched.
Docs only.

Validates: pnpm test 12/12, pnpm lint 0 errors, pnpm build 6/6.

---------

Co-authored-by: Cleanup Bot <cleanup-bot@example.com>
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.

1 participant