{"id":51253151,"url":"https://github.com/leoakok/yuse","last_synced_at":"2026-06-29T08:01:44.808Z","repository":{"id":368079811,"uuid":"1283442607","full_name":"leoakok/yuse","owner":"leoakok","description":"Yuse — AI-powered CV builder with digital twin and job tracker","archived":false,"fork":false,"pushed_at":"2026-06-29T00:28:09.000Z","size":4726,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T01:19:54.269Z","etag":null,"topics":["ai-agent","ai-agents","ai-native","cv","cv-builder","resume","resume-builder"],"latest_commit_sha":null,"homepage":"https://yuse.ahmetkok.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leoakok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-28T23:47:25.000Z","updated_at":"2026-06-29T00:29:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/leoakok/yuse","commit_stats":null,"previous_names":["leoakok/yuse"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/leoakok/yuse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leoakok%2Fyuse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leoakok%2Fyuse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leoakok%2Fyuse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leoakok%2Fyuse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leoakok","download_url":"https://codeload.github.com/leoakok/yuse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leoakok%2Fyuse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34918101,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-agent","ai-agents","ai-native","cv","cv-builder","resume","resume-builder"],"created_at":"2026-06-29T08:01:42.519Z","updated_at":"2026-06-29T08:01:44.533Z","avatar_url":"https://github.com/leoakok.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"public/yuse-logo@2x.png\" alt=\"Yuse logo\" width=\"80\" height=\"80\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eYuse\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAI-native CV builder that grows with you.\u003c/strong\u003e\u003cbr /\u003e\n  Build, tailor, and export resumes from a living career knowledge base — not a one-off template.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/leoakok/yuse/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT License\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://nextjs.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Next.js-16-black?logo=next.js\" alt=\"Next.js\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://go.dev\"\u003e\u003cimg src=\"https://img.shields.io/badge/Go-1.25-00ADD8?logo=go\" alt=\"Go\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.postgresql.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Postgres-16-336791?logo=postgresql\" alt=\"PostgreSQL\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://vercel.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/deploy-Vercel-black?logo=vercel\" alt=\"Vercel\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://yuse.ahmetkok.dev\"\u003eLive demo\u003c/a\u003e\n  ·\n  \u003ca href=\"#quick-start\"\u003eQuick start\u003c/a\u003e\n  ·\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e\n  ·\n  \u003ca href=\"CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n  ·\n  \u003ca href=\"https://github.com/leoakok/yuse/issues\"\u003eIssues\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why Yuse exists\n\nMost CV tools treat your career as a static form. Yuse treats it as **knowledge that compounds** — a Digital Twin of your real work that gets sharper every time you chat, import a profile, or tailor for a role.\n\n| | |\n|---|---|\n| **Why** | Every application deserves a CV that reflects who you actually are — not a generic one-pager. |\n| **How** | A conversational AI assistant maintains structured career stories (STAR/PAR), imports from GitHub and LinkedIn, and tailors resumes per job. |\n| **What** | A full-stack app: Next.js editor with live preview, Go GraphQL API, Postgres persistence, and print/PDF export. |\n\n## Features\n\n- **AI assistant** — Floating in-app agent that creates, edits, and tailors resumes through natural conversation and tool calls (OpenAI function calling + in-process MCP registry).\n- **Digital Twin** — Long-term career knowledge separate from any single CV. Experience uses **STAR** (Situation → Task → Action → Result); projects and skills use **PAR** (Problem → Action → Result).\n- **Resume workspace** — Live preview, reusable section library, themes, and per-resume visibility controls.\n- **Job Tracker** — Track applications, research postings, generate tailored CVs and cover letters, and link them to tracked jobs.\n- **Import sources**\n  - **GitHub** — Optional OAuth connection for private repos and higher rate limits; public profile crawl when not connected.\n  - **LinkedIn** — Profile import via `fetch_linkedin_profile` (server-side crawl).\n  - **Websites \u0026 portfolios** — Deep crawl of personal sites, GitLab, and similar URLs.\n- **Print \u0026 PDF** — Dedicated print view (`/print`) with browser print-to-PDF; vector PDF export via jsPDF.\n- **Auth** — Google OAuth and email/password sign-in (NextAuth.js); GitHub OAuth for Connections.\n- **Workspace-scoped data** — Per-user resumes, twin entries, and job applications in PostgreSQL.\n\n\u003e **Screenshots:** Product screenshots are not bundled in this repo yet. Run locally with `npm run start` and visit [http://localhost:3000](http://localhost:3000), or try the [live demo](https://yuse.ahmetkok.dev). Contributions of anonymized screenshots to `docs/screenshots/` are welcome.\n\n## Tech stack\n\n| Layer | Technology |\n|-------|------------|\n| Frontend | [Next.js 16](https://nextjs.org) (App Router), React 19, TypeScript, Tailwind CSS 4, shadcn/ui |\n| Auth | [NextAuth.js v5](https://authjs.dev) (Google OAuth, credentials) |\n| API | [Go](https://go.dev) + [gqlgen](https://github.com/99designs/gqlgen) GraphQL |\n| Database | PostgreSQL 16 ([Neon](https://neon.tech) in production; Docker locally) |\n| AI | OpenAI API (`gpt-5.4-mini` default; configurable fallbacks) |\n| Agent tools | In-process MCP registry (`backend/internal/mcp`); optional stdio MCP server for Cursor |\n| PDF | jsPDF (client-side vector export) + browser print |\n| Deploy | [Vercel](https://vercel.com) — Next.js frontend + Go backend at `/_/backend` |\n\n## Architecture\n\n```mermaid\nflowchart LR\n  subgraph browser[\"Browser\"]\n    UI[\"Next.js App\"]\n    Proxy[\"/api/graphql proxy\"]\n  end\n\n  subgraph vercel[\"Vercel\"]\n  UI --\u003e Proxy\n  Proxy --\u003e|\"JWT\"| API[\"Go GraphQL API\"]\n  end\n\n  subgraph data[\"Data \u0026 AI\"]\n  API --\u003e DB[(PostgreSQL)]\n  API --\u003e OAI[OpenAI API]\n  API --\u003e GH[GitHub API]\n  end\n\n  UI --\u003e Auth[\"NextAuth session\"]\n  Auth --\u003e Proxy\n```\n\n**Request flow:** The browser talks to `/api/graphql`, a Next.js route that signs a short-lived JWT and proxies to the Go backend. The assistant streams via `/api/assistant/stream`. GitHub and LinkedIn imports run server-side in the Go API.\n\n## Prerequisites\n\n- **Node.js** 20+\n- **Docker Desktop** (Compose v2.1+ with `--wait`) for local Postgres + backend\n- **OpenAI API key** (required for the CV assistant)\n- **Google OAuth credentials** (required for sign-in — interactive setup script provided)\n\nOptional: `gcloud` CLI for guided Google OAuth setup; Go 1.25+ if you run the backend outside Docker.\n\n## Quick start\n\n### 1. Clone and install\n\n```bash\ngit clone https://github.com/leoakok/yuse.git\ncd yuse\nnpm install\n```\n\n### 2. Configure auth (interactive)\n\n```bash\nnpm run setup:auth\n```\n\nThis creates `.env` and `backend/.env` from examples, generates `AUTH_SECRET`, and prompts for Google OAuth credentials.\n\n### 3. Set your OpenAI key\n\nEdit `backend/.env` and add:\n\n```bash\nOPENAI_API_KEY=sk-...\n```\n\n### 4. Start the full stack\n\n```bash\nnpm run start\n```\n\nThis builds and starts **Postgres** and the **Go backend** in Docker, waits for health checks, then runs the **Next.js dev server**.\n\n| Service | URL |\n|---------|-----|\n| Frontend | http://localhost:3000 |\n| GraphQL | http://localhost:8080/graphql |\n| Playground | http://localhost:8080/playground |\n| Postgres | `localhost:5432` |\n\n### 5. Stop\n\n```bash\nnpm run stop\n```\n\nTo wipe the local database volume:\n\n```bash\ndocker compose down --volumes\n```\n\n### Frontend only\n\nIf Postgres and the backend are already running:\n\n```bash\nnpm run dev\n```\n\n### Backend only (without Docker)\n\n```bash\ncd backend\ncp .env.example .env   # set DATABASE_URL, AUTH_SECRET, OPENAI_API_KEY\nmake run\n```\n\nSee [docs/DOCKER.md](docs/DOCKER.md) and [docs/AUTH.md](docs/AUTH.md) for ports, OAuth redirect URIs, and troubleshooting.\n\n## Environment variables\n\n### Frontend (`.env`)\n\nCopy from `.env.example`:\n\n```bash\ncp .env.example .env\n```\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `AUTH_SECRET` | Yes | Session signing + proxy JWT secret (must match backend) |\n| `GOOGLE_CLIENT_ID` | Yes | Google OAuth client ID |\n| `GOOGLE_CLIENT_SECRET` | Yes | Google OAuth client secret |\n| `NEXT_PUBLIC_GRAPHQL_URL` | Yes | Browser GraphQL endpoint (`/api/graphql`) |\n| `GRAPHQL_URL` | Yes | Server-side upstream — absolute URL (`http://localhost:8080/graphql`) |\n| `NEXTAUTH_URL` | No | App URL; inferred locally with `trustHost` |\n| `BACKEND_PORT` | No | Docker backend port override (default `8080`) |\n| `CORS_ORIGIN` | No | Frontend origin for backend CORS (default `http://localhost:3000`) |\n\n### Backend (`backend/.env`)\n\nCopy from `backend/.env.example`:\n\n```bash\ncp backend/.env.example backend/.env\n```\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `DATABASE_URL` | Yes | PostgreSQL connection string |\n| `AUTH_SECRET` | Yes | HS256 secret (must match frontend) |\n| `OPENAI_API_KEY` | For assistant | OpenAI key; assistant errors without it |\n| `OPENAI_MINI_MODEL` | No | Primary model (default `gpt-5.4-mini`) |\n| `OPENAI_FALLBACK_MODEL` | No | Retry model if primary returns empty |\n| `OPENAI_VISION_MODEL` | No | Vision model for image/PDF parsing |\n| `PORT` | No | HTTP port (default `8080`) |\n| `CORS_ORIGIN` | No | Allowed frontend origin |\n| `GITHUB_CLIENT_ID` | For Connections | GitHub OAuth app client ID |\n| `GITHUB_CLIENT_SECRET` | For Connections | GitHub OAuth app client secret |\n| `GITHUB_TOKEN` | No | Fallback token for unauthenticated GitHub API |\n| `GITHUB_OAUTH_CALLBACK_URL` | No | OAuth redirect (default `{CORS_ORIGIN}/api/auth/github/callback`) |\n| `TAVILY_API_KEY` | No | Web search fallback (DuckDuckGo used when unset) |\n| `LINKEDIN_PROFILE_API_URL` | No | Optional LinkedIn profile API endpoint |\n| `LINKEDIN_PROFILE_API_KEY` | No | API key for LinkedIn profile service |\n| `AWS_REGION` | No | S3 region for profile photo uploads |\n| `AWS_ACCESS_KEY_ID` | No | S3 access key |\n| `AWS_SECRET_ACCESS_KEY` | No | S3 secret key |\n| `AWS_S3_BUCKET` | No | S3 bucket name |\n| `AWS_S3_PUBLIC_URL_PREFIX` | No | CDN URL prefix for uploaded photos |\n\nNever commit `.env` files or secrets. `npm run start` syncs `AUTH_SECRET` from the root `.env` into `backend/.env` automatically.\n\n## Project structure\n\n```\nyuse/\n├── src/                      # Next.js frontend\n│   ├── app/                  # App Router pages and API routes\n│   ├── components/\n│   │   ├── ui/               # shadcn primitives\n│   │   ├── cv/               # Resume editor, preview, grids\n│   │   ├── agent/            # Assistant panel and status UI\n│   │   ├── twin/             # Digital Twin workspace\n│   │   └── landing/          # Marketing landing page\n│   └── lib/\n│       ├── api/cv-api.ts     # GraphQL client (use this from pages)\n│       └── types/            # Shared TypeScript types\n├── backend/                  # Go GraphQL API\n│   ├── cmd/server/           # HTTP server entrypoint\n│   ├── graph/                # GraphQL schema and resolvers\n│   └── internal/\n│       ├── mcp/              # Agent tool registry + stdio MCP server\n│       ├── llm/              # OpenAI agent loop and prompts\n│       └── cv/               # Resume and twin business logic\n├── scripts/\n│   ├── start.sh              # Docker Compose + Next.js dev\n│   ├── stop.sh               # Stop containers\n│   └── setup-google-oauth.sh # Interactive auth setup\n├── docs/                     # AUTH, DOCKER, ROADMAP\n├── public/                   # Static assets (logo, icons)\n├── docker-compose.yml        # Local Postgres + backend\n└── vercel.json               # Vercel frontend + Go backend routing\n```\n\n## Deployment\n\nProduction runs on **Vercel**:\n\n- **Frontend** — Next.js at `/`\n- **Backend** — Go service at `/_/backend` (see `vercel.json`)\n- **Database** — [Neon](https://neon.tech) PostgreSQL\n\nLive site: **[yuse.ahmetkok.dev](https://yuse.ahmetkok.dev)**\n\nSet the same environment variables from the tables above in your Vercel project (frontend and backend services). Ensure `AUTH_SECRET` matches across services and `GRAPHQL_URL` points to the deployed backend GraphQL endpoint.\n\n## Scripts reference\n\n| Command | Description |\n|---------|-------------|\n| `npm run start` | Start Postgres + backend (Docker) and Next.js dev server |\n| `npm run stop` | Stop Docker services (preserves DB volume) |\n| `npm run setup:auth` | Interactive Google OAuth and `AUTH_SECRET` setup |\n| `npm run dev` | Next.js dev server only |\n| `npm run build` | Production frontend build |\n| `npm run start:frontend` | Serve production frontend (`next start`) |\n| `npm run lint` | ESLint |\n| `cd backend \u0026\u0026 make run` | Run Go API locally |\n| `cd backend \u0026\u0026 make test` | Go unit tests |\n| `cd backend \u0026\u0026 make mcp-server` | Stdio MCP server for Cursor |\n\n## Contributing\n\nContributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) for setup, code style, and the pull request checklist.\n\n## Related documentation\n\n- [docs/AUTH.md](docs/AUTH.md) — Authentication, OAuth, session invalidation\n- [docs/DOCKER.md](docs/DOCKER.md) — Local Docker orchestration\n- [docs/ROADMAP.md](docs/ROADMAP.md) — Product vision and phases\n- [backend/README.md](backend/README.md) — GraphQL API details and example queries\n- [backend/internal/mcp/README.md](backend/internal/mcp/README.md) — MCP tools and Cursor setup\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n\nCopyright © 2026 [Ahmet Kok](https://github.com/leoakok).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleoakok%2Fyuse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleoakok%2Fyuse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleoakok%2Fyuse/lists"}