{"id":47962997,"url":"https://github.com/sehoon787/autopolio","last_synced_at":"2026-04-04T10:03:44.025Z","repository":{"id":346247278,"uuid":"1137421237","full_name":"sehoon787/autopolio","owner":"sehoon787","description":"Turn your GitHub into a professional portfolio — AI-powered resume generator with 200+ tech detection, multi-LLM support, and DOCX/PDF/MD export","archived":false,"fork":false,"pushed_at":"2026-03-23T10:57:30.000Z","size":5955,"stargazers_count":1,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-23T20:25:55.024Z","etag":null,"topics":["ai-resume","career-automation","developer-tools","docx-generator","electron","fastapi","github-analysis","github-portfolio","job-search","llm","open-source","pdf-generator","portfolio","portfolio-generator","python","react","resume-automation","resume-builder","tech-stack-detection","typescript"],"latest_commit_sha":null,"homepage":"https://sehoon787.github.io/autopolio/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sehoon787.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["sehoon787"]}},"created_at":"2026-01-19T10:50:54.000Z","updated_at":"2026-03-23T01:44:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"9764fc58-f24f-435b-a0a1-0f4714409f3e","html_url":"https://github.com/sehoon787/autopolio","commit_stats":null,"previous_names":["sehoon787/autopolio"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sehoon787/autopolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehoon787%2Fautopolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehoon787%2Fautopolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehoon787%2Fautopolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehoon787%2Fautopolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sehoon787","download_url":"https://codeload.github.com/sehoon787/autopolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sehoon787%2Fautopolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31395450,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T09:13:02.600Z","status":"ssl_error","status_checked_at":"2026-04-04T09:13:01.683Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-resume","career-automation","developer-tools","docx-generator","electron","fastapi","github-analysis","github-portfolio","job-search","llm","open-source","pdf-generator","portfolio","portfolio-generator","python","react","resume-automation","resume-builder","tech-stack-detection","typescript"],"created_at":"2026-04-04T10:03:43.405Z","updated_at":"2026-04-04T10:03:44.015Z","avatar_url":"https://github.com/sehoon787.png","language":"Python","readme":"# Autopolio\n\n\u003e Turn your GitHub into a professional portfolio — powered by AI\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![CI](https://github.com/sehoon787/autopolio/actions/workflows/ci.yml/badge.svg)](https://github.com/sehoon787/autopolio/actions/workflows/ci.yml)\n[![Lint](https://github.com/sehoon787/autopolio/actions/workflows/lint.yml/badge.svg)](https://github.com/sehoon787/autopolio/actions/workflows/lint.yml)\n[![Python](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![Node](https://img.shields.io/badge/node-18+-green.svg)](https://nodejs.org/)\n[![Stars](https://img.shields.io/github/stars/sehoon787/autopolio?style=social)](https://github.com/sehoon787/autopolio)\n[![Release](https://img.shields.io/github/v/release/sehoon787/autopolio)](https://github.com/sehoon787/autopolio/releases)\n\n[🇰🇷 한국어 README](README_ko.md)\n\n**Autopolio** is an open-source, AI-powered portfolio and resume automation platform. It analyzes your GitHub repositories, builds a structured career knowledge base, and generates tailored resumes for major job platforms — all without manually writing every line.\n\n---\n\n## Screenshots\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"docs/screenshots/01-dashboard.png\" width=\"400\" alt=\"Dashboard\"/\u003e\u003cbr/\u003e\u003cem\u003eDashboard \u0026 Career Timeline\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"docs/screenshots/02-projects.png\" width=\"400\" alt=\"Projects\"/\u003e\u003cbr/\u003e\u003cem\u003eProject Management\u003c/em\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"docs/screenshots/03-platforms.png\" width=\"400\" alt=\"Platform Templates\"/\u003e\u003cbr/\u003e\u003cem\u003eJob Platform Templates\u003c/em\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"docs/screenshots/04-settings-llm.png\" width=\"400\" alt=\"AI Settings\"/\u003e\u003cbr/\u003e\u003cem\u003eAI Provider Settings\u003c/em\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nAdditional screenshots: [Document Generation](docs/screenshots/06-generate.png) · [Template Management](docs/screenshots/08-templates.png) · [GitHub Setup](docs/screenshots/07-github-setup.png)\n\n---\n\n## Why Autopolio\n\nMost developers have rich GitHub histories but blank resume pages. Writing a tailored resume for each job platform (Saramin, Remember, Jumpit) takes hours of repetitive effort. Autopolio closes that gap: connect your GitHub, define your career history once, and let the AI pipeline do the rest.\n\n---\n\n## Key Features\n\n- **GitHub Repository Analysis** — Parses commit history and auto-detects 200+ technologies across JavaScript, Python, Java, Kotlin, Dart, PHP, and more — no LLM required for detection\n- **Per-Contributor Breakdown** — Isolates your commits from team repos; Conventional Commit parsing, work area detection, and code quality metrics\n- **Career Knowledge Base** — Structured management of companies, projects, achievements, certifications, education, and awards\n- **Platform Resume Templates** — Pre-built HTML templates for Saramin, Remember, and Jumpit; Mustache syntax for fully custom templates\n- **Multi-LLM AI Summarization** — OpenAI GPT-4, Anthropic Claude, and Google Gemini all supported; switchable per request\n- **Multiple Export Formats** — DOCX, PDF, and Markdown output from a single source\n- **Electron Desktop App** — Cross-platform installer for Windows (exe), macOS (dmg), and Linux (AppImage) with local CLI tool support\n- **Internationalization** — Full UI in Korean and English via react-i18next\n- **CI/CD Pipeline** — GitHub Actions with pytest, Playwright, ruff, tsc, Bandit security scanning, and Gemini Code Assist review\n\n---\n\n## How It Works\n\n```\nStep 1 — GitHub Analysis       Fetch commits and extract statistics (parallel)\nStep 2 — Code Extraction       Detect code patterns and project architecture\nStep 3 — Tech Detection        Auto-detect tech stack from dependency files (fast, no LLM)\nStep 4 — Achievement Detection Extract quantitative achievements from commit messages\nStep 5 — LLM Summarization     Generate AI-powered project summaries (parallel)\nStep 6 — Template Mapping      Map structured data to platform-specific template fields\nStep 7 — Document Generation   Produce DOCX / PDF / Markdown output\n```\n\n---\n\n## Quick Start\n\n### Option A: Docker (recommended)\n\n```bash\ngit clone https://github.com/sehoon787/autopolio.git\ncd Autopolio\n\ncp .env.example .env\n# Edit .env — set ENCRYPTION_KEY, GITHUB_CLIENT_ID/SECRET, and one LLM API key\n\ndocker-compose up -d\n```\n\nOpen `http://localhost:3035` in your browser.\n\n### Option B: Dev script\n\n```bash\ngit clone https://github.com/sehoon787/autopolio.git\ncd Autopolio\ncp .env.example .env\n\n# Windows\nstart-dev.bat\n\n# Linux / macOS\n./start-dev.sh\n```\n\n### Option C: Manual\n\n```bash\n# Backend\nuv sync\nuv run uvicorn api.main:app --reload --port 8085\n\n# Frontend (separate terminal)\ncd frontend\nnpm install\nnpm run dev\n```\n\n| Service | URL |\n|---------|-----|\n| Frontend | http://localhost:3035 |\n| API Docs (Swagger) | http://localhost:8085/docs |\n| API Docs (ReDoc) | http://localhost:8085/redoc |\n\n\u003e Ports are configured in `config/runtime.yaml`.\n\n---\n\n## Electron Desktop App\n\nRun Autopolio as a standalone desktop application with built-in backend:\n\n### Development\n\n```bash\n# 1. Start the backend\nuv sync\nuv run uvicorn api.main:app --reload --port 8085\n\n# 2. Start Electron (separate terminal)\ncd frontend\nnpm install\nnpm run electron:dev\n```\n\n### Build Installers\n\n```bash\ncd frontend\n\nnpm run electron:build:win      # Windows exe (NSIS)\nnpm run electron:build:mac      # macOS dmg\nnpm run electron:build:linux    # Linux AppImage\n```\n\n\u003e The desktop app auto-detects CLI tools (Claude Code, Gemini CLI) and manages API keys locally.\n\n---\n\n## Testing\n\n```bash\n# Full suite: Docker → pytest → Playwright\ntests/scripts/run-all.sh          # Linux / macOS\ntests/scripts/run-all.bat         # Windows\n\n# API tests only\ntests/scripts/run-api-tests.sh\n\n# E2E tests only\ntests/scripts/run-e2e-tests.sh\n```\n\n### Seed Data\n\nPopulate a local environment with realistic sample data:\n\n```bash\npython tests/seed_sample_data.py            # Insert sample data\npython tests/seed_sample_data.py --clean    # Wipe first, then insert\npython tests/seed_sample_data.py --create-user  # Create user + insert\n```\n\nInserts 3 companies, 6 projects, 2 education records, 4 training records, 3 certifications, 2 awards, 3 publications, 2 patents, and 2 activities.\n\n---\n\n## Tech Stack\n\n| Layer | Technologies |\n|-------|-------------|\n| Backend | FastAPI, SQLAlchemy, SQLite |\n| Frontend | React 19, TypeScript, Vite, Tailwind CSS, Shadcn/ui |\n| Desktop | Electron, electron-builder, electron-serve |\n| State Management | Zustand, TanStack Query |\n| Internationalization | react-i18next, i18next |\n| LLM | OpenAI GPT-4 / Anthropic Claude / Google Gemini |\n| Document Generation | python-docx, reportlab, chevron (Mustache) |\n| Package Managers | uv (Python), npm (Frontend) |\n| CI/CD | GitHub Actions + Gemini Code Assist |\n| Testing | pytest, Playwright |\n\n---\n\n## Project Structure\n\n```\nAutopolio/\n├── api/                     # FastAPI backend\n│   ├── constants/           # Centralized enums and config constants\n│   ├── models/              # SQLAlchemy ORM models\n│   ├── schemas/             # Pydantic request/response schemas\n│   ├── routers/             # API route handlers (modularized)\n│   └── services/            # Business logic (modularized)\n├── frontend/                # React frontend + Electron\n│   ├── electron/            # Electron main process and services\n│   └── src/\n│       ├── api/             # API client functions\n│       ├── components/      # Reusable UI components\n│       ├── locales/         # i18n translation files (ko, en)\n│       ├── pages/           # Page components\n│       └── stores/          # Zustand state stores\n├── .github/workflows/       # CI/CD pipeline definitions\n├── tests/                   # Test scripts and E2E tests\n├── config/                  # YAML configuration files\n├── data/                    # SQLite database and platform HTML templates\n├── docs/                    # Project documentation and screenshots\n├── result/                  # Generated output documents\n├── pyproject.toml           # Python dependencies (uv)\n└── docker-compose.yml\n```\n\n---\n\n## Key API Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `POST` | `/api/users` | Create a user |\n| `GET` | `/api/github/repos` | List connected repositories |\n| `POST` | `/api/github/analyze` | Start repository analysis |\n| `GET` | `/api/github/contributor-analysis/{id}` | Per-user detailed analysis |\n| `GET` | `/api/knowledge/projects` | List projects |\n| `GET` | `/api/platforms` | List platform resume templates |\n| `POST` | `/api/platforms/{id}/render` | Render a template with user data |\n| `POST` | `/api/pipeline/run` | Run the full generation pipeline |\n| `GET` | `/api/documents` | List generated documents |\n\nFull interactive documentation is at `http://localhost:8085/docs` when the server is running.\n\n---\n\n## Environment Variables\n\n| Variable | Description | Required |\n|----------|-------------|----------|\n| `ENCRYPTION_KEY` | Fernet encryption key for stored tokens | Yes |\n| `LLM_PROVIDER` | Default LLM provider (`openai` / `anthropic` / `gemini`) | Yes |\n| `OPENAI_API_KEY` | OpenAI API key | One of the three |\n| `ANTHROPIC_API_KEY` | Anthropic API key | One of the three |\n| `GEMINI_API_KEY` | Google Gemini API key | One of the three |\n| `GITHUB_CLIENT_ID` | GitHub OAuth App client ID | Yes |\n| `GITHUB_CLIENT_SECRET` | GitHub OAuth App client secret | Yes |\n| `DATABASE_URL` | SQLite database path (default: `data/autopolio.db`) | No |\n\n---\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on reporting bugs, proposing features, and submitting pull requests.\n\nThis project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md).\n\n## License\n\nApache License 2.0 — see the [LICENSE](LICENSE) file for details.\n","funding_links":["https://github.com/sponsors/sehoon787"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsehoon787%2Fautopolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsehoon787%2Fautopolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsehoon787%2Fautopolio/lists"}