Personal portfolio site at robertdamiano-dev.web.app.
- Next.js (App Router) + Tailwind CSS
- MDX content for
/projects,/blog,/lab - Firebase Hosting (SSR via
frameworksBackend)
- Install dependencies:
npm install
- (Optional) Copy env template:
cp .env.local.example .env.local
- Start the dev server:
npm run dev
- Create/select a Firebase project (Blaze plan required for SSR).
- Set the project id in
.firebaserc(or runfirebase use --add). - Deploy:
npm run firebase:deploy
Deploys run automatically on pushes to main via .github/workflows/deploy.yml.
- Create a Firebase/GCP service account key with permission to deploy Hosting and update the SSR framework backend (Cloud Run–related roles are often required in addition to Hosting; expand IAM if deploy logs show permission errors).
- In GitHub repo settings, add secret
GOOGLE_APPLICATION_CREDENTIALSwith the full JSON key. - Push to
main; workflow will runnpm ci,npm run lint,npm run build, then enable the web frameworks experiment and deploy:npx firebase experiments:enable webframeworks npx firebase deploy --only hosting --project robertdamiano-dev --force
If CI deploy fails and you need local recovery:
npx firebase login --reauth
npx firebase experiments:enable webframeworks
npx firebase deploy --only hosting --project robertdamiano-dev --forceContent lives in the content/ directory as MDX files, organized by collection:
content/
blog/ → /blog/:slug
projects/ → /projects/:slug
lab/ → /lab/:slug
- Add a
.mdxfile in the appropriate collection folder. The filename becomes the URL slug (e.g.content/blog/my-post.mdx→/blog/my-post). - Include frontmatter at the top of the file:
---
title: My Post Title # required
summary: A short description # optional, shown in lists and meta tags
date: "2026-01-15" # optional, used for sorting blog posts
featured: true # optional; featured projects sort first on /projects; up to two appear on the homepage
liveUrl: https://example.com # optional, "Live" link on project pages
repoUrl: https://github.com/… # optional, "Source" link on project pages
---
Your markdown/MDX content here.Place images in public/images/ and reference them in MDX as . Local paths under public/ go through next/image with optimization. Remote image URLs (http/https in MDX) use the same component but are loaded unoptimized.
Run npm run format to auto-format all files with Prettier, or npm run format:check to verify formatting without writing changes.
To use a custom domain, add it in Firebase Hosting and follow the DNS instructions.