ResumeSpy is a back-end application designed to efficiently manage resumes with version control, multi-language support, and customization for specific job descriptions (JDs).
- Single Source Maintenance: Manage one primary language version for each resume position.
- Version Control: Integrated with Git to track changes and compare versions.
- Multi-language Support: Support for translating resumes to various languages.
- JD-specific Customization: Allows resume creation tailored for job descriptions.
- User Authentication: JWT-based API authentication with refresh tokens plus Google and GitHub social login support.
- Interactive API Docs: Built-in Swagger UI available at
/swagger.htmlfor exploring endpoints.
- Back-End: .NET 9.0 Web API
- Database: PostgreSQL 16+
- ORM: Entity Framework Core
- Authentication: JWT + OAuth (Google, GitHub)
- Translation: Multiple providers (Microsoft Translator, DeepL, LibreTranslate, AI-powered)
- AI Services: Azure OpenAI, OpenAI
- Version Control: Git for tracking resume versions
- CI/CD: GitHub Actions
ResumeSpy now exposes a dedicated authentication module that supports both traditional email/password accounts and social sign-in with Google or GitHub. Successful authentication returns a short-lived access token and a rolling refresh token. Clients are expected to:
- Store the returned
accessTokenandrefreshTokenvalues securely. - Attach the bearer access token to subsequent API requests (
Authorization: Bearer <token>). - Call
POST /api/auth/refreshwith the refresh token when the access token expires to obtain a new token pair. - Call
POST /api/auth/logoutto invalidate a refresh token when the user signs out.
| Endpoint | Description |
|---|---|
POST /api/auth/register |
Create a new local account (email + password). |
POST /api/auth/login |
Authenticate via email/password. |
POST /api/auth/refresh |
Exchange a refresh token for a new access/refresh pair. |
POST /api/auth/external |
Complete a social sign-in using Google (ID token) or GitHub (access token). |
POST /api/auth/logout |
Revoke a refresh token (requires authentication). |
Add the following sections to your appsettings.*.json files and populate them with real values before running the API:
"Jwt": {
"Issuer": "ResumeSpy",
"Audience": "ResumeSpyFrontend",
"SigningKey": "<32+ character secure key>",
"AccessTokenDurationInMinutes": 60,
"RefreshTokenDurationInDays": 14
},
"ExternalAuth": {
"Google": {
"ClientId": "<google-oauth-client-id>"
},
"Github": {
"ClientId": "<github-oauth-client-id>",
"ClientSecret": "<github-oauth-client-secret>"
}
}
⚠️ Keep the signing key and OAuth secrets out of source control. Use user secrets or environment variables in production.
- Start the API (
dotnet run --project ResumeSpy.UI). - Open
https://localhost:7227/swagger.html(or the base URL you run on) to view the interactive documentation and try endpoints with JWT auth.
ResumeSpy uses GitHub Actions for automated continuous integration and deployment.
Pull Request → [CI Workflow] → Build & Test → Merge
↓
main branch
↓
[CD Workflow]
↓
Build & Publish
↓
Deploy to DEV
(stub implementation)
Release Branch → [CD Workflow] → Build & Test → Publish → Deploy to PROD
(stub implementation)
Triggers: Pull requests to main or release/** branches
Steps:
- ✅ Checkout code
- ✅ Setup .NET 9.0
- ✅ Restore dependencies
- ✅ Build solution (Release mode)
- ✅ Run tests
- ✅ Report status
Purpose: Validate that code builds and tests pass before merging.
Triggers:
- Push to
main→ Deploy to DEV - Push to
release/**→ Deploy to PROD
Steps:
- ✅ Build and test
- ✅ Publish application artifacts
⚠️ Deploy to environment (stub implementation)
Current Status: Deployment steps are stubs (placeholders). See Implementing Real Deployment to configure actual deployment.
ResumeSpy supports multiple environments with separate configuration:
| Environment | Branch | Database | Deployment |
|---|---|---|---|
| Local | Any | Local PostgreSQL | Manual (dotnet run) |
| DEV | main |
Hosted PostgreSQL | Automatic via CD workflow |
| PROD | release/** |
Production PostgreSQL | Automatic via CD workflow (manual approval) |
-
Copy environment template
cp .env.example .env
-
Configure secrets (see docs/ENVIRONMENTS.md)
- Database connection string
- JWT signing key
- OAuth credentials (Google, GitHub)
- CORS origins
-
Apply database migrations
dotnet ef database update \ --project ResumeSpy.Infrastructure \ --startup-project ResumeSpy.UI
For detailed environment configuration, see docs/ENVIRONMENTS.md.
- .NET 9.0 SDK
- PostgreSQL 16+ (or Docker)
- Git
-
Clone the repository
git clone https://github.com/feifeijin/ResumeSpy.git cd ResumeSpy -
Start PostgreSQL (using Docker)
docker run --name resumespy-postgres \ -e POSTGRES_PASSWORD=devpassword \ -e POSTGRES_DB=resumespy_dev \ -p 5432:5432 \ -d postgres:16
-
Configure user secrets
cd ResumeSpy.UI dotnet user-secrets init dotnet user-secrets set "ConnectionStrings:PrimaryDbConnection" "Host=localhost;Port=5432;Database=resumespy_dev;Username=postgres;Password=devpassword;" dotnet user-secrets set "Jwt:SigningKey" "your-local-dev-key-minimum-32-characters-long" cd ..
-
Apply migrations and run
dotnet ef database update --project ResumeSpy.Infrastructure --startup-project ResumeSpy.UI dotnet restore ResumeSpy.sln dotnet build ResumeSpy.sln dotnet run --project ResumeSpy.UI
-
Access the API
- API:
https://localhost:7227 - Swagger UI:
https://localhost:7227/swagger.html
- API:
ResumeSpy/
├── .github/
│ └── workflows/ # CI/CD workflows
│ ├── ci.yml # Pull request validation
│ └── cd.yml # Continuous deployment
├── docs/
│ ├── CONTRIBUTING.md # Contributing guidelines
│ ├── DEPLOYMENT.md # Deployment implementation guide
│ └── ENVIRONMENTS.md # Environment configuration
├── ResumeSpy.Core/ # Domain layer
│ ├── Entities/ # Domain entities
│ ├── Interfaces/ # Repository interfaces
│ └── Services/ # Business logic
├── ResumeSpy.Infrastructure/ # Infrastructure layer
│ ├── Data/ # Database context
│ ├── Repositories/ # Data access implementations
│ └── Services/ # External service integrations
│ ├── AI/ # AI provider implementations
│ └── Translation/ # Translation services
├── ResumeSpy.UI/ # Presentation layer
│ ├── Controllers/ # API controllers
│ ├── Middleware/ # Custom middleware
│ └── Models/ # API DTOs
└── .env.example # Environment variables template
The current CD workflow includes deployment stubs (placeholders). To implement actual deployment:
-
Choose a deployment platform:
- Azure App Service (recommended for enterprise)
- Railway (recommended for startups)
- Docker + VPS (cost-effective)
- AWS Elastic Beanstalk
-
Configure GitHub Environments:
- Go to repository Settings → Environments
- Create
DEVandPRODenvironments - Add required secrets (deployment tokens, connection strings, etc.)
-
Update CD workflow:
- Replace deployment stub steps with actual deployment commands
- See docs/DEPLOYMENT.md for platform-specific instructions
-
Test deployment:
- Merge to
mainto trigger DEV deployment - Create
release/v1.0.0branch to trigger PROD deployment
- Merge to
For detailed deployment instructions, see docs/DEPLOYMENT.md.
We welcome contributions! Please see docs/CONTRIBUTING.md for:
- Development workflow
- Branch naming conventions
- Commit message format
- Code standards
- Pull request process
- Fork the repository
- Create a feature branch (
feature/your-feature-name) - Make your changes
- Commit using Conventional Commits
- Push and create a pull request
- CI will automatically validate your changes
- CONTRIBUTING.md - Contributing guidelines and development workflow
- ENVIRONMENTS.md - Environment configuration and setup
- DEPLOYMENT.md - Deployment implementation guide
- AI_TRANSLATION_IMPLEMENTATION.md - AI and translation services
- Backend-only repository: Frontend is in a separate repository
- PostgreSQL database: Requires PostgreSQL 16 or later
- Environment separation: DEV and PROD use separate databases
- OAuth configuration: Requires separate OAuth apps per environment
⚠️ Deployment stubs: CD workflow publishes artifacts but doesn't deploy them yet⚠️ No test project: Test infrastructure needs to be added⚠️ Manual migrations: Database migrations need manual application in PROD⚠️ No preview environments: Backend doesn't support PR-specific preview environments⚠️ No monitoring: Application monitoring and alerting not configured⚠️ No rollback: Automated rollback mechanism not implemented
These limitations are intentional for the initial CI/CD foundation and can be addressed incrementally.
- ✅ CI/CD workflows (build, test, publish)
- ✅ Environment configuration documentation
- ✅ Deployment stubs
- ⏳ Real deployment implementation
- ⏳ Database migration automation
- ⏳ Health check endpoints
- ⏳ Smoke tests post-deployment
- ⏳ Unit test project setup
- ⏳ Integration tests
- ⏳ Code coverage reporting
- ⏳ Automated security scanning
- ⏳ Monitoring and alerting
- ⏳ Automated rollback
- ⏳ Blue-green deployments
- ⏳ Performance testing
- ⏳ Feature flags
- ⏳ Canary releases
- ⏳ Multi-region deployment
- ⏳ Load balancing
This project is licensed under the MIT License - see the LICENSE file for details.
- Documentation: Check docs/ directory
- Issues: GitHub Issues
- Discussions: GitHub Discussions