Files
bookhoard/PROJECT_GUIDELINES.md
T
john-okeefe 0a97b679a6 docs: Add hybrid SSR and project guidelines documentation
- Document hybrid SSR architecture for frontend implementation
- Add project guidelines for development workflow
- Explain API preservation and SSR approach
2026-01-31 22:32:52 -05:00

6.4 KiB

Combined Project Guidelines for Bookmann

🚨 CRITICAL PROHIBITIONS (Never violate these)

Backend & Database

  • NEVER modify backend code when working on frontend-only tasks
  • NEVER modify database schema unless explicitly instructed for full-stack changes
  • NEVER use Docker - use Podman only
  • NEVER build server binaries locally - all builds through Dockerfile/docker-compose
  • NEVER create new migration files - merge changes into current one until release
  • NEVER use git checkout on schema files without checking what will be lost
  • NEVER break existing functionality unless explicitly instructed

Frontend & Styling

  • NEVER modify backend/API for frontend features without user confirmation
  • NEVER use custom CSS - TailwindCSS classes only
  • NEVER use JavaScript - convert all to TypeScript
  • NEVER use object-oriented programming patterns - use functional/other paradigms
  • NEVER add new Dockerfiles without user confirmation

General

  • NEVER skip pre-commit hooks unless explicitly requested
  • NEVER force push to main/master branches
  • NEVER commit files with secrets (.env, credentials.json, etc.)
  • NEVER make assumptions - ask clarifying questions when uncertain

🎯 CONTEXT-SPECIFIC RULES

When Working on Frontend-Only Tasks

  • DO NOT touch backend code - handlers, services, database layer
  • DO NOT modify API routes - use existing endpoints only
  • DO NOT change database schema - work with existing structure
  • If backend change seems necessary:
    1. Identify the required change
    2. Explain why you need it
    3. Provide impact analysis
    4. ASK FOR USER CONFIRMATION before proceeding

When Working on Full-Stack Tasks

  • Backend changes are allowed when explicitly part of the task
  • Still follow all database protocols (atomic changes, validation, etc.)
  • Still use Podman for all builds
  • Still include Bruno tests for API changes

MANDATORY REQUIREMENTS

Database Operations (Full-Stack Tasks Only)

  • Follow pgx v5 standards for all database operations
  • Treat schema changes as ATOMIC - complete success or complete rejection
  • When schema changes occur: delete database and rebuild with clean Podman cache
  • Use pre-change checklist: read schema → identify columns → plan changes → verify → read back
  • Post-change validation: ensure schema.sql, models.go, and queries.sql are in sync

Build & Deployment

  • Use Podman exclusively (not Docker)
  • All builds through existing Dockerfile and docker-compose.yml
  • Stop building server binaries - everything goes through containers

API Changes (Full-Stack Tasks Only)

  • Include Bruno v3.0 .bru requests with all API documentation
  • Tests must be comprehensive and cover three contexts: no user, user, and admin
  • Maintain backward compatibility for mobile apps and external consumers

Frontend & Styling

  • Always use TailwindCSS classes for all styling
  • Convert all JavaScript to TypeScript
  • Avoid OOP patterns - prefer functional/other paradigms

Code Organization

  • Minimize project structure changes
  • Place new files in contextually appropriate directories
  • Follow KISS, DRY, and YAGNI principles
  • Use multiple, logical git commits with clear messages

Configuration & Environment

  • If .env is missing, auto-generate secure values
  • Never commit secrets to repository

Documentation

  • Update README.md when users/admins need to be informed
  • Document API changes with Bruno collections

Process & Continuity

  • If mid-task and receive "no response", continue the task
  • Verify no regressions before modifying/removing code

🔧 TECHNICAL STANDARDS

Backend Stack

  • Language: Go 1.25+
  • Database: PostgreSQL 15+ with pgx v5 driver only
  • Authentication: JWT tokens with bcrypt password hashing
  • Architecture: Service layer pattern (handlers → services → database)

Frontend Stack

  • Styling: TailwindCSS (no custom CSS)
  • Language: TypeScript (no JavaScript)
  • Templates: HTMX with server-side rendering
  • Patterns: Functional/other (no OOP)

Containerization

  • Runtime: Podman (not Docker)
  • Build: Existing Dockerfile and docker-compose.yml only
  • No local builds allowed

📋 WORKFLOW CHECKLISTS

Before Making Frontend-Only Changes

  • Identify if backend modification could make implementation simpler
  • Plan to use existing API endpoints only
  • If backend change seems necessary, prepare confirmation request:
    • Required change description
    • Why it would help
    • Impact analysis
    • Alternative approaches considered
  • Plan git commit structure (multiple logical commits)
  • Identify if README.md needs updates

Before Making Full-Stack Changes

  • Read current schema completely (if database changes)
  • Identify all columns that must be preserved
  • Plan exact changes needed
  • Verify Podman will be used for builds
  • Plan git commit structure (multiple logical commits)

During Schema Changes (Full-Stack Only)

  • Read current schema completely
  • Identify all columns that must be preserved
  • Plan exact changes needed
  • Set up verification step
  • Make intended changes
  • Immediately verify by reading back modified sections
  • Confirm ALL expected columns are present
  • Verify schema.sql, models.go, and queries.sql are in sync

After API Changes

  • Create/update Bruno v3.0 .bru requests
  • Test with no user context
  • Test with regular user context
  • Test with admin context
  • Verify backward compatibility

Before Committing

  • Run tests: go test ./... -v
  • Run lint/typecheck if available
  • Ensure no secrets in changes
  • Verify logical commit structure
  • Update README.md if user-facing changes

🏗 ARCHITECTURAL PATTERNS

Current: API-Driven Frontend

Browser → Go template (empty) → JavaScript fetch() → API → Database

Future Reference: Hybrid SSR (NOT TO IMPLEMENT YET)

Browser → Go template (with data) → Display instantly
                    ↓
         JavaScript only for interactivity (CRUD)
                    ↓
              Shared service layer

Ultimately, whenever you are unsure just ask for confirmation.