From aed97936dff7e37c708cd00ddfc763f6f8853665 Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 17:00:00 -0300 Subject: [PATCH 01/10] feat(seo): improve on-page SEO and crawlability - Add react-helmet-async to manage dynamic head tags. - Add specific titles and descriptions for each section. - Improve meta tags in index.html with Open Graph and Twitter cards. --- index.html | 30 +++++++++++++++++++++++++++--- package.json | 1 + pnpm-lock.yaml | 32 ++++++++++++++++++++++++++++++++ src/main.tsx | 5 ++++- src/sections/About.tsx | 10 +++++++++- src/sections/Contact.tsx | 8 ++++++++ src/sections/Experience.tsx | 8 ++++++++ src/sections/Hero.tsx | 20 ++++++++++++++------ src/sections/Writing.tsx | 8 ++++++++ 9 files changed, 111 insertions(+), 11 deletions(-) diff --git a/index.html b/index.html index 4e81603..60a6e97 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,36 @@ - + - + Matheus Caiser • Desenvolvedor Full Stack + + + + + + + + + + + + + + + + - Matheus Caiser • Full Stack Developer diff --git a/package.json b/package.json index 3762a3e..b09a98e 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "lucide-react": "^0.548.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3fa2ea2..1a21d0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + react-helmet-async: + specifier: ^2.0.5 + version: 2.0.5(react@18.3.1) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -1632,6 +1635,9 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2119,6 +2125,14 @@ packages: peerDependencies: react: ^18.3.1 + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-helmet-async@2.0.5: + resolution: {integrity: sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -2241,6 +2255,9 @@ packages: setprototypeof@1.1.1: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4306,6 +4323,10 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4769,6 +4790,15 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-fast-compare@3.2.2: {} + + react-helmet-async@2.0.5(react@18.3.1): + dependencies: + invariant: 2.2.4 + react: 18.3.1 + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + react-is@16.13.1: {} react-refresh@0.18.0: {} @@ -4928,6 +4958,8 @@ snapshots: setprototypeof@1.1.1: {} + shallowequal@1.1.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 diff --git a/src/main.tsx b/src/main.tsx index 74e7555..035793f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,5 +1,6 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; +import { HelmetProvider } from 'react-helmet-async'; import "./index.scss"; import App from './App'; import reportWebVitals from './reportWebVitals'; @@ -9,7 +10,9 @@ const root = ReactDOM.createRoot( ); root.render( - + + + ); diff --git a/src/sections/About.tsx b/src/sections/About.tsx index 2b5c8be..891822b 100644 --- a/src/sections/About.tsx +++ b/src/sections/About.tsx @@ -1,3 +1,4 @@ +import { Helmet } from "react-helmet-async"; import "./About.scss"; import profileImage from "../assets/profile.png"; import SkillItem from "../components/SkillItem"; @@ -5,13 +6,20 @@ import SkillItem from "../components/SkillItem"; const About: React.FC = () => { return (
+ + Sobre Mim • Matheus Caiser + +

About

Profile picture
diff --git a/src/sections/Contact.tsx b/src/sections/Contact.tsx index 196523b..94ad137 100644 --- a/src/sections/Contact.tsx +++ b/src/sections/Contact.tsx @@ -1,4 +1,5 @@ import { useState, useCallback, useMemo } from "react"; +import { Helmet } from "react-helmet-async"; import "./Contact.scss"; const Contact: React.FC = () => { @@ -109,6 +110,13 @@ const Contact: React.FC = () => { return (
+ + Contato • Matheus Caiser + +

Contact

Have a question or want to work together? Leave your details and diff --git a/src/sections/Experience.tsx b/src/sections/Experience.tsx index d73dacf..8e9d17e 100644 --- a/src/sections/Experience.tsx +++ b/src/sections/Experience.tsx @@ -1,4 +1,5 @@ import React, { memo, useMemo } from "react"; +import { Helmet } from "react-helmet-async"; import "./Experience.scss"; import { experienceData, ExperienceItem } from "./experienceData"; @@ -64,6 +65,13 @@ const Experience: React.FC = memo(() => { itemScope itemType="https://schema.org/ItemList" > + + Experiência • Matheus Caiser + +

Experience

{ return (
+ + Matheus Caiser • Desenvolvedor Full Stack + +
-
-
+

+ Hello, I'm Matheus. -

-
+ + I'm a full stack web developer. -
-
+ +
View my work diff --git a/src/sections/Writing.tsx b/src/sections/Writing.tsx index 1553544..657d2e2 100644 --- a/src/sections/Writing.tsx +++ b/src/sections/Writing.tsx @@ -1,4 +1,5 @@ import React, { useMemo } from "react"; +import { Helmet } from "react-helmet-async"; type Post = { title: string; url: string; date: string }; @@ -19,6 +20,13 @@ const Writing: React.FC = () => { return (
+ + Blog • Matheus Caiser + +

Escritos

    {formattedPosts.map((post) => ( From 87ad9e15ee954e047e44e2598fdf2a82e1dbdc3c Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 17:17:31 -0300 Subject: [PATCH 02/10] fix(ci): use official vercel-action for deployment - Replaced manual vercel deployment scripts with the vercel/vercel-action@v3. - This fixes the issue with missing deployment comments on pull requests and simplifies the CI configuration. --- .github/workflows/ci.yml | 53 +++++++++------------------------------- 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59a4713..02d6898 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,28 +58,13 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "22.x" - cache: "pnpm" - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Deploy to Vercel (Production) - env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - run: | - pnpm vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - pnpm vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} - pnpm vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} + uses: vercel/vercel-action@v3 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} + vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} + prod: true # ----------------------------------------------------------------- # JOB 3: Deploy de Preview @@ -98,28 +83,12 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "22.x" - cache: "pnpm" - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Deploy to Vercel (Preview) - env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - run: | - pnpm vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - pnpm vercel build --token=${{ secrets.VERCEL_TOKEN }} - pnpm vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + uses: vercel/vercel-action@v3 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} + vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} # ----------------------------------------------------------------- # JOB 4: Criar Tag de Versão (Sem mudanças) From 5a63794a8db71f31e8c039994d1d20251ac9cfdc Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 17:36:21 -0300 Subject: [PATCH 03/10] fix(ci): replace defunct vercel-action with community alternative - Replaced vercel/vercel-action with amondnet/vercel-action@v25. - The official action repository is no longer accessible, causing CI failures. - This change restores the deployment functionality using a well-maintained community alternative. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02d6898..e8b34bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,7 +59,7 @@ jobs: uses: actions/checkout@v4 - name: Deploy to Vercel (Production) - uses: vercel/vercel-action@v3 + uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} @@ -84,7 +84,7 @@ jobs: uses: actions/checkout@v4 - name: Deploy to Vercel (Preview) - uses: vercel/vercel-action@v3 + uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} From bcadd3b85a03c2041f2ee347b8fccd730c7db306 Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 17:50:53 -0300 Subject: [PATCH 04/10] Update CI workflow to use Vercel CLI directly for better control and security --- .github/workflows/ci.yml | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8b34bc..f3c2564 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,13 +58,17 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Deploy to Vercel (Production) - uses: amondnet/vercel-action@v25 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} - prod: true + - name: Install Vercel CLI + run: npm install --global vercel@latest + + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + + - name: Build Project Artifacts + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + + - name: Deploy Project Artifacts to Vercel + run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} # ----------------------------------------------------------------- # JOB 3: Deploy de Preview @@ -83,12 +87,17 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Deploy to Vercel (Preview) - uses: amondnet/vercel-action@v25 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} - vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} + - name: Install Vercel CLI + run: npm install --global vercel@latest + + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + + - name: Build Project Artifacts + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + + - name: Deploy Project Artifacts to Vercel + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} # ----------------------------------------------------------------- # JOB 4: Criar Tag de Versão (Sem mudanças) From 505c769546c85e3a7ff8700ed238fe6e8f582faa Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:20:07 -0300 Subject: [PATCH 05/10] chore: more experience years --- src/sections/About.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sections/About.tsx b/src/sections/About.tsx index 891822b..6c059da 100644 --- a/src/sections/About.tsx +++ b/src/sections/About.tsx @@ -10,7 +10,7 @@ const About: React.FC = () => { Sobre Mim • Matheus Caiser

    About

    @@ -24,7 +24,7 @@ const About: React.FC = () => { />

- Dynamic and seasoned Full Stack Developer with over 8 years of + Dynamic and seasoned Full Stack Developer with over 13 years of comprehensive experience in web development and software engineering. Proficient in an array of modern technologies including React, React Native, Node.js, Golang, Linux, and Docker. Known for a From d4637f84f1e362a21915428a2fd7dea859ac0082 Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:26:14 -0300 Subject: [PATCH 06/10] chore: try api comment --- .github/workflows/ci.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3c2564..702c21a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,6 +99,25 @@ jobs: - name: Deploy Project Artifacts to Vercel run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + - name: Notify Vercel for PR Comment (if PR) + if: github.event_name == 'pull_request' + run: | + DEPLOY_URL=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} | grep -o 'https://[^ ]*') + curl -X POST "https://api.vercel.com/v13/deployments" \ + -H "Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "mrdeveloper", + "source": "cli", + "gitSource": { + "type": "github", + "repo": "JaegerCaiser/mrdeveloper", + "ref": "${{ github.head_ref }}", + "sha": "${{ github.sha }}" + }, + "target": "preview" + }' + # ----------------------------------------------------------------- # JOB 4: Criar Tag de Versão (Sem mudanças) # ----------------------------------------------------------------- From 5bdb33228a68b9c84611f25f7e33f50c1ccaed6f Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:35:48 -0300 Subject: [PATCH 07/10] chore: try api comment 2 --- .github/workflows/ci.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 702c21a..397bd13 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,6 +99,31 @@ jobs: - name: Deploy Project Artifacts to Vercel run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + - name: Get Repo ID + if: github.event_name == 'pull_request' + run: | + REPO_ID=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/${{ github.repository }} | jq -r .id) + echo "REPO_ID=$REPO_ID" >> $GITHUB_ENV + + - name: Notify Vercel for PR Comment (if PR) + if: github.event_name == 'pull_request' + run: | + curl -X POST "https://api.vercel.com/v13/deployments" \ + -H "Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "mrdeveloper", + "source": "cli", + "gitSource": { + "type": "github", + "repo": "${{ github.repository }}", + "ref": "${{ github.head_ref }}", + "sha": "${{ github.sha }}", + "repoId": ${{ env.REPO_ID }} + }, + "target": "preview" + }' + - name: Notify Vercel for PR Comment (if PR) if: github.event_name == 'pull_request' run: | From b13993990214fa3f584a599bc145f9907c50aa84 Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:37:30 -0300 Subject: [PATCH 08/10] chore: try api comment 3 --- .github/workflows/ci.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 397bd13..8a44ff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,24 +124,7 @@ jobs: "target": "preview" }' - - name: Notify Vercel for PR Comment (if PR) - if: github.event_name == 'pull_request' - run: | - DEPLOY_URL=$(vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} | grep -o 'https://[^ ]*') - curl -X POST "https://api.vercel.com/v13/deployments" \ - -H "Authorization: Bearer ${{ secrets.VERCEL_TOKEN }}" \ - -H "Content-Type: application/json" \ - -d '{ - "name": "mrdeveloper", - "source": "cli", - "gitSource": { - "type": "github", - "repo": "JaegerCaiser/mrdeveloper", - "ref": "${{ github.head_ref }}", - "sha": "${{ github.sha }}" - }, - "target": "preview" - }' + # ----------------------------------------------------------------- # JOB 4: Criar Tag de Versão (Sem mudanças) From 38f2ef06a1c79299cbcd8db4266f2c6c22dfdc5a Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:39:04 -0300 Subject: [PATCH 09/10] chore: try api comment 4 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a44ff0..0051814 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -121,7 +121,7 @@ jobs: "sha": "${{ github.sha }}", "repoId": ${{ env.REPO_ID }} }, - "target": "preview" + "target": "${{ github.head_ref }}" }' From a03d43f80781e8e5777b62999e08336fd72c774f Mon Sep 17 00:00:00 2001 From: Matheus Henrique Caiser Barrozo Date: Wed, 29 Oct 2025 18:42:40 -0300 Subject: [PATCH 10/10] chore: try api comment 5 --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0051814..5f42982 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -120,8 +120,7 @@ jobs: "ref": "${{ github.head_ref }}", "sha": "${{ github.sha }}", "repoId": ${{ env.REPO_ID }} - }, - "target": "${{ github.head_ref }}" + } }'