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:
- Post Storage: Markdown files in
public/posts/ directory
- API Layer: Express server handles CRUD operations on markdown files
- Dynamic Index: Backend automatically generates
index.json when posts change
- Metadata Handling: Server-side parsing of frontmatter (
title:, desc:, tags:)
- 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):
- Navigate to
/admin in your browser
- Click "New Post" button
- Fill in title, description, tags, and content
- Use the Preview tab to see rendered markdown
- Click "Create Post" to save
Manual File Creation:
- Create new
.md file in public/posts/ directory
- Include frontmatter:
title: Your Title, desc: Description, tags: tag1, tag2
- Write content using supported markdown extensions
- Restart backend server to recognize new file
Editing Posts
Via Admin Interface:
- Go to
/admin and click "Edit" on any post
- Modify content in the editor with live preview
- Click "Update Post" to save changes
Direct File Editing:
- Edit the
.md file directly in public/posts/
- Changes will be reflected immediately via API
Markdown Features Supported
WYSIWYG Editor Features:
- Visual toolbar: Quick access to formatting (bold, italic, headers, lists, links, images, code)
- Multiple editing modes: Edit, Preview, and Live (split) modes
- Syntax highlighting: Enhanced code editing with monospace font
- Drag-to-resize: Adjustable panes in live mode
Standard Markdown Syntax Support:
- Text formatting: Bold, italic, strikethrough
- Headers: All levels (H1-H6)
- Lists: Ordered and unordered (with nesting)
- Links and images: Standard
[text](url) and  syntax
- Code: Inline
code and fenced code blocks with syntax highlighting
- Tables: GitHub-style tables (automatically made scrollable)
- Blockquotes: Standard
> syntax, great for callouts with emoji
- Horizontal rules:
--- or ***
- HTML support: Standard HTML tags when needed
- Emoji: GitHub-style
:emoji_name: syntax
- Footnotes: Standard
[^ref] syntax
- Collapsible content: HTML
<details><summary> tags
- Line breaks: Proper paragraph handling
Code Style
- Uses ESLint with React-specific rules
- Unused variables allowed if they follow
^[A-Z_] pattern
- ES2020+ features enabled
- JSX support configured
Markdown Compatibility
- Standards-compliant: Uses only widely-supported markdown features
- Portable content: Markdown files work with GitHub, GitLab, and other platforms
- No custom extensions: Avoids proprietary syntax that doesn't work elsewhere
- HTML fallback: When markdown isn't enough, standard HTML tags are supported
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
- Install frontend dependencies:
npm install
- Install backend dependencies:
cd backend && npm install
- Start development servers:
npm run dev
- Frontend will be available at
http://localhost:5173
- Backend API will be available at
http://localhost:3001
- 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
- Navigate to
/admin without authentication → redirected to /login
- Login with credentials → redirected to intended admin page
- Admin navigation only visible when authenticated
- 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)
- WYSIWYG Markdown Editor with multiple editing modes:
- Edit Mode: Source code editing with syntax highlighting
- Preview Mode: Live rendered markdown preview
- Live Mode: Split view with edit and preview side-by-side
- Visual toolbar with formatting buttons (bold, italic, headers, lists, links, etc.)
- Drag-to-resize editor panes in live mode
- Full support for standard markdown features (tables, footnotes, emoji, HTML tags)
- 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