The open-source internship application tracker for developers and students
Opentern is designed to streamline the internship application process for developers and students. We believe that tracking applications shouldn't be complicated or expensive. Our mission is to provide a powerful, completely free, open-source solution that helps you:
- Organize your internship applications efficiently
- Discover new opportunities automatically
- Track your progress through the application pipeline
- Collaborate with the developer community to improve the tool
- Track applications by status: Interested → Applied → Assessment → Interviewed → Offered/Rejected
- Add custom notes and links for each application
- Visual status indicators with color-coded badges
- Sortable status history to see your application journey
- Automated scraping from popular GitHub repositories:
- Real-time updates via cron jobs (hourly scraping)
- Smart filtering by company, location, and keywords
- One-click application creation from discovered opportunities
- Virtual scrolling for handling thousands of applications
- Real-time search with fuzzy matching using Fuse.js
- Optimized database queries with Convex
- Responsive design that works on all devices
- Google OAuth authentication
- User-specific data isolation
- No data sharing with third parties
- Open source - you own your data
- Completely free - no subscriptions or payments required
- DaisyUI components for consistent design
- Dark/Light mode support
- Intuitive drag-and-drop status management
- Mobile-responsive interface
- Node.js 18+
- npm or yarn
- A Google account for authentication
- A Convex account (free tier available)
-
Clone the repository
git clone https://github.com/gpossst/opentern.git cd opentern -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local
Fill in your environment variables:
# Convex NEXT_PUBLIC_CONVEX_URL=your_convex_url CONVEX_DEPLOY_KEY=your_convex_deploy_key # Google OAuth GOOGLE_CLIENT_ID=your_google_client_id GOOGLE_CLIENT_SECRET=your_google_client_secret # GitHub API (for scraping) GITHUB_TOKEN=your_github_token
-
Set up Convex
npx convex dev
This will:
- Create your Convex project
- Set up the database schema
- Deploy your functions
-
Start the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
- Next.js 15.2.3 - React framework with App Router
- TypeScript - Type-safe development
- Tailwind CSS 4.1.13 - Utility-first CSS framework
- DaisyUI 5.1.10 - Component library
- Lucide React - Icon library
- Fuse.js - Fuzzy search
- React Virtual - Virtual scrolling for performance
- Convex 1.27.0 - Real-time backend platform
- Convex Auth - Authentication system
- Zod - Schema validation
- Google OAuth - User authentication
- GitHub API - Opportunity scraping
- ESLint - Code linting
- Prettier - Code formatting
- TypeScript - Type checking
opentern/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ │ └── cron/scrape/ # Automated scraping endpoint
│ ├── dashboard/ # Main application dashboard
│ ├── globals.css # Global styles
│ ├── layout.tsx # Root layout
│ └── page.tsx # Landing page
├── components/ # React components
│ ├── ApplicationList.tsx # Application management
│ ├── OpportunitiesList.tsx # Opportunity discovery
│ ├── Sidebar.tsx # Navigation sidebar
│ └── SortableList.tsx # Drag-and-drop lists
├── convex/ # Convex backend
│ ├── applications.ts # Application CRUD operations
│ ├── opportunities.ts # Opportunity management
│ ├── users.ts # User management
│ ├── auth.ts # Authentication
│ └── schema.ts # Database schema
├── public/ # Static assets
└── rules/ # Convex rules
We welcome contributions from the community! Here's how you can help:
- Use the GitHub issue tracker
- Include steps to reproduce
- Provide your environment details
- Open a GitHub issue with the "enhancement" label
- Describe the use case and expected behavior
- Consider contributing the implementation yourself!
-
Fork the repository
git clone https://github.com/your-username/opentern.git cd opentern -
Create a feature branch
git checkout -b feature/your-feature-name
-
Make your changes
- Follow the existing code style
- Add tests for new functionality
- Update documentation as needed
-
Test your changes
npm run lint npm run build
-
Commit your changes
git commit -m "feat: add your feature description" -
Push and create a Pull Request
git push origin feature/your-feature-name
- New opportunity sources - Add scraping for more internship repositories
- UI/UX improvements - Enhance the user interface
- Performance optimizations - Improve app speed and efficiency
- API integrations - Connect with job boards and career sites
- Analytics - Add application tracking and insights
- Documentation - Improve guides and tutorials
- Code Style: Follow the existing patterns and use Prettier
- Commits: Use conventional commit messages
- Testing: Add tests for new features
- Documentation: Update README and code comments
- Accessibility: Ensure UI is accessible to all users
| Variable | Description | Required |
|---|---|---|
NEXT_PUBLIC_CONVEX_URL |
Your Convex deployment URL | Yes |
CONVEX_DEPLOY_KEY |
Convex deployment key | Yes |
GOOGLE_CLIENT_ID |
Google OAuth client ID | Yes |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | Yes |
GITHUB_TOKEN |
GitHub API token for scraping | Yes |
- Create a Convex account at convex.dev
- Create a new project
- Run
npx convex devto initialize - Copy the deployment URL to your environment variables
- Go to Google Cloud Console
- Create a new project or select existing
- Enable Google+ API
- Create OAuth 2.0 credentials
- Add authorized redirect URIs:
http://localhost:3000(development)https://yourdomain.com(production)
- Connect your repository to Vercel
- Set environment variables in Vercel dashboard
- Deploy - Vercel will automatically build and deploy
-
Build the application
npm run build
-
Deploy to your hosting platform
- Set environment variables
- Configure cron jobs for scraping
- Set up domain and SSL
{
userId: Id<"users">,
company: string,
title: string,
status: "interested" | "applied" | "assessment" | "interviewed" | "offered" | "rejected" | "archived",
history: Status[],
notes?: string,
link?: string,
dashboardLink?: string,
lastUpdated?: number,
opportunityId?: Id<"opportunities">
}{
company: string,
title: string,
link?: string,
location?: string,
source: string,
createdAt: number
}Opentern automatically scrapes internship opportunities from popular GitHub repositories:
- Schedule: Every hour via Vercel cron jobs
- Sources:
- vanshb03/Summer2026-Internships
- SimplifyJobs/Summer2026-Internships
- Parsing: Handles both HTML tables and markdown formats
- Deduplication: Prevents duplicate entries
- Filtering: Removes expired opportunities (older than 14 days)
- Authentication: Secure Google OAuth integration
- Data Isolation: User data is completely isolated
- No Tracking: We don't track user behavior
- Open Source: Full transparency in code
- GDPR Compliant: Users control their data
- Add more opportunity sources
- Improve mobile responsiveness
- Add application analytics
- Implement bulk operations
- Add sponsor recommendations section
- Team collaboration features
- Integration with job boards
- AI-powered opportunity matching
- Resume integration
- GitHub Discussions: Ask questions and share ideas
- Discord: Join our community chat
- Twitter: Follow for updates @opentern
We're always looking for ways to improve Opentern and help more students find their dream internships. If you're a company or organization that would like to:
- Feature your product in our recommendation section
- Sponsor development of new features
- Partner with us to reach the developer community
Please get in touch with us! We'd love to discuss how we can work together to make internship tracking even better for students and developers.
Contact: Reach out through GitHub Issues or Twitter to start the conversation.
This project is licensed under the MIT License - see the LICENSE file for details.
- vanshb03 and SimplifyJobs for maintaining excellent internship repositories
- Convex for providing an amazing real-time backend platform
- Next.js team for the incredible React framework
- All contributors who help make Opentern better
Made with ❤️ by developers, for developers and students.