diff --git a/output/plan.md b/output/plan.md
index 3401509..563df68 100644
--- a/output/plan.md
+++ b/output/plan.md
@@ -224,15 +224,143 @@ You receive:
## Phase 1: 90-Minute MVP Structure
-### 1.1 MVP Project Structure (Single File Focus)
+### 1.1 STEP-BY-STEP EXECUTION PLAN (MINUTE 0-90)
+
+#### **MINUTES 0-15: ENVIRONMENT SETUP**
+```bash
+# STEP 1: Create project structure
+mkdir -p output && cd output
+go mod init ydn.com
+
+# STEP 2: Create .env file
+cat > .env << EOF
+STRIPE_PUBLISHABLE_KEY=pk_test_...
+STRIPE_SECRET_KEY=sk_test_...
+OVH_APP_KEY=...
+OVH_APP_SECRET=...
+OVH_CONSUMER_KEY=...
+DOLIBARR_URL=http://localhost:8080
+DOLIBARR_API_TOKEN=...
+SMTP_HOST=smtp.mailgun.org
+SMTP_PORT=587
+SMTP_USER=...
+SMTP_PASS=...
+JWT_SECRET=...
+EOF
+
+# STEP 3: Install Go dependencies
+go get github.com/gin-gonic/gin
+go get github.com/stripe/stripe-go/v76
+go get github.com/ovh/go-ovh
+go get github.com/golang-jwt/jwt/v5
+go get gorm.io/gorm
+go get gorm.io/driver/sqlite
```
-output/
-├── main.go # Everything in one file
-├── index.html # Landing page
-├── style.css # Basic styling
-├── database.db # SQLite database
-├── .env # Environment variables
-└── README.md # Manual process documentation
+
+#### **MINUTES 15-45: DOCKER SETUP (MARIADB + DOLIBARR FIRST)**
+```bash
+# STEP 4: Create docker-compose.yml for Dolibarr
+cat > docker-compose.yml << EOF
+version: '3.8'
+services:
+ mariadb:
+ image: mariadb:10.11
+ environment:
+ MYSQL_ROOT_PASSWORD: rootpassword
+ MYSQL_DATABASE: dolibarr
+ MYSQL_USER: dolibarr
+ MYSQL_PASSWORD: dolibarrpass
+ volumes:
+ - mariadb_data:/var/lib/mysql
+ ports:
+ - "3306:3306"
+
+ dolibarr:
+ image: dolibarr/dolibarr:latest
+ environment:
+ DOLIBARR_DB_HOST: mariadb
+ DOLIBARR_DB_USER: dolibarr
+ DOLIBARR_DB_PASSWORD: dolibarrpass
+ DOLIBARR_DB_NAME: dolibarr
+ ports:
+ - "8080:80"
+ depends_on:
+ - mariadb
+ volumes:
+ - dolibarr_data:/var/www/html/documents
+
+volumes:
+ mariadb_data:
+ dolibarr_data:
+EOF
+
+# STEP 5: Start Dolibarr (VITAL - MUST BE FIRST)
+docker-compose up -d
+
+# STEP 6: Wait for Dolibarr to initialize (2 minutes)
+sleep 120
+
+# STEP 7: Configure Dolibarr via browser or API
+# Navigate to http://localhost:8080/install
+# Complete initial setup:
+# - Database: mariadb
+# - User: dolibarr/dolibarrpass
+# - Create admin account
+# - Enable API module
+# - Generate API token
+```
+
+#### **MINUTES 45-75: CORE APPLICATION**
+```bash
+# STEP 8: Create main.go (single file MVP)
+cat > main.go << 'EOF'
+package main
+
+import (
+ // All imports here
+ // Full application code
+)
+
+// All code in single file for MVP speed
+EOF
+
+# STEP 9: Create index.html
+cat > index.html << 'EOF'
+
+
+
+
+
+ YDN - Your Dream Hosting
+
+
+
+
+
+
+EOF
+
+# STEP 10: Test basic application
+go run main.go &
+curl http://localhost:8080
+```
+
+#### **MINUTES 75-90: INTEGRATION TESTING**
+```bash
+# STEP 11: Test Dolibarr integration
+curl -X POST "http://localhost:8080/api/index.php/prospects" \
+ -H "DOLAPIKEY: your_dolibarr_token" \
+ -H "Content-Type: application/json" \
+ -d '{"name":"Test Prospect","email":"test@example.com"}'
+
+# STEP 12: Test Stripe integration
+# Test payment form functionality
+
+# STEP 13: Test email verification
+# Test email sending and verification
+
+# STEP 14: Final MVP testing
+# End-to-end workflow test
```
### 1.2 MVP Technology Stack
@@ -243,48 +371,391 @@ output/
- Stripe Elements (payment form)
- Bootstrap 5 (styling)
- Dolibarr API (prospect creation - VITAL)
+- MariaDB (Dolibarr database)
- OVH API (domain checking only)
- SMTP/Mailgun (email verification)
```
## Phase 2: 12-36 Hour Complete Structure
-### 2.1 Full Project Structure
+### 2.1 STEP-BY-STEP EXECUTION PLAN (HOURS 1-12)
+
+#### **HOURS 1-3: DATABASE & AUTHENTICATION**
+```bash
+# STEP 15: Create PostgreSQL setup
+cat > docker-compose.prod.yml << EOF
+version: '3.8'
+services:
+ postgres:
+ image: postgres:15
+ environment:
+ POSTGRES_DB: ydn
+ POSTGRES_USER: ydn_user
+ POSTGRES_PASSWORD: ${DB_PASSWORD}
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ ports:
+ - "5432:5432"
+
+ redis:
+ image: redis:7
+ ports:
+ - "6379:6379"
+
+volumes:
+ postgres_data:
+EOF
+
+# STEP 16: Create database migrations
+mkdir -p migrations
+cat > migrations/001_initial.sql << EOF
+CREATE TABLE users (
+ id SERIAL PRIMARY KEY,
+ email VARCHAR(255) UNIQUE NOT NULL,
+ password_hash VARCHAR(255) NOT NULL,
+ email_verified BOOLEAN DEFAULT FALSE,
+ dolibarr_contact_id INTEGER,
+ stripe_customer_id VARCHAR(255),
+ created_at TIMESTAMP DEFAULT NOW(),
+ updated_at TIMESTAMP DEFAULT NOW()
+);
+
+CREATE TABLE email_verifications (
+ id SERIAL PRIMARY KEY,
+ email VARCHAR(255) NOT NULL,
+ token VARCHAR(255) NOT NULL,
+ used BOOLEAN DEFAULT FALSE,
+ expires_at TIMESTAMP NOT NULL,
+ created_at TIMESTAMP DEFAULT NOW()
+);
+
+CREATE TABLE subscriptions (
+ id SERIAL PRIMARY KEY,
+ user_id INTEGER REFERENCES users(id),
+ stripe_subscription_id VARCHAR(255) NOT NULL,
+ dolibarr_contract_id INTEGER,
+ status VARCHAR(50) NOT NULL,
+ created_at TIMESTAMP DEFAULT NOW(),
+ updated_at TIMESTAMP DEFAULT NOW()
+);
+
+CREATE TABLE services (
+ id SERIAL PRIMARY KEY,
+ user_id INTEGER REFERENCES users(id),
+ domain_name VARCHAR(255) NOT NULL,
+ vps_id VARCHAR(255),
+ vps_ip INET,
+ cloudron_url VARCHAR(255),
+ cloudron_admin_token VARCHAR(255),
+ cloudron_invite_sent BOOLEAN DEFAULT FALSE,
+ dolibarr_project_id INTEGER,
+ status VARCHAR(50) NOT NULL,
+ created_at TIMESTAMP DEFAULT NOW(),
+ updated_at TIMESTAMP DEFAULT NOW()
+);
+EOF
+
+# STEP 17: Create modular Go structure
+mkdir -p {cmd/{api,worker,migrate},internal/{auth,billing,config,database,dolibarr,handlers,middleware,models,ovh,queue,stripe,cloudron,workers},pkg/{logger,validator,response,errors},web/{static,templates},tests/{unit,integration,e2e}}
+
+# STEP 18: Create authentication module
+cat > internal/auth/jwt.go << 'EOF'
+package auth
+
+import (
+ "github.com/golang-jwt/jwt/v5"
+ "time"
+)
+
+type Claims struct {
+ UserID uint `json:"user_id"`
+ Email string `json:"email"`
+ jwt.RegisteredClaims
+}
+
+func GenerateToken(userID uint, email string, secret string) (string, error) {
+ // JWT generation logic
+}
+
+func ValidateToken(tokenString, secret string) (*Claims, error) {
+ // JWT validation logic
+}
+EOF
+```
+
+#### **HOURS 4-6: API INTEGRATION**
+```bash
+# STEP 19: Create Dolibarr integration
+cat > internal/dolibarr/client.go << 'EOF'
+package dolibarr
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "net/http"
+)
+
+type Client struct {
+ BaseURL string
+ APIKey string
+ HTTPClient *http.Client
+}
+
+type Prospect struct {
+ Name string `json:"name"`
+ Email string `json:"email"`
+ Source string `json:"source"`
+ Status string `json:"status"`
+}
+
+func NewClient(baseURL, apiKey string) *Client {
+ return &Client{
+ BaseURL: baseURL,
+ APIKey: apiKey,
+ HTTPClient: &http.Client{},
+ }
+}
+
+func (c *Client) CreateProspect(prospect *Prospect) (int, error) {
+ // Dolibarr API call to create prospect
+ // VITAL: This must work in MVP
+}
+EOF
+
+# STEP 20: Create OVH integration
+cat > internal/ovh/client.go << 'EOF'
+package ovh
+
+import (
+ "github.com/ovh/go-ovh/ovh"
+)
+
+type Client struct {
+ client *ovh.Client
+}
+
+func NewClient(appKey, appSecret, consumerKey string) (*Client, error) {
+ client, err := ovh.NewClient(
+ ovh.EndPoint[ovh.EU_West],
+ appKey,
+ appSecret,
+ consumerKey,
+ )
+ if err != nil {
+ return nil, err
+ }
+ return &Client{client: client}, nil
+}
+
+func (c *Client) CheckDomainAvailability(domain string) (bool, error) {
+ // OVH domain availability check
+}
+EOF
+
+# STEP 21: Create Stripe integration
+cat > internal/stripe/client.go << 'EOF'
+package stripe
+
+import (
+ "github.com/stripe/stripe-go/v76"
+ "github.com/stripe/stripe-go/v76/customer"
+ "github.com/stripe/stripe-go/v76/checkout/session"
+ "github.com/stripe/stripe-go/v76/subscription"
+)
+
+type Client struct {
+ apiKey string
+}
+
+func NewClient(apiKey string) *Client {
+ stripe.Key = apiKey
+ return &Client{apiKey: apiKey}
+}
+
+func (c *Client) CreateCheckoutSession(customerEmail, successURL, cancelURL string) (string, error) {
+ // Stripe checkout session creation
+}
+EOF
+```
+
+#### **HOURS 7-9: WORKER QUEUE SYSTEM**
+```bash
+# STEP 22: Create Redis queue system
+cat > internal/queue/redis.go << 'EOF'
+package queue
+
+import (
+ "context"
+ "encoding/json"
+ "github.com/redis/go-redis/v9"
+)
+
+type Task struct {
+ ID string `json:"id"`
+ Type string `json:"type"`
+ Payload map[string]interface{} `json:"payload"`
+ Priority int `json:"priority"`
+}
+
+type Queue struct {
+ client *redis.Client
+}
+
+func NewQueue(redisAddr string) (*Queue, error) {
+ client := redis.NewClient(&redis.Options{
+ Addr: redisAddr,
+ })
+ return &Queue{client: client}, nil
+}
+
+func (q *Queue) Enqueue(ctx context.Context, task *Task) error {
+ // Redis queue implementation
+}
+
+func (q *Queue) Dequeue(ctx context.Context) (*Task, error) {
+ // Redis queue implementation
+}
+EOF
+
+# STEP 23: Create worker processes
+cat > internal/workers/provisioning.go << 'EOF'
+package workers
+
+import (
+ "context"
+ "ydn.com/internal/queue"
+ "ydn.com/internal/ovh"
+ "ydn.com/internal/cloudron"
+)
+
+type ProvisioningWorker struct {
+ queue *queue.Queue
+ ovhClient *ovh.Client
+ cloudronClient *cloudron.Client
+}
+
+func (w *ProvisioningWorker) Start(ctx context.Context) {
+ for {
+ task, err := w.queue.Dequeue(ctx)
+ if err != nil {
+ continue
+ }
+ w.processTask(ctx, task)
+ }
+}
+
+func (w *ProvisioningWorker) processTask(ctx context.Context, task *queue.Task) {
+ switch task.Type {
+ case "domain_register":
+ w.registerDomain(ctx, task)
+ case "vps_create":
+ w.createVPS(ctx, task)
+ case "cloudron_install":
+ w.installCloudron(ctx, task)
+ }
+}
+EOF
+```
+
+#### **HOURS 10-12: FRONTEND & TESTING**
+```bash
+# STEP 24: Create accessible frontend
+cat > web/templates/layout.html << 'EOF'
+{{define "layout"}}
+
+
+
+
+
+ {{.Title}} - YDN
+
+
+
+
+
+
+ {{template "content" .}}
+
+
+
+
+{{end}}
+EOF
+
+# STEP 25: Create comprehensive tests
+cat > tests/integration/dolibarr_test.go << 'EOF'
+package integration
+
+import (
+ "testing"
+ "ydn.com/internal/dolibarr"
+)
+
+func TestDolibarrProspectCreation(t *testing.T) {
+ client := dolibarr.NewClient("http://localhost:8080", "test_token")
+
+ prospect := &dolibarr.Prospect{
+ Name: "Test User",
+ Email: "test@example.com",
+ Source: "YDN Web Form",
+ Status: "Lead",
+ }
+
+ id, err := client.CreateProspect(prospect)
+ if err != nil {
+ t.Fatalf("Failed to create prospect: %v", err)
+ }
+
+ if id <= 0 {
+ t.Error("Expected valid prospect ID")
+ }
+}
+EOF
+```
+
+### 2.2 Full Project Structure
```
output/
├── cmd/
-│ ├── api/
-│ │ └── main.go # Main application
-│ ├── worker/
-│ │ └── main.go # Background processing
-│ └── migrate/
-│ └── main.go # Database migrations
+│ ├── api/main.go # Main application
+│ ├── worker/main.go # Background processing
+│ └── migrate/main.go # Database migrations
├── internal/
-│ ├── auth/ # JWT authentication
-│ ├── billing/ # Stripe integration
-│ ├── config/ # Configuration management
-│ ├── database/ # Database operations
-│ ├── dolibarr/ # Dolibarr integration
-│ ├── handlers/ # HTTP handlers
-│ ├── middleware/ # Basic middleware
-│ ├── models/ # Data models
-│ ├── ovh/ # OVH API integration
-│ ├── queue/ # Worker queue management
-│ ├── stripe/ # Payment processing
-│ ├── cloudron/ # Cloudron integration
-│ └── workers/ # Background workers
+│ ├── auth/jwt.go # JWT authentication
+│ ├── billing/stripe.go # Stripe integration
+│ ├── config/config.go # Configuration management
+│ ├── database/postgres.go # Database operations
+│ ├── dolibarr/client.go # Dolibarr integration (VITAL)
+│ ├── handlers/ # HTTP handlers
+│ ├── middleware/auth.go # Authentication middleware
+│ ├── models/user.go # Data models
+│ ├── ovh/client.go # OVH API integration
+│ ├── queue/redis.go # Worker queue management
+│ ├── stripe/client.go # Payment processing
+│ ├── cloudron/install.go # Cloudron integration
+│ └── workers/provisioning.go # Background workers
├── pkg/
-│ ├── logger/ # Structured logging
-│ ├── validator/ # Input validation
-│ ├── response/ # API responses
-│ └── errors/ # Error handling
+│ ├── logger/logger.go # Structured logging
+│ ├── validator/validator.go # Input validation
+│ ├── response/response.go # API responses
+│ └── errors/errors.go # Error handling
├── web/
│ ├── static/ # CSS, JS, images
-│ └── templates/ # HTML templates
+│ └── templates/ # HTML templates (accessible)
├── tests/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ └── e2e/ # End-to-end tests
+├── docker-compose.yml # Dolibarr setup
+├── docker-compose.prod.yml # Production setup
+├── migrations/ # Database migrations
├── go.mod
├── go.sum
└── README.md