An open API service indexing awesome lists of open source software.

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 .

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

![Personal Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/information.png)

![Education Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/education.png)

![Work Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/work.png)

![Skill Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/skill.png)

[πŸ”— 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