Instructions for maintaining Saelan architect portfolio - Next.js 14 site with Strapi CMS backend, Tailwind styling, and bilingual Danish/English content
Comprehensive instructions for working with the Saelan architect portfolio website codebase.
This is a portfolio website for architect Oskar Saelan Halskov built with Next.js 14 App Router. The site features:
**Frontend:**
**Backend:**
**Hosting:**
```
app/
├── layout.js # Root layout (font, Header, TransitionWrapper)
├── page.js # Home — splash video → image reveal
├── globals.css # Font-face, animations, polyrattan mask
├── error.js # Error boundary
├── not-found.js # 404 page
├── contact/page.js # Contact info
├── projects/
│ ├── page.js # Project grid
│ └── [slug]/page.js # Project detail
components/
├── Header.js # Nav with category dropdowns (client)
├── TransitionWrapper.js # Route fade-in wrapper
├── Video.js # Masked video player
lib/
└── projects.js # Project data helpers (Strapi fetch)
public/
├── fonts/ # Italian Plate No2 (11 variants)
├── PH.jpg # Placeholder
├── polyrattanLogo.jpg # Header logo
├── polyrattanVideo.mp4 # Splash video
└── logoTransparent.png # Video mask
```
Projects fetched from Strapi have this structure:
```js
{
slug: string,
title: string,
category: 'architecture' | 'illustration' | 'other',
description: string,
image: string, // Cloudinary URL
year: string,
where: string,
who: string
}
```
1. **Start Strapi CMS (optional, for content changes):**
```bash
cd ../saelan-cms && npm run develop
# Runs on localhost:1337
```
2. **Start Next.js dev server:**
```bash
npm run dev
# Runs on localhost:3000
```
3. **Environment variables** (`.env.local`):
```
NEXT_PUBLIC_STRAPI_URL=http://localhost:1337
STRAPI_API_TOKEN=<read-only-token>
```
```bash
npm run dev # Development server
npm run build # Production build
npm run start # Production server
npm run lint # Run ESLint
```
All UI text follows Danish primary with English italic pattern:
```html
DANSK.<em>ENGLISH</em>
```
```bash
cd ../saelan-cms
npm run develop
```
```bash
cd ../saelan-cms
git add -A && git commit -m "description"
git push origin main
railway up --detach
```
- `NEXT_PUBLIC_STRAPI_URL` → production Strapi URL
- `STRAPI_API_TOKEN` → production read-only token
1. **Read the existing code** in the relevant files first
2. **Follow existing patterns**: bilingual labels, ISR data fetching, Server/Client component split
3. **Test locally** with both local and production Strapi URLs
4. **Maintain the minimal design aesthetic** — this is a clean, image-focused portfolio
1. **Content changes**: Make in Strapi admin panel
2. **Data model changes**: Update both Strapi schema AND `lib/projects.js` helper functions
3. **Category changes**: Update both Strapi collection type AND `Header.js` category filters
1. **Check Strapi connection**: Verify `NEXT_PUBLIC_STRAPI_URL` and `STRAPI_API_TOKEN`
2. **Check Network tab**: Strapi fetch calls should return 200 with JSON data
3. **Check localStorage**: Header visibility state stored in `hasSeenSplash`
4. **Check Console**: Custom events (`showHeader`, `resetSplash`) logged during navigation
1. Log into Strapi admin
2. Create new entry in Projects collection
3. Upload image to Cloudinary via Strapi media library
4. Set category, title, description, year, where, who
5. Frontend auto-updates via ISR (60s) or on next build
1. Replace font files in `public/fonts/`
2. Update font-face declarations in `app/globals.css`
3. Update `next/font/local` config in `app/layout.js`
1. Replace `public/polyrattanVideo.mp4`
2. Optionally update `public/logoTransparent.png` mask
3. Adjust video reveal timing in `app/page.js` if needed
Leave a review
No reviews yet. Be the first to review this skill!
# Download SKILL.md from killerskills.ai/api/skills/claudemd-portfolio-guide/raw