Skip to content

Release: Korean support, Azure AI Foundry, plain description points, CJK PDF fonts - #899

Merged
srbhr merged 24 commits into
mainfrom
dev
Jul 28, 2026
Merged

Release: Korean support, Azure AI Foundry, plain description points, CJK PDF fonts#899
srbhr merged 24 commits into
mainfrom
dev

Conversation

@srbhr

@srbhr srbhr commented Jul 28, 2026

Copy link
Copy Markdown
Owner

7 contributor PRs from the last month, staged and verified on dev.

Merge with a merge commit — do not squash. Keep the dev branch.

Features

Fixes

Maintainer changes on top

  • Scoped the minimal-effort JSON retry to azure_foundry. It had been applied to every provider, silently lowering reasoning_effort for OpenAI GPT-5, Anthropic and DeepSeek on any JSON retry. Covered by a regression test verified to fail without the gate.
  • Resolved the fr.json conflict in favour of the translations already on dev, keeping only settings.errors.baseUrlRequired from the incoming branch.
  • Swiss token compliance: hover:text-blue-700hover:text-primary in the point-style toggle across three builder forms.
  • Backfilled ko.json for both batch-2 PRs, which predated Korean support.

Verification

Run against 8d4f31c, whose tree is byte-identical to the gate-tested integration tip:

locale parity   ok, 7 locales (en es fr ja ko pt-BR zh)
eslint          clean
prettier        clean
vitest          30 files, 195 tests passed
next build      compiled + TypeScript clean
pytest          510 passed, 1 deselected

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

    • Korean (ko) locale added for UI and content generation; registered in frontend and backend.
    • Azure AI Foundry provider (azure_foundry) with LLM_API_BASE support; normalizes Foundry OpenAI endpoints and routes via azure_ai/; settings UI enforces base URL when needed; docs and .env.example updated.
    • Plain description points: per-row bullet/plain toggle stored in descriptionStyles; new shared DescriptionList used across all templates; defaults align to description length with no DB migration.
  • Bug Fixes

    • PDF exports: include fonts-noto-cjk to render Chinese/Japanese/Korean text.
    • Settings: persist Compact Mode and Contact Icons by using a lazy useState initializer.
    • Dialogs: contain long unbroken text via min-w-0 and better wrapping.
    • Builder: stabilize DndContext ids to avoid hydration mismatches.
    • LLM: scope minimal-effort JSON retry to azure_foundry only; resolve fr.json merge and backfill ko.json; use hover:text-primary for the point-style toggle.

Written for commit 8d4f31c. Summary will update on new commits.

Review in cubic

Frankli9986 and others added 24 commits May 4, 2026 16:46
…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>
Batch 2: Azure AI Foundry provider (#892) + plain description points (#882)
Copilot AI review requested due to automatic review settings July 28, 2026 13:02
@srbhr
srbhr merged commit ad7754c into main Jul 28, 2026
6 checks passed
@kilo-code-bot

kilo-code-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 1 Issue Found | Recommendation: Minor issue, can be addressed in follow-up

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/frontend/components/resume/description-list.tsx 25 Using array index as React key could cause issues with DnD reordering

Analysis

This 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:

  • Thorough test coverage for new description styles utility functions
  • Proper alignment logic between description and descriptionStyles arrays in both backend and frontend
  • Good separation of concerns with shared DescriptionList component replacing duplicated rendering logic
  • Azure AI Foundry provider implementation includes proper URL normalization and API version handling
  • i18n additions follow existing patterns with full locale parity

Minor Issue:
The DescriptionList component uses array index as the React key (key={index}). While this works for static rendering, it could cause issues if description items are reordered via drag-and-drop, as React may not properly track item identity across reorders. Consider using a stable identifier if items can be reordered.

Files Reviewed (46 files)
  • Dockerfile - CJK font additions
  • SETUP.md - Documentation updates
  • apps/backend/.env.example - Azure Foundry configuration examples
  • apps/backend/app/config.py - Provider registration
  • apps/backend/app/llm.py - Azure Foundry provider implementation (64+ lines)
  • apps/backend/app/prompts/templates.py - Description styles in prompts
  • apps/backend/app/routers/config.py - API endpoints
  • apps/backend/app/schemas/models.py - Description styles validation
  • apps/backend/tests/unit/test_description_styles.py - New test file
  • apps/backend/tests/unit/test_llm.py - Azure Foundry tests
  • apps/frontend/app/(default)/settings/page.tsx - Provider UI
  • apps/frontend/components/builder/forms/education-form.tsx - DnD context ID
  • apps/frontend/components/builder/forms/experience-form.tsx - Description styles + DnD
  • apps/frontend/components/builder/forms/generic-item-form.tsx - Description styles
  • apps/frontend/components/builder/forms/projects-form.tsx - Description styles
  • apps/frontend/components/builder/resume-builder.tsx - Compact mode persistence
  • apps/frontend/components/builder/resume-form.tsx - DnD context ID
  • apps/frontend/components/common/resume_previewer_context.tsx - Type definitions
  • apps/frontend/components/dashboard/resume-component.tsx - Type definitions
  • apps/frontend/components/resume/description-list.tsx - New shared component
  • apps/frontend/components/resume/dynamic-resume-section.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-clean.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-latex.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-modern-two-column.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-modern.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-single-column.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-two-column.tsx - Use DescriptionList
  • apps/frontend/components/resume/resume-vivid.tsx - Use DescriptionList
  • apps/frontend/components/ui/confirm-dialog.tsx - Dialog width fix
  • apps/frontend/i18n/config.ts - Korean locale registration
  • apps/frontend/lib/api/config.ts - Provider types
  • apps/frontend/lib/api/resume.ts - Type definitions
  • apps/frontend/lib/i18n/messages.ts - Korean messages
  • apps/frontend/lib/utils/description-styles.ts - New utility file
  • apps/frontend/messages/en.json - English translations
  • apps/frontend/messages/es.json - Spanish translations
  • apps/frontend/messages/fr.json - French translations
  • apps/frontend/messages/ja.json - Japanese translations
  • apps/frontend/messages/ko.json - Korean translations (new file, 1038 lines)
  • apps/frontend/messages/pt-BR.json - Portuguese translations
  • apps/frontend/messages/zh.json - Chinese translations
  • apps/frontend/tests/confirm-dialog.test.tsx - New test
  • apps/frontend/tests/description-list.test.tsx - New test
  • apps/frontend/tests/description-styles.test.ts - New test
  • apps/frontend/tests/i18n-locale-parity.test.ts - Korean locale test
  • docs/agent/llm-integration.md - Documentation

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

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 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 (bullet vs plain) via shared DescriptionList, 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.

Comment on lines +161 to +170
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.',
},
Comment on lines +121 to +125
return {
...item,
description: [...(item.description || []), ''],
descriptionStyles: [...(item.descriptionStyles || []), 'bullet'],
};
Comment on lines +122 to +126
return {
...item,
description: [...(item.description || []), ''],
descriptionStyles: [...(item.descriptionStyles || []), 'bullet'],
};
Comment on lines +81 to +85
return {
...item,
description: [...(item.description || []), ''],
descriptionStyles: [...(item.descriptionStyles || []), 'bullet'],
};
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.

[Bug]: Edit mode toggle states not persisted after saving [Bug]: Garbled PDF output when saving Chinese resumes

7 participants