Skip to content

Commit 1cb9916

Browse files
committed
Version-1
0 parents  commit 1cb9916

55 files changed

Lines changed: 11882 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# AI provider: ollama (recommended) or openai
2+
AI_PROVIDER=ollama
3+
4+
# For Ollama (local LLaMA)
5+
OLLAMA_URL=http://localhost:11434/api/generate
6+
7+
# For OpenAI (if you prefer)
8+
# OPENAI_API_KEY=your_openai_api_key_here

.eslintrc.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": ["next/core-web-vitals", "eslint:recommended"],
3+
"rules": {}
4+
}

.github/workflows/ci.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: CI
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- uses: actions/checkout@v4
10+
- name: Setup Node
11+
uses: actions/setup-node@v4
12+
with:
13+
node-version: 18
14+
- name: Install
15+
run: npm ci
16+
- name: Lint
17+
run: npm run lint
18+
- name: Test
19+
run: npm test

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
node_modules
2+
.next
3+
.env
4+
tmp
5+
.DS_Store
6+
dist

Dockerfile.app

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
FROM node:18
2+
WORKDIR /app
3+
4+
# Install dependencies and build
5+
COPY package*.json ./
6+
RUN npm install
7+
COPY . .
8+
RUN npm run build
9+
10+
EXPOSE 3000
11+
ENV NODE_ENV=production
12+
CMD ["npm", "start"]

README.md

Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
# AutoATS - AI-Powered Resume Builder
2+
3+
A modern, intelligent resume builder that uses AI to optimize your resume for specific job descriptions. Built with Next.js, TypeScript, and Tailwind CSS, powered by Ollama for local AI processing.
4+
5+
## ✨ Features
6+
7+
- 🤖 **AI-Powered Optimization**: Uses Ollama (LLaMA 3) to analyze job descriptions and optimize your resume
8+
- 📝 **Smart Project Selection**: Automatically selects the most relevant projects from a pool of 12+ projects
9+
- 🎯 **ATS-Friendly**: Generates resumes optimized for Applicant Tracking Systems
10+
- 📄 **PDF Generation**: Generates a professional PDF (no LaTeX, no Docker)
11+
- 🎨 **Modern UI**: Beautiful, responsive interface built with Tailwind CSS
12+
- 🔒 **Privacy-First**: All AI processing happens locally with Ollama
13+
14+
## 🚀 Quick Start
15+
16+
### Prerequisites
17+
18+
1. **Node.js** (v18 or higher)
19+
2. **Ollama** with LLaMA 3 model (for AI features)
20+
21+
### Installation
22+
23+
1. **Clone the repository**
24+
25+
```bash
26+
git clone <your-repo-url>
27+
cd AutoATS
28+
```
29+
30+
2. **Install dependencies**
31+
32+
```bash
33+
npm install
34+
```
35+
36+
3. **Set up environment variables**
37+
38+
```bash
39+
cp .env.example .env
40+
```
41+
42+
Edit `.env` to configure your settings:
43+
44+
```env
45+
# AI provider: ollama (recommended) or openai
46+
AI_PROVIDER=ollama
47+
48+
# For Ollama (local LLaMA)
49+
OLLAMA_URL=http://localhost:11434/api/generate
50+
```
51+
52+
4. **Install and setup Ollama**
53+
54+
```bash
55+
# Install Ollama
56+
curl -fsSL https://ollama.com/install.sh | sh
57+
58+
# Pull LLaMA 3 model
59+
ollama pull llama3
60+
61+
# Start Ollama service
62+
ollama serve
63+
```
64+
65+
5. **Start the development server**
66+
67+
```bash
68+
npm run dev
69+
```
70+
71+
6. **Open your browser**
72+
Navigate to [http://localhost:3000](http://localhost:3000)
73+
74+
## Running
75+
76+
Run Ollama in one terminal:
77+
78+
```bash
79+
ollama serve
80+
```
81+
82+
Run the app in another:
83+
84+
```bash
85+
npm run dev
86+
```
87+
88+
## 📖 Usage Guide
89+
90+
### Step 1: Paste Job Description
91+
92+
- Copy and paste the complete job description
93+
- Include requirements, responsibilities, and qualifications
94+
- The more detailed, the better the AI optimization
95+
96+
### Step 2: AI-Powered Project Selection
97+
98+
- Click "🤖 AI-Powered Selection" to analyze the JD
99+
- The AI will recommend the most relevant projects from your pool
100+
- You can also manually select/deselect projects
101+
102+
### Step 3: Generate Resume
103+
104+
- Click "Generate Resume" to create your ATS-optimized resume
105+
- The AI will:
106+
- Tailor your summary to match job requirements
107+
- Highlight relevant skills and experiences
108+
- Optimize content for ATS keywords
109+
- Download a PDF (preview + download)
110+
111+
## 🏗️ Project Structure
112+
113+
```
114+
AutoATS/
115+
├── components/ # React components
116+
│ ├── JobDescriptionForm.tsx
117+
│ ├── ProjectSelector.tsx
118+
│ └── ResultDisplay.tsx
119+
├── pages/ # Next.js pages
120+
│ ├── api/ # API endpoints
121+
│ │ ├── analyze-jd.ts
122+
│ │ └── generate-resume.ts
123+
│ ├── _app.tsx
124+
│ └── index.tsx
125+
├── services/ # Legacy services (no longer required for PDF generation)
126+
├── styles/ # CSS styles
127+
│ └── globals.css
128+
├── examples/ # Sample templates and profiles
129+
└── docs/ # Additional documentation
130+
```
131+
132+
## 🔧 Configuration
133+
134+
### AI Provider Options
135+
136+
#### Ollama (Recommended)
137+
138+
- Local processing, no API keys needed
139+
- Uses LLaMA 3 model
140+
- Complete privacy
141+
- Free to use
142+
143+
#### OpenAI (Alternative)
144+
145+
- Requires API key
146+
- Faster processing
147+
- Cloud-based
148+
- Usage costs apply
149+
150+
### Customization
151+
152+
#### Adding Your Own Projects
153+
154+
Edit the `sampleProjects` array in:
155+
156+
- `pages/api/analyze-jd.ts`
157+
- `pages/api/generate-resume.ts`
158+
- `components/ProjectSelector.tsx`
159+
160+
#### Customizing LaTeX Template
161+
162+
The system uses a professional ATS-friendly template. You can modify the LaTeX generation in:
163+
164+
- `pages/api/generate-resume.ts` (function `generateLatexTemplate`)
165+
166+
## 🛠️ Development
167+
168+
### Available Scripts
169+
170+
```bash
171+
# Development
172+
npm run dev # Start development server
173+
npm run build # Build for production
174+
npm run start # Start production server
175+
176+
# Testing
177+
npm test # Run tests
178+
npm run lint # Run linter
179+
```
180+
181+
### API Endpoints
182+
183+
#### `POST /api/analyze-jd`
184+
185+
Analyzes job description and recommends relevant projects.
186+
187+
**Request:**
188+
189+
```json
190+
{
191+
"jobDescription": "Full-stack developer position..."
192+
}
193+
```
194+
195+
**Response:**
196+
197+
```json
198+
{
199+
"recommendedProjects": ["1", "3", "5"],
200+
"keywords": ["react", "node.js", "aws"],
201+
"analysisMethod": "ai"
202+
}
203+
```
204+
205+
#### `POST /api/generate-resume`
206+
207+
Generates optimized resume based on JD and selected projects.
208+
209+
**Request:**
210+
211+
```json
212+
{
213+
"jobDescription": "Full-stack developer position...",
214+
"selectedProjects": ["1", "3", "5"]
215+
}
216+
```
217+
218+
**Response:**
219+
220+
```json
221+
{
222+
"latex": "% LaTeX content...",
223+
"pdfUrl": "http://localhost:3030/pdf/1234567890.pdf",
224+
"selectedProjects": ["1", "3", "5"],
225+
"timestamp": "2024-01-06T15:30:00.000Z"
226+
}
227+
```
228+
229+
## 🔍 Troubleshooting
230+
231+
### Common Issues
232+
233+
#### Ollama Connection Failed
234+
235+
```bash
236+
# Check if Ollama is running
237+
ollama list
238+
239+
# Restart Ollama service
240+
ollama serve
241+
```
242+
243+
#### LaTeX Compilation Errors
244+
245+
```bash
246+
# Check LaTeX service status
247+
curl http://localhost:3030/health
248+
249+
# Rebuild LaTeX service
250+
npm run compile-service:build
251+
npm run compile-service:run
252+
```
253+
254+
#### Tailwind CSS Not Working
255+
256+
```bash
257+
# Rebuild CSS
258+
npm run build
259+
```
260+
261+
### Getting Help
262+
263+
1. Check the console logs for detailed error messages
264+
2. Ensure all services are running (web app, LaTeX service, Ollama)
265+
3. Verify environment variables are correctly set
266+
4. Check network connectivity for external services
267+
268+
## 🤝 Contributing
269+
270+
1. Fork the repository
271+
2. Create a feature branch: `git checkout -b feature/amazing-feature`
272+
3. Commit your changes: `git commit -m 'Add amazing feature'`
273+
4. Push to the branch: `git push origin feature/amazing-feature`
274+
5. Open a Pull Request
275+
276+
## 📄 License
277+
278+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
279+
280+
## 🙏 Acknowledgments
281+
282+
- [Ollama](https://ollama.com/) for local AI processing
283+
- [Next.js](https://nextjs.org/) for the React framework
284+
- [Tailwind CSS](https://tailwindcss.com/) for styling
285+
- [LaTeX](https://www.latex-project.org/) for professional document generation
286+
287+
## 📞 Support
288+
289+
If you encounter any issues or have questions, please:
290+
291+
1. Check the troubleshooting section above
292+
2. Search existing GitHub issues
293+
3. Create a new issue with detailed information
294+
295+
---
296+
297+
**Built with ❤️ for job seekers who want to stand out!**
298+
299+
## Running the Application
300+
301+
```bash
302+
# Run the setup script
303+
./setup.sh
304+
305+
# Then start services:
306+
ollama serve # Start AI service
307+
npm run compile-service:run # Start LaTeX service
308+
npm run dev # Start web app
309+
```
310+
311+
The application will be available at `http://localhost:3030`

__tests__/generator.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { generateSections } from "../server/lib/generator";
2+
import sample from "../examples/sample_profile.json";
3+
import fs from "fs";
4+
5+
test("generator creates summary and sections", () => {
6+
const jd = fs.readFileSync("examples/sample_jd.txt", "utf8");
7+
const res = generateSections(JSON.stringify(sample), jd);
8+
expect(res.summary).toBeTruthy();
9+
expect(res.projectsTex).toContain("\\section*{Projects}");
10+
expect(res.skillsTex).toContain("\\section*{Technical Skills}");
11+
});

__tests__/latex.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {
2+
validateOnlyAllowedChanges,
3+
replaceSection,
4+
} from "../server/lib/latex";
5+
6+
test("validate allows only marked sections to change", () => {
7+
const orig = `A\n% START SUMMARY\nold summary\n% END SUMMARY\nB\n% START PROJECTS\nold projects\n% END PROJECTS\nC`;
8+
const updated = `A\n% START SUMMARY\nnew summary\n% END SUMMARY\nB\n% START PROJECTS\nold projects\n% END PROJECTS\nC`;
9+
expect(validateOnlyAllowedChanges(orig, updated)).toBe(true);
10+
});
11+
12+
test("validate fails if other content changed", () => {
13+
const orig = `A\n% START SUMMARY\nold summary\n% END SUMMARY\nB`;
14+
const updated = `A_modified\n% START SUMMARY\nnew summary\n% END SUMMARY\nB`;
15+
expect(validateOnlyAllowedChanges(orig, updated)).toBe(false);
16+
});

0 commit comments

Comments
 (0)