WARP.md 11 KB

WARP.md

This file provides guidance to WARP (warp.dev) when working with code in this repository.

Project Overview

"The gooneral wheelchair" is a full-stack personal CMS (Content Management System) built with React frontend and Node.js/Express backend. The system provides both a public blog interface and a complete admin dashboard for managing posts dynamically through a REST API.

Development Commands

Full-Stack Development

  • Start both servers: npm run dev - Runs both frontend (Vite) and backend (Express) servers concurrently
  • Frontend only: npm run dev:frontend - Runs Vite dev server on port 5173
  • Backend only: npm run dev:backend - Runs Express API server on port 3001

Production Commands

  • Build frontend: npm run build - Creates optimized production build in dist/
  • Start backend: npm run start:backend - Starts production Express server
  • Preview frontend: npm run preview - Serves the built application locally

Code Quality

  • Lint code: npm run lint - Runs ESLint on all JavaScript/JSX files

Package Management

  • Install all dependencies: npm install && cd backend && npm install
  • Add frontend dependency: npm install <package-name>
  • Add backend dependency: cd backend && npm install <package-name>
  • Add dev dependency: npm install -D <package-name>

Architecture Overview

Full-Stack Architecture

  • Frontend: React SPA with React Router for navigation
  • Backend: Node.js/Express API server with REST endpoints
  • Database: File-system based (markdown files in public/posts/)
  • Communication: Frontend communicates with backend via REST API calls

Frontend Structure

  • Entry Point: src/main.jsx - React application entry with StrictMode
  • Main Router: src/App.jsx - React Router setup with route definitions
  • Components:
    • BlogHome - Public blog homepage with post grid
    • PostView - Individual post display component
    • AdminDashboard - Admin interface for managing posts
    • PostEditor - Create/edit post interface with live preview
  • Styling: Tailwind CSS 4.x via Vite plugin

Backend API Structure

  • Server: backend/server.js - Express server with CORS and session management
  • Authentication: Session-based authentication with bcrypt password hashing
  • API Base URL: http://localhost:3001/api
  • Public Endpoints:
    • GET /api/posts - Fetch all posts with metadata
    • GET /api/posts/:slug - Fetch specific post
    • GET /api/health - Health check endpoint
  • Authentication Endpoints:
    • POST /api/auth/login - User login
    • POST /api/auth/logout - User logout
    • GET /api/auth/me - Get current user info
    • POST /api/auth/change-password - Change user password (requires auth)
  • Protected Endpoints (require admin authentication):
    • POST /api/posts - Create new post
    • PUT /api/posts/:slug - Update existing post
    • DELETE /api/posts/:slug - Delete post

Content Management System

The CMS operates on a hybrid approach:

  1. Post Storage: Markdown files in public/posts/ directory
  2. API Layer: Express server handles CRUD operations on markdown files
  3. Dynamic Index: Backend automatically generates index.json when posts change
  4. Metadata Handling: Server-side parsing of frontmatter (title:, desc:, tags:)
  5. Admin Interface: Full CRUD interface accessible at /admin

Markdown Processing Pipeline

The application uses an extensive MarkdownIt setup with multiple plugins:

  • Base Configuration: HTML enabled, linkify, typographer
  • Extensions: Emoji, abbreviations, subscript/superscript, insertions, marks, definition lists, footnotes, spoilers
  • Custom Containers: Info, warning, and spoiler containers
  • Table Enhancement: Wraps tables in scrollable containers
  • Sanitization: DOMPurify for XSS protection

Client-Side Routing

  • Uses React Router for navigation
  • Route pattern: /posts/{slug} maps to post slugs
  • Home route / shows post grid
  • Admin routes under /admin for content management

Routing Structure

Frontend Routes:

  • / - Blog homepage (BlogHome component)
  • /posts/:slug - Individual post view (PostView component)
  • /login - Login form (LoginForm component)
  • /admin - Admin dashboard (AdminDashboard component) - Protected
  • /admin/post/new - Create new post (PostEditor component) - Protected
  • /admin/post/:slug/edit - Edit existing post (PostEditor component) - Protected

API Routes:

  • GET /api/posts - List all posts
  • GET /api/posts/:slug - Get single post
  • POST /api/posts - Create post
  • PUT /api/posts/:slug - Update post
  • DELETE /api/posts/:slug - Delete post

File Structure Patterns

Frontend Source Code

  • src/App.jsx - Main router component with route definitions and auth integration
  • src/main.jsx - React entry point
  • src/index.css - Global styles (Tailwind imports)
  • src/contexts/AuthContext.jsx - Authentication context and state management
  • src/components/AdminDashboard.jsx - Admin interface component
  • src/components/PostEditor.jsx - Post creation/editing interface
  • src/components/LoginForm.jsx - User login form
  • src/components/ProtectedRoute.jsx - Route protection wrapper

Backend Source Code

  • backend/server.js - Express API server with authentication
  • backend/auth.js - Authentication utilities and user management
  • backend/users.json - User data storage (auto-generated)
  • backend/package.json - Backend dependencies and scripts

Content

  • public/posts/*.md - Blog post markdown files (managed via API)
  • public/posts/index.json - Auto-generated file list (managed by backend)
  • public/posts/image.png - Post assets (images referenced in markdown)

Configuration

  • package.json - Frontend dependencies and development scripts
  • backend/package.json - Backend dependencies
  • vite.config.js - Vite configuration with React and Tailwind (no custom plugins)
  • eslint.config.js - ESLint configuration with React rules

Development Workflow

Adding New Posts

Via Admin Interface (Recommended):

  1. Navigate to /admin in your browser
  2. Click "New Post" button
  3. Fill in title, description, tags, and content
  4. Use the Preview tab to see rendered markdown
  5. Click "Create Post" to save

Manual File Creation:

  1. Create new .md file in public/posts/ directory
  2. Include frontmatter: title: Your Title, desc: Description, tags: tag1, tag2
  3. Write content using supported markdown extensions
  4. Restart backend server to recognize new file

Editing Posts

Via Admin Interface:

  1. Go to /admin and click "Edit" on any post
  2. Modify content in the editor with live preview
  3. Click "Update Post" to save changes

Direct File Editing:

  1. Edit the .md file directly in public/posts/
  2. Changes will be reflected immediately via API

Markdown Features Supported

  • Standard markdown syntax
  • Emoji (:emoji_name: syntax)
  • Footnotes ([^ref] and [^ref]: content)
  • Custom containers (:::info, :::warning, :::spoiler)
  • Abbreviations, subscript/superscript, insertions, marks
  • Definition lists
  • Spoiler text with custom syntax
  • Tables (automatically made scrollable)

Code Style

  • Uses ESLint with React-specific rules
  • Unused variables allowed if they follow ^[A-Z_] pattern
  • ES2020+ features enabled
  • JSX support configured

Custom Implementation Notes

State Management

Each React component manages its own state with useState hooks:

  • BlogHome: posts, loading, error - For blog homepage
  • PostView: post, loading, error - For individual post display
  • AdminDashboard: posts, loading, error - For admin post list
  • PostEditor: formData, loading, saving, error, previewMode - For post editing

API Integration

All components use fetch() to communicate with the Express backend:

  • Base URL: http://localhost:3001/api
  • Error Handling: Consistent error states across components
  • Loading States: All API calls show loading indicators
  • CRUD Operations: Full create, read, update, delete functionality

Unusual Function Names

The codebase contains intentionally obscure function names (e.g., giveFoxHerHeir, getTingyun, travelToExpress, conceiveFoxFromSemen) - this appears to be a stylistic choice and should be preserved when making changes.

Content Processing

  • Metadata extracted via regex patterns from markdown content
  • HTML content sanitized with DOMPurify before rendering
  • Dynamic title updates based on selected post
  • Custom image credit parsing for blog post assets

Development Setup

Initial Setup

  1. Install frontend dependencies: npm install
  2. Install backend dependencies: cd backend && npm install
  3. Start development servers: npm run dev
  4. Frontend will be available at http://localhost:5173
  5. Backend API will be available at http://localhost:3001
  6. Admin interface accessible at http://localhost:5173/admin

Production Deployment

Frontend: Can be deployed to static hosting (Netlify, Vercel, etc.) Backend: Requires Node.js server environment (Heroku, Railway, DigitalOcean, etc.) Database: File system based, no external database required

Environment Variables

  • PORT - Backend server port (default: 3001)
  • NODE_ENV - Environment mode for backend

Authentication System

Default Credentials

  • Username: admin
  • Password: admin123
  • ⚠️ IMPORTANT: Change the default password immediately after first login

Security Features

  • Session-based authentication with secure cookies
  • Bcrypt password hashing (10 rounds)
  • Protected API endpoints require admin role
  • Frontend route protection with automatic redirects
  • Session timeout after 24 hours of inactivity

User Management

  • Single admin user system (expandable)
  • Password change functionality in admin interface
  • Automatic user file creation on first server start
  • Session persistence across browser sessions

Admin Interface Features

Authentication Flow

  1. Navigate to /admin without authentication → redirected to /login
  2. Login with credentials → redirected to intended admin page
  3. Admin navigation only visible when authenticated
  4. Logout clears session and redirects to homepage

Dashboard (/admin) - Requires Authentication

  • Overview statistics (total posts, recent posts)
  • Post management table with edit/delete actions
  • Quick access to create new posts
  • User greeting and logout functionality

Post Editor (/admin/post/new or /admin/post/:slug/edit) - Requires Authentication

  • Rich form interface for post metadata (title, description, tags)
  • Large textarea for markdown content
  • Live preview tab with full markdown rendering
  • Save/cancel actions with error handling
  • Automatic slug generation from title for new posts

Login Form (/login)

  • Clean, responsive login interface
  • Error handling for invalid credentials
  • Default credentials display for initial setup
  • Automatic redirect after successful login