๐ 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
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
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
โ 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:
- Konfigurator (simple Version)
- Contract PDF
- Payment (Stripe only)
- Dashboard (read-only)
Dann iterieren!
3. Use Shared Modules
Spart 60% Entwicklungszeit!
Next: Roadmap โ