A modern Next.js portfolio and blog website for Axis Maps.
A modern Next.js portfolio and blog website for Axis Maps, featuring:
- 61 projects with comprehensive metadata and MDX content
- 24 cartography guide articles with full-text search
- Blog system with MDX support and dynamic rendering
- Responsive design using Tailwind CSS v4
- SEO optimized with sitemap, robots, and JSON-LD schema
- Performance monitoring via Vercel Analytics & Speed Insights
- Next.js 15 (canary) with App Router
- TypeScript for type safety
- Tailwind CSS v4 (alpha) for styling
- MDX for content management
- Vitest for testing
- pnpm as package manager
- Node.js 24+
- pnpm 8+ (required - do not use npm or yarn)
# Clone the repository
git clone [repository-url]
cd axismaps
# Install pnpm if you don't have it
npm install -g pnpm
# Install dependencies (MUST use pnpm)
pnpm install
# Start development server
pnpm run devVisit http://localhost:3000 to see the application.
This project uses pnpm as its package manager. Always use pnpm commands, never npm or yarn:
- ✅
pnpm install- Install dependencies - ✅
pnpm add <package>- Add a dependency - ✅
pnpm add -D <package>- Add a dev dependency - ❌
npm install- Do not use - ❌
yarn add- Do not use
pnpm run dev # Start development server
pnpm run build # Build for production (includes search index)
pnpm start # Run production server
pnpm run lint # Run ESLintpnpm test # Run tests in watch mode
pnpm test:run # Run tests once (CI)
pnpm test:coverage # Generate coverage report
pnpm test:ui # Interactive test UI/app
/blog # Blog functionality
/posts # MDX blog posts
/projects # Projects portfolio
/posts # MDX project files (61 projects)
/[slug] # Dynamic project pages
/guide # Cartography guide
/posts # Guide articles (24 articles)
/[slug] # Dynamic guide pages
/about # About page
/contact # Contact page with form
/components # Shared React components
/api # API routes (contact form)
/data # JSON data files
clients.json # Client metadata
categories.json # Category metadata
/public/images # Static assets
/bin # Build scripts (search index generation)
Projects are stored as MDX files in /app/projects/posts/ with frontmatter:
---
title: "Project Title"
slug: "project-slug"
publishedAt: "2024-01-01"
featured: true
subtitle: "Project subtitle"
teaser: "Brief description"
coverImage: "/images/projects/cover.jpg"
client: "Client Name"
category: "Category"
videoUrl: "https://..."
mapUrl: "https://..."
---Guide articles are in /app/guide/posts/ and are indexed for full-text search. The search index is built automatically during the production build process.
Blog posts use MDX in /app/blog/posts/ with YAML frontmatter:
---
title: "Post Title"
publishedAt: "2024-01-01"
summary: "Post summary"
image: "/images/blog/post.jpg"
---The project uses Vitest with React Testing Library. Tests are co-located with components and run automatically via GitHub Actions on push and pull requests.
pnpm test:run # Run all tests
pnpm test:coverage # Generate coverage report- 80%+ for utilities
- 70%+ for components
- 90%+ for critical logic
The application is configured for Vercel deployment with automatic CI/CD:
- Push to
mainbranch triggers deployment - Pull requests create preview deployments
- Tests run automatically before deployment