This document describes the security measures, responsible usage policies, and reporting procedures for PatchMyResume.
Please review these carefully if you are deploying or contributing to this project.
- π Security Principles
- π Data Storage & Handling
- π API & Backend Security
- π‘οΈ User Account Security
β οΈ Usage Warnings- π§ Abuse & DDoS Prevention
- π’ Reporting Security Issues
- β Summary
PatchMyResume is designed with the following global standards in mind:
- Privacy by Design β We minimize stored data and avoid persisting unnecessary user information.
- OWASP Best Practices β API, authentication, and session handling follow OWASP security recommendations.
- Data Ownership β Users own their API keys and resume data.
- Transparency β Clear terms and warnings are displayed before AI usage.
- Responsible Disclosure β Security issues must be reported privately before public discussion.
| Data Point | Storage Location | Sharing Policy | Notes |
|---|---|---|---|
| User Resume Data | Appwrite DB & Session Storage | Private | Stored securely, accessible only by the logged-in user. |
| User API Key (Gemini) | Appwrite DB (Hashed) | Private | Hashed and used server-side only to access the Gemini API. |
| Job Description | State | Not Saved | Used temporarily for a single AI tailoring request. |
| AI Suggestions | State | Not Saved | Discarded after the user makes their selection/moves on. |
| Final PDF Resume | Local User Device | Not Stored | Generated client-side (src/lib/pdfHelpers.ts) and never stored on our servers. |
-
Transport Layer
- All routes served exclusively over HTTPS.
- CSRF protection enabled for session-based requests.
-
Authentication & Authorization
- Powered by NextAuth + Appwrite.
- Protected routes (resume CRUD, AI requests) require valid sessions.
- Access tokens are scoped and time-limited.
-
Rate Limiting
- AI requests: 10 requests/minute per user.
- Global per-IP/user limit to prevent abuse.
- Repeated violations trigger temporary bans.
-
Error Responses
- Generic error messages returned (to avoid information leaks).
- No internal stack traces exposed in production.
-
Login Activity Logging
- Each login stores:
user_id + ip + timestamp. - New IP logins trigger email notification.
- Each login stores:
-
Session Protection
- Session tokens validated server-side.
- Expired/invalid sessions are denied automatically.
- No long-lived tokens without refresh cycles.
-
Password Security
- Managed fully by Appwrite (secure hashing, salted).
- Project does not implement custom password storage.
-
API Key Ownership
- Users provide their own Google Gemini API Key.
- All costs are billed directly to the userβs Google account.
- The project and maintainers are not responsible for usage charges.
-
Terms & Consent
- Terms are displayed before first AI request.
- Continuing with the workflow means you agree to it.
- Rate limiting applied at both user and IP levels.
- Public routes restricted to read-only.
- Authenticated routes require valid sessions.
- Suspicious requests are logged and may be blocked.
We take security seriously. If you discover a vulnerability or security concern:
- Use the official Private Vulnerability Reporting channel.
- On the repository main page, click the Security tab, then Report a vulnerability.
- Do NOT disclose publicly in Discussions, PRs, or public Issues.
- Provide a clear description (steps to reproduce, impact, and suggested fix if possible).
We will review and patch issues as quickly as possible, collaborating privately via the GitHub Advisory process.
PatchMyResume follows a secure-by-default approach:
- β API keys hashed & stored securely
- β User data private to account owner
- β HTTPS, rate limiting, and auth enforced
- β AI requests never persist sensitive info
- β Transparent terms & consent before AI usage
- β
Responsible disclosure via GitHub Issues (
securitylabel)
These measures provide a global standard security baseline for development, contribution, and deployment.
If you wish to not provide any data to us, feel free to host locally by following the Installation Guide in Readme.md!