TrackApply is a practical solution for tracking job applications with resume version locking, job description snapshots, and follow-up management.
- Resume Version Locking: Immutable snapshots of which resume was used for each application
- Job Description Snapshots: Capture and preserve job descriptions at the time of application
- Follow-Up Management: Automatic follow-up date calculation and reminders
- Immutable Tracking: Core application data cannot be accidentally modified or deleted
- Status History: Complete audit trail of application status changes
- Frontend: Next.js 14 (React), Tailwind CSS
- Backend: Next.js API Routes
- Database: SQLite (via better-sqlite3)
- Authentication: Custom session-based auth with bcrypt
- File Storage: Local filesystem (can migrate to cloud storage later)
- Node.js 18+ and npm
- Windows, macOS, or Linux
-
Install dependencies:
npm install
-
Run the development server:
npm run dev
-
Open your browser: Navigate to http://localhost:3000
- Create an account by clicking "Sign Up" on the homepage
- Upload your resume(s) from the "Resumes" page
- Start tracking applications by clicking "Add Application"
trackapply/
├── app/ # Next.js app directory
│ ├── api/ # API routes
│ │ ├── auth/ # Authentication endpoints
│ │ ├── applications/ # Application CRUD
│ │ ├── resumes/ # Resume management
│ │ └── followups/ # Follow-up tracking
│ ├── auth/ # Auth pages (signin/signup)
│ ├── dashboard/ # Dashboard page
│ ├── applications/ # Application pages
│ └── resumes/ # Resume library page
├── lib/ # Core libraries
│ ├── db.ts # Database setup and schema
│ ├── auth.ts # Authentication utilities
│ ├── fileStorage.ts # File storage utilities
│ └── middleware.ts # Auth middleware
├── data/ # Data directory (created automatically)
│ ├── trackapply.db # SQLite database
│ └── users/ # User file storage
└── package.json
The application uses SQLite with the following tables:
users- User accountsresumes- Resume libraryapplications- Job applicationsapplication_resumes- Immutable resume locksfollow_ups- Follow-up schedulingstatus_history- Application status audit trail
When you select a resume for an application, the system:
- Creates an immutable copy of the resume file
- Stores it in
/data/users/{user_id}/applications/{app_id}/resume_locked.pdf - Links it to the application record
- This locked version cannot be deleted or modified
Job descriptions are stored as text in the database at the time of application creation. Even if the original posting is deleted or changed, you'll always have the original requirements.
- Automatic follow-up dates (default: 7 days after application)
- Dashboard shows pending follow-ups
- One-click follow-up completion tracking
- Custom follow-up date support
- Passwords are hashed using bcrypt
- File storage is user-isolated
- Session-based authentication
- SQL injection protection via prepared statements
- File type validation (PDF, DOCX only)
- File size limits (10MB max)
npm run build
npm startThe SQLite database is stored at: data/trackapply.db
User files are stored at: data/users/{user_id}/
To backup your data:
- Copy the
data/directory - The database and all user files are contained within
See DEPLOYMENT.md and QUICK_DEPLOY.md for deployment instructions.
Recommended platforms:
- Railway - Best for SQLite + file storage
- Render - Also supports persistent storage
- Vercel - Requires database migration
GITHUB_SETUP.md- How to push to GitHubDEPLOYMENT.md- Detailed deployment guideQUICK_DEPLOY.md- Quick deployment stepsQUICK_START.md- Getting started guideJob_Application_Tracker_Product_Design.md- Product design document
- Browser extension for one-click job logging
- Email reminders for follow-ups
- Application analytics dashboard
- Export data as CSV/JSON
- Mobile app (React Native)
- Ensure the
data/directory is writable - Delete
data/trackapply.dbto reset the database (⚠️ deletes all data)
- Check file size (max 10MB)
- Ensure file is PDF or DOCX format
- Check disk space availability
- Clear browser cookies
- Sign out and sign back in
ISC
For issues or questions, please check the documentation files or create an issue on GitHub.