Disclaimer: ✨Vibe coded✨, hand architected. I was inspired by Brian's job search and wanted to do something more customizable.
Job search link aggregator for tech professionals. Generate pre-built search URLs to 60+ job boards with a single set of filters.
-
60+ Job Boards across 5 categories:
- ATS Systems (Greenhouse, Lever, Ashby, Workday, etc.)
- Major Platforms (LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs)
- Tech-Focused (Wellfound, Y Combinator, Stack Overflow, Dice, etc.)
- Niche & Specialized (Remote-focused, climate tech, crypto, gaming, etc.)
- Company Careers (Google, Apple, Amazon, Meta, Netflix, Stripe, etc.)
-
Smart Filtering
- Role/job title with variations (e.g., "full stack" / "fullstack")
- Experience level (entry, mid, senior, director)
- Technologies (include/exclude)
- Industries (include/exclude)
- Remote preference
- Location
- Time posted
- Company size
-
Presets - Save and load filter configurations
-
Theme Support - Light/dark mode
-
Local Storage - Filters persist across sessions
- Node.js 18+
npm installnpm run devOpen index.html in your browser.
npm run buildnpm test- TypeScript - Strict mode for type safety
- esbuild - Fast bundling (~15ms builds)
- Vitest - Test runner with jsdom for DOM testing
- Vanilla JS - No framework; direct DOM manipulation
Single-page tool with simple UI needs:
- Filter inputs → generate URLs → display links
- No complex state or routing needed
- Bundle stays small (~49kb) and loads instantly
URL Generation
- Each job board has a
buildUrl(filters)function - Two query builders:
buildSearchQuery()- Boolean syntax with quotes for sophisticated search engines (LinkedIn, Indeed, Google)buildSimpleQuery()- Plain terms for sites that display raw query in URL (Glassdoor, company careers)
Tri-state Checkboxes
- Technologies/industries support include/exclude/ignore
- Enables "Python jobs but NOT Java" queries
Storage
- Filters auto-save to localStorage
- Presets exportable as JSON
- URL sharing via query string
No Backend
- Pure client-side; opens directly in browser
- Docker is just nginx serving static files
├── src/
│ ├── app.ts # Main application logic
│ ├── jobboards.ts # Job board definitions and URL builders
│ ├── types.ts # TypeScript types
│ ├── storage.ts # Local storage utilities
│ ├── presets.ts # Preset configurations
│ └── tristate.ts # Tri-state checkbox component
├── css/
│ └── styles.css # Styling
├── dist/ # Built output
└── index.html # Main HTML file
Pull and run from GitHub Container Registry:
docker compose pull
docker compose up -dThe app runs on port 8080. Configure your reverse proxy:
| Proxy | Config |
|---|---|
| Caddy | reverse_proxy localhost:8080 |
| nginx | proxy_pass http://localhost:8080; |
| Traefik | Use labels or file provider |
To update:
docker compose pull && docker compose up -dNo Docker needed. Build and serve with any web server:
npm run buildServe these files:
index.htmlcss/dist/
docker compose upAccess at http://localhost:8080
MIT