프로젝트 소개

## 개요 LinkeGringo는 미국 기술 리크루터의 스크리닝 기준에 맞춰 LinkedIn 프로필을 분석하고 재작성하는 오픈 소스 웹 애플리케이션입니다. README에 명시된 개발 동기는 전문적인 프레젠테이션의 부족, 즉 업무 중심의 수동적인 설명, 측정 가능한 성과 부재, 관용적인 기술 영어 표현의 어려움을 해결하는 것입니다. 이 애플리케이션은 GitHub Pages를 통해 배포되었습니다. ## 사용 여정 README에 설명된 워크플로우는 다음과 같은 구조화된 파이프라인을 따릅니다: 1. **PDF 업로드**: 사용자가 LinkedIn의 "PDF로 저장" 기능을 통해 프로필을 내보낸 후 애플리케이션으로 드래그합니다. 2. **인바운드 진단**: 가중치가 적용된 Inbound Readiness 지표 계산, 리텐션 퍼널(검색 → 카드 → 프로필 → InMail) 분석 및 주요 병목 구간을 제시합니다. 3. **적응형 기술 인터뷰**: 실제 지표, 확장성 한계 및 아키텍처 결정 사항을 명확히 하기 위한 질문을 진행합니다. 4. **사실 확인**: 환각 현상(hallucinations)을 방지하기 위해 재작성 전 기술적 사실 관계를 명시적으로 검토합니다. 5. **Action Hub**: 세 가지 탭으로 구성됩니다. *My Profile*(LinkedIn Recruiter 형식의 전후 비교 카드, 즉시 복사 가능한 섹션 및 글자 수 카운터), *Search*(MATCH, WEAK, MISSING 표시가 포함된 리크루터 검색 시뮬레이터), *Launch*(Open to Work, 목표 직무, 원격 근무 위치, 영어 보조 프로필 등 LinkedIn 외부 설정 체크리스트). ## 개인정보 보호 및 아키텍처 README는 감사 가능한 개인정보 보호 모델을 강조합니다: - **백엔드 없음**: 애플리케이션은 브라우저에서만 실행되는 Single Page Application(SPA)입니다. - **BYOK (Bring Your Own Key)**: 사용자는 Google AI Studio에서 무료로 발급받은 본인의 Google Gemini API 키를 사용합니다. - **검사 가능한 요청**: 네트워크 호출은 브라우저에서 Google 서버(`generativelanguage.googleapis.com`)로 직접 전송되며, DevTools의 Network 탭에서 확인 가능합니다. - **로컬 저장소**: API 키는 기기의 `localStorage`에만 저장됩니다. ## 스택 및 코드 구조 이 프로젝트는 모노레포 구조입니다: - `packages/core` (`@linkegringo/core`): 도메인, Zod 스키마, 타입 및 결정론적 공식. - `packages/ai` (`@linkegringo/ai`): Gemini 제공자 (`@google/genai`), 오프라인 모의 객체(mock) 및 프롬프트. - `apps/web` (`@linkegringo/web`): Vite와 Tailwind CSS v4를 사용한 React 19 기반 SPA. 저장소 배지는 TypeScript 5.7+ 및 Gemini Flash 통합을 나타냅니다. GitHub Pages 배포 및 풀 리퀘스트 검증을 위한 GitHub Actions CI/CD 워크플로우가 구축되어 있습니다. ## 실행 방법 사전 요구 사항: Node.js `>= 22` 및 pnpm `>= 11`. ```bash git clone https://github.com/Muriel-Gasparini/linkegringo.git cd linkegringo pnpm install pnpm dev ``` 개발 서버는 `http://localhost:5173`에서 작동합니다. 사용 가능한 스크립트로는 `pnpm build`(패키지 및 웹 앱 컴파일), `pnpm typecheck`(정적 타입 검사), `pnpm test`가 있습니다. ## 거버넌스 저장소에는 `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` (Contributor Covenant), `SECURITY.md` 파일과 MIT 라이선스가 포함되어 있습니다. 유지 관리는 Muriel Gasparini가 담당합니다.