{"id":27902800,"url":"https://github.com/frau-azadeh/resume-app","last_synced_at":"2026-04-07T08:32:05.403Z","repository":{"id":291601741,"uuid":"978141244","full_name":"frau-azadeh/resume-app","owner":"frau-azadeh","description":"A modern Resume Builder Web Application developed for showcasing front-end  skills as part of an interview project .","archived":false,"fork":false,"pushed_at":"2025-09-20T13:47:41.000Z","size":951,"stargazers_count":17,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-20T14:51:28.785Z","etag":null,"topics":["prettier","react","react-hook-form","redux-persist","redux-toolkit","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"https://resume-app-three-mu.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frau-azadeh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-05T14:30:32.000Z","updated_at":"2025-09-20T13:47:45.000Z","dependencies_parsed_at":"2025-06-11T21:08:58.478Z","dependency_job_id":"91002cbe-3e9f-44ce-95de-841ad1fd1f24","html_url":"https://github.com/frau-azadeh/resume-app","commit_stats":null,"previous_names":["frau-azadeh/resume-app"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/frau-azadeh/resume-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frau-azadeh%2Fresume-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frau-azadeh%2Fresume-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frau-azadeh%2Fresume-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frau-azadeh%2Fresume-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frau-azadeh","download_url":"https://codeload.github.com/frau-azadeh/resume-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frau-azadeh%2Fresume-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31506562,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["prettier","react","react-hook-form","redux-persist","redux-toolkit","tailwindcss","typescript"],"created_at":"2025-05-05T21:38:27.838Z","updated_at":"2026-04-07T08:32:05.395Z","avatar_url":"https://github.com/frau-azadeh.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"📄 Resume App\nA sleek, production-ready Resume Builder \u0026 Application Tracking web app built with React + TypeScript, powered by Supabase (Postgres + Auth), Redux Toolkit, and Tailwind CSS.\nUsers 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.\n\nLive Demo: https://resume-app-swart.vercel.app/\n\nRepo: https://github.com/frau-azadeh/resume-app\n\n---\n\n## 🖼️ UI Preview\n\n![Personal Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/information.png)\n\n![Education Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/education.png)\n\n![Work Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/work.png)\n\n![Skill Information](https://raw.githubusercontent.com/frau-azadeh/resume-app/master/public/skill.png)\n\n[🔗 Live Demo](https://resume-app-swart.vercel.app/)\n\n[📂 GitHub Repo](https://github.com/frau-azadeh/resume-app)\n\n---\n\n## 🚀 Tech Stack\n\n- ⚛️ **React (TypeScript)** – Component-based UI development\n\n- 💨 **Tailwind CSS** – Utility-first styling framework\n\n- 🧩 **React Hook Form + Zod** – Form state management and schema validation\n\n- 🎯 Redux Toolkit + Redux Persist – Global state with local persistence\n\n- 🧼 **Prettier** – Code formatting and consistency\n\n- 🐘 Supabase – Postgres DB, Auth, (optional Storage)\n\n- 🧱 Headless UI \u0026 Lucide – Accessible components \u0026 icons\n\n---\n\n## ✨ Features\n\n✅ Multi-step Resume Wizard (Personal, Education, Work, Skills, …)\n\n✅ Typed forms with Zod validation and RHF\n\n✅ Auth with Supabase (email/password)\n\n✅ Candidate Panel: build resume, submit application, track status, download PDF\n\n✅ Admin Panel:\n\nView applications (search, filter, sort)\n\nApprove/Reject with a custom message\n\nDecision metadata (message, decided_at, decided_by)\n\nNice decision modal with suggested messages\n\n✅ Client-side join for last names (apps + personal info)\n\n✅ State persistence (Redux Persist)\n\n✅ RTL-friendly UI \u0026 responsive design\n\n---\n\n## 💻 Getting Started\n\n1.  Clone the repository:\n\n        git clone https://github.com/faru-azadeh/resume-app.git\n\n        cd resume-app\n\n2.  Install dependencies:\n\n        npm install\n\n3.  Start the development server:\n\n        npm run dev\n\n---\n\n📁 Project Structure\n\n```\nresume-app/\n│\n├── public/                          # Static files\n│   └── favicon.svg\n│\n├── src/                             # Main source folder\n│\n│   ├── assets/                      # Images, logos, icons\n│\n│   ├── components/                  # Reusable UI and domain components\n│   │   ├── admin/                   # Admin-specific components (from 2nd tree)\n│   │   │   ├── AdminDecisionModal.tsx\n│   │   │   ├── ApplicationsTable.tsx\n│   │   │   ├── FilterStatus.tsx\n│   │   │   ├── ResumeModal.tsx\n│   │   │   └── SearchBox.tsx\n│   │   ├── ui/                      # Shared UI widgets (from both trees)\n│   │   │   ├── Button.tsx\n│   │   │   ├── Input.tsx\n│   │   │   └── ...                  # (other UI components)\n│   │   └── skill/                   # Domain-specific (from 1st tree)\n│   │       ├── SkillForm.tsx\n│   │       ├── LanguageSkillForm.tsx\n│   │       ├── ManagementSkillForm.tsx\n│   │       ├── SkillList.tsx\n│   │       └── ResumeUpload.tsx\n│\n│   ├── hooks/                       # Custom hooks (from 2nd tree)\n│\n│   ├── lib/\n│   │   └── supabase.ts              # Supabase client (from 2nd tree)\n│\n│   ├── pages/                       # Route pages (merged)\n│   │   ├── PersonalInfo.tsx         # Candidate-side steps (from 1st tree)\n│   │   ├── Education.tsx            # Candidate-side steps (from 1st tree)\n│   │   ├── SkillInfo.tsx            # Candidate-side steps (from 1st tree)\n│   │   ├── Summary.tsx              # Candidate-side summary (from 1st tree)\n│   │   └── admin/                   # Admin panel pages (from 2nd tree)\n│   │       ├── Dashboard.tsx\n│   │       ├── EducationHistory.tsx\n│   │       ├── Footer.tsx\n│   │       ├── Login.tsx\n│   │       ├── PersonalInfo.tsx     # Admin-side personal info view\n│   │       ├── Signup.tsx\n│   │       ├── SkillInfo.tsx\n│   │       ├── Summary.tsx          # Candidate “status summary” page (admin view)\n│   │       └── WorkInfo.tsx\n│\n│   ├── routes/                      # Route configs (from 1st tree)\n│   │   └── AppRouter.tsx\n│\n│   ├── store/                       # Redux Toolkit + Persist (merged)\n│   │   ├── slices/\n│   │   │   ├── skillSlice.ts        # Example slice (from 1st tree)\n│   │   │   └── ...                  # Other slices (auth, resume, etc.)\n│   │   ├── persistConfig.ts         # Redux Persist setup (from 1st tree)\n│   │   └── store.ts                 # Store config (present in both → kept one path)\n│\n│   ├── styles/\n│   │   └── fonts.css                # From 2nd tree\n│\n│   ├── types/                       # Custom types (merged)\n│   │   ├── admin.ts                 # AppStatus, DecisionStatus, rows... (2nd tree)\n│   │   └── skill.d.ts               # Skill types (1st tree)\n│\n│   ├── utils/                       # Helper functions (from 1st tree)\n│   │   └── stars.ts                 # Example: renderStars helper\n│\n│   ├── validation/                  # Zod schemas (merged)\n│   │   ├── skillSchema.ts           # From 1st tree\n│   │   └── (other zod schemas)      # From 2nd tree\n│\n│   ├── App.tsx                      # Main app component\n│   ├── main.tsx                     # Entry point\n│   └── index.css                    # Tailwind base styles\n│\n├── .env                             # From 1st tree (legacy keys if used)\n├── .env.example                     # From 1st tree\n├── .env.local                       # From 2nd tree (Vite + Supabase envs)\n├── package.json                     # From 2nd tree\n├── postcss.config.js\n├── tailwind.config.js\n├── tsconfig.json\n├── vite.config.ts\n└── README.md\n\n```\n\n---\n\n## 🔐 Authentication \u0026 Roles\n\nSupabase Auth (email/password) is used for login/signup.\n\nAdmin 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.\n\nThe Admin panel is visible only to users that your app treats as admins (e.g., after checking role or a secure claim).\n\nTip: Create a profiles table keyed by auth.users.id and store role ('admin' | 'user'). Load it after login and gate routes/UI accordingly.\n\n---\n\n## 🗄️ Database (Supabase)\n\nMinimum required tables (simplified):\n\napplications\n\nid uuid pk default gen_random_uuid()\n\nuser_id uuid not null (FK to auth.users.id)\n\nstatus text not null ('pending' | 'approved' | 'rejected')\n\ndecision_message text null\n\ndecided_at timestamptz null\n\ndecided_by uuid null\n\ncreated_at timestamptz default now()\n\npersonal_infos\n\nuser_id uuid pk\n\nfirst_name text, last_name text, … (fields you already have)\n\neducations, work_infos, skill … (your current structure)\n\nIf you’re evolving an existing DB, this migration is handy:\n\n        alter table public.applications\n        add column if not exists decision_message text,\n        add column if not exists decided_at timestamptz,\n        add column if not exists decided_by uuid;\n\n        -- Optional: index for admin lists\n        create index if not exists idx_applications_created_at on public.applications (created_at desc);\n\n---\n\n## 📦 Local Persistence\n\nThis 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.\n\nRLS\nFor local dev you can keep RLS off. In production, enable RLS and add policies that:\n\nallow candidates to read/update their own records,\n\nallow admins to read all applications \u0026 personal infos.\n\n---\n\n## 🧪 Getting Started\n\n1.  Clone \u0026 Install\n\n         git clone https://github.com/frau-azadeh/resume-app.git\n         cd resume-app\n         npm install\n\n2.  Environment Variables\n\nCreate .env.local in the root:\n\n        VITE_SUPABASE_URL=https://YOUR-SUPABASE-PROJECT.supabase.co\n        VITE_SUPABASE_ANON_KEY=YOUR_PUBLIC_ANON_KEY\n\n3.  Run Dev\n\n         npm run dev\n\n4.  Build \u0026 Preview\n\n         npm run build\n         npm run preview\n\n---\n\n## 🔧 Notable Implementation Details\n\nClient-side join: the Admin list fetches applications and personal_infos (for last names) and merges client-side.\n\nDecision Modal: when approving/rejecting, admin can edit a message; message \u0026 timestamps are saved to applications.\n\nRedux Persist: preserves form steps and candidate data between reloads.\n\nRTL: fully RTL-compatible styles.\n\n---\n\n## 🧭 Roadmap\n\n⬜ File storage for resume uploads (Supabase Storage)\n\n⬜ Email notifications on decision\n\n⬜ Audit log for admin actions\n\n⬜ E2E tests (Playwright/Cypress)\n\n---\n\n## 🤝 Contributing\n\nContributions are warmly welcomed!\n\nFeel free to fork this repo, create a feature branch, and submit a pull request.\n\n---\n\n## 🌻Developed by\n\nAzadeh Sharifi Soltani\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrau-azadeh%2Fresume-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrau-azadeh%2Fresume-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrau-azadeh%2Fresume-app/lists"}