{"id":26237232,"url":"https://github.com/tkellogg/target-practice","last_synced_at":"2025-07-22T16:07:32.038Z","repository":{"id":271803942,"uuid":"914619066","full_name":"tkellogg/target-practice","owner":"tkellogg","description":"An AI-driven resume manager that takes a human-written verbose resume and crafts it to fit a specific job role","archived":false,"fork":false,"pushed_at":"2025-01-29T21:35:27.000Z","size":1316,"stargazers_count":12,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-13T04:30:40.948Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/tkellogg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-10T00:37:39.000Z","updated_at":"2025-03-12T00:33:07.000Z","dependencies_parsed_at":"2025-01-10T01:28:22.263Z","dependency_job_id":"b4a223eb-01fa-4796-a3e2-ca8050e589ac","html_url":"https://github.com/tkellogg/target-practice","commit_stats":null,"previous_names":["tkellogg/target-practice"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tkellogg/target-practice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkellogg%2Ftarget-practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkellogg%2Ftarget-practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkellogg%2Ftarget-practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkellogg%2Ftarget-practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tkellogg","download_url":"https://codeload.github.com/tkellogg/target-practice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tkellogg%2Ftarget-practice/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266525118,"owners_count":23942877,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":[],"created_at":"2025-03-13T04:29:19.455Z","updated_at":"2025-07-22T16:07:31.991Z","avatar_url":"https://github.com/tkellogg.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Target Practice\n\nCreate resumes that are targeted at specific job postings.\n\n## The Problem\n\nHiring managers are so slammed with stacks of resumes, that they really have to be\nspoonfed the exact information they're looking for. But that's a lot of work on you,\nthe job candidate.\n\nFurthermore, it sucks to write a resume. It's hard enough trying to remember what you\ndid, now you also have to phrase it so that it sounds good. And did I even do anything\nthat sounds good?\n\n## The Solution\n\nIt's a two step process:\n\n1. Build a resume. Not just a resume, a huge bank of stories about projects, etc.\n2. Upload job description, and export a resume that's targeted specifically to it.\n\nThe stories are key. We use an AI to interview you, to prod you with questions to talk\nmore and more about details that you've forgotten. The AI also takes care of making\nsure it all sounds professional. Using the AI, you can generate accomplishments \u0026 \nskills extracted from the stories. In my case, I have 20-30 skills for each of my jobs.\nMake it extremely comprehensive.\n\nUX Design Principle: You always have the ability to edit any LLM-generated text.\n\nWhen it comes time to generating the targeted resume, after uploading the job posting,\nthe LLM analyzes the post for what's needed to be successful. You can collaborate on\nthat analysis, and then generate a resume PDF. The final resume is mostly the same as\nthe full resume, but filtered down to just accomplishments \u0026 skills that are relevant\nto the job posting.\n\n\n## Architecture\n\nThe app is built as a frontend-only web application that interacts directly with GitHub's API for storage. This design was chosen because:\n\n1. **Privacy**: Your resume data is stored in your private GitHub repository, giving you full control over access\n2. **Version Control**: Git provides automatic versioning and history of all changes\n3. **No Database**: By using GitHub for storage, we eliminate the need for a separate database\n4. **Simplicity**: The frontend-only architecture means you can run it locally without complex setup\n\nThe application uses:\n- React + Vite for the frontend\n- Material UI for the interface\n- GitHub API for data storage\n- Anthropic's Claude API for AI analysis\n- XML for data format (chosen for readability and merge-friendliness)\n\n**Note**: Currently, this is a local-only application. You'll need to run it on your own machine - there is no hosted version.\n\n## Features\n\n- **Resume Editor**\n  - Edit your full resume with clickable text fields\n  - Organize experience, projects, and patents\n  - Auto-saves to GitHub as XML\n  - Beautiful Material UI interface\n  - Light/dark mode based on system theme\n\n- **Job Posting Management**\n  - Import and analyze job postings\n  - AI-powered analysis of requirements and success criteria\n  - Generate tailored resumes for each position\n  - Export to PDF with professional formatting\n  - All data stored in GitHub as XML\n\n## Setup\n\n1. Clone the repository\n2. Install dependencies:\n   ```bash\n   npm install\n   ```\n3. Create a `.env` file with:\n   ```\n   VITE_GH_ACCESS_KEY=your_github_access_key\n   VITE_ANTH_API_KEY=your_anthropic_key\n   ```\n   The Github access key is acquired by running `gh auth token`. Your Anthropic\n   key should be obtained from Anthropic [here](https://docs.anthropic.com/en/api/getting-started). You'll probably have to setup a credit card with Anthropic,\n   but it likely won't cost much money.\n4. Verify `.env` is not tracked by git:\n   ```bash\n   git ls-files .env  # Should return no output\n   ```\n5. Start the development server:\n   ```bash\n   npm run dev\n   ```\n\nThe frontend runs on port 3001 and the backend on port 3002.\n\n## Further Setup\n\n1. Create a *private* Github repository. e.g. call it `resume` or `resume-curated`, \n   whatever. This is where all your data \u0026 PDFs will be stored.\n2. Create a file in that repo called `full-resume.xml`\n3. Copy the contents of `EXAMPLE.xml` and paste it into ChatGPT, Claude, or whatever\n   your favorite AI is, along with your resume, and have it convert your resume to\n   that format. It's not a big deal if it's off by a little, it just has to get close.\n4. Paste the XML version of your resume into `full-resume.xml` in your private repo.\n5. Commit/push (or just use the github UI)\n\n## Usage\n\n1. **Select Repository**\n   - Choose a GitHub repository from the dropdown (typically a private repo)\n   - The app will load `full-resume.xml` from the root\n\n2. **Edit Resume**\n   - Click any text to edit\n   - Changes are saved automatically\n   - Supports rich text formatting\n\n3. **Manage Job Postings**\n   - Create new job postings\n   - AI analyzes requirements\n   - Generate tailored resumes\n   - Export to PDF\n\n## File Structure\n\n- `/full-resume.xml` - Complete resume data (stored in your private repo)\n- `/job-postings/{company}-{title}.xml` - Job posting data\n- `/job-postings/{company}-{title}.pdf` - Generated PDFs\n\n## Plans\nThis repo was designed to work with agentic coding AIs, like Cursor Agent.\nNew features should be first described in the proper markdown file in `plans/`.\nWhile you're using an agent, have the proper plan files in your context. Doing\nthis helps keep the agents on the right path.\n\nOccasionally you need to fix bugs in the plans. Discrepancies \u0026 poorly organized\nthoughts can confuse agents. Use a reasoning model like o1 or R1 to help write\nclear \u0026 concise plans.\n\n## Development\n\n- Built with React + Vite\n- TypeScript for type safety\n- Material UI components\n- GitHub API for storage\n- Anthropic API for AI analysis\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Submit a pull request\n\n## Privacy Note\n\nThis application is designed to work with private GitHub repositories. Your resume data and job applications should be stored in a private repository that only you can access. The application code itself can be public, as it contains no sensitive information. ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkellogg%2Ftarget-practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftkellogg%2Ftarget-practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkellogg%2Ftarget-practice/lists"}