Skip to content

About

Personal portfolio and website built with Angular. Hosted with GitHub Pages

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

1 watching

Forks

Latest commit

Β 

History

230 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

AldΓ©ric Hoarau β€” Freelance Portfolio

Angular TypeScript NPM Vitest GitHub Pages

![Dependencies](https://img.shields.io/badge/dependencies-not_yet_updated-lightgrey?style=for-the-badge)

Freelance landing page built with Angular 22, deployed on GitHub Pages.

🌐 Live site: https://alderichoarau.github.io (mirrored on GitLab Pages β€” bonus backup copy, GitHub Pages is the real deployment)

Analysis

GitHub

CI

Build & Test Sonar Cloud Analysis CodeQL Dependency Review Security Β· SCA Security Β· Secrets Security Β· DAST (OWASP ZAP) Accessibility Β· axe-core

Deploy

Deploy Status

Mirror

GitLab CI Bitbucket Pipelines

Sonar

Quality Gate Status Bugs Code Smells Coverage Security Rating

Mirrors

GitHub is the source of truth. This repository is automatically push-mirrored (read-only) to:

Issues and pull requests should be opened on GitHub.


Tech Stack

Category Technology
Framework Angular 22 β€” Standalone Components, Signals
UI Angular Material 22 with custom dark theme
i18n ngx-translate (FR / EN)
Testing Vitest + @analogjs/vitest-angular + jsdom
Coverage @vitest/coverage-v8 (lcov β†’ SonarCloud)
Build Angular CLI / esbuild
Quality ESLint + Prettier + Husky pre-commit
CI/CD GitHub Actions
Analysis SonarCloud

Sections

Section Description
Hero Introduction, key stats, CTAs, social links
Technologies Stack by category (Frontend, Backend, Cloud, etc.)
Experience Timeline from 2015 to present
Credentials Microsoft/Scrum certifications + languages
References Client logos (infinite scroll carousel)
FAQ 7 frequently asked questions about services
Contact Email, LinkedIn, Malt, GitHub, Collective

Quick Start

Requirements: Node.js 26+, npm 11+

git clone https://github.com/alderichoarau/alderichoarau.github.io.git
cd alderichoarau.github.io
npm install
npm start
# β†’ http://localhost:4200

Scripts

# Development
npm start                # Development server
npm run build            # Standard build
npm run build:prod       # Production build

# Code quality
npm run lint             # ESLint check
npm run lint:fix         # ESLint with auto-fix
npm run format           # Prettier (write)
npm run format:check     # Prettier (check only)
npm run check            # lint + format:check

# Testing
npm run test             # Single run (Vitest)
npm run test:watch       # Watch mode
npm run test:coverage    # Tests + lcov coverage report

Architecture

src/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ core/
β”‚   β”‚   β”œβ”€β”€ components/     # Navigation, Footer
β”‚   β”‚   └── services/       # DataService, ScrollAnimationService,
β”‚   β”‚                       # SeoService, TranslationService
β”‚   β”œβ”€β”€ features/
β”‚   β”‚   β”œβ”€β”€ about/          # Hero section
β”‚   β”‚   β”œβ”€β”€ technologies/   # Tech stack
β”‚   β”‚   β”œβ”€β”€ experience/     # Timeline
β”‚   β”‚   β”œβ”€β”€ certifications/ # Certifications + languages
β”‚   β”‚   β”œβ”€β”€ references/     # Client logos
β”‚   β”‚   β”œβ”€β”€ faq/            # FAQ accordion
β”‚   β”‚   └── contact/        # Contact
β”œβ”€β”€ assets/
β”‚   └── i18n/               # fr.json, en.json
β”œβ”€β”€ test-setup.ts           # Vitest setup (zone.js + TestBed)
└── styles.scss             # Global theme + CSS variables

Testing

Tests run with Vitest + @analogjs/vitest-angular (jsdom β€” no browser required).

npm run test             # 151 tests, ~3s
npm run test:coverage    # Generates coverage/lcov.info

Coverage target: 80% statements / functions / lines.


CI/CD

GitHub Actions Workflows

File Trigger Role
ci.yml PR + push to main + manual Lint β†’ Format check β†’ Test β†’ Build
a11y.yml PR + push to main + manual Accessibility audit (axe-core) β€” PR/push job audits this branch's build, manual dispatch audits the live site
sca.yml PR + push to main + manual Dependency vulnerability scan (Trivy)
secrets-scan.yml PR + push to main + manual Leaked secret scan (gitleaks)
dast.yml Manual (workflow_dispatch) OWASP ZAP baseline scan against the real deployed site
sonar.yml Push to main + PR + manual Generate coverage β†’ SonarCloud analysis (SAST)
CodeQL GitHub default setup (weekly) SAST, no workflow file β€” configured under repo Settings β†’ Code security
dependency-review.yml Pull Request Audit new dependencies
deploy.yml Manual (workflow_dispatch) Lint β†’ Test β†’ Build β†’ Deploy to GitHub Pages
release-prepare.yml Manual (workflow_dispatch) Bump version, open the release PR
release-publish.yml Release PR merged Create the git tag + GitHub release

sca.yml/secrets-scan.yml/dast.yml/a11y.yml used to be jobs inside ci.yml (a11y, security) β€” split into their own files for a named badge/check per category, same convention as azure-quiz-frontend/azure-quiz-backend. No Container/IaC scan here: this repo has no Dockerfile/Helm/Terraform, nothing for that category to check.

Deployment (deploy.yml)

Triggered manually via workflow_dispatch, or dispatched by release-publish.yml right after it creates a release, via gh workflow run deploy.yml --ref <tag> (a release created with GITHUB_TOKEN doesn't emit an event other workflows can react to, so a release: published trigger wouldn't fire here). Deploys the exact commit pointed to by the release's tag.

  1. Checkout code
  2. npm run lint β€” ESLint check
  3. npm run test β€” Vitest suite
  4. npm run build β€” Angular build (esbuild)
  5. Upload docs/browser/ β†’ GitHub Pages

SonarCloud Analysis (sonar.yml)

  1. Checkout code
  2. npm run test:coverage β€” generates coverage/lcov.info
  3. SonarCloud scan using the lcov report

Sonar configuration is in sonar-project.properties.

Release (release-prepare.yml + release-publish.yml)

main is a protected branch, so the release is a two-step process:

  1. Prepare β€” manually trigger release-prepare.yml from the Actions tab with a tag_name input (e.g. v2.1.0). It bumps package.json / package-lock.json, pushes a release/<tag_name> branch, and opens a PR into main.
  2. Publish β€” once that PR is reviewed and merged, release-publish.yml fires automatically: it creates and pushes the <tag_name> tag on the merge commit, then creates the matching GitHub release with auto-generated notes.

Publishing the release automatically triggers deploy.yml, so merging the release PR is the standard way to ship to production.


Code Quality

  • ESLint + angular-eslint for TypeScript and templates
  • Prettier for consistent formatting
  • Husky pre-commit hook (lint-staged)
  • SonarCloud for continuous static analysis

License

Β© 2026 AldΓ©ric Hoarau. All rights reserved. This repository is public for viewing purposes only β€” see LICENSE. External contributions are not accepted, see CONTRIBUTING.md.


Contact

AldΓ©ric Hoarau β€” Cloud Consultant & DevOps Trainer

About

Personal portfolio and website built with Angular. Hosted with GitHub Pages

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages