https://github.com/frau-azadeh/resume-app
A modern Resume Builder Web Application developed for showcasing front-end skills as part of an interview project .
https://github.com/frau-azadeh/resume-app
prettier react react-hook-form redux-persist redux-toolkit tailwindcss typescript
Last synced: about 2 months ago
JSON representation
A modern Resume Builder Web Application developed for showcasing front-end skills as part of an interview project .
- Host: GitHub
- URL: https://github.com/frau-azadeh/resume-app
- Owner: frau-azadeh
- License: mit
- Created: 2025-05-05T14:30:32.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-09-20T13:47:41.000Z (8 months ago)
- Last Synced: 2025-09-20T14:51:28.785Z (8 months ago)
- Topics: prettier, react, react-hook-form, redux-persist, redux-toolkit, tailwindcss, typescript
- Language: TypeScript
- Homepage: https://resume-app-three-mu.vercel.app
- Size: 929 KB
- Stars: 17
- Watchers: 2
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
π Resume App
A sleek, production-ready Resume Builder & Application Tracking web app built with React + TypeScript, powered by Supabase (Postgres + Auth), Redux Toolkit, and Tailwind CSS.
Users can create a resume via a multi-step wizard, submit an application, track status, and download a PDF. Admins can review applications, approve/reject with a message, and manage decisions from a dedicated panel.
Live Demo: https://resume-app-swart.vercel.app/
Repo: https://github.com/frau-azadeh/resume-app
---
## πΌοΈ UI Preview




[π Live Demo](https://resume-app-swart.vercel.app/)
[π GitHub Repo](https://github.com/frau-azadeh/resume-app)
---
## π Tech Stack
- βοΈ **React (TypeScript)** β Component-based UI development
- π¨ **Tailwind CSS** β Utility-first styling framework
- π§© **React Hook Form + Zod** β Form state management and schema validation
- π― Redux Toolkit + Redux Persist β Global state with local persistence
- π§Ό **Prettier** β Code formatting and consistency
- π Supabase β Postgres DB, Auth, (optional Storage)
- π§± Headless UI & Lucide β Accessible components & icons
---
## β¨ Features
β
Multi-step Resume Wizard (Personal, Education, Work, Skills, β¦)
β
Typed forms with Zod validation and RHF
β
Auth with Supabase (email/password)
β
Candidate Panel: build resume, submit application, track status, download PDF
β
Admin Panel:
View applications (search, filter, sort)
Approve/Reject with a custom message
Decision metadata (message, decided_at, decided_by)
Nice decision modal with suggested messages
β
Client-side join for last names (apps + personal info)
β
State persistence (Redux Persist)
β
RTL-friendly UI & responsive design
---
## π» Getting Started
1. Clone the repository:
git clone https://github.com/faru-azadeh/resume-app.git
cd resume-app
2. Install dependencies:
npm install
3. Start the development server:
npm run dev
---
π Project Structure
```
resume-app/
β
βββ public/ # Static files
β βββ favicon.svg
β
βββ src/ # Main source folder
β
β βββ assets/ # Images, logos, icons
β
β βββ components/ # Reusable UI and domain components
β β βββ admin/ # Admin-specific components (from 2nd tree)
β β β βββ AdminDecisionModal.tsx
β β β βββ ApplicationsTable.tsx
β β β βββ FilterStatus.tsx
β β β βββ ResumeModal.tsx
β β β βββ SearchBox.tsx
β β βββ ui/ # Shared UI widgets (from both trees)
β β β βββ Button.tsx
β β β βββ Input.tsx
β β β βββ ... # (other UI components)
β β βββ skill/ # Domain-specific (from 1st tree)
β β βββ SkillForm.tsx
β β βββ LanguageSkillForm.tsx
β β βββ ManagementSkillForm.tsx
β β βββ SkillList.tsx
β β βββ ResumeUpload.tsx
β
β βββ hooks/ # Custom hooks (from 2nd tree)
β
β βββ lib/
β β βββ supabase.ts # Supabase client (from 2nd tree)
β
β βββ pages/ # Route pages (merged)
β β βββ PersonalInfo.tsx # Candidate-side steps (from 1st tree)
β β βββ Education.tsx # Candidate-side steps (from 1st tree)
β β βββ SkillInfo.tsx # Candidate-side steps (from 1st tree)
β β βββ Summary.tsx # Candidate-side summary (from 1st tree)
β β βββ admin/ # Admin panel pages (from 2nd tree)
β β βββ Dashboard.tsx
β β βββ EducationHistory.tsx
β β βββ Footer.tsx
β β βββ Login.tsx
β β βββ PersonalInfo.tsx # Admin-side personal info view
β β βββ Signup.tsx
β β βββ SkillInfo.tsx
β β βββ Summary.tsx # Candidate βstatus summaryβ page (admin view)
β β βββ WorkInfo.tsx
β
β βββ routes/ # Route configs (from 1st tree)
β β βββ AppRouter.tsx
β
β βββ store/ # Redux Toolkit + Persist (merged)
β β βββ slices/
β β β βββ skillSlice.ts # Example slice (from 1st tree)
β β β βββ ... # Other slices (auth, resume, etc.)
β β βββ persistConfig.ts # Redux Persist setup (from 1st tree)
β β βββ store.ts # Store config (present in both β kept one path)
β
β βββ styles/
β β βββ fonts.css # From 2nd tree
β
β βββ types/ # Custom types (merged)
β β βββ admin.ts # AppStatus, DecisionStatus, rows... (2nd tree)
β β βββ skill.d.ts # Skill types (1st tree)
β
β βββ utils/ # Helper functions (from 1st tree)
β β βββ stars.ts # Example: renderStars helper
β
β βββ validation/ # Zod schemas (merged)
β β βββ skillSchema.ts # From 1st tree
β β βββ (other zod schemas) # From 2nd tree
β
β βββ App.tsx # Main app component
β βββ main.tsx # Entry point
β βββ index.css # Tailwind base styles
β
βββ .env # From 1st tree (legacy keys if used)
βββ .env.example # From 1st tree
βββ .env.local # From 2nd tree (Vite + Supabase envs)
βββ package.json # From 2nd tree
βββ postcss.config.js
βββ tailwind.config.js
βββ tsconfig.json
βββ vite.config.ts
βββ README.md
```
---
## π Authentication & Roles
Supabase Auth (email/password) is used for login/signup.
Admin capability is typically controlled via a profile record (e.g., profiles.role IN ('admin','user')) or by granting the admin user ID in your database.
The Admin panel is visible only to users that your app treats as admins (e.g., after checking role or a secure claim).
Tip: Create a profiles table keyed by auth.users.id and store role ('admin' | 'user'). Load it after login and gate routes/UI accordingly.
---
## ποΈ Database (Supabase)
Minimum required tables (simplified):
applications
id uuid pk default gen_random_uuid()
user_id uuid not null (FK to auth.users.id)
status text not null ('pending' | 'approved' | 'rejected')
decision_message text null
decided_at timestamptz null
decided_by uuid null
created_at timestamptz default now()
personal_infos
user_id uuid pk
first_name text, last_name text, β¦ (fields you already have)
educations, work_infos, skill β¦ (your current structure)
If youβre evolving an existing DB, this migration is handy:
alter table public.applications
add column if not exists decision_message text,
add column if not exists decided_at timestamptz,
add column if not exists decided_by uuid;
-- Optional: index for admin lists
create index if not exists idx_applications_created_at on public.applications (created_at desc);
---
## π¦ Local Persistence
This project uses Redux Persist to store the application state in localStorage. This ensures that user inputs are saved even after page refreshes or browser restarts, enhancing the user experience significantly.
RLS
For local dev you can keep RLS off. In production, enable RLS and add policies that:
allow candidates to read/update their own records,
allow admins to read all applications & personal infos.
---
## π§ͺ Getting Started
1. Clone & Install
git clone https://github.com/frau-azadeh/resume-app.git
cd resume-app
npm install
2. Environment Variables
Create .env.local in the root:
VITE_SUPABASE_URL=https://YOUR-SUPABASE-PROJECT.supabase.co
VITE_SUPABASE_ANON_KEY=YOUR_PUBLIC_ANON_KEY
3. Run Dev
npm run dev
4. Build & Preview
npm run build
npm run preview
---
## π§ Notable Implementation Details
Client-side join: the Admin list fetches applications and personal_infos (for last names) and merges client-side.
Decision Modal: when approving/rejecting, admin can edit a message; message & timestamps are saved to applications.
Redux Persist: preserves form steps and candidate data between reloads.
RTL: fully RTL-compatible styles.
---
## π§ Roadmap
β¬ File storage for resume uploads (Supabase Storage)
β¬ Email notifications on decision
β¬ Audit log for admin actions
β¬ E2E tests (Playwright/Cypress)
---
## π€ Contributing
Contributions are warmly welcomed!
Feel free to fork this repo, create a feature branch, and submit a pull request.
---
## π»Developed by
Azadeh Sharifi Soltani