Zum Inhalt

๐Ÿš€ Scaling Guide

How to Add New Verticals to the G100 Ecosystem


๐ŸŽฏ Overview

Neue Instances (Verticals) kรถnnen in 5 Schritten hinzugefรผgt werden:

1. Define Asset Type
2. Configure Vocabulary
3. Setup Infrastructure
4. Implement Features
5. Deploy & Connect

Zeitaufwand: 2-4 Wochen (80% Demo)


๐Ÿ“‹ Step 1: Define Asset Type

Asset Definition Checklist

// types/assets.ts

interface YourAsset {
  // Identifiers
  id: string;
  category: 'your_category';

  // Core Properties
  manufacturer: string;
  model: string;
  identifier: string;  // VIN, Serial Number, etc.

  // Pricing
  base_price: number;
  currency: 'EUR' | 'USD';

  // Configuration (optional)
  configuration?: {
    options: string[];
    customizations: Record<string, unknown>;
  };

  // NFT (optional)
  nft_token_id?: string;
}

Example: Bavaria Yacht

interface BavariaYacht {
  id: string;
  category: 'yacht';
  manufacturer: 'Bavaria Yachts';
  model: 'R40 FLY' | 'C42' | 'SR41';
  hin: string;  // Hull Identification Number
  base_price: number;
  currency: 'EUR';
  configuration?: {
    hull_color: string;
    interior: string;
    engine: string;
    options: string[];
  };
  nft_token_id?: string;
}

๐Ÿ“ Step 2: Configure Vocabulary

2.1 Add Instance Config

// config/vocabulary.ts

export const vocabulary = {
  instances: {
    // ...existing (flo, morelo)

    bavaria: {
      asset: {
        'de-DE': 'Yacht',
        'en-US': 'Yacht',
        'fr-FR': 'Yacht',
      },
      party_a: {
        'de-DE': 'Werft',
        'en-US': 'Shipyard',
        'fr-FR': 'Chantier naval',
      },
      party_b: {
        'de-DE': 'Eigner',
        'en-US': 'Owner',
        'fr-FR': 'Propriรฉtaire',
      },
      test: {
        'de-DE': 'Probefahrt',
        'en-US': 'Sea Trial',
        'fr-FR': 'Essai en mer',
      },
    },
  },
};

2.2 Contract Types

// types/contracts.ts

export type ContractType = 
  // ...existing
  | 'yacht_kaufvertrag'
  | 'yacht_charter'
  | 'sea_trial'
  ;

๐Ÿ—๏ธ Step 3: Setup Infrastructure

3.1 Create Instance Workspace

# Copy MORELO template
cp -r templates/vertical-template bavaria-yachts
cd bavaria-yachts

# Install dependencies
npm install

3.2 Cloudflare D1 Database

# Create D1 database
npx wrangler d1 create bavaria-db

# Update wrangler.toml
# Copy database ID from output
# wrangler.toml
name = "bavaria-yachts"
main = "src/index.ts"
compatibility_date = "2024-01-01"

[[d1_databases]]
binding = "DB"
database_name = "bavaria-db"
database_id = "YOUR_DATABASE_ID_HERE"

[vars]
INSTANCE_ID = "bavaria"
API_URL = "https://api.contractplattform.dev"  # Optional

3.3 Database Schema

-- migrations/0001_init.sql

CREATE TABLE yachts (
  id TEXT PRIMARY KEY,
  manufacturer TEXT NOT NULL,
  model TEXT NOT NULL,
  hin TEXT UNIQUE,
  base_price REAL NOT NULL,
  configuration TEXT,  -- JSON
  nft_token_id TEXT,
  created_at INTEGER DEFAULT (strftime('%s', 'now'))
);

CREATE TABLE contracts (
  id TEXT PRIMARY KEY,
  type TEXT NOT NULL,
  status TEXT NOT NULL,
  yacht_id TEXT,
  party_a_data TEXT,  -- JSON
  party_b_data TEXT,  -- JSON
  financials TEXT,    -- JSON
  created_at INTEGER DEFAULT (strftime('%s', 'now')),
  signed_at INTEGER,
  FOREIGN KEY (yacht_id) REFERENCES yachts(id)
);

CREATE TABLE dealers (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  marina TEXT,
  email TEXT UNIQUE,
  created_at INTEGER DEFAULT (strftime('%s', 'now'))
);
# Apply migrations
npx wrangler d1 migrations apply bavaria-db --local
npx wrangler d1 migrations apply bavaria-db --remote

๐ŸŽจ Step 4: Implement Features

4.1 Core Features Checklist

Feature Priority Estimated Time
Yacht Konfigurator ๐Ÿ”ด High 1 week
Contract Generation ๐Ÿ”ด High 3 days
Dealer Dashboard ๐Ÿ”ด High 1 week
Sea Trial Booking ๐ŸŸก Medium 3 days
NFT Minting ๐ŸŸก Medium 3 days
CRM Integration ๐ŸŸข Low 1 week

4.2 Konfigurator Implementation

// src/routes/konfigurator.ts
import { Hono } from 'hono';

const app = new Hono();

app.get('/konfigurator', async (c) => {
  // Load yacht models
  const models = await c.env.DB
    .prepare('SELECT * FROM yachts WHERE manufacturer = ?')
    .bind('Bavaria Yachts')
    .all();

  return c.json({ success: true, data: models });
});

app.post('/konfigurator', async (c) => {
  const { model, configuration } = await c.req.json();

  // Calculate price with options
  const baseYacht = await c.env.DB
    .prepare('SELECT * FROM yachts WHERE id = ?')
    .bind(model)
    .first();

  const totalPrice = calculatePrice(baseYacht, configuration);

  return c.json({
    success: true,
    data: {
      yacht: baseYacht,
      configuration,
      total_price: totalPrice,
    },
  });
});

export default app;

4.3 Contract Generation

// src/services/contracts.ts

export async function createYachtContract(
  db: D1Database,
  data: {
    yacht_id: string;
    dealer: ContractParty;
    customer: ContractParty;
    financials: ContractFinancials;
  }
) {
  const contract = {
    id: generateId('ctr'),
    type: 'yacht_kaufvertrag',
    status: 'draft',
    yacht_id: data.yacht_id,
    party_a_data: JSON.stringify(data.dealer),
    party_b_data: JSON.stringify(data.customer),
    financials: JSON.stringify(data.financials),
  };

  await db
    .prepare(`
      INSERT INTO contracts (id, type, status, yacht_id, party_a_data, party_b_data, financials)
      VALUES (?, ?, ?, ?, ?, ?, ?)
    `)
    .bind(
      contract.id,
      contract.type,
      contract.status,
      contract.yacht_id,
      contract.party_a_data,
      contract.party_b_data,
      contract.financials
    )
    .run();

  return contract;
}

4.4 Document Templates

{{!-- templates/de-DE/yacht_kaufvertrag.hbs --}}

# Kaufvertrag - {{asset.manufacturer}} {{asset.model}}

**zwischen**

**{{party_a.name}}**  
Werft: {{party_a.marina}}  
{{party_a.address}}

*nachfolgend โ€žVerkรคufer" genannt*

**und**

**{{party_b.first_name}} {{party_b.last_name}}**  
{{party_b.address}}

*nachfolgend โ€žKรคufer" genannt*

---

## ยง 1 Kaufgegenstand

Der Verkรคufer verkauft dem Kรคufer die folgende Yacht:

- **Hersteller:** {{asset.manufacturer}}
- **Modell:** {{asset.model}}
- **Hull Identification Number (HIN):** {{asset.hin}}
- **Rumpffarbe:** {{asset.configuration.hull_color}}
- **Interieur:** {{asset.configuration.interior}}
- **Motor:** {{asset.configuration.engine}}

**Ausstattung:**
{{#each asset.configuration.options}}
- {{this}}
{{/each}}

---

## ยง 2 Kaufpreis

Der Kaufpreis betrรคgt:

**{{financials.total_amount}} {{financials.currency}}**

---

## ยง 3 Probefahrt

Eine Probefahrt wurde am {{test_date}} durchgefรผhrt.

---

## ยง 4 Unterschriften

**Ort, Datum:** ________________

**Verkรคufer:**  
_________________________

**Kรคufer:**  
_________________________

๐Ÿš€ Step 5: Deploy & Connect

5.1 Deploy to Cloudflare

# Test locally
npm run dev

# Deploy to production
npx wrangler deploy

5.2 Configure Domain

# Add custom domain in Cloudflare Dashboard
# bavaria.contractplattform.dev โ†’ bavaria-yachts worker

5.3 Connect to Master API (Optional)

// src/config/api.ts

export const apiConfig = {
  enabled: process.env.API_ENABLED === 'true',
  baseUrl: process.env.API_URL,
  apiKey: process.env.API_KEY,
};

// src/services/sync.ts

export async function syncContractToMaster(contract: Contract) {
  if (!apiConfig.enabled) return;

  try {
    const response = await fetch(`${apiConfig.baseUrl}/v1/contracts`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiConfig.apiKey}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        instance_id: 'bavaria',
        ...contract,
      }),
    });

    if (!response.ok) {
      console.error('Sync failed:', await response.text());
    }
  } catch (error) {
    console.error('Sync error:', error);
  }
}

๐Ÿ“š MkDocs Documentation

Create Instance Docs

cd bavaria-yachts
mkdir -p docs/docs

# Copy template
cp -r ../templates/mkdocs-template/* docs/

Update mkdocs.yml

site_name: Bavaria Yachts Platform
site_description: Yacht Sales & Charter Management

theme:
  name: material
  language: de
  palette:
    primary: blue
    accent: cyan

nav:
  - Home: index.md
  - Getting Started:
    - Installation: getting-started/installation.md
    - Configuration: getting-started/configuration.md
  - Features:
    - Yacht Konfigurator: features/konfigurator.md
    - Sea Trial Booking: features/sea-trial.md
    - Contract Management: features/contracts.md
  - Integrations:
    - Marina Systems: integrations/marina.md
    - Marine Finance: integrations/finance.md
  - API:
    - Overview: api/overview.md

Start Docs Server

cd docs
mkdocs serve -a 0.0.0.0:8200

โœ… Launch Checklist

Pre-Launch

  • [ ] Database migrations applied
  • [ ] Environment variables configured
  • [ ] Contract templates created (DE, EN)
  • [ ] Konfigurator working locally
  • [ ] Payment integration tested
  • [ ] Document generation tested

Launch

  • [ ] Deploy to Cloudflare Workers
  • [ ] Custom domain configured
  • [ ] SSL certificate active
  • [ ] MkDocs published
  • [ ] Analytics configured
  • [ ] Error tracking setup (Sentry)

Post-Launch

  • [ ] Monitor error logs
  • [ ] Test first contract end-to-end
  • [ ] Gather dealer feedback
  • [ ] Iterate on UX

๐ŸŽฏ 80% Demo Scope

Focus auf kritische Pfade:

โœ… Must Have

  • Konfigurator (Happy Path)
  • Contract Creation (Draft โ†’ Signed)
  • PDF Generation
  • Basic Dashboard

๐ŸŸก Nice to Have

  • Advanced Konfigurator features
  • CRM Integration
  • NFT Minting
  • Analytics Dashboard

โŒ Not Now

  • Multi-currency support
  • Advanced error handling
  • A/B testing
  • Mobile Apps

๐Ÿ“Š Timeline Estimate

Bavaria Yachts Example

Phase Duration Tasks
Week 1 Setup Infrastructure, DB, Templates
Week 2 Core Features Konfigurator, Contracts
Week 3 Integrations Payment, Documents
Week 4 Polish & Docs MkDocs, Testing, Deploy

Total: 4 weeks to 80% demo


๐Ÿ’ก Tips & Tricks

1. Copy from MORELO

MORELO ist das beste Template:

  • โœ… Konfigurator vorhanden
  • โœ… Contract Flow implementiert
  • โœ… NFT Minting ready
  • โœ… Dealer Dashboard

Einfach kopieren und Vocabulary anpassen!

2. Start with MVP

Nicht alle Features sofort:

  1. Konfigurator (simple Version)
  2. Contract PDF
  3. Payment (Stripe only)
  4. Dashboard (read-only)

Dann iterieren!

3. Use Shared Modules

npm install @contractplattform/core

Spart 60% Entwicklungszeit!


Next: Roadmap โ†’