Conversation
…777) The Docker image used python:3.13-slim-bookworm which does not include any CJK fonts. Playwright/Chromium relies on system font fallback for rendering Chinese characters in PDF exports. Without CJK fonts, Chinese resumes render as garbled text / boxes. Changes: - Add fonts-noto-cjk to Dockerfile apt-get install block - Covers Chinese, Japanese, and Korean characters Closes #777
…neration Adds a full Korean translation (766 keys, matching en.json 1:1) and registers `ko` everywhere a locale must be declared: frontend i18n/config.ts (+ locale name/flag), lib/i18n/messages.ts, the locale-parity test's hardcoded imports, and the backend's SUPPORTED_LANGUAGES / LANGUAGE_NAMES so Korean also works as a content-generation language, not just a UI language. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…rors fix: contain long dialog descriptions
Stabilize DnD context ids to avoid hydration mismatch
fix(docker): add CJK fonts for Chinese/Japanese/Korean PDF rendering (#777)
fix(builder): persist Compact Mode and Contact Icons toggles across sessions
feat(i18n): add Korean (ko) language support
…ocale - Replace hover:text-blue-700 with hover:text-primary in the description point-style toggle across experience, project and generic item forms (Swiss design system: no raw palette classes). - Add the missing ko.json translation for builder.genericItemForm.actions .togglePointStyle, required for locale parity after #876 landed on dev. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UMmBLeE1yEETK1xNWqGCTv
# Conflicts: # apps/frontend/messages/fr.json
The retry downgrade to reasoning_effort='minimal' was applied to every provider, silently lowering output quality for OpenAI GPT-5, Anthropic and DeepSeek reasoning models on any JSON retry. Gate it on the azure_foundry provider, which is the case it was written for (Foundry GPT-5 deployments can spend their whole budget on reasoning and return no visible content). Adds a regression test asserting non-Azure providers keep their configured effort across retries. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UMmBLeE1yEETK1xNWqGCTv
Original work by @RedMoonnn in PR #882 (feat/plain-description-points). Landed via integration branch because maintainer fixes were needed: Swiss token compliance and the ko.json key added after #876. Co-authored-by: RedMoonnn <RedMoonnn@users.noreply.github.com>
Original work by @sahayagodson in PR #892 (add-azure-foundry-provider). Landed via integration branch because maintainer fixes were needed: fr.json conflict resolved in favour of the translations already on dev, the minimal-effort JSON retry scoped to azure_foundry, and ko.json added. Co-authored-by: sahayagodson <sahayagodson@users.noreply.github.com>
Code Review SummaryStatus: 1 Issue Found | Recommendation: Minor issue, can be addressed in follow-up Overview
Issue Details (click to expand)SUGGESTION
AnalysisThis PR combines 7 contributor PRs with extensive changes across i18n, LLM provider configuration, resume templates, and UI stability fixes. The code is well-structured with comprehensive test coverage. Strengths:
Minor Issue: Files Reviewed (46 files)
Review completed on merged PR. Overall quality is high with good test coverage and proper handling of edge cases. Reviewed by qwen3.7-plus · Input: 125K · Output: 6.2K · Cached: 536.1K |
There was a problem hiding this comment.
Pull request overview
This release bundle integrates recent contributor work to expand language support, add an Azure AI Foundry LLM provider, improve resume description rendering with per-row bullet/plain styling, and fix several UI/PDF operational issues (including CJK font support in Docker-based PDF generation).
Changes:
- Added Korean (
ko) locale end-to-end (frontend i18n wiring + backend language lists) and updated locale parity guards. - Introduced Azure AI Foundry provider support (frontend settings/UI + backend LiteLLM routing, URL normalization, API version handling, key storage, and regression tests).
- Implemented per-row description point styling (
bulletvsplain) via sharedDescriptionList, plus schema validation/alignment and builder toggles; improved several UI behaviors (DnD hydration stability, confirm dialog overflow, persisted builder settings) and added Docker CJK fonts.
Reviewed changes
Copilot reviewed 46 out of 46 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| SETUP.md | Documents Azure AI Foundry provider configuration. |
| docs/agent/llm-integration.md | Adds Azure AI Foundry to the provider overview and integration notes. |
| Dockerfile | Installs fonts-noto-cjk to support CJK glyph rendering in PDFs inside Docker. |
| apps/frontend/tests/i18n-locale-parity.test.ts | Extends locale parity test coverage to include ko. |
| apps/frontend/tests/description-styles.test.ts | Adds unit tests for description style alignment/toggling helpers. |
| apps/frontend/tests/description-list.test.tsx | Adds component test for bullet vs plain rendering behavior. |
| apps/frontend/tests/confirm-dialog.test.tsx | Adds regression test ensuring long unbroken dialog text is contained/wrapped. |
| apps/frontend/messages/en.json | Adds new UI strings for point-style toggle + base URL requirement error. |
| apps/frontend/messages/es.json | Adds translations for point-style toggle + base URL requirement error. |
| apps/frontend/messages/fr.json | Adds translations for point-style toggle + base URL requirement error. |
| apps/frontend/messages/ja.json | Adds translations for point-style toggle + base URL requirement error. |
| apps/frontend/messages/pt-BR.json | Adds translations for point-style toggle + base URL requirement error. |
| apps/frontend/messages/zh.json | Adds translations for point-style toggle + base URL requirement error. |
| apps/frontend/messages/ko.json | Introduces full Korean locale file and includes new keys used by the release. |
| apps/frontend/lib/utils/description-styles.ts | Adds helpers to align/toggle per-row description styles safely. |
| apps/frontend/lib/i18n/messages.ts | Registers Korean messages in the runtime message map. |
| apps/frontend/lib/api/resume.ts | Extends processed resume typings to include descriptionStyles. |
| apps/frontend/lib/api/config.ts | Adds azure_foundry provider metadata; extends supported languages and key provider types. |
| apps/frontend/i18n/config.ts | Registers ko in locales, names, and flags. |
| apps/frontend/components/ui/confirm-dialog.tsx | Fixes flex shrink/overflow behavior by adding min-w-0 to the text column. |
| apps/frontend/components/resume/description-list.tsx | Adds shared renderer for bullet/plain description rows (with customizable marker). |
| apps/frontend/components/resume/dynamic-resume-section.tsx | Switches custom item-list rendering to the shared DescriptionList. |
| apps/frontend/components/resume/resume-clean.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-latex.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-modern.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-modern-two-column.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-single-column.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-two-column.tsx | Replaces hand-rolled bullet rendering with DescriptionList and supports descriptionStyles. |
| apps/frontend/components/resume/resume-vivid.tsx | Migrates arrow-bullet rendering to DescriptionList with custom marker + descriptionStyles. |
| apps/frontend/components/dashboard/resume-component.tsx | Extends shared resume data types to include descriptionStyles. |
| apps/frontend/components/common/resume_previewer_context.tsx | Extends previewer context types to include descriptionStyles. |
| apps/frontend/components/builder/resume-form.tsx | Stabilizes DnD ids to avoid hydration mismatch. |
| apps/frontend/components/builder/resume-builder.tsx | Fixes localStorage load race by using a lazy useState initializer for template settings. |
| apps/frontend/components/builder/forms/experience-form.tsx | Adds per-row bullet/plain toggle + keeps styles aligned while editing. |
| apps/frontend/components/builder/forms/education-form.tsx | Stabilizes DnD ids for education items. |
| apps/frontend/components/builder/forms/generic-item-form.tsx | Adds per-row bullet/plain toggle for custom item lists. |
| apps/frontend/components/builder/forms/projects-form.tsx | Adds per-row bullet/plain toggle for projects. |
| apps/frontend/app/(default)/settings/page.tsx | Adds Azure Foundry to provider UI; requires Base URL when needed; improves validation and test flow. |
| apps/backend/tests/unit/test_llm.py | Adds unit tests for Azure Foundry routing/normalization and scoped reasoning-effort retry behavior. |
| apps/backend/tests/unit/test_description_styles.py | Adds tests ensuring backend schema aligns descriptionStyles with description. |
| apps/backend/app/schemas/models.py | Adds descriptionStyles to schemas with coercion + alignment validators; extends API key update request. |
| apps/backend/app/routers/config.py | Adds ko to supported languages; registers azure_foundry and its key update handling. |
| apps/backend/app/prompts/templates.py | Adds Korean language name; updates prompt examples/rules to include/preserve descriptionStyles. |
| apps/backend/app/llm.py | Implements Azure Foundry routing, API base normalization, API version handling, and scoped JSON retry reasoning-effort downgrade. |
| apps/backend/app/config.py | Registers azure_foundry in provider lists and legacy key mapping. |
| apps/backend/.env.example | Documents Azure Foundry environment variables and supported provider list. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| azure_foundry: { | ||
| name: 'Azure AI Foundry', | ||
| defaultModel: 'mistral-large-latest', | ||
| requiresKey: true, | ||
| requiresBaseUrl: true, | ||
| baseUrlLabel: 'Azure AI Foundry endpoint', | ||
| baseUrlPlaceholder: 'https://<resource>.services.ai.azure.com/openai/v1/responses', | ||
| baseUrlDescription: | ||
| 'Paste the endpoint from Foundry. GPT deployments can use the service root or /openai/v1/responses; Azure AI Inference models can use the /models endpoint.', | ||
| }, |
| return { | ||
| ...item, | ||
| description: [...(item.description || []), ''], | ||
| descriptionStyles: [...(item.descriptionStyles || []), 'bullet'], | ||
| }; |
| return { | ||
| ...item, | ||
| description: [...(item.description || []), ''], | ||
| descriptionStyles: [...(item.descriptionStyles || []), 'bullet'], | ||
| }; |
| return { | ||
| ...item, | ||
| description: [...(item.description || []), ''], | ||
| descriptionStyles: [...(item.descriptionStyles || []), 'bullet'], | ||
| }; |
7 contributor PRs from the last month, staged and verified on
dev.Merge with a merge commit — do not squash. Keep the
devbranch.Features
SupportedLanguageunion, backendSUPPORTED_LANGUAGESandLANGUAGE_NAMES.azure_ai/; Foundry-hosted GPT-5 deployments viaazure/gpt5_series/withapi_version=v1. Key stored in the existing Fernet-encrypted slot.descriptionStylesarray, with a sharedDescriptionListrenderer replacing the hand-rolled<ul>in all 7 templates. No DB migration — rides in the existingprocessed_dataJSON column.Fixes
fonts-noto-cjk; Chinese, Japanese and Korean now render in generated PDFs instead of tofu boxes. Image grows ~60–80 MB.useStateinitializer, eliminating the race where the save effect overwrote saved settings with defaults on mount.min-w-0so a long unbroken token wraps instead of blowing out the dialog width.idon eachDndContext, removing a hydration mismatch on/builder.Maintainer changes on top
azure_foundry. It had been applied to every provider, silently loweringreasoning_effortfor OpenAI GPT-5, Anthropic and DeepSeek on any JSON retry. Covered by a regression test verified to fail without the gate.fr.jsonconflict in favour of the translations already ondev, keeping onlysettings.errors.baseUrlRequiredfrom the incoming branch.hover:text-blue-700→hover:text-primaryin the point-style toggle across three builder forms.ko.jsonfor both batch-2 PRs, which predated Korean support.Verification
Run against
8d4f31c, whose tree is byte-identical to the gate-tested integration tip:Manually verified by the maintainer.
46 files changed, +1962 / −264. Contributors: @moduvoice, @sahayagodson, @RedMoonnn, @Frankli9986, @gingeekrishna, @luochen211.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UMmBLeE1yEETK1xNWqGCTv
Summary by cubic
Adds Korean language support, Azure AI Foundry provider, and a plain/bullet toggle for resume descriptions. Fixes CJK PDF rendering and several UI stability issues.
New Features
ko) locale added for UI and content generation; registered in frontend and backend.azure_foundry) withLLM_API_BASEsupport; normalizes Foundry OpenAI endpoints and routes viaazure_ai/; settings UI enforces base URL when needed; docs and.env.exampleupdated.descriptionStyles; new sharedDescriptionListused across all templates; defaults align to description length with no DB migration.Bug Fixes
fonts-noto-cjkto render Chinese/Japanese/Korean text.useStateinitializer.min-w-0and better wrapping.DndContextids to avoid hydration mismatches.azure_foundryonly; resolvefr.jsonmerge and backfillko.json; usehover:text-primaryfor the point-style toggle.Written for commit 8d4f31c. Summary will update on new commits.