DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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