{"id":27874699,"url":"https://github.com/camerodev/react-printable-cv","last_synced_at":"2026-05-05T21:32:07.397Z","repository":{"id":227921294,"uuid":"772732475","full_name":"camerodev/react-printable-cv","owner":"camerodev","description":"Printable, multi-language, web curriculum vitae (resume) built with React and Redux 🖨️⚛️","archived":false,"fork":false,"pushed_at":"2024-03-15T19:28:11.000Z","size":6784,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-05T01:39:57.221Z","etag":null,"topics":["cv","pdf","printable","react","redux","resume"],"latest_commit_sha":null,"homepage":"https://react-cv.tomchen.org/","language":"JavaScript","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/camerodev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-03-15T19:27:57.000Z","updated_at":"2024-03-29T17:35:38.000Z","dependencies_parsed_at":"2024-03-15T20:38:52.987Z","dependency_job_id":null,"html_url":"https://github.com/camerodev/react-printable-cv","commit_stats":null,"previous_names":["slickcharmer/react-printable-cv","camerodev/react-printable-cv"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/camerodev/react-printable-cv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camerodev%2Freact-printable-cv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camerodev%2Freact-printable-cv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camerodev%2Freact-printable-cv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camerodev%2Freact-printable-cv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/camerodev","download_url":"https://codeload.github.com/camerodev/react-printable-cv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camerodev%2Freact-printable-cv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32445542,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T20:22:27.477Z","status":"ssl_error","status_checked_at":"2026-04-29T20:22:26.507Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["cv","pdf","printable","react","redux","resume"],"created_at":"2025-05-05T01:37:30.245Z","updated_at":"2026-04-29T21:37:02.652Z","avatar_url":"https://github.com/camerodev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Printable CV\n\n[![CircleCI](https://img.shields.io/circleci/build/github/tomchen/react-printable-cv)](https://circleci.com/gh/tomchen/react-printable-cv \"CircleCI\") [![Codecov](https://img.shields.io/codecov/c/github/tomchen/react-printable-cv)](https://codecov.io/gh/tomchen/react-printable-cv \"Codecov\") [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/quality/g/tomchen/react-printable-cv)](https://scrutinizer-ci.com/g/tomchen/react-printable-cv/?branch=master) [![MIT License](https://img.shields.io/github/license/tomchen/react-printable-cv)](https://github.com/tomchen/react-printable-cv/blob/master/LICENSE \"MIT License\")\n\nPrintable, multi-language, web curriculum vitae (resume) built with React and Redux.\n\n[Click here to go to the demo page](https://react-cv.tomchen.org/)\n\nIt's a responsive web page or a so-called SPA (single page application) that is 'perfectly' A4 paper print-ready. The data, stored in JSON files, are fully separated from the SPA.\u003c!--  A PDF file can be generated at compile time or in the backend server. --\u003e\n\nAlso can be optionally generated a standalone HTML file containing all the resources, including JavaScript, CSS, images, fonts and even the pre-generated PDF. The [demo page](https://react-cv.tomchen.org/) is a non-standalone code splitting version, it has [a subpage](https://react-cv.tomchen.org/standalone) that looks the same but is a standalone HTML.\n\n## Direct printing\n\nThe direct printing feature is experimental:\n\n* Direct printing is almost perfect in Google Chrome (and potentially in other browsers with the same core)\n* Firefox user should set print scale to 100% instead of 'Shrink To Fit'\n* Other browsers may or may not have problems in direct printing\n\nIt's possible to print the page to PDF file, most browsers come with such feature.\n\n## PDF\n\n\u003c!-- The PDF server creation is not fully ready --\u003e\n\n\u003c!-- In case your browser has any problem in printing the document directly, there is always the PDF button to come to your rescue. The pre-generated or server-generated PDF is consistent in any browser / PDF viewer, and can be perfectly printed. --\u003e\n\n\u003c!-- To generate PDF: open the web page online verison (i.e. with a server, you can use the [online editor/demo](https://react-cv.tomchen.org/) or run `npm start` on your computer), edit the CV and click \"PDF\" button, change the language. --\u003e\n\nPut your pre-generated `$LOCALE.pdf` files in the `pdf/` folder so that they can be included in the SPA.\n\n## Static offline version\n\nThe static offline version can be either a standalone HTML file that contains all the resources, including JavaScript, CSS, images, fonts, PDF, etc., or a group of HTML, JavaScript bundle files and other aforementioned resources.\n\nIn comparison with the normal version with separate resource files, standalone HTML file have great portability but lost the ability to on-demand, asynchronously \"lazy load\" / code splitting.\n\nIn wider or normal screen, the web page visually shows on an \"A4 page\" with non-printable buttons on the right side outside the \"A4 page\". The web page is responsive in mobile screen.\n\n`npm run rebuild` to generate the static offline version (using files and resources from `data/`, `src/` and `pdf/`) and put it into `dist/` folder.\n\nIn `settings/index.js`, change `inline_resources` to false to have separate resource files instead of the standalone HTML. You can also set `less_script_chunks` to false to have as many JavaScript chunk files as webpack needs for code splitting.\n\nIt supports mordern browsers and IE 11 via Polyfills, although it may have some [Flexbox](https://caniuse.com/flexbox) rendering problem in IE 11.\n\n## File sizes\n\nYou'll find the Chrome generated PDF usually much smaller than Word generated PDF. However, it's not the case for Firefox. You'll find the [CV word file](https://github.com/tomchen/react-printable-cv/blob/master/word/cv.docx) in the folder `word/` (the CV word file was created by me long before the React one) to be compared.\n\n## Multi-language\n\nYou can set languages in `settings/index.js`. Translations are in `i18n/$LOCALE/$NAMESPACE.json`.\n\n## Configuration\n\n`settings/index.js`:\n\n```javascript\nmodule.exports = {\n  langs: [\n    {\n      code: 'en',\n      name: 'English',\n    },\n    ...\n  ],\n  default_lang: 'en',\n  less_script_chunks: false, // generate one JavaScript chunk files only in production\n  inline_resources: false, // make resources inline in order to generate a standalone HTML in production\n  noindex: false, // add noindex meta tag to block search engine. However, the reCAPTCHA described below would be a better choice\n  recaptcha: false, // add Google reCAPTCHA to block spiders, if true, you should also set `useRecaptcha`, `siteKey` and `secretKey` in `backend/settings.js`, see also the following \"Back end\" section\n  dynamic_pdf: true, // when clicking PDF button, send JSON to backend to generate PDF on demand, instead of downloading pre-included static PDF\n  export_json_button: true, // show \"Export JSON\" button\n  import_json_button: true, // show \"Import JSON\" button\n  github_button: true, // show \"GitHub\" button\n  generate_backend_pdf_template: false, // generate a template to be used by backend to generate PDF\n  print_show_web_version_link: false, // show web version link in print view so that it will be shown in the print-view-generated PDF (`web_version_url` is optionally defined in CV data JSON)\n}\n```\n\nModify user data and settings in `data/`, `pdf/` and `settings/` folders, and run `npm start` (dev mode) or `npm run build` (build production file).\n\n## Back end\n\nTo use [Google reCAPTCHA](https://www.google.com/recaptcha/) ([register new site in console](https://www.google.com/recaptcha/admin/create)), you need to have a back end. A Node.js+Express.js-powered simple back end is in the `backend/` folder. Modify `backend/settings.js`, move the production files you have built from `dist/` to `backend/static`, deploy `backend/` to your server, run `npm start` at `backend/` directory.\n\nIf you use Google reCAPTCHA, It is automatically assumed you do not want your pages to be indexed by search engines and web crawlers.\n\n`backend/settings.js`:\n* `useRecaptcha`:\n  * `false`: do not use reCAPTCHA\n  * `'checkbox'`: checkbox reCAPTCHA (v2)\n  * *ANYTHING ELSE*: invisible reCAPTCHA (v2 or v3)\n* the other settings should be pretty clear\n\n## Stack\n\nNot bootstrapped with Create React App, it uses:\n\n* React + Redux (react-redux) for the main logic\n* Babel, webpack, PostCSS, some plugins and loaders for transpilation and module bundling\n* Material UI for buttons\n* Main page area is built with CSS Flexbox, and using Sass and CSS Modules\n* *Formik + Yup for forms (will be used)*\n* *Immer (will be used)*, Redux Thunk for store manipulation and asynchronous operations\n* i18next for forms i18n\n* Influenced by JAMstack (JSON source, Markdown support via react-markdown)\n* Prettier, ESLint, stylelint for linting\n* Day.js for date manipulation\n* Puppeteer for backend PDF creation\n* Jest for test\n* CircleCI and Codecov for CI\n* *[`ts-version`](https://github.com/tomchen/react-printable-cv/tree/ts-version) branch is a partially-checked TypeScript version transformed from `master` branch's ES version v2.1. The project will continue to be developed in ES*\n\n## To do\n\nThings that could be done in the future to make it better or more interesting:\n\n* [ ] Editor forms (Edit Mode)\n* [ ] Backend generates PDF on-demand\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamerodev%2Freact-printable-cv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcamerodev%2Freact-printable-cv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamerodev%2Freact-printable-cv/lists"}