Skip to content

Lil-Code30/job-hunt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

35 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Job Hunt

A Linear-inspired job application tracker built with Next.js 16 and Firebase.

Features

  • Add jobs via URL (auto-scrapes title, company, location) or manual form
  • Markdown editor for job description and notes/timeline
  • Kanban board with drag-and-drop status columns
  • Table view with inline status updates
  • Command palette (⌘K) to search across all jobs
  • Status timeline history per job
  • Contacts per job with email/LinkedIn
  • Stats page: funnel, source breakdown, tag cloud, KPIs
  • CSV export
  • Google + email auth
  • Real-time Firestore sync

Screenshots

Title & Description Screenshot
Main Dashboard
Overview of application metrics and recent activities.
Main Dashboard
Command Palette
Global search using Cmd+K to quickly find jobs and contacts.
Command Palette
Jobs List - Kanban View
Drag and drop jobs across different status columns.
Kanban View
Jobs List - Table View
A structured table view of all your tracked jobs.
Table View
Job List Filters
Advanced filtering and search options for your applications.
Job Filters
Job Details Page
Comprehensive view of a specific job application.
Job Details
Job Status Timeline
A history timeline showing the status evolution for a job.
Status Timeline
Add Job Form
Track a new job application by filling out its basic details.
Add Job Form
Add Job - Description
Markdown editor to save the job description.
Job Description
Add Job - Notes
Markdown editor to log interview notes and reflections.
Job Notes
Add Job - Contacts
Manage recruiter and employee contacts for the role.
Job Contacts
Contact Directory
A consolidated list of all your networking contacts.
Contact List
Statistics & Charts (1)
Visual breakdowns and metrics of your job hunt performance.
Stats Page 1
Statistics & Charts (2)
Application funnel and more detailed analytics.
Stats Page 2
Settings
Manage application preferences and account options.
Settings Page

Stack

  • Framework: Next.js 16 (App Router)
  • Backend: Firebase (Firestore, Auth, Storage)
  • Styling: Tailwind CSS
  • Drag & drop: @dnd-kit
  • Search: cmdk
  • Charts: recharts

Setup

1. Create the Next.js app

npx create-next-app@latest job-hunt --typescript --tailwind --app --src-dir=no --import-alias="@/*"
cd job-hunt

2. Install dependencies

npm install firebase @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities cmdk recharts

3. Set up Firebase

  1. Go to Firebase Console β†’ New project
  2. Enable Firestore (production mode)
  3. Enable Authentication β†’ Google + Email/Password
  4. Enable Storage
  5. Copy your web app config

4. Configure environment

cp .env.local.example .env.local
# Fill in your Firebase values

5. Deploy Firestore rules and indexes

npm install -g firebase-tools
firebase login
firebase init   # select Firestore, use existing project
firebase deploy --only firestore

6. Copy source files

Drop all files from this repo into your Next.js project maintaining the folder structure.

7. Run

npm run dev

Open http://localhost:3000.

Folder structure

job-hunt/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ (auth)/
β”‚   β”‚   β”œβ”€β”€ login/page.tsx
β”‚   β”‚   └── layout.tsx
β”‚   β”œβ”€β”€ (dashboard)/
β”‚   β”‚   β”œβ”€β”€ layout.tsx              ← sidebar + topbar shell
β”‚   β”‚   β”œβ”€β”€ page.tsx                ← dashboard overview
β”‚   β”‚   β”œβ”€β”€ jobs/
β”‚   β”‚   β”‚   β”œβ”€β”€ page.tsx            ← job list (table + kanban toggle)
β”‚   β”‚   β”‚   β”œβ”€β”€ [id]/page.tsx       ← job detail
β”‚   β”‚   β”‚   └── new/page.tsx        ← add job (URL or manual)
β”‚   β”‚   β”œβ”€β”€ contacts/page.tsx       ← people at companies
β”‚   β”‚   β”œβ”€β”€ stats/page.tsx          ← charts, funnel, heatmap
β”‚   β”‚   └── settings/page.tsx
β”‚   └── api/
β”‚       β”œβ”€β”€ scrape/route.ts         ← URL β†’ job metadata
β”‚       └── export/route.ts         ← CSV export
β”‚
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ jobs/
β”‚   β”‚   β”œβ”€β”€ JobCard.tsx
β”‚   β”‚   β”œβ”€β”€ JobTable.tsx
β”‚   β”‚   β”œβ”€β”€ KanbanBoard.tsx
β”‚   β”‚   β”œβ”€β”€ JobForm.tsx             ← manual entry + markdown editor
β”‚   β”‚   β”œβ”€β”€ StatusBadge.tsx
β”‚   β”‚   └── TagPill.tsx
β”‚   β”œβ”€β”€ ui/                         ← shadcn/ui components
β”‚   β”œβ”€β”€ layout/
β”‚   β”‚   β”œβ”€β”€ Sidebar.tsx
β”‚   β”‚   └── CommandPalette.tsx      ← Cmd+K search
β”‚   └── shared/
β”‚       β”œβ”€β”€ MarkdownEditor.tsx      ← for description field
β”‚       └── FilterBar.tsx
β”‚
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ firebase/
β”‚   β”‚   β”œβ”€β”€ config.ts
β”‚   β”‚   β”œβ”€β”€ jobs.ts                 ← CRUD operations
β”‚   β”‚   β”œβ”€β”€ contacts.ts
β”‚   β”‚   └── auth.ts
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”œβ”€β”€ useJobs.ts
β”‚   β”‚   β”œβ”€β”€ useSearch.ts
β”‚   β”‚   └── useFilters.ts
β”‚   └── utils/
β”‚       β”œβ”€β”€ scraper.ts
β”‚       └── formatters.ts
β”‚
β”œβ”€β”€ types/
β”‚   └── index.ts                    ← Job, Contact, Tag, Status types
β”‚
└── functions/                      ← Firebase Cloud Functions
    β”œβ”€β”€ src/
    β”‚   β”œβ”€β”€ scrapeJob.ts
    β”‚   └── sendReminder.ts
    └── package.json

Keyboard shortcuts

Shortcut Action
⌘K Open command palette
⌘N New job (wire up in layout)
Esc Close palette

CSV Export

Call POST /api/export with { jobs: Job[] } in the body. Returns a .csv file. Add an export button in the jobs page:

async function handleExport() {
  const res = await fetch("/api/export", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ jobs: allJobs }),
  });
  const blob = await res.blob();
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "jobs.csv";
  a.click();
}

Env variables

NEXT_PUBLIC_FIREBASE_API_KEY = your_api_key;
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN = your_auth_domain;
NEXT_PUBLIC_FIREBASE_PROJECT_ID = your_project_id;
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET = your_storage_bucket;
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID = your_messaging_sender_id;
NEXT_PUBLIC_FIREBASE_APP_ID = your_app_id;

About

vibing+coding this web App to help me track my job hunting πŸ₯²

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages