ββββββββββββ βββ βββ
ββββββββββ ββββ βββ
βββ βββββββ βββ
βββ βββββ ββ βββ
βββ βββ ββββββββ
βββ βββ ββββββ
Track Your Journey β Job Application Tracker
Track Your Journey is a modern offline-first job application tracker focused on privacy, local storage, productivity, and clean retro-inspired UI.
- 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
--accentcolor 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
| 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 |
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
- Node.js 18+
- npm 9+
- Docker (optional, for containerized deployment)
cd client
npm installcd client
npm run devOpens at http://localhost:5173.
cd client
npm run buildOutput goes to client/dist/.
docker compose up --buildOpens at http://localhost:3000 behind an Nginx reverse proxy.
| 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 |
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.
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.
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.
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.
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.
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)
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 compose up --buildThe 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.
- 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
MIT Β© Abdrahman Walied