DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A CV/Resume creation tool.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Free, privacy-first CV and resume builder for the global job market.
Built by Bagalinis Consulting. No account required. Your CV is stored in your browser, not on our servers.
GlobalCV generates professional CVs and resumes tailored to the conventions of eight major job markets. Each market has its own templates, fields, labels, and formatting rules — so your CV looks like it was built by someone who knows the local standards, not a generic online tool.
Supported markets:
| Market | Page size | Templates | Language |
|---|---|---|---|
| 🇺🇸 United States | Letter | Classic, Modern | English |
| 🇬🇧 United Kingdom | A4 | Classic CV, Modern CV | English |
| 🇦🇺 Australia & NZ | A4 | Classic, Modern | English |
| 🇮🇳 India | A4 | Classic CV, Modern CV | English |
| 🇪🇺 European Union | A4 | Europass, Modern | English |
| 🌎 Latin America | Letter | Traditional, Modern | Spanish |
| 🇧🇷 Brasil | A4 | Tradicional, Moderno | Portuguese |
| 🇯🇵 Japan | A4 | 履歴書 (Rirekisho), 職務経歴書 (Shokumu) | Japanese |
Market conventions enforced per locale:
| Market | Photo | DOB | Nationality | Marital status | Page limit |
|---|---|---|---|---|---|
| 🇺🇸 US | Hidden (discrimination law) | Hidden | Hidden | Hidden | 1 |
| 🇬🇧 GB | Hidden (equality law) | Hidden | Hidden | Hidden | 2 |
| 🇦🇺 AU | Hidden | Hidden | Hidden | Hidden | 3 |
| 🇮🇳 IN | Optional | Optional | Optional | Optional | 2 |
| 🇪🇺 EU | Optional | Optional | Optional | Hidden | 2 |
| 🌎 LATAM | Required | Required | Required | Required | 2 |
| 🇧🇷 BR | Optional | Optional | Optional | Optional | 2 |
| 🇯🇵 JP | Required | Required | Required | Optional | — |
.json file; restoring always creates a new draft (in the backup's market) and never overwrites an existing one#, not sent to servers). Photo and ID number are never included; other sensitive fields (DOB, nationality, marital status, gender, emergency contact, street address, references' contacts) only on explicit opt-in. Not encrypted — anyone with the link can read itYour CV never leaves your device.
GlobalCV is a fully client-side app. No data is collected, stored on a server, or shared with third parties. See the full Privacy Policy and Terms of Service inside the app.
Hosting is provided by Vercel. No analytics or tracking scripts are used.
The share link embeds CV content as LZ-compressed plain text in the URL fragment — anyone with the link can read it. A privacy notice is shown before every copy.
| Framework | Next.js 16 (App Router, Turbopack) |
| UI | React 19, Tailwind CSS 3, Radix UI |
| State | Zustand 4 + Immer |
| Forms | react-hook-form 7 |
| Drag & drop | @dnd-kit/core + sortable |
| PDF generation | @react-pdf/renderer 4 |
| Share URL compression | lz-string |
| Icons | lucide-react |
| Language | TypeScript 5.9 |
git clone https://github.com/augustosc-eu/globalcv.git
cd globalcv
npm install
npm run dev # http://localhost:3000
npm run build # production build
npm run lint # ESLint (eslint.config.mjs)
npm run typecheck # TypeScript
npm test # unit + integration tests (node:test via tsx)
npm run verify:pdf # render every market/template/export-mode PDF fixture
npm run test:e2e # browser smoke tests against a production build (needs Playwright + Chromium)
Open http://localhost:3000 and select a market to begin.
Requirements: Node.js 22.13+ (see .nvmrc; required by pdfjs-dist 6 and Next.js 16)
CI (.github/workflows/ci.yml) runs typecheck, lint, tests, npm audit --omit=dev --audit-level=high, build, PDF fixtures and the browser smoke tests on every pull request.
After upgrading pdfjs-dist, run npm run sync:pdf-worker (a test fails if public/pdf.worker.min.mjs is out of sync).
src/
├── app/
│ ├── page.tsx # Market selector landing page
│ ├── [market]/
│ │ ├── layout.tsx # Market validation + ErrorBoundary + PrivacyBanner
│ │ └── page.tsx # Renders WizardShell for the market
│ ├── privacy/page.tsx
│ └── terms/page.tsx
│
├── types/
│ ├── cv.types.ts # CVData, PersonalInfo, WorkExperience, …
│ └── market.types.ts # MarketConfig shape
│
├── lib/
│ ├── markets/
│ │ ├── us.config.ts # US market config
│ │ ├── eu.config.ts # EU market config
│ │ ├── latam.config.ts # Latam market config
│ │ ├── jp.config.ts # Japan market config
│ │ ├── ui.ts # Shared UI label helpers
│ │ └── index.ts # getMarketConfig(), isValidMarket()
│ ├── parser/
│ │ └── cvParser.ts # Paste-import parser → ParseResult { data, warnings }
│ ├── pdf/
│ │ └── CVPDFDocument.tsx # All PDF layouts (Classic, Modern, Europass, Shokumu, …)
│ ├── sharing/
│ │ └── shareUrl.ts # encodeCVToURL / decodeCVFromURL (lz-string)
│ ├── storage/
│ │ └── localStorage.ts # saveCV / loadCV / clearCV — versioned + migration
│ └── utils/
│ ├── cn.ts # Tailwind class merge helper
│ ├── dateFormat.ts # Wareki + locale date formatting
│ └── theme.ts # Color theme utilities
│
├── store/
│ └── cvStore.ts # Zustand store — state, autosave, undo/redo, restoreCV
│
├── hooks/
│ └── usePDFExport.ts # PDF generation state machine (idle/generating/done/error)
│
└── components/
├── form-fields/
│ ├── DateRangePicker.tsx # Start/end date + "present" toggle + validation
│ └── PhotoUpload.tsx # Canvas compression + 8 MB limit
│
├── preview/
│ ├── PreviewPane.tsx # Zoomable preview with page-count warning
│ └── renderers/
│ ├── USClassicRenderer.tsx
│ ├── USModernRenderer.tsx
│ ├── EUEuropassRenderer.tsx
│ ├── EUModernRenderer.tsx
│ ├── LatamTraditionalRenderer.tsx
│ ├── LatamModernRenderer.tsx
│ ├── JapanRirekishoRenderer.tsx
│ └── JapanShokumuRenderer.tsx
│
├── shared/
│ ├── AppHeader.tsx # Save status, undo/redo, import, share, backup, PDF export
│ ├── ATSSuggestionsPanel.tsx # 10-point ATS score with tips (US market)
│ ├── CopyToMarketModal.tsx # Copy CV content to another market
│ ├── CrossTabSyncBanner.tsx # Reload prompt when another tab saves the same market
│ ├── ErrorBoundary.tsx # React error boundary with reload fallback
│ ├── PasteImportModal.tsx # 3-step paste → preview → apply import flow
│ ├── PrivacyBanner.tsx # Top-of-page privacy notice
│ ├── ShareButton.tsx # Copy share link with long-URL warning modal
│ └── ThemeSelector.tsx # Color theme picker
│
└── wizard/
├── WizardShell.tsx # Main layout: sidebar nav + form area + preview pane
├── WizardProgress.tsx # Step list with completion indicators
├── WizardNavigation.tsx # Prev / Next buttons
├── StepRouter.tsx # Maps step key → step component
└── steps/
├── PersonalInfoStep.tsx # Name, contact, photo, address (validated)
├── ObjectiveStep.tsx # Summary / objective text
├── WorkExperienceStep.tsx # DnD-sortable work entries
├── EducationStep.tsx # DnD-sortable education entries
├── SkillsStep.tsx # Tag-based skills with proficiency level
├── LanguagesStep.tsx # Language + CEFR proficiency
├── CertificationsStep.tsx
├── ReferencesStep.tsx
├── TemplatePickerStep.tsx # Template + theme picker + ATS panel (US)
├── JapanSpecificStep.tsx # 通勤時間, 扶養家族, 配偶者, 自己PR, 志望動機
└── StepHeader.tsx # Shared step title/description
Every market's wizard steps, fields, validation rules, UI labels, and PDF layout are driven by MarketConfig. Components read the config at runtime — no market-specific if branches in shared components. To change what a market shows, edit its config file.
CVData is a single flat object shared across all markets. Market-specific optional fields (nearestStation, commuteTime, selfPromotion, reasonForApplication, etc.) are declared as optional on the shared type. The config controls which fields are rendered.
CV drafts are stored in localStorage under cv_maker_v2_{market} (legacy cv_maker_v1_{market} is migrated on first save). Reads never modify storage. Drafts that no longer match the schema are repaired in memory, and their original is copied to a cv_maker_quarantine_* key before it is replaced; unparseable data is quarantined, never overwritten. Every save reports success or a typed failure (quota, unavailable, conflict, …) and the header shows "Not saved" on failure. Each draft carries a revision so concurrent tabs cannot overwrite each other silently. See docs/remediation/GLOBALCV_REMEDIATION_SUMMARY.md for recovery and troubleshooting.
A Zustand subscriber (outside React) captures CV snapshots every 2 seconds when the store is dirty. History is capped at 20 entries. The redo future is dropped on any new edit.
@react-pdf/renderer v4 is lazy-loaded and renders on the main thread when you export. wrap={false} on entry <View>s prevents mid-entry page breaks. The ModernPDF sidebar uses minHeight: '100%' on the outer flex row with backgroundColor directly on the sidebar <View> so it extends correctly across multiple pages.
parseRawCV(text, market) returns { data: Partial<CVData>, warnings: string[] }. It detects sections by heading patterns, extracts contact info from the first 15 lines, and parses date ranges in many formats: ISO YYYY-MM, MMM YYYY, MMM-YYYY, MM/YYYY, Spanish month names, and plain year. Skills are capped at 30 with a warning.
CV data (minus never-shared and, by default, sensitive fields) is JSON-serialized, LZ-compressed and placed in the URL fragment (/{market}#cv=2.<payload>). Payloads are size-limited and schema-validated on open. Legacy ?share= links still open (sensitive fields dropped) and are removed from the address bar immediately.
src/lib/markets/{market}.config.ts implementing MarketConfigsrc/lib/markets/index.tsMarket union in src/types/cv.types.ts and to MARKETS in src/lib/markets/registry.ts (a compile-time check fails if they differ; routes, schema and storage all read this list)src/components/preview/renderers/src/lib/pdf/CVPDFDocument.tsxThe app is fully static-compatible. Deploy on Vercel with zero configuration:
Optional environment variables:
ENABLE_POST_JOB=true and NEXT_PUBLIC_ENABLE_POST_JOB=true to enable the job submission moduleRESEND_API_KEY to enable server-side email delivery for /post-job submissionsRESEND_FROM to control sender identity (default: GlobalCV Jobs <[email protected]>)For Jobs source compliance hardening, you can optionally gate higher-risk providers:
JOBS_SAFE_MODE=false and NEXT_PUBLIC_JOBS_SAFE_MODE=false to disable strict safe mode (not recommended for public launch)ENABLE_ARBEITNOW_SOURCE=true and NEXT_PUBLIC_ENABLE_ARBEITNOW_SOURCE=true to allow Arbeitnow while safe mode is onENABLE_4DAYWEEK_SOURCE=true and NEXT_PUBLIC_ENABLE_4DAYWEEK_SOURCE=trueENABLE_THEMUSE_SOURCE=true and NEXT_PUBLIC_ENABLE_THEMUSE_SOURCE=trueBy default, safe mode is ON and uncertain sources stay disabled.
The jobs API never forwards the free-text search to providers: each provider is fetched at most once per 5 minutes per server instance (single-flight, max 4 concurrent, 6 s timeout per request) and filtered locally. Requests are validated (search ≤ 100 chars, known filter values only) and rate-limited per client per instance (60/min). For a global limit across serverless instances, add a platform rule (e.g. a Vercel Firewall rate-limit rule on /api/*). Demo listings are served only outside production, or with ENABLE_DEMO_JOBS=true.
/post-job submissions are sent to the backend and emailed via ResendlocalStorage and, when you share, in the URL fragment (LZ-compressed, not encrypted)next.config.mjs: CSP (no unsafe-eval in production, object-src 'none', logo hosts allow-listed), X-Frame-Options: DENY, X-Content-Type-Options, Strict-Transport-Security, Permissions-Policy, Cross-Origin-Opener-Policy; X-Powered-By disabledMIT — free to use, modify, and distribute.
Made with care by Bagalinis Consulting