A personal website and portfolio built with Next.js 16, React 19, and TailwindCSS 4, deployed on Vercel.
- Next.js 16 with App Router and static export support
- React 19 with modern hooks and components
- TailwindCSS 4 for styling
- TypeScript for type safety
- Vercel Analytics and Speed Insights integration
- GitHub Calendar visualization
- AOS (Animate On Scroll) animations
- Resume Integration at
/resumepath with YAML-based data and PDF download functionality - Coding Activity page with WakaTime tiles and a GitHub contribution calendar
- Scroll-to-top button for long pages
- Node.js 20 or higher
- npm or yarn
The fastest way to get started is to open this repository in a GitHub Codespace or any compatible Dev Container environment by clicking the badge above.
This will automatically set up your development environment with all dependencies pre-installed.
If you prefer to run locally without a Dev Container:
-
Clone the repository:
git clone https://github.com/brignano/brignano.io.git cd brignano.io -
Install dependencies:
npm install
-
Run the development server:
npm run dev
-
Open http://localhost:3000 in your browser
The resume is integrated directly into the application and accessible at /resume. Resume data is stored in YAML format (public/resume.yml) for easy editing and maintenance.
Features:
- PDF download functionality using
@react-pdf/renderer - Client-side PDF generation from YAML data
- Theme toggling support
- Responsive design
- Clean, professional layout
The PDF generation is handled entirely on the client-side, allowing the application to maintain its static export configuration while providing dynamic PDF download capabilities.
npm run dev- Start the development server with Turbopacknpm run build- Build the application for production (static export toout/directory)npm run start- Start Next.js production server (not used for static exports; serve theout/directory with a static file server instead)npm run lint- Run ESLint to check code quality
Next.js is configured with static exports to ensure compatibility with various hosting platforms:
npm run buildThe build output will be in the out/ directory.
This project is optimized for deployment on Vercel:
Deploy your own version with one click:
- Push your code to a Git repository (GitHub, GitLab, Bitbucket)
- Import your project to Vercel:
- Go to vercel.com/new
- Select your repository
- Vercel will automatically detect the Next.js framework
- Click "Deploy"
Vercel will automatically:
- Build your Next.js application
- Deploy to a global CDN
- Provide automatic HTTPS
- Set up preview deployments for pull requests
- Enable Vercel Analytics and Speed Insights (already configured)
Use the Vercel CLI to deploy from your machine or CI. Commands vary slightly by CLI version β prefer npx vercel if you don't want a global install.
- Authenticate and link the repo:
vercel login
vercel link # or `vercel link --yes` to auto-confirm- Deploy:
# interactive preview deploy
vercel
# production deploy (non-interactive)
vercel --prod --confirm
# or with npx
npx vercel --prod --confirm- Fetch environment variables locally (when needed):
# older CLI: positional
vercel env pull .env.local production
# newer CLI: long option
vercel env pull .env.local --environment=productionNotes:
vercel env add <NAME> productionadds a variable to the Vercel project; runvercel env pullafterwards to fetch it locally.- For CI, set env vars in the Vercel dashboard or use the Vercel Git integration.
Infrastructure-as-code (IaC) for this site is maintained in a separate repository:
brignano/awsβ contains Terraform/CloudFormation and deployment configuration used to provision cloud resources for this site and related projects. See https://github.com/brignano/aws for details.
If you need environment variables for your deployment:
- Go to your project settings on Vercel
- Navigate to "Environment Variables"
- Add your variables for Production, Preview, and Development environments
This site sends events via Google Analytics using the helper in lib/gtag.ts and the GA_MEASUREMENT_ID constant. The file is located at lib/gtag.ts and the event() helper is used throughout the codebase to send analytics events (e.g. contribution graph interactions).
Notes about the default analytics setup:
lib/gtag.tscurrently provides a default, hardcodedGA_MEASUREMENT_IDvalue. You do not need to configure Google Analytics to run or build the site locally β the hardcoded ID will be used by default.- If you want to use your own Google Analytics property, either set
GA_MEASUREMENT_IDin Vercel environment variables or add it to a local.env.localfile (example below).
To enable your own Google Analytics (optional):
GA_MEASUREMENT_ID=G-YOURIDHERE
WAKATIME_API_KEY=your_wakatime_api_key_hereGenerating .env.local from Vercel CLI
If you already have environment variables set up in the Vercel dashboard, you can pull them into a local .env.local file using the Vercel CLI. Follow these steps exactly:
- Install the Vercel CLI (if needed):
npm install -g vercel- Authenticate and link the local repo to the Vercel project (this is required so
env pullknows which project to read from):
vercel login
vercel link
# or `vercel link --yes` to auto-confirm when you already know the project- Pull environment variables into
.env.localfrom the linked Vercel project. Specify the environment if needed (production/preview/development):
vercel env pull .env.local --environment=developmentNotes and troubleshooting:
vercel env add <NAME> <environment>only sets a variable on Vercel (it will prompt for the value) β it does not automatically write to your local.env.localfile.vercel env pullreads variables from the currently linked Vercel project. If variables are missing afterenv pull, ensure your local repo is linked to the correct Vercel project (vercel link) and that you have permission to read that project's variables.- To re-check or re-link the project use
vercel link --yesor runverceland follow the interactive prompts. - If you prefer to add variables directly via CLI to Vercel (not local), you can run:
vercel env add GA_MEASUREMENT_ID production
vercel env add WAKATIME_API_KEY productionAfter adding variables on Vercel, re-run vercel env pull .env.local --environment=production to fetch them into your local file.
Be careful not to commit secrets β .env.local should remain local and is usually ignored by Git.
Required variables for development:
WAKATIME_API_KEYβ required to render the WakaTime coding statistics on the/codingpage. If this is not set the coding page will show an error when fetching WakaTime data.
Optional:
GA_MEASUREMENT_IDβ only necessary if you want analytics sent to your own Google Analytics property; otherwise the default hardcoded value will be used.
.
βββ .devcontainer/ # DevContainer configuration
βββ .github/ # GitHub workflows and configurations
βββ app/ # Next.js app directory (App Router)
β βββ page.tsx # Home page (/)
β βββ coding/page.tsx # Coding Activity (/coding)
β βββ resume/page.tsx # Resume (/resume)
β βββ sitemap.ts # sitemap.xml
β βββ globals.css # Global styles
β βββ layout.tsx # Root layout
βββ components/ # React components (reusable UI)
βββ public/ # Static assets
β βββ robots.txt # Robots rules
β βββ resume.yml # Resume data (YAML format)
βββ lib/ # Site constants, analytics helpers
βββ types/ # TypeScript types
βββ eslint.config.mjs # ESLint configuration
βββ next.config.ts # Next.js configuration
βββ postcss.config.mjs # PostCSS configuration
βββ tailwind.config.ts # TailwindCSS configuration
βββ tsconfig.json # TypeScript configuration
/- Home page/coding- Coding Activity (WakaTime tiles + GitHub contribution calendar)/resume- Resume page/sitemap.xml- Generated sitemappublic/robots.txt- Robots rules for crawlers
The next.config.ts is configured for static exports:
output: "export"- Enables static HTML exportimages.unoptimized: true- Disables server-side image optimizationbasePath: ""- Set to your repository slug if deploying to a subdirectory
Vercel Analytics and Speed Insights are already integrated via:
@vercel/analytics@vercel/speed-insights
These packages are automatically enabled when deployed on Vercel.
Contributions are welcome! Feel free to open issues or submit pull requests.
This project is open source and available under the MIT License.