A modern, responsive personal portfolio website built with Next.js, TypeScript, Tailwind CSS, and Motion. Fork it, customize it, and make it your own.
- Next.js Server-Side Rendering — Fast initial page loads with server-side data fetching
- Tailwind CSS — Utility-first styling with custom dark theme
- Motion Animations — Smooth, performant animations throughout
- Blog System — Markdown-based articles with tag filtering and modal reading
- GitHub Integration — Automatically fetches and displays GitHub repositories
- AI Project Analyses — Pre-generated project insights using OpenAI
- Responsive Design — Mobile-first layout with adaptive grid system
- Docker Development — Containerized development and production environments
| Category | Technology |
|---|---|
| Framework | Next.js 16, React 19, TypeScript |
| Styling | Tailwind CSS with custom theme |
| Animations | Motion (Framer Motion) |
| Markdown | react-markdown with GitHub Flavored Markdown |
| AI | ai SDK + OpenAI (build-time only, via seed script) |
| Build | Turbopack (dev), Next.js standalone (production) |
| Container | Docker with multi-stage builds |
# Clone the repository
git clone https://github.com/ds-brandao/personalWebsite.git
cd personalWebsite/next-app
npm install
# Start the development server
npm run devOpen http://localhost:3000 in your browser.
docker compose up dev# With Node.js
cd next-app
npm run build
npm run start
# With Docker
docker build -t personal-website .
docker run -p 80:80 personal-website├── next-app/ # Next.js application
│ ├── app/
│ │ └── page.tsx # Server component (data fetching)
│ ├── components/ # React components
│ │ ├── PageClient.tsx # Main client layout
│ │ ├── ArticleCard.tsx # Blog post cards
│ │ ├── Projects.tsx # Project carousel
│ │ ├── ProjectDetail.tsx # AI analysis + commits display
│ │ └── ai-elements/ # AI-generated UI components
│ ├── ai/
│ │ └── tools.ts # AI tool definitions for analysis
│ ├── lib/
│ │ └── data.ts # Server-side data fetching
│ ├── scripts/
│ │ └── seed-analyses.ts # Pre-generate AI project analyses
│ ├── types/
│ │ └── index.ts # TypeScript type definitions
│ ├── public/
│ │ ├── config/ # Configuration files
│ │ │ ├── config.json # Personal info & tags
│ │ │ ├── articles.json # Blog post metadata
│ │ │ └── analyses.json # Pre-generated AI analyses
│ │ ├── blog-posts/ # Markdown blog posts
│ │ └── images/ # Static images
│ └── package.json
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yaml # Development environment
└── README.md
Edit next-app/public/config/config.json to set your name, social links, and tags:
{
"personal": {
"name": "Your Name"
},
"social": {
"github": { "username": "your-username", "url": "https://github.com/..." },
"email": "your@email.com",
"linkedin": "https://linkedin.com/in/..."
},
"tags": { ... }
}- Create a Markdown file in
next-app/public/blog-posts/ - Add metadata to
next-app/public/config/articles.json:
{
"title": "Article Title",
"summary": "Brief description",
"markdown": "/blog-posts/article.md",
"image": "/images/blog/article.jpg",
"objectPosition": "center 50%",
"tags": ["Tag1", "Tag2"]
}To generate AI-powered project analyses, set your OpenAI API key and run the seed script:
cd next-app
echo "OPENAI_API_KEY=your-key-here" > .env.local
npm run seeddocker build -t personal-website .
docker run -d -p 80:80 personal-websiteThe included workflow (.github/workflows/deploy.yml) automatically builds and deploys on push to main.
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please make sure your code:
- Passes linting (
npm run lintinnext-app/) - Builds successfully (
npm run buildinnext-app/) - Follows the existing code style
Found a bug or have a feature request? Open an issue with a clear description and steps to reproduce.
This project is licensed under the MIT License.