Skip to content

abdrahman-dev/TrackYourJob

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—     β–ˆβ–ˆβ•—
   β–ˆβ–ˆβ•”β•β•β•β•šβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β•     β–ˆβ–ˆβ•‘
   β–ˆβ–ˆβ•‘    β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•      β–ˆβ–ˆβ•‘
   β–ˆβ–ˆβ•‘     β•šβ–ˆβ–ˆβ•”β•  β–ˆβ–ˆ   β–ˆβ–ˆβ•‘
   β–ˆβ–ˆβ•‘      β–ˆβ–ˆβ•‘   β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•
   β•šβ•β•      β•šβ•β•    β•šβ•β•β•β•β•

Track Your Journey β€” Job Application Tracker

React 19 TypeScript Vite Framer Motion IndexedDB License MIT Docker Vercel

Track Your Journey is a modern offline-first job application tracker focused on privacy, local storage, productivity, and clean retro-inspired UI.


πŸš€ Features

  • Landing page β€” Full marketing landing with animated hero mockup, features grid, how-it-works steps, FAQ accordion, and CTA section
  • Dark pixel UI β€” Retro game-inspired design with JetBrains Mono and Space Mono fonts, sharp 0px border-radius throughout
  • Warm parchment light mode β€” Toggle between dark and light themes. Light mode uses a warm, muted, eye-friendly palette (never pure white). Persisted to localStorage
  • Canvas animated background β€” Subtle floating particle system rendered on HTML5 Canvas with requestAnimationFrame. Particles drift slowly and wrap around edges. Configurable intensity (normal/high) and reads the CSS --accent color dynamically
  • Mobile-responsive layout β€” Hamburger sidebar overlay on mobile, responsive grids, compact cards, adaptive typography. Fully usable on any screen size
  • Error boundaries β€” React Error Boundary wrapping the app with styled fallback UI and restart button
  • 404 Not Found page β€” Dedicated page with Space Mono heading, descriptive text, and return-to-dashboard button
  • Full CRUD job tracking β€” Log applications, update status, add notes and cover letters
  • CV manager β€” Upload PDF/DOCX files (max 10 MB), mark as general, download with one click
  • Cover letter tracking β€” Per-application toggle with text area for storing cover letter content
  • Status pipeline β€” Track through Saved β†’ Applied β†’ Interview β†’ Offer β†’ Rejected
  • Dashboard analytics β€” Six animated stat cards with icons, gradient backgrounds, hover effects + recent applications list
  • Search & filter β€” Full-text search by company/role/location, filter by status, sorted newest-first
  • Cancel on forms β€” Cancel button in JobForm discards changes and navigates back
  • Import/Export JSON β€” Full backup and restore with replace or merge mode. CV file data is base64-encoded
  • Toast notifications β€” Snappy, auto-dismissing (3s) feedback on all actions
  • Animated transitions β€” Framer Motion page transitions, staggered list animations, toast enter/exit
  • Auth system placeholder β€” Login and Register route stubs ready for backend integration
  • Pixel-style favicon β€” Custom SVG favicon matching the dark UI aesthetic
  • SEO optimized β€” Full Open Graph, Twitter Card, JSON-LD structured data, and canonical URL
  • Keyboard-friendly forms β€” Validation with red border errors on required fields
  • Docker support β€” One-command deploy via Docker Compose with Nginx

πŸ“¦ Tech Stack

Tool Purpose
React 19 UI framework
TypeScript 6 Type safety
Vite 8 Build tool and dev server
React Router v6 Client-side routing
idb IndexedDB wrapper for persistent storage
Framer Motion 11 Declarative animations
HTML5 Canvas Animated background particle system
Plain CSS Styling (no Tailwind, no UI libraries)
Docker / Nginx Production deployment

πŸ“ Project Structure

TrackYourJob/
β”œβ”€β”€ client/
β”‚   β”œβ”€β”€ public/
β”‚   β”‚   └── favicon.svg            # Pixel-style SVG favicon (dark bg, accent TYJ grid)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   β”œβ”€β”€ jobs.ts            # API stubs β€” wraps DB calls, swap to axios later
β”‚   β”‚   β”‚   └── cvs.ts             # API stubs for CV operations
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ AnimatedBackground.tsx  # Canvas particle system (35–45 dots, requestAnimationFrame)
β”‚   β”‚   β”‚   β”œβ”€β”€ EmptyState.tsx         # ASCII-art empty state with CTA button + subtitle
β”‚   β”‚   β”‚   β”œβ”€β”€ ErrorBoundary.tsx      # React Error Boundary with styled fallback UI
β”‚   β”‚   β”‚   β”œβ”€β”€ Sidebar.tsx            # Fixed 220px nav with pixel logo grid, active gradient
β”‚   β”‚   β”‚   β”œβ”€β”€ StatusBadge.tsx        # Colored status pill with light-mode CSS overrides
β”‚   β”‚   β”‚   β”œβ”€β”€ Toast.tsx              # Toast notification container with AnimatePresence
β”‚   β”‚   β”‚   └── Topbar.tsx             # Fixed top bar with title, theme toggle, + ADD JOB
β”‚   β”‚   β”œβ”€β”€ context/
β”‚   β”‚   β”‚   └── ThemeContext.tsx        # Light/dark theme provider + useTheme hook (localStorage)
β”‚   β”‚   β”œβ”€β”€ db/
β”‚   β”‚   β”‚   └── index.ts              # All IndexedDB operations via idb (jobs + cvs stores)
β”‚   β”‚   β”œβ”€β”€ features/
β”‚   β”‚   β”‚   β”œβ”€β”€ cvs/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CVCard.tsx         # CV display card with download/delete + stagger
β”‚   β”‚   β”‚   β”‚   └── CVManager.tsx      # Dropzone upload, label input, general toggle
β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Dashboard.tsx      # Stats grid with icons/gradients + recent apps list
β”‚   β”‚   β”‚   β”‚   └── StatCard.tsx       # Animated stat card with icon, hover effect
β”‚   β”‚   β”‚   └── jobs/
β”‚   β”‚   β”‚       β”œβ”€β”€ JobCard.tsx        # Job list item with stagger animation
β”‚   β”‚   β”‚       β”œβ”€β”€ JobDetail.tsx      # Job detail view wrapping JobForm in edit mode
β”‚   β”‚   β”‚       β”œβ”€β”€ JobForm.tsx        # Full create/edit form with validation + cancel
β”‚   β”‚   β”‚       └── JobList.tsx        # Search, filter by status, sort newest-first
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   β”œβ”€β”€ ToastContext.tsx       # Toast state context + provider
β”‚   β”‚   β”‚   β”œβ”€β”€ useCVs.ts             # CV data fetching with loading state
β”‚   β”‚   β”‚   β”œβ”€β”€ useJobs.ts            # Job data fetching (list + single) with loading state
β”‚   β”‚   β”‚   └── useToast.ts           # Toast consumption hook
β”‚   β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Login.tsx         # Login placeholder (coming soon)
β”‚   β”‚   β”‚   β”‚   └── Register.tsx      # Register placeholder (coming soon)
β”‚   β”‚   β”‚   β”œβ”€β”€ Landing.tsx           # Full landing page: hero, features, how-it-works, FAQ, footer
β”‚   β”‚   β”‚   β”œβ”€β”€ NotFound.tsx          # 404 page with "// PAGE NOT FOUND" heading
β”‚   β”‚   β”‚   └── Settings.tsx          # Import/export page with replace/merge
β”‚   β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”‚   └── index.tsx             # All route definitions with AnimatePresence
β”‚   β”‚   β”œβ”€β”€ styles/
β”‚   β”‚   β”‚   β”œβ”€β”€ components.css        # Badges, toasts, emptystate, settings, light-mode overrides
β”‚   β”‚   β”‚   β”œβ”€β”€ cvs.css               # CV upload dropzone, list, cards
β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard.css         # 3-col stat grid with icons, recent items
β”‚   β”‚   β”‚   β”œβ”€β”€ globals.css           # CSS reset + dark/light CSS variables + micro-interactions
β”‚   β”‚   β”‚   β”œβ”€β”€ jobs.css              # Job list, form fields, detail, cancel button
β”‚   β”‚   β”‚   β”œβ”€β”€ landing.css           # Landing page styles (navbar, hero, features, FAQ, footer)
β”‚   β”‚   β”‚   β”œβ”€β”€ sidebar.css           # Fixed 220px sidebar with pixel logo + active gradient
β”‚   β”‚   β”‚   └── topbar.css            # Fixed top bar with theme toggle button
β”‚   β”‚   β”œβ”€β”€ types/
β”‚   β”‚   β”‚   └── index.ts              # Job, CV, Stats, Toast, ImportMode types
β”‚   β”‚   β”œβ”€β”€ utils/
β”‚   β”‚   β”‚   β”œβ”€β”€ formatDate.ts         # ISO date to MM/DD/YYYY display
β”‚   β”‚   β”‚   β”œβ”€β”€ importExport.ts       # JSON export (base64 CVs) + import (replace/merge)
β”‚   β”‚   β”‚   └── statusColors.ts       # Status β†’ color mapping for dark mode inline styles
β”‚   β”‚   β”œβ”€β”€ App.tsx                   # Root layout: ThemeProvider β†’ AnimatedBackground + Sidebar + Topbar + Routes
β”‚   β”‚   └── main.tsx                  # Entry point, initDB with error fallback UI
β”‚   β”œβ”€β”€ index.html                    # SEO-optimized: OG tags, Twitter Card, JSON-LD, preconnect fonts
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ tsconfig.json
β”‚   └── vite.config.ts
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ nginx.conf
└── README.md

πŸ›  Getting Started

Prerequisites

  • Node.js 18+
  • npm 9+
  • Docker (optional, for containerized deployment)

Installation

cd client
npm install

Run Dev

cd client
npm run dev

Opens at http://localhost:5173.

Build

cd client
npm run build

Output goes to client/dist/.

Docker

docker compose up --build

Opens at http://localhost:3000 behind an Nginx reverse proxy.


πŸ“– Usage

Route Overview

Path Page
/ Landing Page
/app Dashboard
/app/jobs Job List
/app/jobs/new New Job
/app/jobs/:id Job Detail
/app/cvs CV Manager
/app/settings Settings
/login Login (stub)
/register Register (stub)
* 404 Not Found

Landing (/)

Full marketing page with animated hero mockup, features grid, how-it-works section, FAQ accordion, CTA, and footer. Includes theme toggle and smooth scroll navigation.

Dashboard (/app)

Six animated stat cards with icons and gradient backgrounds show your pipeline totals (Total, Applied, Interview, Offer, Rejected, Saved) with staggered Framer Motion entrance. Below, the five most recent applications are listed. Click any row to jump to the detail view, or "VIEW ALL β†’" to see the full list.

Jobs (/app/jobs)

Search by company, role, or location with the search input. Filter by status using the toggle buttons (ALL, APPLIED, INTERVIEW, OFFER, REJECTED, SAVED). Sort is always newest-first by creation date. Click any card to open the detail view. Use "+ ADD JOB" in the top bar to create a new entry.

Job Detail / New Job (/app/jobs/:id, /app/jobs/new)

Fill in company (*), role (*), location, job URL, date applied (*), status, and optional notes. Toggle "Cover letter used" to reveal a text area for pasting cover letter content. Select an uploaded CV from the dropdown. Required fields show red borders on validation failure. Use "βœ• CANCEL" to discard changes and navigate back. In edit mode, "DELETE JOB" removes the entry after a confirmation dialog.

CV Manager (/app/cvs)

Drag-and-drop or click to upload PDF/DOCX files (max 10 MB). Give each CV a label and optionally mark it as "General" β€” these get a highlighted left border. Download any CV with one click (blob URL is revoked after 100ms). General CVs are tagged with a "β˜… GENERAL" badge.

Settings (/app/settings)

Export: Downloads all jobs and CVs as a single JSON file (tyj-backup-YYYY-MM-DD.json). CV file data is base64-encoded.

Import: Upload a backup JSON file and choose between:

  • Replace β€” clears all existing data before importing
  • Merge β€” skips duplicates (same company+role for jobs, same label for CVs)

πŸ’Ύ Import / Export Format

The backup JSON follows this structure:

{
  "exported_at": "2026-05-09T12:00:00.000Z",
  "jobs": [
    {
      "company": "Acme Corp",
      "role": "Frontend Engineer",
      "location": "Remote",
      "job_url": "https://acme.com/careers/123",
      "date_applied": "2026-04-15T00:00:00.000Z",
      "status": "interview",
      "notes": "Had a great first round.",
      "cover_letter_used": true,
      "cover_letter_text": "Dear Acme...",
      "cv_id": 1,
      "created_at": "2026-04-15T10:30:00.000Z"
    }
  ],
  "cvs": [
    {
      "label": "Software Engineer Resume",
      "file_name": "resume.pdf",
      "file_data": "JVBERi0xLjcN...", // base64 encoded
      "file_type": "application/pdf",
      "is_general": false,
      "created_at": "2026-03-01T08:00:00.000Z"
    }
  ]
}

🐳 Docker

docker compose up --build

The app is served on port 3000 via Nginx. The Dockerfile uses a multi-stage build: Node for the Vite build, then Nginx alpine to serve the static assets.


πŸ—Ί Roadmap

  • Landing page with hero, features, FAQ, and CTA
  • Light/Dark mode toggle with localStorage persistence
  • Mobile-responsive layout with hamburger sidebar
  • Docker + Nginx production deployment
  • CI/CD via GitHub Actions
  • Import/Export JSON backup with replace/merge
  • Backend API (Node.js + Express)
  • Authentication (JWT)
  • Email reminders for follow-ups
  • PWA support (offline install)
  • Analytics dashboard with charts

πŸ“„ License

MIT Β© Abdrahman Walied

About

Offline-first job application tracker with React, TypeScript, IndexedDB, Docker, analytics dashboard, CV manager, import/export backups, and animated retro pixel UI.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Contributors