Personal portfolio and agent-readable landing site for jmcte.me.
- Next.js App Router
- TypeScript
- Tailwind CSS
- Lucide React icons
- Vitest + Testing Library
content/holds source-of-truth content in Markdown + JSON.app/contains server-rendered pages.components/contains reusable UI blocks.lib/contains loader and contract logic.public/contains generated machine-readable outputs:profile.jsonprojects.jsonresume.jsonagent-profile.jsonsitemap.xmlrobots.txt.well-known/security.txt
npm run sync:data- generate public JSON and metadata fromcontent/.npm run dev- local Next.js dev server.npm run build- static export for Cloudflare Pages.npm run test- run Vitest suite.npm run lint- run ESLint.npm run typecheck- run TypeScript check.
npm install
npm run sync:data
npm run dev- Connect repository to Cloudflare Pages.
- Set framework preset to Next.js.
- Use build command:
npm run build
- Set output directory:
out
- Add custom domain:
jmcte.mewww.jmcte.me
This repo includes .github/workflows/pages-deploy.yml which runs on push to main and deploys out to Cloudflare Pages.
Required repository secrets:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
Expected Pages project name in workflow:
jmcte-meby default (can be overridden via GitHub Actions variableCLOUDFLARE_PAGES_PROJECT).
If your project name is different, set CLOUDFLARE_PAGES_PROJECT in GitHub Actions variables, or update projectName in the workflow.
If you have a Cloudflare token that can manage API tokens, you can provision a least-privilege Pages deploy token and wire it into GitHub:
- Copy
.env.exampleto.envand fill:CLOUDFLARE_TOKEN_MGMT_TOKENCLOUDFLARE_ACCOUNT_ID
- Ensure GitHub CLI is authenticated:
gh auth login
- Run:
node scripts/provision-cloudflare-pages-token.mjs
This script:
- Creates a deploy token with
Cloudflare Pages:Editpermissions scoped to your account. - Sets GitHub Actions secrets:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID - Sets GitHub Actions variable:
CLOUDFLARE_PAGES_PROJECT
Enable project hooks with:
git config core.hooksPath .githooksYou have two production-ready options.
- In Cloudflare Pages, add custom domains for:
jmcte.mewww.jmcte.me
- Cloudflare Pages will show target hostnames (example form:
<project-name>.pages.dev). - In Porkbun DNS:
- Create a DNS record for
www:- Type:
CNAME - Name:
www - Value:
<your-project>.pages.dev
- Type:
- For root
@, create one of:CNAME-flattened/ALIASrecord to<your-project>.pages.dev(if your DNS plan supports it), orURL Redirectfrom@->www.jmcte.me.
- Create a DNS record for
- In Cloudflare Pages, wait for verification and enable HTTPS.
- Add
jmcte.meto Cloudflare as a new zone. - Cloudflare will provide nameservers (for example
xxxx.ns.cloudflare.com,yyyy.ns.cloudflare.com). - In Porkbun, replace domain nameservers with Cloudflare nameservers.
- In Cloudflare DNS, add or confirm records from Pages wizard for:
jmcte.me-><your-project>.pages.devwww.jmcte.me-><your-project>.pages.dev
- Enable SSL mode (automatic) and force HTTPS.
Notes:
- Keep TTL near default unless you are coordinating a change window.
- SSL/TLS certificate issuance can take a few minutes after DNS propagation.