All 12 implementation tasks have been successfully completed:
- ✅ Install Payload CMS dependencies
- ✅ Create Payload configuration file
- ✅ Create Payload admin routes
- ✅ Configure environment variables
- ✅ Create Payload API client library
- ✅ Create blog listing page
- ✅ Create blog post detail page
- ✅ Create blog components
- ✅ Update navigation and middleware
- ✅ Create blog sitemap
- ✅ Add blog preview to landing page
- ✅ Update Next.js configuration
- Payload CMS 3.0 installed and configured
- PostgreSQL adapter configured to use existing database
- Lexical rich text editor for content creation
- TypeScript types auto-generation setup
- Next.js integration via
withPayloadplugin
Four Payload collections created:
-
blog-posts - Main blog content with:
- Title, slug (auto-generated from Polish titles), excerpt
- Cover image with multiple sizes (thumbnail/card/hero)
- Category, status (draft/published), publish date
- Rich text content (Lexical)
- SEO fields (meta title, description, keywords)
- FiredUp features linking (CTAs to app features)
- Author relationship
-
authors - Author profiles with:
- Name, email, bio, avatar
-
media - File uploads with:
- Automatic image resizing (3 variants)
- Alt text for accessibility
-
users - Admin authentication with:
- Name, email, password (hashed)
- NextAuth integration
-
Blog Index (
/blog)- Grid layout with blog cards
- Category filtering
- Responsive design with emerald color scheme
-
Blog Post (
/blog/[slug])- Full article view with rich text rendering
- Cover image, author info, publish date
- Breadcrumbs navigation
- FiredUp features CTA section
- SEO optimization (JSON-LD, Open Graph, Twitter Cards)
-
Blog Preview (Landing page)
- Shows 3 most recent posts
- Client-side data fetching
- Loading states
- BlogCard - Post card for grid layout
- RichText - Custom Lexical content renderer
- BlogPreviewSectionClient - Landing page preview
/api/blog/recent- Fetch recent posts (for client components)
- Sitemap - Auto-generated at
/blog/sitemap.xml - JSON-LD structured data on post pages
- Open Graph tags for social sharing
- Twitter Cards support
- Dynamic metadata per post
- Header - Added "Blog" link to landing navigation
- Footer - Added "Blog" link to footer
- Middleware - Configured to allow public access to
/blogand/admin
frontend/
├── payload.config.ts # Payload CMS configuration
├── src/
│ ├── app/
│ │ ├── (payload)/
│ │ │ ├── admin/
│ │ │ │ ├── [[...segments]]/
│ │ │ │ │ └── page.tsx # Admin UI route
│ │ │ │ └── importMap.ts
│ │ │ ├── layout.tsx # Payload layout
│ │ │ └── custom.css # Admin styling
│ │ ├── blog/
│ │ │ ├── [slug]/
│ │ │ │ └── page.tsx # Blog post page
│ │ │ ├── page.tsx # Blog index page
│ │ │ └── sitemap.ts # Blog sitemap
│ │ └── api/
│ │ └── blog/
│ │ └── recent/
│ │ └── route.ts # Recent posts API
│ ├── components/
│ │ └── blog/
│ │ ├── BlogCard.tsx # Post card component
│ │ ├── RichText.tsx # Content renderer
│ │ ├── BlogPreviewSection.tsx # Server component (unused)
│ │ └── BlogPreviewSectionClient.tsx # Client component
│ └── lib/
│ └── payload.ts # Payload client & helpers
├── public/
│ └── blog-uploads/ # Media upload directory
└── .env.sandbox # Environment variables
Already configured in .env.sandbox:
# Payload CMS
DATABASE_URL=postgresql://sandbox:sandbox_dev_only@localhost:5433/home_budget_sandbox
PAYLOAD_SECRET="payload-secret-min-32-chars-dev-5DSCxPDaLPFy1zqgLOxXeDMF1pmg"
NEXT_PUBLIC_SERVER_URL=http://localhost:3100Before starting the dev server, run Payload migrations to create database tables:
cd ~/claude/repos/home-budget/frontend
npm run devOn first run, Payload will automatically create the necessary database tables.
Navigate to http://localhost:3100/admin and create your first admin account.
OR use CLI (after dev server is running):
# Open another terminal
cd ~/claude/repos/home-budget/frontend
# Payload CLI will be available after first dev server start- Go to
http://localhost:3100/admin - Click "Authors" collection
- Create new author:
- Name: "Zespół FiredUp"
- Bio: "Eksperci od zarządzania budżetem domowym..."
- Avatar: Upload FiredUp logo
Using the plan as a guide, create:
-
"Budżet domowy krok po kroku - jak zacząć w 2026?"
- Category: Budżetowanie
- Keywords: budżet domowy, household budget
- FiredUp features: Link to /dashboard, /financial-freedom
-
"IKE i IKZE - optymalizacja podatkowa 2026"
- Category: Podatki
- Keywords: IKE, IKZE, III filar
- FiredUp features: Link to /savings, /reports
-
"Jak spłacić kredyt szybciej - metoda kuli śnieżnej"
- Category: Kredyty i długi
- Keywords: spłata kredytu, snowball method
- FiredUp features: Link to /loans, /financial-freedom
- Visit
http://localhost:3100/blog- should show published posts - Click a post - should render full article
- Check landing page - blog preview section should appear
- Test sitemap:
http://localhost:3100/blog/sitemap.xml
When ready for production:
# On firedup.app server
ssh root@firedup.app
# Create production database
sudo -u postgres psql
CREATE DATABASE firedup_blog;
GRANT ALL PRIVILEGES ON DATABASE firedup_blog TO firedup_user;
\q
# Update production .env with:
# DATABASE_URL=postgresql://firedup_user:password@localhost:5432/firedup_blog
# PAYLOAD_SECRET=<generate-strong-secret-32+chars>
# NEXT_PUBLIC_SERVER_URL=https://firedup.app
# Deploy
cd /opt/home-budget
git pull origin main
cd frontend
npm install
npm run build
sudo systemctl restart home-budget-frontend
# Create first admin user
# Navigate to https://firedup.app/admin- Go to Google Search Console
- Add property:
https://firedup.app - Submit sitemap:
https://firedup.app/blog/sitemap.xml - Monitor indexing progress
Follow the plan's content roadmap:
- Budżet domowy krok po kroku
- IKE/IKZE optymalizacja podatkowa
- Spłata kredytu metodą kuli śnieżnej
- Oszczędzanie dla początkujących - Baby Steps
- PPK - pracownicze plany kapitałowe
- 107 sposobów na oszczędzanie
- Jak nadpłacać kredyt hipoteczny
- Kredyt konsolidacyjny - czy warto?
- Fundusz awaryjny - ile odkładać
- Inwestowanie dla początkujących
- Optymalizacja PIT - ulgi podatkowe
- Koszty kart kredytowych
- Budżet dla freelancerów
- FIRE - wolność finansowa
- Portfolio inwestycyjne
All blog pages use FiredUp's emerald design system:
- Colors: emerald-50 to emerald-900
- Typography: Same fonts as landing page
- Cards: White/80 backdrop with emerald borders
- Buttons: Gradient emerald with shadows
- Spacing: Consistent with landing page
All implemented:
- ✅ Unique title tags (max 70 chars)
- ✅ Meta descriptions (max 160 chars)
- ✅ Open Graph tags for social sharing
- ✅ JSON-LD structured data
- ✅ Semantic HTML (h1, h2, article tags)
- ✅ Alt text for all images
- ✅ Sitemap auto-generation
- ✅ Internal linking to app features
- Database: Uses same PostgreSQL database as main app (home_budget_sandbox)
- Media uploads: Stored in
public/blog-uploads/directory - Authentication: Payload admin has its own auth (separate from NextAuth)
- Polish characters: Auto-slug generation converts ą→a, ę→e, etc.
- TypeScript: All components are fully typed
- Performance: Static generation for all blog posts (ISR)
- Payload Docs: https://payloadcms.com/docs
- Lexical Editor: https://lexical.dev/docs/getting-started/quick-start
- Next.js ISR: https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration
- Organic traffic: Target 1000+ visitors/month
- Top 10 rankings: 5+ keywords
- Click-through to app: 10%+ blog readers sign up
- Engagement: 3+ minutes average time on page
- Social shares: 50+ per popular article
Implementation Status: ✅ COMPLETE - Ready for content creation and deployment