From f8edb53de46e05c15da03b3421b28c7113b379a9 Mon Sep 17 00:00:00 2001 From: okxlin Date: Wed, 29 Nov 2023 18:17:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0open=20resume=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8(=E6=84=9F=E8=B0=A2=E7=BD=91=E5=8F=8B?= =?UTF-8?q?=E5=8C=85=E5=AD=90=E5=8F=94=E7=9A=84=E6=8A=95=E7=A8=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/openresume/README.md | 71 ++++++++++++++++++++++ apps/openresume/data.yml | 20 ++++++ apps/openresume/latest/.env.sample | 2 + apps/openresume/latest/data.yml | 10 +++ apps/openresume/latest/docker-compose.yml | 16 +++++ apps/openresume/logo.png | Bin 0 -> 4355 bytes 6 files changed, 119 insertions(+) create mode 100644 apps/openresume/README.md create mode 100644 apps/openresume/data.yml create mode 100644 apps/openresume/latest/.env.sample create mode 100644 apps/openresume/latest/data.yml create mode 100644 apps/openresume/latest/docker-compose.yml create mode 100644 apps/openresume/logo.png diff --git a/apps/openresume/README.md b/apps/openresume/README.md new file mode 100644 index 00000000..e628e45a --- /dev/null +++ b/apps/openresume/README.md @@ -0,0 +1,71 @@ +# OpenResume + +OpenResume is a powerful open-source resume builder and resume parser. + +The goal of OpenResume is to provide everyone with free access to a modern professional resume design and enable anyone to apply for jobs with confidence. + +Official site: [https://open-resume.com](https://open-resume.com) + +## ⚒️ Resume Builder + +OpenResume's resume builder allows user to create a modern professional resume easily. + +![Resume Builder Demo](https://i.ibb.co/jzcrrt8/resume-builder-demo-optimize.gif) + +It has 5 Core Features: +|
**Feature**
| **Description** | +|---|---| +| **1. Real Time UI Update** | The resume PDF is updated in real time as you enter your resume information, so you can easily see the final output. | +| **2. Modern Professional Resume Design** | The resume PDF is a modern professional design that adheres to U.S. best practices and is ATS friendly to top ATS platforms such as Greenhouse and Lever. It automatically formats fonts, sizes, margins, bullet points to ensure consistency and avoid human errors. | +| **3. Privacy Focus** | The app only runs locally on your browser, meaning no sign up is required and no data ever leaves your browser, so it gives you peace of mind on your personal data. (Fun fact: Running only locally means the app still works even if you disconnect the internet.) | +| **4. Import From Existing Resume PDF** | If you already have an existing resume PDF, you have the option to import it directly, so you can update your resume design to a modern professional design in literally a few seconds. | +| **5. Successful Track Record** | OpenResume users have landed interviews and offers from top companies, such as Dropbox, Google, Meta to name a few. It has been proven to work and liken by recruiters and hiring managers. | + +## 🔍 Resume Parser + +OpenResume’s second component is the resume parser. For those who have an existing resume, the resume parser can help test and confirm its ATS readability. + +![Resume Parser Demo](https://i.ibb.co/JvSVwNk/resume-parser-demo-optimize.gif) + +You can learn more about the resume parser algorithm in the ["Resume Parser Algorithm Deep Dive" section](https://open-resume.com/resume-parser). + +## 📚 Tech Stack + +|
**Category**
|
**Choice**
| **Descriptions** | +|---|---|---| +| **Language** | [TypeScript](https://github.com/microsoft/TypeScript) | TypeScript is JavaScript with static type checking and helps catch many silly bugs at code time. | +| **UI Library** | [React](https://github.com/facebook/react) | React’s declarative syntax and component-based architecture make it simple to develop reactive reusable components. | +| **State Management** | [Redux Toolkit](https://github.com/reduxjs/redux-toolkit) | Redux toolkit reduces the boilerplate to set up and update a central redux store, which is used in managing the complex resume state. | +| **CSS Framework** | [Tailwind CSS](https://github.com/tailwindlabs/tailwindcss) | Tailwind speeds up development by providing helpful css utilities and removing the need to context switch between tsx and css files. | +| **Web Framework** | [NextJS 13](https://github.com/vercel/next.js) | Next.js supports static site generation and helps build efficient React webpages that support SEO. | +| **PDF Reader** | [PDF.js](https://github.com/mozilla/pdf.js) | PDF.js reads content from PDF files and is used by the resume parser at its first step to read a resume PDF’s content. | +| **PDF Renderer** | [React-pdf](https://github.com/diegomura/react-pdf) | React-pdf creates PDF files and is used by the resume builder to create a downloadable PDF file. | + +## 📁 Project Structure + +OpenResume is created with the NextJS web framework and follows its project structure. The source code can be found in `src/app`. There are a total of 4 page routes as shown in the table below. (Code path is relative to `src/app`) + +|
**Page Route**
| **Code Path** | **Description** | +|---|---|---| +| / | /page.tsx | Home page that contains hero, auto typing resume, steps, testimonials, logo cloud, etc | +| /resume-import | /resume-import/page.tsx | Resume import page, where you can choose to import data from an existing resume PDF. The main component used is `ResumeDropzone` (`/components/ResumeDropzone.tsx`) | +| /resume-builder | /resume-builder/page.tsx | Resume builder page to build and download a resume PDF. The main components used are `ResumeForm` (`/components/ResumeForm`) and `Resume` (`/components/Resume`) | +| /resume-parser | /resume-parser/page.tsx | Resume parser page to test a resume’s AST readability. The main library util used is `parseResumeFromPdf` (`/lib/parse-resume-from-pdf`) | + +## 💻 Local Development + +### Method 1: npm + +1. Download the repo `git clone https://github.com/xitanggg/open-resume.git` +2. Change the directory `cd open-resume` +3. Install the dependency `npm install` +4. Start a development server `npm run dev` +5. Open your browser and visit [http://localhost:3000](http://localhost:3000) to see OpenResume live + +### Method 2: Docker + +1. Download the repo `git clone https://github.com/xitanggg/open-resume.git` +2. Change the directory `cd open-resume` +3. Build the container `docker build -t open-resume .` +4. Start the container `docker run -p 3000:3000 open-resume` +5. Open your browser and visit [http://localhost:3000](http://localhost:3000) to see OpenResume live \ No newline at end of file diff --git a/apps/openresume/data.yml b/apps/openresume/data.yml new file mode 100644 index 00000000..5065bbdf --- /dev/null +++ b/apps/openresume/data.yml @@ -0,0 +1,20 @@ +name: OpenResume +tags: + - 工具 +title: 一个功能强大的开源简历生成器和简历解析器 +type: 工具 +description: 一个功能强大的开源简历生成器和简历解析器 +additionalProperties: + key: openresume + name: OpenResume + tags: + - Tool + shortDescZh: 一个功能强大的开源简历生成器和简历解析器 + shortDescEn: A powerful open-source resume builder and resume parser + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://www.open-resume.com + github: https://github.com/xitanggg/open-resume + document: https://github.com/xitanggg/open-resume diff --git a/apps/openresume/latest/.env.sample b/apps/openresume/latest/.env.sample new file mode 100644 index 00000000..48254f63 --- /dev/null +++ b/apps/openresume/latest/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="openresume" +PANEL_APP_PORT_HTTP="40179" \ No newline at end of file diff --git a/apps/openresume/latest/data.yml b/apps/openresume/latest/data.yml new file mode 100644 index 00000000..a84a2527 --- /dev/null +++ b/apps/openresume/latest/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40179 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number \ No newline at end of file diff --git a/apps/openresume/latest/docker-compose.yml b/apps/openresume/latest/docker-compose.yml new file mode 100644 index 00000000..171cd098 --- /dev/null +++ b/apps/openresume/latest/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + openresume: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3000" + image: peppershade/open-resume:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/openresume/logo.png b/apps/openresume/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..521b42b86a71c267ac16061cc2e351333f6ef4b5 GIT binary patch literal 4355 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 TpWJ;{17v6IWYu{2`d|MCtiol+ literal 0 HcmV?d00001