{"id":18791380,"url":"https://github.com/jpcercal/resume","last_synced_at":"2026-03-10T01:08:19.508Z","repository":{"id":69640474,"uuid":"55231433","full_name":"jpcercal/resume","owner":"jpcercal","description":"João's Resume JSON/PDF Builder","archived":false,"fork":false,"pushed_at":"2025-01-15T13:32:07.000Z","size":13084,"stargazers_count":4,"open_issues_count":3,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-15T15:22:24.286Z","etag":null,"topics":["curriculum","cv","resume-builder","resume-creator","resume-generator","resume-parser","resume-template"],"latest_commit_sha":null,"homepage":"","language":"SCSS","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/jpcercal.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,"publiccode":null,"codemeta":null}},"created_at":"2016-04-01T12:38:37.000Z","updated_at":"2025-01-15T13:08:38.000Z","dependencies_parsed_at":"2024-01-15T17:52:43.910Z","dependency_job_id":"42ed8873-447b-403f-af91-3c5055456d30","html_url":"https://github.com/jpcercal/resume","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpcercal%2Fresume","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpcercal%2Fresume/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpcercal%2Fresume/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpcercal%2Fresume/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jpcercal","download_url":"https://codeload.github.com/jpcercal/resume/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239718329,"owners_count":19685722,"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":["curriculum","cv","resume-builder","resume-creator","resume-generator","resume-parser","resume-template"],"created_at":"2024-11-07T21:15:38.251Z","updated_at":"2026-03-07T03:06:06.081Z","avatar_url":"https://github.com/jpcercal.png","language":"SCSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Resume\n\n[![View Resume](https://img.shields.io/badge/Jo%C3%A3o's_Resume-VIEW-blue?logo=googlechrome\u0026logoColor=ffffff 'View Resume')](https://github.com/jpcercal/resume/blob/main/resume.pdf) [![Download Resume](https://img.shields.io/badge/Jo%C3%A3o's_Resume-DOWNLOAD-ED5F1A?logo=githubsponsors\u0026logoColor=ffffff 'Download Resume')](https://raw.githubusercontent.com/jpcercal/resume/main/resume.pdf) [![resume.json](https://img.shields.io/badge//resume.json-2B2B2B?logo=github\u0026logoColor=ffffff 'resume.json')](https://raw.githubusercontent.com/jpcercal/resume/main/resume.json) [![github actions](https://img.shields.io/badge/github%20actions-2B2B2B?logo=githubactions\u0026logoColor=ffffff 'github actions')](https://github.com/jpcercal/resume/actions) [![CI](https://github.com/jpcercal/resume/actions/workflows/resume.yml/badge.svg?branch=main)](https://github.com/jpcercal/resume/actions/workflows/resume.yml?query=branch%3Amain) [![Latest Release](https://img.shields.io/github/v/release/jpcercal/resume?display_name=tag\u0026logo=github\u0026logoColor=ffffff\u0026color=2B2B2B)](https://github.com/jpcercal/resume/releases) [![Docker Pulls](https://img.shields.io/docker/pulls/jpcercal/resume?logo=docker\u0026logoColor=ffffff\u0026color=2496ED)](https://hub.docker.com/r/jpcercal/resume) [![Node 24+](https://img.shields.io/badge/Node.js-24%2B-339933?logo=nodedotjs\u0026logoColor=ffffff)](https://nodejs.org/)\n\nAs a software engineer with a thirst for adventure, I'm constantly looking for ways to\napply engineering rigour to problems that most people solve manually. A resume is one of\nthose problems. It goes stale, the formatting drifts, version history disappears into a\ngraveyard of `final_v3.docx` files, and every update turns into a tedious afternoon of\npixel-pushing. I decided to treat my resume the same way I treat production software:\nas source code, with automation, versioning, and a proper release pipeline. This\nrepository is the result.\n\n## Why your resume deserves a repository\n\nThe instincts that make engineers effective — reproducibility, automation, auditability —\napply just as well to a resume as they do to any other deliverable. Here is why I think\nevery engineer should have one of these:\n\n**Your resume is source code.** The single source of truth lives in `resume.json`, a\nstructured file that follows the open [JSON Resume](https://jsonresume.org/) schema. Every\nchange is a commit. The full history is preserved. There are no conflicting copies,\nno formatting accidents, and no mystery about what changed between versions.\n\n**Every push ships a release.** The moment you push, the CI pipeline takes over. It builds\na Docker image, renders the HTML, generates the PDF, minifies the page, deploys it to\nGitHub Pages, force-amends the commit to include the built artifacts, and tags a new\nversioned release — all without you touching a single tool manually. The pipeline does\nin seconds what used to take an afternoon.\n\n**One Docker command, anywhere.** The build is fully containerised and produces identical\noutput on Intel, Apple Silicon, and ARM servers. There is no \"it works on my machine\"\nproblem. Anyone can clone the repo, run a single command, and have a pixel-perfect PDF\nin their working directory.\n\n## How does it work?\n\nThe pipeline is intentionally simple:\n\n| Step | What happens |\n|------|--------------|\n| Edit `resume.json` | Update your content — work experience, skills, education |\n| `git push` | Triggers the GitHub Actions workflow |\n| CI builds the image | Multi-arch Docker image pushed to Docker Hub |\n| Artifacts are generated | `resume.pdf`, `resume.html`, and two preview PNGs |\n| HTML is minified | CSS, JS, and whitespace compressed for the web |\n| GitHub Pages is updated | The minified HTML is live at your Pages URL |\n| Release is tagged | A versioned GitHub release is created with `resume.pdf` as an asset |\n\nUnder the hood, [resumed](https://github.com/rbardini/resumed) validates the JSON and\nrenders it through a custom [Handlebars](https://handlebarsjs.com/) template styled with\n[TailwindCSS v4](https://tailwindcss.com/). [Puppeteer](https://pptr.dev/) then takes the\nHTML and prints it to PDF using a headless Chromium instance baked into the Docker image.\nNo external services, no proprietary tooling — just open-source software running in a\nreproducible container.\n\n## See it in action\n\n![A preview of the resume file](resume-preview.pdf.png)\n\nAt the very top of this page you can click `João's Resume | VIEW` to open the PDF directly\nin your browser, or `João's Resume | DOWNLOAD` to save a copy for offline viewing.\n\n\u003e For the tech-savvy, the raw data is in\n\u003e [`resume.json`](https://raw.githubusercontent.com/jpcercal/resume/main/resume.json) —\n\u003e the file that drives everything. Here is a preview of what it looks like:\n\u003e\n\u003e ![A preview of the resume.json file](resume-preview.json.png)\n\n\u003e The full workflow is defined in `.github/workflows/resume.yml`. You can watch it run\n\u003e live on [GitHub Actions](https://github.com/jpcercal/resume/actions).\n\n## Build it yourself\n\nThe only dependency is [Docker](https://www.docker.com/). Once installed, you have two\noptions:\n\n**Option 1 — Pull the pre-built image from Docker Hub (fastest):**\n\n```bash\ndocker pull jpcercal/resume\n```\n\n**Option 2 — Build the image locally (after making changes to the `Dockerfile`):**\n\n```bash\ndocker build --tag jpcercal/resume .\n```\n\nEither way, generate all artifacts with a single command:\n\n```bash\ndocker run --rm -v \"$PWD:/app\" jpcercal/resume\n```\n\n\u003e **Windows PowerShell:** replace `\"$PWD\"` with `\"${PWD}\"`.\n\nThis mounts the project root as `/app` inside the container and writes four files directly\ninto your working directory:\n\n- `resume.pdf`\n- `resume.html`\n- `resume-preview.pdf.png`\n- `resume-preview.json.png`\n\nThe image is built for both `linux/amd64` and `linux/arm64`, so it runs natively on\nIntel/AMD machines as well as Apple Silicon (M-series) and ARM servers — no emulation\noverhead.\n\nEnjoy it. =)\n\n## Fork it and make it yours\n\nThe best part about treating a resume as a repository is that the whole pipeline is\nforkable. Clone or fork this repo, edit `resume.json` with your own information, push,\nand your personal resume pipeline is live — complete with GitHub Pages hosting, versioned\nPDF releases, and a Docker image on Docker Hub.\n\nIf the default layout does not suit your style, the entire theme lives in the `theme/`\nfolder: swap the Handlebars template, adjust the TailwindCSS tokens, add new helpers.\nThe `resume.json` data model stays the same; only the presentation changes.\n\nYour resume is a living document. It should be treated like one.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpcercal%2Fresume","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjpcercal%2Fresume","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpcercal%2Fresume/lists"}