본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 06. 30. 10:13

saeedkolivand/ai-job-hunter-app

요약

Ollama, OpenAI, Anthropic 등을 활용해 로컬 우선 방식으로 작동하는 AI 기반 구직 보조 데스크톱 애플리케이션입니다. 채용 공고 스크래핑, 이력서 및 자기소개서 생성, ATS 최적화 매칭 기능을 제공하며 모든 데이터를 사용자 기기에 안전하게 저장합니다.

핵심 포인트

  • Ollama를 통한 완전 오프라인 실행 및 다양한 AI API 지원
  • Tauri(Rust/React) 기반의 로컬 우선 데스크톱 애플리케이션
  • 채용 공고 스크래핑 및 이력서와의 시맨틱 매칭 기능
  • ATS 친화적인 9가지 이력서 템플릿 및 PDF 내보내기 지원
  • 모델의 추론 과정을 실시간으로 확인 가능한 사고(thinking) 뷰 제공

지능적인 구직 활동, 이력서 및 자기소개서 생성, 지원 보조를 위한 로컬 우선(local-first), AI 네이티브 데스크톱 어시스턴트 — Ollama를 통해 완전히 오프라인으로 실행하거나, 본인의 OpenAI, Anthropic 또는 Gemini 키를 연결하거나, AI CLI 에이전트(Claude Code, Codex, Gemini CLI)를 통해 라우팅할 수 있습니다.

⬇️ 최신 릴리스 다운로드
·
🌐 라이브 사이트
·
🎬 단편 영화
·
📦 설치
·
✨ 기능
·
📚 문서

📑 목차

# 🚀 시도해 보세요 → 운영체제(OS)별 빌드 다운로드:
# https://github.com/saeedkolivand/ai-job-hunter-app/releases
#
...

시작하는 데 API 키가 필요하지 않습니다 — Ollama로 완전히 오프라인으로 실행하거나, 나중에 Settings → AI에서 클라우드 키를 추가할 수 있습니다. 처음이신가요? 사전 요구 사항 및 운영체제별 참고 사항은 Installation을 확인하세요.

AI Job Hunter는 Tauri(Rust 코어와 React 렌더러로 구성)로 구축된 데스크톱 애플리케이션으로, AI 기반의 구직 활동을 사용자의 로컬 머신으로 가져옵니다. 이 앱은 16개의 채용 게시판(Indeed, Glassdoor, Xing과 같은 폐쇄형 게시판을 포함하는 Adzuna/JSearch 애그리게이터 및 Greenhouse, Lever와 같은 기업 범위의 ATS 게시판 포함)을 스크래핑하고, 게시물을 사용자의 이력서와 의미론적으로 매칭하며, 선택한 AI 제공업체를 통해 맞춤형 자기소개서와 이력서를 생성하고, 지원 질문에 대한 근거 있는 답변 초안을 작성하며, 지원하는 모든 항목을 추적합니다 — 이 모든 과정은 사용자의 데이터와 자격 증명을 기기에 보관하면서 수행됩니다.

유일한 외부 호출은 사용자가 구성한 AI 제공업체(및 명시적으로 활성화한 선택적 웹 검색)로만 이루어집니다. 그 외의 모든 것 — 채용 정보, 이력서, 생성물, 지원 내역 — 은 사용자의 머신에 있는 로컬 데이터베이스에 저장됩니다.

ATS(채용 관리 시스템)에 안전한 9가지 이력서 템플릿 — Classic · Modern · Swiss Minimal · Academic · Atelier · Meridian · Throughline · Portrait · Lebenslauf

📝 이력서 및 자기소개서 생성

스트리밍 생성 (Streaming generation) — 9개의 전문 템플릿, DOCX / PDF / TXT 내보내기, ATS (Applicant Tracking System) 친화적 포맷팅 지원.

범용 "사고 (thinking)" 뷰 — 특정 제공자뿐만 아니라 모든 제공자(Anthropic, OpenAI, Gemini, Ollama, CLI 에이전트)에 걸쳐 모델의 추론 스트림(reasoning stream)을 실시간으로 확인 가능.

백그라운드 생성 (Background generation) — 탭을 전환하거나, 모달을 닫거나, 다른 페이지로 이동하더라도 생성이 계속 진행되며, 다시 돌아왔을 때 결과가 저장되어 있음.

더 작은 용량의 PDF — 내보내기 시 폰트가 글리프 서브셋(glyph-subsetted, 실제 사용된 문자만 포함) 방식으로 처리되어, 일반적인 이력서 PDF 용량을 약 3MB에서 약 120KB로 축소.

🎯 매칭, ATS 및 분석

시맨틱 채용 공고 매칭 (Semantic job matching) — 벡터(vector) + 키워드 검색 하이브리드 방식; 각 채용 공고를 사용자의 이력서와 비교하여 점수를 산출.

이력서 분석 (Résumé analysis) — ATS 점수 산정, 기술 격차(skill-gap) 탐지, 언어 불일치 경고 및 개선 권장 사항 제공.

🤖 오토파일럿(Autopilot) 및 지원 현황 추적

오토파일럿 워크플로우 (Autopilot workflows) — 검색 조건(게시판, 쿼리, 위치, 일정, 필터)을 정의하면, 이에 맞는 채용 공고를 찾아 점수를 매김.

중복 제거 + 신규/지원 완료 배지 (Dedup + New/Applied badges) — 워크플로우를 재실행하면 URL 기준으로 결과가 병합됨: 기존에 찾은 항목은 유지되고, 진정으로 새로운 항목에는 New 배지가, 이미 생성한 항목에는 Applied 배지가 붙음(저장된 생성 기록으로부터 자동 유도됨).

원클릭 맞춤화 (One-click tailoring) — 찾은 채용 공고에서 Tailor를 클릭하면 AI 생성(Generate) 워크스페이스가 준비되고, 공고가 열리며, 어떤 게시판에서든 지원 완료로 표시됨. 맞춤형 이력서 + 자기소개서 및 일반적인 지원 질문에 대한 **이력서 기반 답변 (résumé-grounded answers)**을 생성할 수 있으며, 선택적으로 기업 조사도 수행 가능.

문서 / 활동 (Documents / Activity) — 생성된 모든 지원서는 작업별 단일 레코드(이력서, 자기소개서, 답변, 요약, 게시판, 날짜)로 저장되며, Documents 페이지(이력서 / 자기소개서 / 활동 탭)에서 찾아볼 수 있음.

🌐 브라우저 확장 프로그램 (원클릭 채용 공고 저장)

이제 Chrome 웹 스토어 및 Firefox 부가 기능(Add-ons)에서 이용 가능— Chrome용 설치 · Firefox용 설치. - Chrome 및 Firefox를 위한 MV3 확장 프로그램— 채용 게시판을 탐색하는 동안 확장 프로그램 버튼을 클릭하여 채용 공고를 저장된 지원 목록으로 가져올 수 있습니다. 원클릭 가져오기 (One-click import)— 게시판 페이지에서 **"이 채용 공고 가져오기 (Import this job)"**를 클릭하세요. 확장 프로그램이 가능한 경우 렌더링된 DOM을 자동으로 캡처하며(LinkedIn/Indeed와 같이 로그인이 필요한 게시판의 봇 차단벽을 우회), 제한된 페이지에서는 URL 전용 방식으로 전환됩니다. - 완전 로컬 방식 — 채용 정보는 비밀 토큰과 함께 **루프백 전용 웹소켓 (loopback-only WebSocket)**을 통해 데스크톱 앱으로 전송됩니다. 원격 백엔드 없음, 분석 데이터 수집 없음. - 설정, 개발 페어링 및 아키텍처는 apps/extension/README.md를 참조하세요. 로컬에서 실행해 보려면 확장 프로그램의 로컬 개발 및 테스트 가이드를 확인하세요.

🔎 기업 조사 (선택 사항)

  • 자기소개서나 답변을 작성하기 전에, 사용 중인 AI 제공업체의 자체 웹 검색(또는 Ollama의 무료 Ollama Web Search API)을 사용하여 웹에서 기업을 선택적으로 조사할 수 있습니다. → 기업이 무엇을 하는지, 규모/단계, 제품, 미션, 최근 뉴스 등 간결하고 사실적인 요약 정보를 제공합니다. - 기본값은 꺼짐 (off) 상태이며, 일주일 동안 캐싱되고 신뢰할 수 없는 (untrusted) 참조 컨텍스트로 취급됩니다. 이는 결코 후보자의 사실 정보가 되지 않으며, 허위 사실을 생성하지 않는 근거 규칙(no-fabrication grounding rule)이 모든 주장에 여전히 적용됩니다.

🧠 AI 제공업체 및 로컬 튜닝

멀티 제공업체 (Multi-provider)— Ollama (로컬), OpenAI, Anthropic, Gemini, 모든 OpenAI 호환 서버 (LM Studio, vLLM, 원격 Ollama), 그리고 헤드리스 CLI 에이전트 (CLI agents) (Claude Code, Codex, Gemini CLI)를 지원합니다. 모델별 로컬 제한 (Per-model local limits)— Ollama의 /api/show를 통해 로컬 모델의 실제 컨텍스트 창(context window)을 분석한 다음, 모델당 컨텍스트 창 + 최대 출력 토큰을 설정합니다. 이때 너무 큰 프롬프트가 조용히 잘리지 않도록 하드웨어 지연 경고를 제공합니다.

🔒 개인정보 보호 및 데이터

OS 키체인(keychain) 내 자격 증명— 암호화되어 저장되며, 평문이나 설정 파일에 절대 저장되지 않습니다.
모든 데이터 로컬 저장— 채용 정보, 이력서, 생성물, 지원 내역이 로컬 SQLite 데이터베이스에 저장되며, 텔레메트리(telemetry, 원격 측정)가 전혀 없습니다.
전체 초기화— 단 한 번의 동작으로 모든 저장소(문서, 생성물, 오토파일럿, 연락처/채용 선호도, 캐시, 키체인 항목)를 초기 설치 상태로 삭제합니다.
다국어 지원— UI는 영어 및 독일어로 제공되며, 생성 기능은 11개 언어(en, de, fr, es, it, tr, pt, ru, zh, ja, ko)를 지원합니다.

설정(Settings) → AI에서 언제든지 제공업체를 전환할 수 있습니다:

제공업체 (Provider)모델 (Models)비고 (Notes)
Ollama (로컬)mistral, llama3.2, deepseek-r1, 모든 Ollama 모델API 키가 필요 없음; 완전 오프라인; 모델별 컨텍스트/출력 제한 있음
OpenAIGPT-4o, o-series, GPT-4 TurboAPI 키 필요
AnthropicClaude (Sonnet / Opus), extended thinkingAPI 키 필요; 추론 과정이 thinking 뷰로 스트리밍됨
Google GeminiGemini 2.5 / 1.5 (Pro, Flash)API 키 필요; thinking 모델 지원
OpenAI 호환 (OpenAI-compatible)모든 모델 (LM Studio, vLLM, 원격 Ollama 등)사용자 정의 베이스 URL (Custom base URL) 사용
CLI 에이전트 (로컬)Claude Code, Codex, Gemini CLI설치된 CLI를 통해 헤드리스(headless)로 실행 — API 키 불필요 (CLI 자체 로그인 사용)

API 키는 OS 키체인에 암호화되어 저장됩니다. CLI 에이전트는 헤드리스 서브프로세스(subprocess)로 실행되며 해당 CLI가 이미 보유한 로그인 정보를 재사용하므로, 앱 내에 별도의 키가 필요하지 않습니다.

릴리스 빌드 다운로드 (권장)

Releases 페이지에서 사용 중인 OS에 맞는 최신 설치 프로그램을 받으세요.

macOS.dmg 파일을 엽니다.

그리고 앱을 Applications 폴더로 드래그합니다. 이 앱은 Apple의 공증(notarized)을 받지 않았기 때문에, Gatekeeper가 처음 실행 시 실행을 거부할 수 있습니다 ("app is damaged and can't be opened"). 다음 명령어로 격리(quarantine) 속성을 한 번 제거해 주세요:

xattr -cr "/Applications/AI Job Hunter.app"

Windows / Linux — Releases 페이지에서 설치 프로그램 또는 AppImage를 실행하세요.

Homebrew (macOS)

릴리스에는 서명된 macOS .dmg 파일이 포함되어 있으며, 이 저장소는 자체 Homebrew tap(Casks/ai-job-hunter.rb cask) 역할을 겸합니다. 다음 명령어로 설치하세요:

brew tap saeedkolivand/ai-job-hunter-app https://github.com/saeedkolivand/ai-job-hunter-app
brew install --cask ai-job-hunter

이 Cask (Cask)는 (앱이 공증(notarized)되지 않았으므로) Gatekeeper 격리 플래그(quarantine flag)를 자동으로 해제해 줍니다. 일회성 다운로드를 선호하시나요? Releases 페이지에서 직접 .dmg 파일을 받으세요.

이 Cask는 검증된 설치를 위해 아키텍처별 sha256 체크섬(checksum)을 고정하며, macOS .dmg를 제공하는 최신 릴리스(release)를 추적합니다. 설치 프로그램 빌드가 수동으로 이루어지므로, 새로운 빌드가 .dmg를 게시하면 Cask의 version과 두 체크섬을 모두 업데이트해야 합니다 (brew bump-cask-pr).

소스에서 빌드하기 (Build from source)

사전 요구 사항 (Prerequisites)

요구 사항버전비고
Node.js20+LTS 권장
...
git clone https://github.com/saeedkolivand/ai-job-hunter-app.git
cd ai-job-hunter-app
pnpm install
...

문제 해결 (Troubleshooting)

증상해결 방법
macOS: "app is damaged and can't be opened"공증(notarized)되지 않음 — 격리 플래그를 한 번 해제하세요: xattr -cr "/Applications/AI Job Hunter.app"
선택기(picker)에 모델이 없음 / "select a model"Ollama를 실행하고 ollama pull <model>을 수행하거나, Settings → AI에서 클라우드 키(cloud key)를 추가하세요
기업 조사(Company research)가 작동하지 않음이는 선택 사항(opt-in)이며 사용 중인 AI 제공업체의 웹 검색을 사용합니다. Ollama의 경우 무료 Ollama 키를 추가하세요 (Settings → AI). 사용 가능한 검색 기능이 없으면 요약 없이 생성이 진행됩니다
스크래핑(Scraping)이 브라우저를 찾을 수 없음앱이 설치된 Chromium 브라우저를 자동으로 감지합니다 (detect_system_chrome). 찾을 수 없는 경우 Chrome 또는 Edge를 설치하거나, CHROME 환경 변수를 브라우저 실행 파일 경로로 설정하세요
pnpm dev가 Rust 코어 빌드에 실패함안정적인 Rust 툴체인(toolchain)이 설치되어 있는지 확인하고 (rustup install stable) 다시 실행하세요

맞춤형 이력서 / 자기소개서 생성하기

1. 앱 실행 → AI Generate
2. 이력서 텍스트를 붙여넣거나 PDF/DOCX/TXT 파일을 업로드
3. 채용 공고 텍스트를 붙여넣거나 직무 기술서(job description) 파일을 업로드
...

Autopilot 실행 및 지원 질문 답변하기

  1. Autopilot → New → 보드(board), 쿼리(query), 위치(location), 일정(schedule), 필터(filters) 설정
  2. 실행(Run it) → 검색된 채용 공고가 나타나며, 점수가 매겨지고 중복이 제거됨 (새로운 결과에는 New 배지 표시)
  3. 검색된 채용 공고 열기 → 맞춤화(Tailor):
    ...

보드 스크래핑(Scrape boards) 및 의미론적 검색(search semantically)

  1. Jobs → Scrape → 보드 선택 (예: LinkedIn + Greenhouse + Aggregator)
  2. 쿼리(Query) + 위치(location); 회사 범위의 ATS 보드(Greenhouse, Lever 등)의 경우, 회사 슬러그(company slugs)를 입력
  3. Start 클릭 → 결과가 채용(jobs) 테이블로 스트리밍됨
    ...

참고: 회사 범위의 ATS 보드는 자유 형식의 키워드 대신 회사 슬러그(company slugs)가 필요합니다. Aggregator (Adzuna + JSearch)는 봇 방지(anti-bot) 보드(Indeed, Glassdoor, Xing)의 직접적인 스크래핑을 대체합니다. 무료 Adzuna 키는 https://developer.adzuna.com 에서 이용 가능합니다. 전체 보드 목록 및 구성 세부 정보는 docs/knowledge/scraping-domain.md를 참조하세요.

이 앱은 비밀 정보(secrets)를 위해 OS 키체인(keychain)을 사용하며, .env 파일을 사용하지 않습니다. 키와 자격 증명은 UI에서 설정되며 Tauri의 키체인 플러그인을 통해 암호화됩니다.

설정 (Setting)위치 (Location)설명 (Description)
AI provider + keySettings → AIOllama / OpenAI / Anthropic / Gemini / 호환 가능
...Adzuna/JSearch keysSettings → Jobs
Performance modeSettings → PerformanceLow / Balanced / Performance
LanguageSettings → GeneralUI 및 생성 로캘 (locale)
계층 (Layer)기술 (Technology)
Desktop shellTauri 2.x — Rust 코어 + React 렌더러
...

한 줄 요약 아키텍처: React 렌더러는 OS를 직접 호출하지 않으며, 타입이 지정된 IPC 계약을 통해 Rust 코어와 통신합니다.

React renderer → service hook (React Query) → tauri-client → Rust #[tauri::command] → core (scrape · AI · export · DB)
apps/tauri/src/renderer/services apps/tauri/src-tauri/src

IPC 요청 형태(request shapes)는 단일 진실 공급원(single source of truth)을 가집니다: packages/shared에 있는 Zod 스키마이며, 이를 통해

pnpm gen:ipc

명령어가 일치하는 Rust 구조체(structs)를 생성합니다. 따라서 TypeScript와 Rust 측이 서로 어긋날 수 없습니다.

새로운 IPC 기능 추가 (수동으로 동기화해야 하는 5개의 접점)

packages/shared/src/ipc/contracts/*.ts
— 메서드 시그니처(method signature)를 추가합니다.

apps/tauri/src-tauri/src/commands/*.rs
#[tauri::command]를 구현하고 main.rs에 등록합니다.

apps/tauri/src/tauri-client/namespaces/*
invoke(...) 호출을 연결(wire)합니다.

apps/tauri/src/renderer/services/*
— React Query 서비스 훅(hook)을 추가합니다.

  • 만약 요청의 형태(shape)가 변경되었다면: Zod 스키마를 추가하고 pnpm gen:ipc를 실행하세요.

AI 프로바이더(provider) / 채용 게시판(job board) 추가 (설정 + 어댑터 추가, 비즈니스 로직 변경 없음)

AI 프로바이더— 프로바이더 어댑터(provider adapter)를 구현하고 등록합니다. 앱의 나머지 부분은 중앙 집중식 프로바이더 추상화(Completer / 스트리밍 계약)를 통해 경로를 지정받습니다. 추론(Reasoning), 제한 사항(limits), 채용 상태(job state)는 어댑터 경계에서 정규화되므로, 렌더러(renderer)는 하나의 계약만을 유지하며 프로바이더별 분기 처리를 하지 않습니다.

채용 게시판— 스크래퍼 레지스트리(scraping/boards/mod.rsSCRAPERS)에 항목을 추가합니다. 탐색(discovery)은 레지스트리 기반으로 이루어지므로 호출자(caller)를 변경할 필요가 없습니다.

컨벤션(Conventions) 및 가드레일(guardrails)

PR(Pull Request)만 허용— 절대 main 브랜치에 직접 푸시하지 마세요. Conventional Commits를 준수해야 하며, ESLint + commitlint + 아키텍처 테스트가 모든 변경 사항을 검증합니다.

포트 및 어댑터(Ports & adapters)— UI는 @ajh/ui 프리미티브(primitives)와 서비스 훅을 임포트하며, window.api를 절대 직접 사용하지 않습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Claude Ecosystem의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0