A user-friendly web application for managing and editing the master_resume.json file. This interface provides a visual way to update resume content without manually editing JSON files.
Related to: GitHub Issue #2
✅ Visual Resume Editor - Edit all resume sections through an intuitive web interface
✅ Real-time Validation - Client and server-side validation to prevent malformed data
✅ Automatic Backups - Creates backups before every save operation
✅ Backup Management - View, restore, and manage backup history
✅ Responsive Design - Works seamlessly on desktop, tablet, and mobile devices
✅ CRUD Operations - Add, edit, and delete experience, education, and certifications
✅ Tag Management - Manage technology tags for experience bullets
✅ RESTful API - Clean API for programmatic access
- Location:
src/api/app.py - Port: 5000
- Technology: Python Flask with CORS support
- Location:
src/web/ - Files:
index.html- Main HTML structureapp.js- JavaScript application logicstyles.css- Responsive CSS styling
- Technology: Vanilla JavaScript with Bootstrap 5
- Resume File:
data/master_resume.json - Backups:
data/backups/
- Python 3.8 or higher
- pip (Python package manager)
- Modern web browser (Chrome, Firefox, Safari, Edge)
-
Install Python dependencies:
pip install -r requirements.txt
-
Verify installation:
python -m pytest tests/test_api.py -v
-
Start the Flask API server:
python src/api/app.py
The API will be available at
http://localhost:5000 -
Open the web interface:
Open
src/web/index.htmlin your web browser, or serve it using a simple HTTP server:# Using Python's built-in HTTP server cd src/web python -m http.server 8080
Then navigate to
http://localhost:8080
The interface is divided into sections accessible via the left sidebar:
- Basic Info - Name, title, location, contact information
- Summary - Professional summary
- Technical Skills - Technical proficiencies by category
- Areas of Expertise - Key areas of expertise
- Experience - Professional experience entries
- Education - Educational background
- Certifications - Professional certifications
- Click "Basic Info" in the sidebar
- Edit fields directly
- Changes are tracked automatically
- Navigate to "Experience" section
- Click "Add Experience" button
- Fill in employer, role, dates, and location
- Add accomplishment bullets
- Tag bullets with relevant technologies
- Click "Add Tag" on any bullet point
- Enter tag name in the prompt
- Click "×" on a tag to remove it
- Click "Save Changes" in the top navigation
- System validates data before saving
- Automatic backup is created
- Success message confirms save
- Click "Create Backup" button in top navigation
- Backup is created with timestamp
- Click "View Backups" button
- Modal shows all available backups with:
- Filename
- Creation date/time
- File size
- Open backup history modal
- Click "Restore" on desired backup
- Confirm restoration
- Current state is backed up before restore
- Page reloads with restored data
http://localhost:5000/api
GET /api/healthResponse:
{
"status": "healthy",
"timestamp": "2025-10-11T12:00:00"
}GET /api/resumeResponse:
{
"success": true,
"data": { /* resume data */ }
}PUT /api/resume
Content-Type: application/json
{ /* complete resume data */ }Response:
{
"success": true,
"message": "Resume updated successfully",
"backup": "master_resume_backup_20251011_120000.json"
}POST /api/resume/validate
Content-Type: application/json
{ /* resume data to validate */ }Response:
{
"valid": true,
"errors": []
}POST /api/resume/backupResponse:
{
"success": true,
"message": "Backup created successfully",
"backup": "master_resume_backup_20251011_120000.json",
"timestamp": "2025-10-11T12:00:00"
}GET /api/resume/backupsResponse:
{
"success": true,
"backups": [
{
"filename": "master_resume_backup_20251011_120000.json",
"size": 12345,
"created": "2025-10-11T12:00:00"
}
]
}POST /api/resume/restore
Content-Type: application/json
{
"filename": "master_resume_backup_20251011_120000.json"
}Response:
{
"success": true,
"message": "Resume restored successfully",
"restored_from": "master_resume_backup_20251011_120000.json",
"current_backup": "master_resume_backup_20251011_120100.json"
}The system validates resume data to ensure data integrity:
name- Full nametitle- Professional titlelocation- Locationcontact- Contact object withemailandphonesummary- Professional summary
employer- Company namerole- Job titledates- Employment datesbullets- Array of accomplishment objects
school- Institution namedegree- Degree or certification
experience- Must be an arrayeducation- Must be an arraycertifications- Must be an array (if present)contact- Must be an object
# Run all API tests
python -m pytest tests/test_api.py -v
# Run with coverage
python -m pytest tests/test_api.py --cov=src/api --cov-report=html- Health check endpoint
- Resume CRUD operations
- Validation logic
- Backup creation and restoration
- Error handling
- Edge cases
- Check if port 5000 is already in use
- Verify Python dependencies are installed
- Check file permissions for
data/directory
- Verify API server is running
- Check browser console for errors
- Ensure
data/master_resume.jsonis writable
- Review error messages in the UI
- Check that all required fields are filled
- Verify data structure matches expected format
- Ensure backup file exists in
data/backups/ - Verify backup file is valid JSON
- Check file permissions
- CORS enabled for local development
- No authentication (suitable for local use)
- File system access restricted to data directory
- Add authentication/authorization
- Implement rate limiting
- Use HTTPS
- Restrict CORS to specific origins
- Add input sanitization
- Implement audit logging
- User authentication
- Multi-user support
- Version control integration
- Export to multiple formats
- AI-powered content suggestions
- Collaborative editing
- Cloud storage integration
- Mobile app
When contributing to the resume editor:
- Follow TDD principles - write tests first
- Ensure all tests pass before committing
- Update documentation for new features
- Link commits to GitHub issues
- Follow existing code style
This project is part of the agentic-resume-tailor repository.
For issues or questions:
- Create a GitHub issue
- Reference issue #2 for context
- Include error messages and logs