{"id":29169105,"url":"https://github.com/stormdotcom/cv-sorter-ui","last_synced_at":"2025-07-20T09:36:47.558Z","repository":{"id":298446712,"uuid":"999667370","full_name":"stormdotcom/cv-sorter-ui","owner":"stormdotcom","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-18T17:59:19.000Z","size":386,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-01T11:09:33.466Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cv-sorter.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stormdotcom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-10T15:47:29.000Z","updated_at":"2025-06-27T20:32:50.000Z","dependencies_parsed_at":"2025-07-01T11:09:35.819Z","dependency_job_id":"2ad99d54-f670-4521-a1ba-e7eb3d2c08ac","html_url":"https://github.com/stormdotcom/cv-sorter-ui","commit_stats":null,"previous_names":["stormdotcom/cv-sorter-ui"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/stormdotcom/cv-sorter-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stormdotcom%2Fcv-sorter-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stormdotcom%2Fcv-sorter-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stormdotcom%2Fcv-sorter-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stormdotcom%2Fcv-sorter-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stormdotcom","download_url":"https://codeload.github.com/stormdotcom/cv-sorter-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stormdotcom%2Fcv-sorter-ui/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266101396,"owners_count":23876779,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2025-07-01T11:09:32.091Z","updated_at":"2025-07-20T09:36:47.497Z","avatar_url":"https://github.com/stormdotcom.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CvSorter\n\nA fullstack CV sorting and job matching platform using Node.js, Express, PostgreSQL, React, and OpenAI.\n\n## Project Structure\n- **Backend:** Node.js, Express, PostgreSQL (MVC + Repository pattern)\n- **Frontend:** React (see `client/`)\n- **Shared Types:** Zod/Drizzle schemas in `shared/`\n\n---\n\n## Database Schema (Main Entities)\n\n### User\n| Field      | Type      | Description           |\n|----------- |---------- |----------------------|\n| id         | integer   | Primary key          |\n| username   | string    | Unique, required     |\n| password   | string    | Hashed, required     |\n| isAdmin    | boolean   | Admin flag           |\n| name       | string    | Optional             |\n| email      | string    | Optional             |\n| createdAt  | timestamp | Auto, default now    |\n\n### Candidate\n| Field           | Type            | Description                |\n|---------------- |---------------- |---------------------------|\n| id              | integer         | Primary key                |\n| name            | string          | Required                   |\n| email           | string          | Optional                   |\n| phone           | string          | Optional                   |\n| position        | string          | Optional                   |\n| experience      | string          | Optional                   |\n| skills          | string[]        | Array of skills            |\n| education       | Education[]     | Array of education objects |\n| workHistory     | WorkExperience[]| Array of work objects      |\n| resumeText      | string          | Raw text                   |\n| originalFileName| string          | Original file name         |\n| matchScore      | integer         | Calculated match score     |\n| createdAt       | timestamp       | Auto, default now          |\n| userId          | integer         | FK to users                |\n\n#### Education\n| Field      | Type    |\n|------------|---------|\n| degree     | string  |\n| institution| string  |\n| period     | string  |\n\n#### WorkExperience\n| Field      | Type    |\n|------------|---------|\n| title      | string  |\n| company    | string  |\n| period     | string  |\n| description| string  |\n| skills     | string[]|\n\n### Job Description\n| Field               | Type      |\n|-------------------- |----------|\n| id                  | integer  |\n| title               | string   |\n| department          | string   |\n| location            | string   |\n| employmentType      | string   |\n| description         | string   |\n| responsibilities    | string[] |\n| requirements        | string[] |\n| requiredSkills      | string[] |\n| preferredSkills     | string[] |\n| minimumExperience   | integer  |\n| preferredExperience | integer  |\n| educationRequirements| string[]|\n| active              | boolean  |\n| createdAt           | timestamp|\n\n### Candidate Assessment\n| Field              | Type      |\n|------------------- |----------|\n| id                 | integer  |\n| candidateId        | integer  |\n| jobDescriptionId   | integer  |\n| overallScore       | integer  |\n| skillsMatchScore   | integer  |\n| experienceMatchScore| integer |\n| educationMatchScore| integer  |\n| keyStrengths       | string[] |\n| developmentAreas   | string[] |\n| insights           | string   |\n| rank               | integer  |\n| assessmentDate     | timestamp|\n\n### BlogPost\n| Field        | Type      |\n|------------- |----------|\n| id           | integer  |\n| title        | string   |\n| slug         | string   |\n| content      | string   |\n| summary      | string   |\n| imageUrl     | string   |\n| authorId     | integer  |\n| authorName   | string   |\n| tags         | string[] |\n| published    | boolean  |\n| publishedAt  | timestamp|\n| createdAt    | timestamp|\n| updatedAt    | timestamp|\n\n---\n\n## API Routes\n\n### Auth\n| Method | Endpoint         | Description         |\n|--------|------------------|--------------------|\n| POST   | /api/register    | Register user      |\n| POST   | /api/login       | Login user         |\n| POST   | /api/logout      | Logout user        |\n| GET    | /api/user        | Get current user   |\n\n### Candidates (all require authentication)\n| Method | Endpoint              | Description                |\n|--------|-----------------------|---------------------------|\n| GET    | /api/candidates       | List all candidates       |\n| GET    | /api/candidates/:id   | Get candidate by ID       |\n| POST   | /api/candidates       | Create new candidate      |\n| PUT    | /api/candidates/:id   | Update candidate by ID    |\n| DELETE | /api/candidates/:id   | Delete candidate by ID    |\n\n### Job Descriptions (all require authentication)\n| Method | Endpoint                        | Description                        |\n|--------|----------------------------------|------------------------------------|\n| GET    | /api/job-descriptions           | List/search job descriptions       |\n| POST   | /api/job-descriptions           | Create new job description         |\n| GET    | /api/job-descriptions/:id       | Get job description by ID          |\n| PATCH  | /api/job-descriptions/:id       | Update job description by ID       |\n\n---\n\n## Notes\n- All endpoints return JSON.\n- Auth endpoints do not require authentication; all others do.\n- See `shared/schema.ts` for full Zod/TypeScript types.\n- Follows MVC and repository pattern for backend structure.\n\n---\n\n## Getting Started\n1. Install dependencies: `npm install`\n2. Configure your `.env` for PostgreSQL and OpenAI\n3. Start the backend: `npm run dev` (or `npm start`)\n4. Start the frontend: `cd client \u0026\u0026 npm install \u0026\u0026 npm run dev`\n\n---\n\n## License\nMIT \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstormdotcom%2Fcv-sorter-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstormdotcom%2Fcv-sorter-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstormdotcom%2Fcv-sorter-ui/lists"}