Git Product home page Git Product logo

cv's Introduction

Last commit License


cv

My JSONResume based CV and generation with resumed with interchangeable themes and support for multiple languages.

View CV · Report Bug · Request Feature

Table of Contents

About The Project

This project contains my CV application based on JSONResume. Furthermore, variants of the CV are generated automatically as .html (using resumed) and .pdf (using puppeteer). Tons of themes are supported. Custom build scripts allow generation for multiple languages (which is a missing feature in JSONSchema itself). Deployment is automated using GitHub Actions to GitHub Pages.

You can use this repository as a starting point and inspiration to write your own CV with JSONResume.

Notice: However, please provide your own json files and do not reuse my files without modification as those contain personal information as described in the LICENSE.

Features

  • Auto-generated HTML content for the CV based on JSONResume and resumed
  • Auto-generated PDF content for the CV based on puppeteer
  • Support for thousands of themes and custom ones
  • Vue-based Single Page Application (SPA) for dynamically viewing the CV
  • Easily extensible Multi-language support
  • Dark mode support
  • Progressive Web App Support (App installation, Offline usage)
  • PWA installation notification (Chromium-based browsers only)
  • Accessibility tested

Built With

This project is built as a monorepo. Currently, it only contains the following packages

  • cv-content: Generation for multiple static html files using JSONSchema and resumed
  • cv-wrapper: Vue based SPA used as entrypoint to dynamically serve cv-content and provide additional features

The following lists contain the important technologies used to implement this application.

cv-content:

cv-wrapper:

  • Vue (JavaScript framework used to implement the application)
  • vue-i18n (Internationalization support for Vue)
  • PrimeVue (UI components library)
  • PrimeIcons (Icon set used for PrimeVue)
  • PrimeFlex (CSS utility library)
  • Pinia (State management solution for Vue)
  • VueUse (Collection of useful Vue Composition API helpers)
  • flag-icons (Predefined flag icons based on ISO standard)

Getting Started

To get a local copy up and running, follow these simple steps.

Prerequisites

This project requires Node.js to run. It uses bun to manage dependencies. You need to have both tools installed.

Info: If you want to use npm as alternative to bun, just replace all commands in this guide with npm instead of bun.

Installation

  1. Clone the repository
git clone https://github.com/devtobi/cv.git
  1. Install dependencies
bun install
  1. Optional: Install puppeteer Chrome browser on your machine (only required .pdf generation)
bun run prepare

Usage

To get started using this repository, you need to edit the .json files inside the data directory for your own CV.

Tip: Each file represents the data for generation a CV in a specific language. You can create as many .json files as you want. The build tools will automatically handle them. Keep in mind that the filename is used as a path inside the generated assets for web deployment.

Example: es.json will generate a file index.html under the es directory and thus be served under /es/index.html.

Local Usage

Info: Please note your .json files need to be written in JSONResume schema. You can use bun run format to format your files and bun run validate to check if your edits are valid, according to JSONResume.

If you want to build your CV locally, you need to install a theme onto your system, as this repository does not come with one by default. Themes are published as npm packages in the format jsonresume-theme-*. Take a look at the available themes here.

Install your desired theme as development dependency using bun install -D jsonresume-theme-* (or npm install -D jsonresume-theme-*). Then set your theme by exporting an environment variable named THEME to the name of your theme (e.g. export THEME=jsonresume-theme-basic).

Info: Keep in note the commands for exporting environment variables might differ depending on your operating system.

To build the whole monorepo use the command bun run build. The command builds an .html version and a .pdf version and places those files into specific subdirectories for each language your CV was written in. On top of that, it builds the Vue based wrapper application. In the end both build folders are combined into a single dist folder. This folder can be served as is.

Usage with GitHub actions

This repository provides custom workflows to validate or build and deploy your CV. You can find the workflows under .github/workflows.

The validation will run on every push to any branch. Build and deployment can only be triggered on your main branch via a manual trigger through the GitHub Actions GUI.

The workflows use a custom action to set up required tooling for running inside CI/CD environments. It uses caching to speed up execution time when no changes inside bun.lockb were found.

Info: As you will not change any dependencies as a normal user of this repository, you will greatly benefit from the caching mechanism.

You can set run options via the GUI for the workflow execution like:

  • theme: Theme to use for building website and/or PDF document (jsonresume-theme-<theme>), required
  • deploy: Whether to deploy the website or not, default false
  • node-version: NodeJS version to use, default is lts/*
  • bun-version: Bun version to use, default is latest
  • chrome-version: Chrome version to use, default is stable

Note: To deploy as GitHub Pages, you need to have it correctly configured and enabled. See GitHub documentation for more information.

Authors

License

Distributed under a customized MIT License. See LICENSE for more information.

Important: The files contained in the data directory include personal data. Permission to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of these specific files is granted on the condition that users must replace the personal data with their own. The files in the data directory must not be used as is without modification using their own personal data.

cv's People

Contributors

devtobi avatar renovate[bot] avatar dependabot[bot] avatar

Watchers

 avatar

cv's Issues

Add installation notice when compatible with PWA

A custom notification should appear when the environment of the user is capable of running the app as PWA.
This popup should only appear once and if dismissed the option to install should be placed inside the app information.

Renovatebot Intervall ändern

Der Renovatebot soll nur noch einmal pro Woche prüfen, da zu viele Merge Requests ankommen.
ggf. gibt es hier bereits ein vorgefertigtes Template.
Andernfalls kann über eine eigene Konfigurationsoption ein "Schedule" konfiguriert werden.

Siehe https://docs.renovatebot.com/presets-schedule/

Es ist darauf zu achten, dass die Presets nicht kollidieren.

Add notifications via ToastService

PrimeVue provides a ToastService which can be used throughout the application.
This feature should be setup and used for implementing features like downloading the pdf version, changing locale or dark mode

Add language selection feature to navigation bar

A menu dropdown should be implemented in the menubar, that allows for selection of a language. A appropriate icon should be added.

The dropdown should use ISO codes internally, to use the browser API and convert it to the name of the language.

After selection of the language, this should be stored inside a data structure of the app.

Reset preferences functionality

A functionality to reset the user preferences stored in localStorage should be implemented.
A custom component using a Button can be used here.
The button should prompt the user with a confirm dialog.
After the reset a toast message should be displayed informing that the reset took place.

Behebungen für Caching

Aktuell gibt es ein paar Probleme mit dem Caching durch den Service-Worker:

  1. Rufe ich beispielsweise /de auf, so wird weiterhin die Vue-Applikation angezeigt, obwohl eigentlich nur der Content angezeigt werden sollte
  2. Die Contents sollen gecached werden
  3. Verwendete Icons sollen korrekt gecached werden

Add ScrollToTop component

When scrolling down on the page, a component to scroll back to the top should appear as floating action button at the bottom right of the screen.
The appear / disappear should be animated if possible.
PrimeVue provides a predefined component for this purpose that can be further optimized.

Refactor build process

Current build process should be simplified by:

  • Always built with .pdf files included in dist (fewer custom npm scripts needed)
  • Create post build job that copies dist folder to root of mono repo using (cpx)
  • Update CI/CD to respect new changes

Dark mode feature

A dark mode toggle component should be implemented that switches the appearance of the application.

Optionally the app syncs with the mode the OS / Browser uses.

Saving user preferences

localStorage should be used to store the users desired preferences for the app (like language, dark mode).

of not selected yet a default value should be used (english, light mode)

VueUse provides useful helpers for working with localStorage.

Add linting as a CI/CD step

Add the lint-script (which lints both workspace packages) to the pipeline (on every push).
This should happen after the validate step.

The reason is normal users only change the data directory frequently and thus this is the step that could break in practice.

Support for multiple languages

I want to add support to build for multiple languages with multiple .json files.
Since resumed only allows building with single files, the tool has to be called multiple times and .html files must be generated in separate directories.

Build can be parallelized by using the tool concurrently

Fix menubar UI

There are some strange UI bugs with the menubar:

  • The link button have a padding when hovering
  • The avatar and elements are not vertically centered in the menubar
  • The mobile view of the menubar is broken

Add metadata for dependencies

The app should display the dependencies used in production (optional also in development)
A list might be suitable.
Displaying it via a popup when hitting a info button might be appropriate

CV-Content Component

A component should be implemented, which displays the CV content dynamically depending on the current selected language.
A easy win could be to use iframes, however Web Components might be a more robust and modern solution.

Move from "pnpm" to "bun"

I want to switch to "bun" as a new package manager instead of "pnpm".

Things that need to be done:

  • Change lockfile
  • Switch monorepo workspace to bun
  • Update CI/CD
  • Remove Dependabot

Fix problem with dependencies

For some reason dependencies are also listed inside the package.json files of the workspaces, this should be fixed.
On top of that, the theme was accidentially committed and should be removed from dependencies.

PDF download functionality

A button component that downloads the PDF version of the CV (respecting the current selected language) should be implemented.
A appropriate icon should be added.

Change Renovatebot to monthly checks

Description

Due to lots of changes in the dependencies, I only want to manage dependency updates once a month and thus the schedule needs to be changed from weekly to monthly.

Move deprecated eslintrc plugin configs to flat config

To move to ESLint flat config the following dependencies need to support this feature:

  • eslint:recommended -> @eslint/js
  • plugin:vue/vue3-essential -> eslint-plugin-vue
  • @vue/eslint-config-typescript -> WAITING FOR SUPPORT (see vuejs/eslint-config-typescript#72)
  • @vue/eslint-config-prettier/skip-formatting -> WAITING FOR SUPPORT (see vuejs/eslint-config-prettier#19)
  • plugin:@intlify/vue-i18n/recommended -> @intlify/eslint-plugin-vue-i18n

With the new flat config syntax rushstack/eslint-patch can be removed. ;)

Responsiveness-Bug

Beim Ändern der Sprache auf dem Mobilgerät gibt es Probleme mit der Breite.
Problem ist, dass der Inhalt der WebComponent breiter als der App-Container ist, der Overflow aber weiterhin angezeigt wird.
Der App-Container sollte so modifiziert werden, dass dessen minimale Breite der Breite von der WebComponent entspricht.

Refactor to use pnpm workspaces

Since I want to add another package as a wrapper application (see #4) the repo must be refactored as a mono repo using ppm workspaces feature.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Pending Approval

These branches will be created by Renovate only once you click their checkbox below.

  • chore(deps): update dependency puppeteer to v23
  • fix(deps): update dependency @vueuse/core to v11
  • fix(deps): update dependency primevue to v4
  • 🔐 Create all pending approval PRs at once 🔐

Awaiting Schedule

These updates are awaiting their schedule. Click on a checkbox to get an update now.

  • chore(deps): update dependency unplugin-vue-components to v0.27.4
  • fix(deps): update dependency @vueuse/core to v10.11.1
  • fix(deps): update dependency pinia to v2.2.2
  • fix(deps): update dependency vue to v3.4.38
  • chore(deps): update dependency @types/node to v20.15.0
  • chore(deps): update dependency vite to v5.4.1
  • chore(deps): update eslint monorepo to v9.9.0 (@eslint/js, eslint)
  • fix(deps): update dependency vue-i18n to v9.14.0

Detected dependencies

bun
package.json
  • eslint 9.8.0
  • @eslint/js 9.8.0
  • @ianvs/prettier-plugin-sort-imports 4.3.1
  • concurrently 8.2.2
  • globals 15.9.0
  • ncp 2.0.0
  • prettier 3.3.3
github-actions
.github/actions/setup-tooling/action.yaml
  • actions/setup-node v4.0.3@1e60f620b9541d16bece96c5465dc8ee9832be0b
  • oven-sh/setup-bun v2.0.1@4bc047ad259df6fc24a6c9b0f9a0cb08cf17fbe5
  • actions/cache v4.0.2@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
  • browser-actions/setup-chrome v1.7.2@facf10a55b9caf92e0cc749b4f82bf8220989148
.github/workflows/build-deploy.yaml
  • actions/checkout v4.1.7@692973e3d937129bcbf40652eb9f2f61becf3332
  • actions/upload-pages-artifact v3.0.1@56afc609e74202658d3ffba0e8f6dda462b719fa
  • actions/deploy-pages v4.0.5@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e
.github/workflows/check.yaml
  • actions/checkout v4.1.7@692973e3d937129bcbf40652eb9f2f61becf3332
npm
packages/cv-content/package.json
  • eslint-config-prettier 9.1.0
  • html-minifier-terser 7.2.0
  • minimist 1.2.8
  • puppeteer 22.15.0
  • resumed 3.0.1
packages/cv-wrapper/package.json
  • @vueuse/core 10.11.0
  • flag-icons 7.2.3
  • html-include-element 0.3.0
  • pinia 2.2.0
  • primeflex 3.3.1
  • primeicons 7.0.0
  • primevue 3.53.0
  • vue 3.4.35
  • vue-i18n 9.13.1
  • @eslint/eslintrc 3.1.0
  • @intlify/eslint-plugin-vue-i18n 3.0.0
  • @intlify/unplugin-vue-i18n 4.0.0
  • @tsconfig/node20 20.1.4
  • @types/node 20.14.14
  • @vite-pwa/assets-generator 0.2.4
  • @vitejs/plugin-vue 5.1.2
  • @vue/eslint-config-prettier 9.0.0
  • @vue/eslint-config-typescript 13.0.0
  • @vue/tsconfig 0.5.1
  • axe-core 4.10.0
  • eslint-plugin-vue 9.27.0
  • eslint-plugin-vuejs-accessibility 2.4.1
  • typescript 5.5.4
  • unplugin-vue-components 0.27.3
  • user-agent-data-types 0.4.2
  • vite 5.3.5
  • vite-plugin-pwa 0.20.1
  • vue-axe 3.1.2
  • vue-tsc 2.0.29

  • Check this box to trigger a request for Renovate to run again on this repository

i18n integration

The vue-i18n package should be included and all relevant parts for the app should be converted to using i18n strings.
A dedicated directory for managing locales should be created.

The i18n language should switch depending on which selected language (via the dropdown) is stored internally.

Add functionality to select language

At the moment, the build tools allow building of multiple static folders for different languages.
An entrypoint is needed (without selecting any language) that extends the current view by a "Select a language" functionality.

My suggestions would be to write a simple Vue application that dynamically renders the different language CVs inside a full-screen iframe.

The language functionality could be implemented inside a appear-like component using a dropdown for language selection.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.