⚓ Stand out of the crowd by showing a professional website/resume.
👔 💼 Build fast 🚀 and easy the best Personal Web Application resume!
Get rid of your old and deprecated text resume by using the first Open-source Web Application (100% free), which makes a professional personal website and portfolio easy and quick to build.
- A fully functional Angular 21 (LTS) application with a customizable template and content;
- Totally responsive for the mobile and desktop devices (allow mobile gestures too... ;));
- Internationalization for English and Portuguese (easy for adding/removing new languages - in18 lib);
- Mobile navigation sharing (Share the resume with native apps like Whatsapp, LinkedIn, Facebook, etc...);
- A complete Wiki that provides support;
- Integrated with Google Analytics;
- Optimized for SEO ( Crawler and Bots from Google, Bing, etc... );
- Using the schemas for structured data (schema.org);
- Firebase integration in the contact form;
- Composed of 5 custom sections (Welcome, About Me, Experiences, Posts, and Contact);
- Router fragment friendly (e.g: https://guilhermeborgesbastos.com/posts );
- Source code verified by static code analyzers (safe and ready for production);
Learn about the latest improvements.
To get more help on the setup, customization or any other aspect, accessing the following:
- Wiki on GitHub - A complete documentation, from getting started until deploy.
- A Community Chat for further discussions.
A video tutorial is also available watch it [Video is outdated, use as guideline, if needed].
- Node.js
^20.19.0,^22.12.0or^24.0.0(the versions supported by Angular 21). The project pins Node 24 in.nvmrc, so with nvm you can just runnvm use. To see what version of Node.js is installed on your machine type the following command in the terminal:
node -v
-
If you haven't installed Node.js in your machine then go to this link in order to install node.
-
npm
10or later (bundled with the Node.js versions above). To check it, run:
npm -v
- TypeScript and the Angular CLI are installed locally as project dependencies (TypeScript 5.9, Angular CLI 21); no global installation is required.
A video tutorial is also available watch it.
-
Fork this repository, by clicking the
Forkbutton at the top-right on this page.
-
Clone the forked repository from your GitHub account.
git clone https://github.com/[replace-with-your-github-username]/live-resume.git
-
Go to the cloned directory (e.g.
cd live-resume). -
Run
npm ci(ornpm install). No--forceor--legacy-peer-depsflag is needed. -
Inner the folder of the cloned project, start the application:
npx ng serve -o --host 0.0.0.0 --configuration en
P.S: npm run start:en (or npm run start:pt) starts the same dev server without the extra flags. If you prefer a global ng command, run npm install -g @angular/cli@21.
Note: the optional parameters:
-oaliases for opening the default browser as soon the application is served.--host 0.0.0.0is useful if you want to see how your application runs on a mobile or from some other laptop/computer/network.--configuration=enin this example the application will be displayed in en-US, by replacing theenwithpt=>--configuration pt, the application language would be pt-BR.
- After that, the command will start a server instance and listen on port
4200. Open (http://localhost:4200/) in your browser. The Live Resume will be displayed.
Please, feel free to make improvements, or any sort of changes and send it back via pull request. Your contribution is always welcome!
| Command | What it does |
|---|---|
npm run lint |
ESLint (flat config in eslint.config.js) with the angular-eslint rules for TypeScript and templates. |
npm run validate:posts |
Checks src/assets/data/posts.json (see Validating posts.json). |
npm test -- --watch=false --browsers=ChromeHeadless |
Unit tests (Jasmine + Karma). |
npm run build -- --configuration production |
Production build; must finish without warnings. |
npm run build-locale |
Localized builds for both languages (dist/en, dist/pt). Missing translations fail the build. |
npm run test:e2e |
Builds both locales and runs the Playwright browser suite. |
npm run test:e2e:run |
Runs the browser suite against the existing dist/ output (no rebuild). |
npm run test:e2e:docker |
Builds the Docker image, runs it on port 8080 and runs the browser suite against the container. |
The browser suite (e2e/) runs Chromium at desktop (1440×900) and mobile (Pixel 7) sizes against the production builds, served by e2e/serve.mjs at http://127.0.0.1:4300/en/ and /pt/ (change the port with E2E_PORT). It checks rendering and layout, translations, fragment navigation, the carousels (buttons and swipe), mobile navigation, the 404 page and contact-form validation. Firebase, reCAPTCHA and Google Analytics requests are stubbed or blocked, so tests never send real data, and any console error, page error or failed request fails the run.
Install the browser once with npx playwright install chromium. Results go to test-results/: an HTML report (npx playwright show-report test-results/report), landing-page screenshots for every locale and viewport in test-results/screenshots/, and screenshots plus traces of any failing test in test-results/artifacts/.
The GitHub Actions workflow (.github/workflows/ci.yml) runs all of these checks on every push and pull request.
The Dockerfile builds both languages from the lockfile and serves them with Nginx, at the same /en/ and /pt/ paths as production:
docker build -t live-resume .
docker run --rm -p 8080:80 live-resume
Then open http://localhost:8080/en/ or http://localhost:8080/pt/. /en and /pt redirect to their trailing-slash form, other paths under a language return that language's app (so its 404 page is shown), and anything outside /en/ and /pt/ returns 404. Run npm run test:e2e:docker to build the image and run the browser suite against a container.
Published images: guilhermeborgesbastos/live-resume on Docker Hub (linux/amd64 and linux/arm64).
Publishing a release. The Docker publish workflow (.github/workflows/docker-publish.yml) runs when a version tag is pushed. Set the version, merge, then tag the merged commit:
npm version 2.1.0 --no-git-tag-version # updates package.json and package-lock.json; commit it in a PR
git tag v2.1.0 && git push origin v2.1.0
The workflow fails unless the tag equals package.json's version. It runs the browser suite against the container, then pushes 2.1.0, 2.1, 2, latest and sha-<commit>; pre-release tags such as v2.1.0-rc.1 only publish their exact version. It needs a DOCKERHUB_TOKEN repository secret (a Docker Hub access token with read & write access), and optionally a DOCKERHUB_USERNAME variable (defaults to the repository owner). Pull requests that change the image run the same build and tests without publishing.
The repository includes a Claude Code skill that adds a new card to the Posts section. Run /add-post <article URL> and it writes the English and Portuguese title and description, passes all of that text through the Humanizer skill, saves the thumbnail and inserts the record into src/assets/data/posts.json. Full guide: docs/add-post-skill.md.
- Requirements: Claude Code plus the Humanizer plugin
- Usage
- What the skill does
- Writing rules: 275-character limit, allowed HTML, both languages
- Validating posts.json with
npm run validate:posts - Adding a post by hand
- Troubleshooting
In the Wiki Doc. there is a specific page supporting you on how to apply customizations to the layout and more... See page
Feel free to add new features, language supports, fix bugs, or improve the docs. Any kind of help is appreciated! If you make any kind of improvements, please, send them back as a Pull Request. Let's keep making it better and up-to-date.
This project uses several open source packages:
Site www.guilhermeborgesbastos.com
LinkedIn profile
Facebook profile
The theme is available as open source under the terms of the MIT License.
