fix: rebuild docs/ with latest GPU specs
@@ -22,7 +22,7 @@ const CloudPricing: React.FC = () => {
|
||||
|
||||
const instances: GPUInstance[] = [
|
||||
{
|
||||
gpu: 'NVIDIA B300',
|
||||
gpu: 'NVIDIA B300 (Blackwell Ultra)',
|
||||
gpuCount: 8,
|
||||
processor: 'Dual 64-Core',
|
||||
ram: '3TB',
|
||||
@@ -32,7 +32,20 @@ const CloudPricing: React.FC = () => {
|
||||
monthlyPrice: null,
|
||||
sixMonthPrice: null,
|
||||
annualPrice: null,
|
||||
badge: 'Cutting Edge'
|
||||
badge: 'Blackwell Ultra'
|
||||
},
|
||||
{
|
||||
gpu: 'NVIDIA GB200 NVL72',
|
||||
gpuCount: 8,
|
||||
processor: '2x Grace CPU',
|
||||
ram: '1,536GB HBM3e',
|
||||
nvmeStorage: 'Rack-Scale System',
|
||||
additionalStorage: '1.4 EXAFLOPS FP4',
|
||||
network: '800Gb/s NVLink',
|
||||
monthlyPrice: null,
|
||||
sixMonthPrice: null,
|
||||
annualPrice: null,
|
||||
badge: 'Rack Scale'
|
||||
},
|
||||
{
|
||||
gpu: 'NVIDIA B200',
|
||||
@@ -313,6 +326,16 @@ const CloudPricing: React.FC = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Vera Rubin Roadmap */}
|
||||
<div className="mt-12 text-center">
|
||||
<div className="inline-flex items-center gap-2 px-6 py-3 bg-purple-500/10 border border-purple-500/30 rounded-full">
|
||||
<svg className="w-5 h-5 text-purple-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
<span className="text-sm font-semibold text-purple-300">Vera Rubin (R-series) -- Coming 2027</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Key Features */}
|
||||
<div className="mt-16 grid grid-cols-1 md:grid-cols-4 gap-6">
|
||||
<div className="text-center">
|
||||
|
||||
@@ -11,7 +11,7 @@ const DGXSparkHighlight: React.FC = () => {
|
||||
addItem({
|
||||
id: 'dgx-spark',
|
||||
name: 'DGX Spark',
|
||||
price: 4000,
|
||||
price: 3999,
|
||||
description: 'Perfect for startups and researchers to kickstart projects on a powerful, dedicated DGX instance.',
|
||||
purchaseMethod: 'online',
|
||||
image: '/nvidia-dgx-spark-and-nvidia-dgx-station.jpg',
|
||||
@@ -41,7 +41,7 @@ const DGXSparkHighlight: React.FC = () => {
|
||||
className="relative rounded-2xl shadow-2xl border border-primary/30"
|
||||
/>
|
||||
<div className="absolute -top-4 -right-4 bg-primary text-black font-bold px-6 py-3 rounded-full shadow-lg transform rotate-12">
|
||||
Only $4,000
|
||||
Only $3,999
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -153,7 +153,7 @@ const DGXSparkHighlight: React.FC = () => {
|
||||
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
Add to Cart - $4,000
|
||||
Add to Cart - $3,999
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
|
||||
@@ -11,7 +11,7 @@ const FAQ: React.FC = () => {
|
||||
},
|
||||
{
|
||||
question: "How does pricing work?",
|
||||
answer: "DGX Spark is a one-time $4,000 payment that includes 100 hours of compute. For on-demand usage beyond that, check out Hanzo Cloud for pay-as-you-go pricing. Enterprise customers can contact sales for custom SuperPOD deployments and volume pricing."
|
||||
answer: "DGX Spark is a one-time $3,999 payment that includes 100 hours of compute. For on-demand usage beyond that, check out Hanzo Cloud for pay-as-you-go pricing. Enterprise customers can contact sales for custom SuperPOD deployments and volume pricing."
|
||||
},
|
||||
{
|
||||
question: "Can I scale beyond DGX Spark?",
|
||||
|
||||
@@ -31,7 +31,7 @@ const features = [
|
||||
{
|
||||
icon: CpuChipIcon,
|
||||
title: 'Elite NVIDIA Hardware',
|
||||
description: 'Get direct access to the world\'s most advanced AI hardware, including NVIDIA DGX systems, H200, and H100 GPUs.',
|
||||
description: 'Get direct access to the world\'s most advanced AI hardware, including NVIDIA Blackwell Ultra B300, B200, GB200 NVL72, DGX systems, and Hopper GPUs.',
|
||||
},
|
||||
{
|
||||
icon: ScaleIcon,
|
||||
|
||||
@@ -3,9 +3,37 @@ import React from 'react';
|
||||
|
||||
const hardware = [
|
||||
{
|
||||
category: 'LATEST: Blackwell Architecture',
|
||||
category: 'LATEST: Blackwell Ultra',
|
||||
name: 'NVIDIA B300 GPU',
|
||||
description: 'Blackwell Ultra B300 GPU delivers the highest single-GPU AI performance with 288GB HBM3e memory, 12 TB/s bandwidth, and 2nd-gen Transformer Engine.',
|
||||
imageUrl: '/nvidia-blackwell-ultra.jpg',
|
||||
stats: [
|
||||
{ value: '288 GB', label: 'HBM3e Memory' },
|
||||
{ value: '12 TB/s', label: 'Memory Bandwidth' },
|
||||
{ value: '~$5.99', label: '/GPU-hr Cloud' },
|
||||
{ value: 'Blackwell Ultra', label: 'Architecture' },
|
||||
{ value: '1800 GB/s', label: 'NVLink 5.0' },
|
||||
{ value: '2nd Gen', label: 'Transformer Engine' },
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'Rack-Scale: Blackwell Architecture',
|
||||
name: 'NVIDIA GB200 NVL72',
|
||||
description: 'Rack-scale system with 8x B200 GPUs and 2x Grace CPUs. 1.4 EXAFLOPS FP4 performance with 1,536GB total HBM3e memory and direct liquid cooling.',
|
||||
imageUrl: '/nvidia-blackwell-ultra.jpg',
|
||||
stats: [
|
||||
{ value: '1,536 GB', label: 'Total HBM3e' },
|
||||
{ value: '1.4 EX', label: 'FLOPS FP4' },
|
||||
{ value: '8x B200', label: '+ 2x Grace' },
|
||||
{ value: 'From $399K', label: 'Purchase' },
|
||||
{ value: '$29,999', label: '/mo Lease' },
|
||||
{ value: 'Liquid', label: 'Cooled' },
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'Blackwell Architecture',
|
||||
name: 'NVIDIA B200 GPU',
|
||||
description: 'The latest Blackwell B200 GPU delivers unprecedented AI performance with 192GB HBM3e memory and 2nd-gen Transformer Engine for next-generation AI workloads.',
|
||||
description: 'The Blackwell B200 GPU delivers exceptional AI performance with 192GB HBM3e memory and 2nd-gen Transformer Engine for next-generation AI workloads.',
|
||||
imageUrl: '/nvidia-blackwell-ultra.jpg',
|
||||
stats: [
|
||||
{ value: '192 GB', label: 'HBM3e Memory' },
|
||||
@@ -17,7 +45,7 @@ const hardware = [
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'LATEST: Blackwell Architecture',
|
||||
category: 'Blackwell Architecture',
|
||||
name: 'NVIDIA B100 GPU',
|
||||
description: 'Blackwell B100 GPU combines exceptional AI performance with 192GB memory, perfect for training and inference of the largest AI models.',
|
||||
imageUrl: '/nvidia-dgx-spark-and-dgx-station.jpg',
|
||||
@@ -58,6 +86,20 @@ const hardware = [
|
||||
{ value: 'PCIe Gen5', label: 'System Interface' },
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'COMING 2027: Vera Rubin Architecture',
|
||||
name: 'NVIDIA R-Series (Vera Rubin)',
|
||||
description: 'Next-generation Vera Rubin architecture GPUs are expected in 2027. Contact us to join the waitlist for early access when available.',
|
||||
imageUrl: '/nvidia-dgx-spark-and-dgx-station.jpg',
|
||||
stats: [
|
||||
{ value: 'R-Series', label: 'Architecture' },
|
||||
{ value: '2027', label: 'Expected' },
|
||||
{ value: 'HBM4', label: 'Memory Type' },
|
||||
{ value: 'Next Gen', label: 'NVLink' },
|
||||
{ value: 'TBD', label: 'Performance' },
|
||||
{ value: 'Waitlist', label: 'Status' },
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
const Stat: React.FC<{ value: string; label: string }> = ({ value, label }) => (
|
||||
|
||||
@@ -25,7 +25,7 @@ const Hero: React.FC = () => {
|
||||
</span>
|
||||
</h1>
|
||||
<p className="max-w-3xl mx-auto text-lg md:text-xl text-gray-400 mb-10">
|
||||
Access NVIDIA's latest Blackwell architecture GPUs. Rent or buy B200 and B100 GPUs with unprecedented AI performance, 192GB HBM3e memory, and next-generation capabilities for frontier model training and inference.
|
||||
Access NVIDIA's latest Blackwell Ultra architecture GPUs. Rent or buy B300, B200, and B100 GPUs with unprecedented AI performance, up to 288GB HBM3e memory, and next-generation capabilities for frontier model training and inference.
|
||||
</p>
|
||||
<div className="flex justify-center items-center space-x-4">
|
||||
<a href="#pricing" className="bg-primary text-black font-bold py-4 px-10 rounded-lg hover:bg-primary-dark transition-all duration-300 transform hover:scale-105 text-lg">
|
||||
|
||||
@@ -277,11 +277,68 @@ const gpuPlans = [
|
||||
salesLink: 'https://hanzo.ai/contact',
|
||||
// Hidden from landing page - available via hardware specs page
|
||||
},
|
||||
{
|
||||
id: 'b300-standalone',
|
||||
name: 'NVIDIA B300 (Blackwell Ultra)',
|
||||
price: 'From $50K',
|
||||
priceValue: 50000,
|
||||
period: 'per GPU',
|
||||
description: 'Blackwell Ultra B300 GPU with 288GB HBM3e memory. The most powerful single GPU for frontier AI training and inference.',
|
||||
features: [
|
||||
'Single NVIDIA B300 GPU',
|
||||
'288 GB HBM3e Memory',
|
||||
'12 TB/s Memory Bandwidth',
|
||||
'Blackwell Ultra Architecture',
|
||||
'NVLink 5.0 Interconnect',
|
||||
'2nd Gen Transformer Engine',
|
||||
'FP4 / FP8 / FP16 Support',
|
||||
'Enterprise Support',
|
||||
],
|
||||
cta: 'Contact Sales',
|
||||
purchaseMethod: 'sales' as const,
|
||||
salesLink: 'https://hanzo.ai/contact',
|
||||
isBlackwell: true,
|
||||
},
|
||||
{
|
||||
id: 'gb200-nvl72',
|
||||
name: 'GB200 NVL72',
|
||||
price: 'From $399K',
|
||||
priceValue: 399000,
|
||||
leasePrice: '$29,999',
|
||||
leasePriceValue: 29999,
|
||||
period: '',
|
||||
description: '8x B200 GPUs + 2x Grace CPUs in a single rack-scale system. 1.4 EXAFLOPS FP4 performance with 1,536GB total HBM3e memory.',
|
||||
features: [
|
||||
'8x NVIDIA B200 GPUs',
|
||||
'2x NVIDIA Grace CPUs',
|
||||
'1.4 EXAFLOPS FP4 Performance',
|
||||
'1,536 GB Total HBM3e Memory',
|
||||
'NVLink 5.0 Interconnect',
|
||||
'Direct Liquid Cooling',
|
||||
'Blackwell Architecture',
|
||||
'Enterprise Support & Services',
|
||||
],
|
||||
leaseFeatures: [
|
||||
'8x NVIDIA B200 GPUs + 2x Grace CPUs',
|
||||
'1.4 EXAFLOPS FP4 Performance',
|
||||
'1,536 GB Total HBM3e Memory',
|
||||
'NVLink 5.0 Interconnect',
|
||||
'Direct Liquid Cooling',
|
||||
'$29,999/mo Lease',
|
||||
'Enterprise Support & Services',
|
||||
],
|
||||
cta: 'Contact Sales',
|
||||
purchaseMethod: 'sales' as const,
|
||||
salesLink: 'https://hanzo.ai/contact',
|
||||
isBlackwell: true,
|
||||
},
|
||||
{
|
||||
id: 'gb300-nvl72',
|
||||
name: 'GB300 NVL72 Exascale',
|
||||
price: 'Custom Quote',
|
||||
priceValue: 0,
|
||||
price: 'From $499K',
|
||||
priceValue: 499000,
|
||||
leasePrice: '$39,999',
|
||||
leasePriceValue: 39999,
|
||||
period: '',
|
||||
description: 'An exascale of compute in a rack. 72x NVIDIA B300 GPUs with direct liquid cooling for maximum AI performance.',
|
||||
features: [
|
||||
@@ -295,6 +352,15 @@ const gpuPlans = [
|
||||
'800 Gb/s Networking',
|
||||
'Enterprise Support & Services',
|
||||
],
|
||||
leaseFeatures: [
|
||||
'72x NVIDIA B300 GPUs',
|
||||
'20.7 TB Total GPU Memory',
|
||||
'36x NVIDIA Grace CPUs',
|
||||
'Direct Liquid Cooling',
|
||||
'Exascale Supercomputer',
|
||||
'$39,999/mo Lease',
|
||||
'Enterprise Support & Services',
|
||||
],
|
||||
cta: 'Contact Sales',
|
||||
purchaseMethod: 'sales' as const,
|
||||
salesLink: 'https://hanzo.ai/contact',
|
||||
@@ -325,6 +391,29 @@ const gpuPlans = [
|
||||
isBlackwell: true,
|
||||
popular: true,
|
||||
},
|
||||
{
|
||||
id: 'h200-8x-standalone',
|
||||
name: '8X NVIDIA H200 (Standalone)',
|
||||
price: 'Contact Sales',
|
||||
priceValue: 0,
|
||||
period: 'Lease Starting at $21,199/mo',
|
||||
description: '8X NVIDIA H200 GPUs with 141GB HBM3e per GPU. Lease terms: Annual ($21,199/mo), 6-Month ($23,849/mo), 3-Month ($25,174/mo), Monthly ($26,499/mo).',
|
||||
features: [
|
||||
'8X NVIDIA H200 GPUs',
|
||||
'141 GB HBM3e per GPU',
|
||||
'Dual 48-core Processors',
|
||||
'2TB System RAM',
|
||||
'960GB NVMe + (4) 3.84TB NVMe',
|
||||
'25Gb Bonded Network (3200Gb Available)',
|
||||
'Annual: $21,199/mo ($3.63/GPU-hr)',
|
||||
'6-Month: $23,849/mo ($4.08/GPU-hr)',
|
||||
'3-Month: $25,174/mo ($4.31/GPU-hr)',
|
||||
'Monthly: $26,499/mo ($4.54/GPU-hr)',
|
||||
],
|
||||
cta: 'Contact Sales',
|
||||
purchaseMethod: 'sales' as const,
|
||||
salesLink: 'https://hanzo.ai/contact',
|
||||
},
|
||||
{
|
||||
id: 'h100-8x-standalone',
|
||||
name: '8X NVIDIA H100 (Standalone)',
|
||||
@@ -445,9 +534,9 @@ const gpuPlans = [
|
||||
price: 'Usage-Based',
|
||||
priceValue: 0,
|
||||
period: '',
|
||||
description: 'Need on-demand GPU access? Check out Hanzo Cloud for flexible, pay-as-you-go H100 and H200 GPU compute.',
|
||||
description: 'Need on-demand GPU access? Check out Hanzo Cloud for flexible, pay-as-you-go Blackwell and Hopper GPU compute.',
|
||||
features: [
|
||||
'Access to H100 & H200 GPUs',
|
||||
'Access to B300, B200, H200 & H100 GPUs',
|
||||
'Scale from 1 to 100s of GPUs',
|
||||
'Pay only for what you use',
|
||||
'Ideal for Inference & Fine-tuning',
|
||||
|
||||
@@ -24,7 +24,7 @@ const SearchModal: React.FC<SearchModalProps> = ({ isOpen, onClose }) => {
|
||||
{
|
||||
id: 'dgx-spark',
|
||||
title: 'DGX Spark',
|
||||
description: '$4,000 - Dedicated DGX Instance with 100 Hours Compute',
|
||||
description: '$3,999 - Dedicated DGX Instance with 100 Hours Compute',
|
||||
category: 'Product',
|
||||
action: () => {
|
||||
navigate('/#pricing');
|
||||
|
||||
@@ -194,7 +194,7 @@ const UseCases: React.FC = () => {
|
||||
href="#pricing"
|
||||
className="inline-flex items-center px-8 py-4 bg-primary text-black font-bold rounded-lg hover:bg-primary-dark transition-all duration-300 transform hover:scale-105"
|
||||
>
|
||||
Get DGX Spark - $4,000
|
||||
Get DGX Spark - $3,999
|
||||
<svg className="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
|
||||
@@ -115,7 +115,7 @@ const WhyBuyHardware: React.FC = () => {
|
||||
<p className="text-gray-400">Own Your Hardware</p>
|
||||
</div>
|
||||
<div className="text-center mb-6">
|
||||
<div className="text-5xl font-bold text-primary mb-2">$4,000</div>
|
||||
<div className="text-5xl font-bold text-primary mb-2">$3,999</div>
|
||||
<div className="text-gray-400">One-time payment</div>
|
||||
<div className="text-gray-500 text-sm mt-1">+ 100 hours included</div>
|
||||
</div>
|
||||
@@ -249,7 +249,7 @@ const WhyBuyHardware: React.FC = () => {
|
||||
href="#pricing"
|
||||
className="inline-flex items-center px-8 py-4 bg-primary text-black font-bold rounded-lg hover:bg-primary-dark transition-all duration-300 transform hover:scale-105"
|
||||
>
|
||||
Get DGX Spark for $4,000
|
||||
Get DGX Spark for $3,999
|
||||
<svg className="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 395 KiB |
|
After Width: | Height: | Size: 15 MiB |
|
After Width: | Height: | Size: 223 KiB |
@@ -0,0 +1 @@
|
||||
hanzo.computer
|
||||
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 539 KiB |
@@ -1,273 +0,0 @@
|
||||
# Invoice System Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The Hanzo Computer marketplace now includes a comprehensive PDF invoice generation system that allows customers to download professional invoices for their orders and subscriptions.
|
||||
|
||||
## Features
|
||||
|
||||
### Customer Features
|
||||
- **Download PDF Invoices**: Generate and download professional PDF invoices for all paid orders
|
||||
- **Invoice History**: View all past invoices in a dedicated tab on the dashboard
|
||||
- **Invoice Preview**: Preview invoices before downloading
|
||||
- **Automatic Generation**: Invoices are automatically generated when orders are paid
|
||||
- **Professional Layout**: Clean, branded invoice design with Hanzo Computer branding
|
||||
|
||||
### Admin Features
|
||||
- **Bulk Generation**: Generate invoices for multiple orders at once
|
||||
- **Email Invoices**: Send invoices directly to customers via email
|
||||
- **Regenerate Invoices**: Update and regenerate existing invoices
|
||||
- **Invoice Management**: Mark invoices as paid, void invoices, add notes
|
||||
- **Missing Invoice Detection**: Identify paid orders without invoices
|
||||
|
||||
## Technical Implementation
|
||||
|
||||
### Components
|
||||
|
||||
#### 1. Invoice Generator (`/src/lib/invoices.ts`)
|
||||
Core invoice functionality including:
|
||||
- Invoice data structure definition
|
||||
- Invoice creation from orders and subscriptions
|
||||
- PDF storage in Supabase
|
||||
- Invoice number generation
|
||||
- Currency and date formatting
|
||||
|
||||
#### 2. Invoice Component (`/src/components/Invoice.tsx`)
|
||||
React PDF component using `@react-pdf/renderer`:
|
||||
- Professional invoice template
|
||||
- Hanzo Computer branding
|
||||
- Line items with GPU specifications
|
||||
- Tax calculations
|
||||
- Payment terms and conditions
|
||||
|
||||
#### 3. Dashboard Integration (`/src/components/DashboardInvoices.tsx`)
|
||||
Customer-facing invoice interface:
|
||||
- Invoice download buttons
|
||||
- Preview functionality
|
||||
- Invoice history display
|
||||
- Real-time generation
|
||||
|
||||
#### 4. Admin Actions (`/src/lib/adminInvoiceActions.ts`)
|
||||
Administrative invoice operations:
|
||||
- Bulk invoice generation
|
||||
- Email sending integration
|
||||
- Invoice status management
|
||||
- Regeneration capabilities
|
||||
|
||||
### Database Schema
|
||||
|
||||
#### Invoices Table
|
||||
```sql
|
||||
- id: UUID (Primary Key)
|
||||
- invoice_number: VARCHAR (Unique)
|
||||
- user_id: UUID (Foreign Key)
|
||||
- order_id: UUID (Foreign Key)
|
||||
- subscription_id: UUID (Foreign Key)
|
||||
- external_invoice_id: VARCHAR
|
||||
- amount_due: DECIMAL
|
||||
- amount_paid: DECIMAL
|
||||
- status: VARCHAR ('draft', 'open', 'paid', 'void', 'uncollectible')
|
||||
- due_date: DATE
|
||||
- paid_at: TIMESTAMP
|
||||
- pdf_url: TEXT
|
||||
- generated_at: TIMESTAMP
|
||||
- line_items: JSONB
|
||||
- customer_info: JSONB
|
||||
- subtotal: DECIMAL
|
||||
- tax: DECIMAL
|
||||
```
|
||||
|
||||
### Storage Configuration
|
||||
|
||||
#### Supabase Storage Buckets
|
||||
- **invoices**: Public bucket for PDF storage
|
||||
- Organized by year: `/invoices/2025/INV-20250131-0001.pdf`
|
||||
- Automatic public URL generation
|
||||
- Signed URLs for private access
|
||||
|
||||
## Usage
|
||||
|
||||
### For Customers
|
||||
|
||||
1. **View Invoices**:
|
||||
- Log in to your dashboard
|
||||
- Click the "Invoices" tab
|
||||
- View all your orders and their invoice status
|
||||
|
||||
2. **Download Invoice**:
|
||||
- Find the order you need an invoice for
|
||||
- Click "Download" if invoice exists
|
||||
- Or click "Generate Invoice" for new invoices
|
||||
- PDF will download to your computer
|
||||
|
||||
3. **Preview Invoice**:
|
||||
- Click "Preview" button next to any order
|
||||
- View invoice in modal before downloading
|
||||
- Close modal when done
|
||||
|
||||
### For Administrators
|
||||
|
||||
1. **Generate Invoice for Order**:
|
||||
```typescript
|
||||
import { generateAndSendInvoice } from '@/lib/adminInvoiceActions';
|
||||
|
||||
const result = await generateAndSendInvoice(orderId, true); // true = send email
|
||||
```
|
||||
|
||||
2. **Bulk Generate Invoices**:
|
||||
```typescript
|
||||
import { bulkGenerateInvoices } from '@/lib/adminInvoiceActions';
|
||||
|
||||
const result = await bulkGenerateInvoices(orderIds, false); // false = no emails
|
||||
console.log(`Generated: ${result.generated}, Failed: ${result.failed}`);
|
||||
```
|
||||
|
||||
3. **Regenerate Invoice**:
|
||||
```typescript
|
||||
import { regenerateInvoice } from '@/lib/adminInvoiceActions';
|
||||
|
||||
const result = await regenerateInvoice(invoiceId, true); // true = send email
|
||||
```
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Generate Invoice API (`/api/generate-invoice.ts`)
|
||||
Serverless function for invoice generation:
|
||||
|
||||
```typescript
|
||||
POST /api/generate-invoice
|
||||
{
|
||||
"type": "order" | "subscription" | "invoice",
|
||||
"id": "order-uuid",
|
||||
"regenerate": false,
|
||||
"period": { // optional, for subscriptions
|
||||
"start": "2025-01-01",
|
||||
"end": "2025-01-31"
|
||||
}
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"invoiceId": "invoice-uuid",
|
||||
"invoiceNumber": "INV-20250131-0001",
|
||||
"pdfUrl": "https://...",
|
||||
"downloadUrl": "https://..." // signed URL
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
```bash
|
||||
VITE_SUPABASE_URL=your-supabase-url
|
||||
VITE_SUPABASE_ANON_KEY=your-supabase-anon-key
|
||||
SUPABASE_SERVICE_KEY=your-service-key # For API operations
|
||||
```
|
||||
|
||||
### Company Information
|
||||
Edit `/src/lib/invoices.ts` to update company details:
|
||||
```typescript
|
||||
export const COMPANY_INFO = {
|
||||
name: 'Hanzo Computer',
|
||||
address: '2100 Geng Road',
|
||||
city: 'Palo Alto',
|
||||
state: 'CA',
|
||||
zip: '94303',
|
||||
country: 'United States',
|
||||
email: 'billing@hanzo.computer',
|
||||
phone: '+1 (650) 555-0100',
|
||||
website: 'https://hanzo.computer',
|
||||
taxId: 'XX-XXXXXXX'
|
||||
};
|
||||
```
|
||||
|
||||
## Email Integration
|
||||
|
||||
To enable email sending, integrate with your preferred email service:
|
||||
|
||||
1. **SendGrid Integration**:
|
||||
```typescript
|
||||
import sgMail from '@sendgrid/mail';
|
||||
|
||||
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
|
||||
// Update sendInvoiceEmail function in adminInvoiceActions.ts
|
||||
```
|
||||
|
||||
2. **AWS SES Integration**:
|
||||
```typescript
|
||||
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
|
||||
|
||||
const client = new SESClient({ region: "us-west-2" });
|
||||
// Update sendInvoiceEmail function
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Tests
|
||||
```bash
|
||||
npm test -- invoice.test.ts
|
||||
```
|
||||
|
||||
### Manual Testing
|
||||
1. Create a test order and mark it as paid
|
||||
2. Navigate to Dashboard > Invoices tab
|
||||
3. Click "Generate Invoice" for the test order
|
||||
4. Verify PDF downloads correctly
|
||||
5. Check invoice appears in history
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Invoice Generation Fails**:
|
||||
- Check Supabase connection
|
||||
- Verify storage bucket exists and has proper permissions
|
||||
- Check console for detailed error messages
|
||||
|
||||
2. **PDF Not Downloading**:
|
||||
- Ensure browser allows pop-ups from the site
|
||||
- Check if PDF URL is accessible
|
||||
- Verify storage bucket is public or signed URL is valid
|
||||
|
||||
3. **Missing Invoice Data**:
|
||||
- Ensure order has complete information
|
||||
- Check user details are properly loaded
|
||||
- Verify line items are properly formatted
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **Access Control**:
|
||||
- Users can only view/download their own invoices
|
||||
- Admin role required for bulk operations
|
||||
- RLS policies enforce data isolation
|
||||
|
||||
2. **Storage Security**:
|
||||
- Invoices stored in Supabase Storage
|
||||
- Signed URLs for temporary access
|
||||
- Public URLs only for authorized invoices
|
||||
|
||||
3. **Data Privacy**:
|
||||
- Customer information stored securely
|
||||
- PII handled according to privacy policy
|
||||
- Audit trail for all invoice operations
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
1. **Recurring Invoices**: Automatic monthly invoice generation for subscriptions
|
||||
2. **Custom Templates**: Multiple invoice templates for different use cases
|
||||
3. **Multi-language Support**: Invoices in customer's preferred language
|
||||
4. **Payment Links**: Direct payment links in invoice emails
|
||||
5. **Webhook Integration**: Webhook for automatic invoice generation
|
||||
6. **Credit Notes**: Support for refunds and adjustments
|
||||
7. **Batch Download**: ZIP file with multiple invoices
|
||||
8. **Invoice Scheduling**: Schedule invoice generation for future dates
|
||||
|
||||
## Support
|
||||
|
||||
For issues or questions about the invoice system:
|
||||
- Technical Support: support@hanzo.computer
|
||||
- Billing Questions: billing@hanzo.computer
|
||||
- Documentation: This file and inline code comments
|
||||
@@ -1,296 +0,0 @@
|
||||
# Rate Limiting Implementation
|
||||
|
||||
## Overview
|
||||
|
||||
This document describes the comprehensive rate limiting system implemented across API endpoints and Supabase queries for the Hanzo Computer platform.
|
||||
|
||||
## Architecture
|
||||
|
||||
The rate limiting system consists of several components:
|
||||
|
||||
1. **Upstash Redis** - Distributed rate limit storage
|
||||
2. **Middleware** - API route protection
|
||||
3. **Supabase Tables** - Audit logging and custom rules
|
||||
4. **Frontend Handling** - User feedback and retry logic
|
||||
5. **Admin Dashboard** - Monitoring and management
|
||||
|
||||
## Components
|
||||
|
||||
### 1. Rate Limiter Utility (`src/lib/rateLimit.ts`)
|
||||
|
||||
Core rate limiting logic using Upstash Redis with sliding window algorithm.
|
||||
|
||||
**Features:**
|
||||
- Role-based limits (anonymous, authenticated, admin)
|
||||
- Endpoint-specific limits
|
||||
- Graceful fallback on Redis failure
|
||||
- Rate limit status tracking
|
||||
|
||||
**Default Limits:**
|
||||
- Anonymous users: 10 requests/minute
|
||||
- Authenticated users: 100 requests/minute
|
||||
- Admin users: 1000 requests/minute
|
||||
|
||||
### 2. API Middleware (`api/_middleware.ts`)
|
||||
|
||||
Automatic rate limiting for all API routes.
|
||||
|
||||
**Headers Added:**
|
||||
- `X-RateLimit-Limit` - Total allowed requests
|
||||
- `X-RateLimit-Remaining` - Requests remaining
|
||||
- `X-RateLimit-Reset` - Reset timestamp
|
||||
- `Retry-After` - Seconds until retry
|
||||
|
||||
### 3. Database Schema (`supabase/migrations/rate_limiting.sql`)
|
||||
|
||||
**Tables:**
|
||||
- `rate_limit_log` - Request history
|
||||
- `rate_limit_rules` - Custom per-user limits
|
||||
- `rate_limit_violations` - Abuse tracking
|
||||
|
||||
**Features:**
|
||||
- Row Level Security (RLS)
|
||||
- Automatic cleanup of old logs (7 days)
|
||||
- Performance indexes
|
||||
- Monitoring views
|
||||
|
||||
### 4. Frontend API Client (`src/lib/api.ts`)
|
||||
|
||||
Smart API client with rate limit handling.
|
||||
|
||||
**Features:**
|
||||
- Automatic retry with exponential backoff
|
||||
- User-friendly error messages
|
||||
- Visual countdown timer
|
||||
- Rate limit status indicator
|
||||
|
||||
### 5. Admin Dashboard (`src/pages/admin/RateLimitDashboard.tsx`)
|
||||
|
||||
Comprehensive monitoring interface.
|
||||
|
||||
**Sections:**
|
||||
- Overview - Endpoint statistics
|
||||
- Users - User activity tracking
|
||||
- Violations - Rate limit violations
|
||||
- Rules - Custom limit management
|
||||
|
||||
## Protected Endpoints
|
||||
|
||||
### Strict Limits
|
||||
- `/api/create-payment-intent` - 5 requests/minute
|
||||
- `/api/rfq-submission` - 5 requests/hour
|
||||
|
||||
### Moderate Limits
|
||||
- `/api/send-email` - 10 requests/minute
|
||||
- `/api/quote-acceptance` - 10 requests/minute
|
||||
|
||||
### Standard Limits
|
||||
- `/api/generate-invoice` - 20 requests/minute
|
||||
- All admin endpoints - 100 requests/minute
|
||||
|
||||
## Setup Instructions
|
||||
|
||||
### 1. Environment Variables
|
||||
|
||||
Add to your `.env` file:
|
||||
|
||||
```env
|
||||
# Upstash Redis Configuration
|
||||
UPSTASH_REDIS_REST_URL=https://your-redis-instance.upstash.io
|
||||
UPSTASH_REDIS_REST_TOKEN=your-upstash-redis-token-here
|
||||
|
||||
# Rate Limiting Configuration
|
||||
RATE_LIMIT_ENABLED=true
|
||||
VITE_API_URL=/api
|
||||
|
||||
# Admin Configuration
|
||||
ADMIN_API_KEY=your-admin-api-key-here
|
||||
```
|
||||
|
||||
### 2. Database Migration
|
||||
|
||||
Run the Supabase migration:
|
||||
|
||||
```bash
|
||||
supabase db push
|
||||
```
|
||||
|
||||
Or manually execute `supabase/migrations/rate_limiting.sql` in your Supabase dashboard.
|
||||
|
||||
### 3. Upstash Redis Setup
|
||||
|
||||
1. Create an account at [upstash.com](https://upstash.com)
|
||||
2. Create a new Redis database
|
||||
3. Copy the REST URL and token to your `.env` file
|
||||
|
||||
### 4. Deploy API Routes
|
||||
|
||||
For Vercel deployment:
|
||||
```bash
|
||||
vercel --prod
|
||||
```
|
||||
|
||||
For other platforms, ensure the `/api` directory is properly configured for serverless functions.
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Frontend API Call
|
||||
|
||||
```typescript
|
||||
import { api } from '@/lib/api';
|
||||
|
||||
// Automatic rate limit handling
|
||||
try {
|
||||
const result = await api.createPaymentIntent(5000, 'usd');
|
||||
console.log('Payment intent created:', result);
|
||||
} catch (error) {
|
||||
if (error instanceof RateLimitError) {
|
||||
console.log(`Rate limited. Retry in ${error.retryAfter} seconds`);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Custom Rate Limit Check
|
||||
|
||||
```typescript
|
||||
import { getRateLimitStatus } from '@/lib/rateLimit';
|
||||
|
||||
const status = await getRateLimitStatus('user_123', 'api/send-email');
|
||||
console.log(`Remaining requests: ${status.remaining}`);
|
||||
```
|
||||
|
||||
### Clear Rate Limit (Admin)
|
||||
|
||||
```typescript
|
||||
// Admin endpoint to clear rate limits
|
||||
fetch('/api/admin/clear-rate-limit', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Admin-Key': 'your-admin-key'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
userId: 'user_123',
|
||||
endpoint: 'api/send-email' // optional
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Admin Dashboard Access
|
||||
|
||||
Navigate to `/admin/rate-limits` to access the monitoring dashboard.
|
||||
|
||||
**Features:**
|
||||
- Real-time request statistics
|
||||
- User activity tracking
|
||||
- Violation logs
|
||||
- Custom rule management
|
||||
|
||||
### Database Queries
|
||||
|
||||
```sql
|
||||
-- View recent rate limit violations
|
||||
SELECT * FROM rate_limit_violations
|
||||
WHERE timestamp > NOW() - INTERVAL '24 hours'
|
||||
ORDER BY timestamp DESC;
|
||||
|
||||
-- Check user request patterns
|
||||
SELECT * FROM rate_limit_user_stats
|
||||
WHERE email = 'user@example.com';
|
||||
|
||||
-- View endpoint statistics
|
||||
SELECT * FROM rate_limit_stats
|
||||
ORDER BY total_requests DESC;
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Rate Limit Exceeded Response
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "Too Many Requests",
|
||||
"message": "Rate limit exceeded. Please try again in 45 seconds.",
|
||||
"limit": 10,
|
||||
"remaining": 0,
|
||||
"reset": "2024-01-01T12:00:00Z",
|
||||
"retryAfter": 45
|
||||
}
|
||||
```
|
||||
|
||||
### Frontend Display
|
||||
|
||||
When rate limited, users see:
|
||||
1. Toast notification with countdown timer
|
||||
2. Automatic retry after cooldown
|
||||
3. Visual indicator of rate limit status
|
||||
|
||||
## Best Practices
|
||||
|
||||
### For Developers
|
||||
|
||||
1. **Use the API client** - Always use `src/lib/api.ts` for API calls
|
||||
2. **Handle errors gracefully** - Check for `RateLimitError` specifically
|
||||
3. **Implement caching** - Reduce unnecessary API calls
|
||||
4. **Batch operations** - Combine multiple operations when possible
|
||||
|
||||
### For Administrators
|
||||
|
||||
1. **Monitor regularly** - Check the dashboard for unusual patterns
|
||||
2. **Set appropriate limits** - Balance security with usability
|
||||
3. **Review violations** - Investigate repeated violations
|
||||
4. **Update rules** - Adjust limits based on usage patterns
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Issue: Rate limits not working**
|
||||
- Check `RATE_LIMIT_ENABLED=true` in environment
|
||||
- Verify Upstash Redis credentials
|
||||
- Ensure middleware is properly configured
|
||||
|
||||
**Issue: Users frequently hitting limits**
|
||||
- Review current limits in dashboard
|
||||
- Consider increasing limits for specific users
|
||||
- Implement caching on frontend
|
||||
|
||||
**Issue: Redis connection failures**
|
||||
- Verify Upstash credentials
|
||||
- Check network connectivity
|
||||
- System fails open (allows requests) by default
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **IP-based limiting** - Fallback for anonymous users
|
||||
2. **User-based limiting** - Primary for authenticated users
|
||||
3. **Endpoint-specific limits** - Sensitive operations have stricter limits
|
||||
4. **Admin override** - Administrators can clear limits when needed
|
||||
|
||||
## Performance Impact
|
||||
|
||||
- **Latency**: ~20-50ms added per request
|
||||
- **Redis calls**: 1 per request
|
||||
- **Database logging**: Asynchronous, minimal impact
|
||||
- **Frontend retry**: Exponential backoff prevents thundering herd
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- [ ] Geographic-based rate limiting
|
||||
- [ ] Machine learning for anomaly detection
|
||||
- [ ] Dynamic limit adjustment based on load
|
||||
- [ ] WebSocket rate limiting
|
||||
- [ ] GraphQL query complexity limiting
|
||||
|
||||
## Support
|
||||
|
||||
For issues or questions:
|
||||
1. Check the admin dashboard for current status
|
||||
2. Review logs in Supabase
|
||||
3. Contact system administrator with details
|
||||
|
||||
---
|
||||
|
||||
Last updated: October 2024
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="2500" height="422" viewBox="0 0 1002 169"><path d="M84.16 169v-32.88c34.86 0 61.75-34.37 48.31-70.74A49 49 0 0 0 103.09 36a51.94 51.94 0 0 0-70.22 48.31H0c0-54.8 53.29-98.14 111.55-80.2a81.43 81.43 0 0 1 53.29 53.3C182.77 115.7 139.44 169 84.16 169z" fill="#0080ff"/><path d="M84.66 136.12H51.79v-32.38h32.87m-32.87 57.79h-24.9v-25.41h24.9v25.41m-24.9-25.41H6V115.2h20.89M300.3 48.94c-9.46-6.48-21.91-10-35.86-10h-30.37v97.14h30.38q20.92 0 35.86-10.46a38.11 38.11 0 0 0 12.45-15.44c3-6.48 4.48-14.45 4.48-22.92s-1.49-16.44-4.48-22.42c-3-7.43-6.98-12.41-12.46-15.9zM252 55.42h9.46c10.46 0 19.42 2 26.39 6.48 7.47 4.48 11 13 11 25.41s-4 21.42-11 26.4c-6.47 4-14.94 6.48-25.9 6.48H252V55.42m86.65-17.93a10.13 10.13 0 0 0-7.47 3 9 9 0 0 0-3.49 7.47 10.46 10.46 0 1 0 20.92 0 10.14 10.14 0 0 0-3-7.47c-1.49-2-4-3-7-3m-9 29.89h17.43v68.25h-17.36V67.38m79.68 6c-5-4.48-11-7.47-17.43-7.47a30.82 30.82 0 0 0-23.41 10 34.69 34.69 0 0 0-9.46 24.41c0 9.47 3 17.93 9 24.41s13.94 9.47 23.41 9.47a27.56 27.56 0 0 0 16.93-5.48v1.49c0 5.48-1.49 10-4.48 13s-7 4.48-12.45 4.48c-8 0-12.95-3-18.92-11.46l-12 11.46.5.5c2.49 3.49 6.47 7 11.45 10.46s11.45 5 18.92 5c10.46 0 18.43-3 24.4-9.47s9.46-14.45 9.46-24.91V67.38h-16.91v6h1m-4.48 40.35c-3 3.49-7 5-12 5s-9-1.49-12-5-4.48-8-4.48-13.45S378 90.29 381 86.8s7-5 12-5 9 1.49 12 5 4.48 8 4.48 13.45-1.49 10-4.48 13.45m36.35-46.33h17.43v68.25h-17.54V67.38m8.47-29.89a10.21 10.21 0 0 0-10.46 10.46 10.46 10.46 0 1 0 20.92 0 10.21 10.21 0 0 0-10.47-10.46M496 48.94h-16.91v18.44h-10v15.44h10v28.4c0 9 2 15.44 5.48 18.93s10 5.48 18.43 5.48a48.3 48.3 0 0 0 8.47-.5h1v-15.45l-6 .5c-4 0-7-.5-8-2-1.49-1.49-2-4.48-2-9V83.32h15.94V67.87h-15.89L496 48.94m96.61-10h17.43v97.14h-17.41V39m191.24 72.73a57.76 57.76 0 0 1-8.47 8 17.19 17.19 0 0 1-9 2.49 17 17 0 0 1-12.4-5.53c-3.49-4-5-8.47-5-14.45s1.49-10.46 5-14.45a15.31 15.31 0 0 1 12.45-5.48c5.48 0 11.45 3.49 16.43 9.47l11.45-11c-7.47-9.47-16.93-13.95-28.39-13.95-9.46 0-17.43 3.49-24.4 10.46a36.2 36.2 0 0 0-10 25.41c0 10 3.49 18.93 10 25.41a32.39 32.39 0 0 0 24.4 10.46c12.45 0 22.41-5.48 29.38-15.44l-11.45-11.46m70.22-34.37a26.22 26.22 0 0 0-10-8 32.5 32.5 0 0 0-14.44-3c-9.46 0-17.43 3.49-23.41 10.46a40 40 0 0 0-8.47 25.41c0 10.46 3 18.93 9.46 25.41s14.44 10 24.9 10c11.45 0 20.92-4.48 28.39-13.95l.5-.5-11.45-11c-1 1.49-2.49 2.49-4 4a15.18 15.18 0 0 1-5 3.49 16.36 16.36 0 0 1-8.47 2 19.17 19.17 0 0 1-12-4c-3-2.49-4.48-6-5-10.46h45.82v-6.48a37.16 37.16 0 0 0-2-13 22.59 22.59 0 0 0-5-10.46m-37.18 16.06a17.64 17.64 0 0 1 4.48-8 12 12 0 0 1 9-3.49c4 0 7.47 1 9.46 3.49 2 2 3 5 3.49 8h-26.43m103.59-20.43c-5-4.48-12.45-6.48-21.41-6.48a43.59 43.59 0 0 0-15.92 3.5c-4.48 2.49-9 6-11.45 11l11 10.46c4.48-7.47 9.46-10 16.43-10a13.9 13.9 0 0 1 9 3 9 9 0 0 1 3.49 7.47v3.49a38.13 38.13 0 0 0-12.45-2q-12.7 0-20.92 6c-5.48 4-8 10-8 16.94 0 6.48 2 11.46 6.47 15.44s10 5.48 16.43 5.48 12.45-2.49 18.43-7v5.48h16.93V91.79c0-8-2.49-14.45-8-18.93m-30.38 36.86c2-1.49 4.48-2 8-2a42.37 42.37 0 0 1 12.95 2.49v6.48a22 22 0 0 1-14.94 5.48c-3 0-5.48-.5-7-2s-2.49-3-2.49-5a8.17 8.17 0 0 1 3.49-5.48m104.54-35.84c-5-5.48-11.45-8-19.92-8q-10.46 0-16.43 6v-4h-16.94v68.25h17.43V98.26c0-5 1-9.47 3.49-12.45a12.54 12.54 0 0 1 10-4.48 10.94 10.94 0 0 1 9 4 18 18 0 0 1 3.49 11v39.85H1002V96.27q-.75-14.2-7.47-22.42m-423.31-1c-5-4.48-12.45-6.48-21.41-6.48a43.59 43.59 0 0 0-15.94 3.49c-4.48 2.49-9 6-11.45 11l11 10.46c4.48-7.47 9.46-10 16.43-10a13.9 13.9 0 0 1 9 3 9 9 0 0 1 3.49 7.47v3.49a38.13 38.13 0 0 0-12.45-2q-12.7 0-20.92 6c-5.48 4-8 10-8 16.94 0 6.48 2 11.46 6.47 15.44s10 5.48 16.43 5.48 12.45-2.49 18.43-7v5.48h16.93V91.79c0-8-3-14.45-8-18.93m-30.88 36.86c2-1.49 4.48-2 8-2a42.37 42.37 0 0 1 12.95 2.49v6.48a22 22 0 0 1-14.94 5.48c-3 0-5.48-.5-7-2s-2.49-3-2.49-5a14.84 14.84 0 0 1 3.49-5.48m132 27.9a49.82 49.82 0 1 1 49.8-49.82 50 50 0 0 1-49.8 49.82m0-82.69a32.38 32.38 0 1 0 32.33 32.4 32.31 32.31 0 0 0-32.37-32.38" fill="#0080ff"/></svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 50" fill="none">
|
||||
<g fill="#FFFFFF">
|
||||
<!-- DigitalOcean text -->
|
||||
<text x="10" y="32" font-family="Arial, sans-serif" font-size="24" font-weight="600">DigitalOcean</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 249 B |
@@ -0,0 +1,12 @@
|
||||
<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="67" height="67" fill="#000000"/>
|
||||
<g>
|
||||
<path d="M17 54V36.1H4V54H17Z" fill="#ffffff"/>
|
||||
<path d="M4 36.1L17 37.6V36.1H4Z" fill="#DDDDDD" opacity="0.7"/>
|
||||
<path d="M53.6 17.4H17.2L4 36.1H40.3L53.6 17.4Z" fill="#ffffff"/>
|
||||
<path d="M17 4H4V17.4H17V4Z" fill="#ffffff"/>
|
||||
<path d="M53.6 4H40.4V17.4H53.6V4Z" fill="#ffffff"/>
|
||||
<path d="M53.6 17.4L40.4 15.7V17.4H53.6Z" fill="#DDDDDD" opacity="0.7"/>
|
||||
<path d="M53.6 54V36.1H40.4V54H53.6Z" fill="#ffffff"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 562 B |
|
After Width: | Height: | Size: 686 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 308 KiB |
@@ -0,0 +1,9 @@
|
||||
<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M22.21 67V44.6369H0V67H22.21Z" fill="#ffffff"/>
|
||||
<path d="M0 44.6369L22.21 46.8285V44.6369H0Z" fill="#DDDDDD" opacity="0.7"/>
|
||||
<path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="#ffffff"/>
|
||||
<path d="M22.21 0H0V22.3184H22.21V0Z" fill="#ffffff"/>
|
||||
<path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="#ffffff"/>
|
||||
<path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" fill="#DDDDDD" opacity="0.7"/>
|
||||
<path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 589 B |
@@ -0,0 +1,42 @@
|
||||
# NVIDIA Images Manifest
|
||||
|
||||
## DGX Systems
|
||||
- nvidia-dgx-spark-and-dgx-station.jpg (378KB)
|
||||
- nvidia-dgx-spark-and-nvidia-dgx-station.jpg (131KB) - duplicate
|
||||
- nvidia-dgx-superpod.jpg (146KB)
|
||||
- 2u-nvidia-rtx-pro-server.jpg (395KB)
|
||||
|
||||
## H200/H100 GPUs
|
||||
- h200-nvl.jpg (309KB)
|
||||
- nvidia-blackwell-ultra.jpg (209KB)
|
||||
|
||||
## RTX Pro Products
|
||||
- nvidia-rtx-pro-6000-blackwell-server-edition-gpu.jpg (150KB)
|
||||
- rtx-pro-2000-blackwell.png (2.0MB)
|
||||
- rtx-pro-4000-blackwell-sff.png (1.5MB)
|
||||
- rtx-pro-enterprise-it.png (627KB)
|
||||
|
||||
## Technology Showcases
|
||||
- robotics-and-omniverse.jpg (2.0MB)
|
||||
- industrial-ai.png (941KB)
|
||||
- nvidia-ai-data-platform.jpg (671KB)
|
||||
- quantum-computing.jpg (367KB)
|
||||
- B-R4-Ros-IsaacSim-2024_oneoff.png (41KB)
|
||||
- jetson-thor.png (1.2MB)
|
||||
|
||||
## Networking & Infrastructure
|
||||
- nvlink-fusion.jpg (406KB)
|
||||
- silicon-photonics-networking.jpg (408KB)
|
||||
- spectrum-xgs.png (512KB)
|
||||
|
||||
## Data Center & Cloud
|
||||
- European AI Infrastructure.jpg (539KB)
|
||||
- gtc-paris-dgx-cloud-lepton.jpg (247KB)
|
||||
- CUDA-x Data Science Image.jpg (1.0MB)
|
||||
|
||||
## Gaming/Consumer
|
||||
- geforce-now-gamescom-2025.jpg (686KB)
|
||||
- BFGD KV.jpg (15MB) - NEEDS OPTIMIZATION
|
||||
|
||||
## Manufacturing
|
||||
- tsmc-chip.jpg (83KB)
|
||||
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="scroll-smooth">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access</title>
|
||||
<meta name="title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta name="description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://hanzo.computer/" />
|
||||
<meta property="og:title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta property="og:description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
<meta property="og:image" content="https://hanzo.computer/og-image.jpg" />
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:url" content="https://hanzo.computer/" />
|
||||
<meta property="twitter:title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta property="twitter:description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
<meta property="twitter:image" content="https://hanzo.computer/og-image.jpg" />
|
||||
<meta name="twitter:site" content="@hanzoai" />
|
||||
|
||||
<!-- Additional Meta Tags -->
|
||||
<meta name="keywords" content="AI supercomputing, NVIDIA DGX, H100 GPU, H200 GPU, Blackwell, B200, B300, GB200, GB300, DGX Spark, Vera Rubin, GPU rental, AI infrastructure, machine learning, deep learning, cloud GPU" />
|
||||
<meta name="author" content="Hanzo Industries Inc" />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<link rel="canonical" href="https://hanzo.computer/" />
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
||||
<script type="module" crossorigin src="/assets/index-DMDQJq7E.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-Z_4HI4Em.css">
|
||||
</head>
|
||||
<body class="bg-dark-bg">
|
||||
<div id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 670 KiB |
|
After Width: | Height: | Size: 209 KiB |
|
After Width: | Height: | Size: 378 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 146 KiB |
@@ -0,0 +1,14 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" fill="none">
|
||||
<!-- NVIDIA logo in green -->
|
||||
<g fill="#76B900">
|
||||
<path d="M5 10v40h5V22.5l4 .025c1.3 0 2.2.3 2.85 1 .8.85 1.1 2.2 1.1 4.7v21.75h5V26.5c0-7-4.5-8-8.8-8H5z"/>
|
||||
<path d="M27.5 50h5V10h-5v40z"/>
|
||||
<path d="M37.5 10l-4.2 14-4.2-14h-5.5l5.75 17.75h7.25L42.5 10h-5z"/>
|
||||
<path d="M47.5 10v40h8.1c4.35 0 5.75-.7 7.25-2.35 1.1-1.15 1.8-3.65 1.8-6.35 0-2.5-.6-4.75-1.65-6.1-1.4-1.75-4.25-2.45-8.35-2.45H47.5V10zm5 3.85h2.15c3.15 0 5.15 1.4 5.15 5.05s-2 5.05-5.15 5.05H52.5V13.85z"/>
|
||||
<path d="M70 50h5V10h-5v40z"/>
|
||||
<path d="M82.5 10l-7 17.75h4.95l1.1-3.15h8.25l1.05 3.15h5.35L88.5 10h-6zm3.25 3.25l3.05 8.3h-6.15l3.1-8.3z"/>
|
||||
</g>
|
||||
|
||||
<!-- INCEPTION PROGRAM text in white, smaller font -->
|
||||
<text x="5" y="70" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="8" font-weight="600" letter-spacing="1">INCEPTION PROGRAM</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 929 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-146.205 -44.925 1267.11 269.55">
|
||||
<path d="M962.1 144.1v-2.7h1.7c.9 0 2.2.1 2.2 1.2 0 1.1-.7 1.5-1.8 1.5h-2.1m0 1.9h1.2l2.7 4.7h2.9l-3-4.9c1.5.1 2.7-1 2.8-2.5v-.4c0-2.6-1.8-3.4-4.8-3.4h-4.3v11.2h2.5V146m12.6-.9c0-6.6-5.1-10.4-10.8-10.4-5.7 0-10.8 3.8-10.8 10.4 0 6.6 5.1 10.4 10.8 10.4 5.7 0 10.8-3.8 10.8-10.4m-3.2 0c.2 4.2-3.1 7.8-7.3 8h-.3c-4.4.2-8.1-3.3-8.3-7.7-.2-4.4 3.3-8.1 7.7-8.3 4.4-.2 8.1 3.3 8.3 7.7-.1.1-.1.2-.1.3zM578.2 34v118h33.3V34zm-262-.2v118.1h33.6V60.2l26.2.1c8.6 0 14.6 2.1 18.7 6.5 5.3 5.6 7.4 14.7 7.4 31.2v53.9h32.6V86.7c0-46.6-29.7-52.9-58.7-52.9zm315.7.2v118h54c28.8 0 38.2-4.8 48.3-15.5 7.2-7.5 11.8-24.1 11.8-42.2 0-16.6-3.9-31.4-10.8-40.6C723 37.2 705.2 34 678.6 34zm33 25.6h14.3c20.8 0 34.2 9.3 34.2 33.5s-13.4 33.6-34.2 33.6h-14.3zM530.2 34l-27.8 93.5L475.8 34h-36l38 118h48l38.4-118zm231.4 118h33.3V34h-33.3zM855 34l-46.5 117.9h32.8l7.4-20.9h55l7 20.8h35.7L899.5 34zm21.6 21.5l20.2 55.2h-41z" fill="#FFF"/>
|
||||
<path d="M101.3 53.6V37.4c1.6-.1 3.2-.2 4.8-.2 44.4-1.4 73.5 38.2 73.5 38.2S148.2 119 114.5 119c-4.5 0-8.9-.7-13.1-2.1V67.7c17.3 2.1 20.8 9.7 31.1 27l23.1-19.4s-16.9-22.1-45.3-22.1c-3-.1-6 .1-9 .4m0-53.6v24.2l4.8-.3c61.7-2.1 102 50.6 102 50.6s-46.2 56.2-94.3 56.2c-4.2 0-8.3-.4-12.4-1.1v15c3.4.4 6.9.7 10.3.7 44.8 0 77.2-22.9 108.6-49.9 5.2 4.2 26.5 14.3 30.9 18.7-29.8 25-99.3 45.1-138.7 45.1-3.8 0-7.4-.2-11-.6v21.1h170.2V0zm0 116.9v12.8c-41.4-7.4-52.9-50.5-52.9-50.5s19.9-22 52.9-25.6v14h-.1c-17.3-2.1-30.9 14.1-30.9 14.1s7.7 27.3 31 35.2M27.8 77.4s24.5-36.2 73.6-40V24.2C47 28.6 0 74.6 0 74.6s26.6 77 101.3 84v-14c-54.8-6.8-73.5-67.2-73.5-67.2z" fill="#76B900"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="316.2 33.8 630.2 118.2" xmlns:v="https://vecta.io/nano"><path d="M578.2 34v118h33.3V34h-33.3zm-262-.2v118.1h33.6V60.2l26.2.1c8.6 0 14.6 2.1 18.7 6.5 5.3 5.6 7.4 14.7 7.4 31.2v53.9h32.6V86.7c0-46.6-29.7-52.9-58.7-52.9h-59.8zm315.7.2v118h54c28.8 0 38.2-4.8 48.3-15.5 7.2-7.5 11.8-24.1 11.8-42.2 0-16.6-3.9-31.4-10.8-40.6C723 37.2 705.2 34 678.6 34h-46.7zm33 25.6h14.3c20.8 0 34.2 9.3 34.2 33.5s-13.4 33.6-34.2 33.6h-14.3V59.6zM530.2 34l-27.8 93.5L475.8 34h-36l38 118h48l38.4-118h-34zm231.4 118h33.3V34h-33.3v118zM855 34l-46.5 117.9h32.8l7.4-20.9h55l7 20.8h35.7L899.5 34H855zm21.6 21.5l20.2 55.2h-41l20.8-55.2z"/></svg>
|
||||
|
After Width: | Height: | Size: 665 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="800" width="1200" viewBox="-146.205 -44.925 1267.11 269.55" style="background-color: #222"><path d="M962.1 144.1v-2.7h1.7c.9 0 2.2.1 2.2 1.2 0 1.1-.7 1.5-1.8 1.5h-2.1m0 1.9h1.2l2.7 4.7h2.9l-3-4.9c1.5.1 2.7-1 2.8-2.5v-.4c0-2.6-1.8-3.4-4.8-3.4h-4.3v11.2h2.5V146m12.6-.9c0-6.6-5.1-10.4-10.8-10.4-5.7 0-10.8 3.8-10.8 10.4 0 6.6 5.1 10.4 10.8 10.4 5.7 0 10.8-3.8 10.8-10.4m-3.2 0c.2 4.2-3.1 7.8-7.3 8h-.3c-4.4.2-8.1-3.3-8.3-7.7-.2-4.4 3.3-8.1 7.7-8.3 4.4-.2 8.1 3.3 8.3 7.7-.1.1-.1.2-.1.3zM578.2 34v118h33.3V34zm-262-.2v118.1h33.6V60.2l26.2.1c8.6 0 14.6 2.1 18.7 6.5 5.3 5.6 7.4 14.7 7.4 31.2v53.9h32.6V86.7c0-46.6-29.7-52.9-58.7-52.9zm315.7.2v118h54c28.8 0 38.2-4.8 48.3-15.5 7.2-7.5 11.8-24.1 11.8-42.2 0-16.6-3.9-31.4-10.8-40.6C723 37.2 705.2 34 678.6 34zm33 25.6h14.3c20.8 0 34.2 9.3 34.2 33.5s-13.4 33.6-34.2 33.6h-14.3zM530.2 34l-27.8 93.5L475.8 34h-36l38 118h48l38.4-118zm231.4 118h33.3V34h-33.3zM855 34l-46.5 117.9h32.8l7.4-20.9h55l7 20.8h35.7L899.5 34zm21.6 21.5l20.2 55.2h-41z" fill="#FFF"/><path d="M101.3 53.6V37.4c1.6-.1 3.2-.2 4.8-.2 44.4-1.4 73.5 38.2 73.5 38.2S148.2 119 114.5 119c-4.5 0-8.9-.7-13.1-2.1V67.7c17.3 2.1 20.8 9.7 31.1 27l23.1-19.4s-16.9-22.1-45.3-22.1c-3-.1-6 .1-9 .4m0-53.6v24.2l4.8-.3c61.7-2.1 102 50.6 102 50.6s-46.2 56.2-94.3 56.2c-4.2 0-8.3-.4-12.4-1.1v15c3.4.4 6.9.7 10.3.7 44.8 0 77.2-22.9 108.6-49.9 5.2 4.2 26.5 14.3 30.9 18.7-29.8 25-99.3 45.1-138.7 45.1-3.8 0-7.4-.2-11-.6v21.1h170.2V0zm0 116.9v12.8c-41.4-7.4-52.9-50.5-52.9-50.5s19.9-22 52.9-25.6v14h-.1c-17.3-2.1-30.9 14.1-30.9 14.1s7.7 27.3 31 35.2M27.8 77.4s24.5-36.2 73.6-40V24.2C47 28.6 0 74.6 0 74.6s26.6 77 101.3 84v-14c-54.8-6.8-73.5-67.2-73.5-67.2z" fill="#76B900"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 406 KiB |
@@ -0,0 +1,155 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
width: 1200px;
|
||||
height: 630px;
|
||||
background: linear-gradient(135deg, #0a0a0f 0%, #1a1a2e 100%);
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.bg-blur {
|
||||
position: absolute;
|
||||
border-radius: 50%;
|
||||
filter: blur(150px);
|
||||
}
|
||||
.bg-blur-1 {
|
||||
top: -20%;
|
||||
left: -10%;
|
||||
width: 50%;
|
||||
height: 50%;
|
||||
background: rgba(45, 106, 227, 0.15);
|
||||
}
|
||||
.bg-blur-2 {
|
||||
bottom: -20%;
|
||||
right: -10%;
|
||||
width: 50%;
|
||||
height: 50%;
|
||||
background: rgba(0, 255, 155, 0.15);
|
||||
}
|
||||
.content {
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
text-align: center;
|
||||
padding: 60px;
|
||||
max-width: 1000px;
|
||||
}
|
||||
.logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 16px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.logo svg {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
fill: white;
|
||||
}
|
||||
.logo-text {
|
||||
font-size: 48px;
|
||||
font-weight: 800;
|
||||
color: white;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.title {
|
||||
font-size: 72px;
|
||||
font-weight: 800;
|
||||
color: white;
|
||||
margin-bottom: 30px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
.highlight {
|
||||
color: #00ff9b;
|
||||
}
|
||||
.subtitle {
|
||||
font-size: 32px;
|
||||
color: #a0a0a0;
|
||||
margin-bottom: 40px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.badges {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 30px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.badge {
|
||||
background: rgba(0, 255, 155, 0.1);
|
||||
border: 2px solid rgba(0, 255, 155, 0.3);
|
||||
padding: 12px 30px;
|
||||
border-radius: 50px;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
color: #00ff9b;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
.badge svg {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
fill: #00ff9b;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="bg-blur bg-blur-1"></div>
|
||||
<div class="bg-blur bg-blur-2"></div>
|
||||
|
||||
<div class="content">
|
||||
<div class="logo">
|
||||
<svg viewBox="0 0 67 67" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M22.21 67V44.6369H0V67H22.21Z"></path>
|
||||
<path d="M0 44.6369L22.21 46.8285V44.6369H0Z" opacity="0.7"></path>
|
||||
<path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z"></path>
|
||||
<path d="M22.21 0H0V22.3184H22.21V0Z"></path>
|
||||
<path d="M66.7198 0H44.5098V22.3184H66.7198V0Z"></path>
|
||||
<path d="M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" opacity="0.7"></path>
|
||||
<path d="M66.7198 67V44.6369H44.5098V67H66.7198Z"></path>
|
||||
</svg>
|
||||
<div class="logo-text">Hanzo</div>
|
||||
</div>
|
||||
|
||||
<h1 class="title">
|
||||
AI Supercomputing<br>
|
||||
<span class="highlight">On Your Terms</span>
|
||||
</h1>
|
||||
|
||||
<p class="subtitle">
|
||||
Access NVIDIA DGX, H100 & H200 GPUs<br>
|
||||
Starting at $3,999
|
||||
</p>
|
||||
|
||||
<div class="badges">
|
||||
<div class="badge">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M13 10V3L4 14h7v7l9-11h-7z"/>
|
||||
</svg>
|
||||
DGX Spark
|
||||
</div>
|
||||
<div class="badge">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<rect x="2" y="7" width="20" height="14" rx="2" ry="2"/>
|
||||
<path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/>
|
||||
</svg>
|
||||
H100 & H200
|
||||
</div>
|
||||
<div class="badge">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<circle cx="12" cy="12" r="10"/>
|
||||
<polyline points="12 6 12 12 16 14"/>
|
||||
</svg>
|
||||
On-Demand
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 408 KiB |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 50" fill="none">
|
||||
<g fill="#FFFFFF">
|
||||
<!-- techstars text -->
|
||||
<text x="5" y="32" font-family="Arial, sans-serif" font-size="28" font-weight="700" letter-spacing="-0.5">techstars</text>
|
||||
<!-- Correct underscore aligned with text -->
|
||||
<rect x="5" y="38" width="185" height="3" fill="#00C9FF"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 377 B |
|
After Width: | Height: | Size: 83 KiB |
@@ -9,10 +9,10 @@ test.describe('Ecommerce Flow', () => {
|
||||
|
||||
// Test DGX Spark highlight section
|
||||
await expect(page.getByRole('heading', { name: /DGX Spark/i }).first()).toBeVisible();
|
||||
await expect(page.getByText(/Only \$4,000/i)).toBeVisible();
|
||||
await expect(page.getByText(/Only \$3,999/i)).toBeVisible();
|
||||
|
||||
// Add to cart from highlight section
|
||||
await page.getByRole('button', { name: /Add to Cart - \$4,000/i }).click();
|
||||
await page.getByRole('button', { name: /Add to Cart - \$3,999/i }).click();
|
||||
|
||||
// Should navigate to cart
|
||||
await expect(page).toHaveURL('/cart');
|
||||
@@ -23,7 +23,7 @@ test.describe('Ecommerce Flow', () => {
|
||||
|
||||
// Verify cart item details
|
||||
await expect(page.getByRole('heading', { name: 'DGX Spark' })).toBeVisible();
|
||||
await expect(page.getByText(/\$4,000/i)).toBeVisible();
|
||||
await expect(page.getByText(/\$3,999/i)).toBeVisible();
|
||||
|
||||
// Test quantity controls
|
||||
const plusButton = page.getByRole('button', { name: '+' });
|
||||
@@ -130,7 +130,7 @@ test.describe('Navigation', () => {
|
||||
|
||||
// Dropdown should appear
|
||||
await expect(page.getByText('DGX Spark').first()).toBeVisible();
|
||||
await expect(page.getByText('$4,000 - Dedicated DGX Instance')).toBeVisible();
|
||||
await expect(page.getByText('$3,999 - Dedicated DGX Instance')).toBeVisible();
|
||||
await expect(page.getByText('GPU On-Demand')).toBeVisible();
|
||||
await expect(page.getByText('H100 & H200 GPUs')).toBeVisible();
|
||||
});
|
||||
@@ -224,7 +224,7 @@ test.describe('Cart Persistence', () => {
|
||||
await page.goto('/');
|
||||
|
||||
// Add item to cart
|
||||
await page.getByRole('button', { name: /Add to Cart - \$4,000/i }).click();
|
||||
await page.getByRole('button', { name: /Add to Cart - \$3,999/i }).click();
|
||||
await expect(page).toHaveURL('/cart');
|
||||
|
||||
// Add more items
|
||||
|
||||
@@ -6,27 +6,27 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<!-- Primary Meta Tags -->
|
||||
<title>Hanzo - On-Demand AI Supercomputing | DGX, H100, H200 GPU Access</title>
|
||||
<meta name="title" content="Hanzo - On-Demand AI Supercomputing | DGX, H100, H200 GPU Access" />
|
||||
<meta name="description" content="Access NVIDIA DGX systems, H100 and H200 GPUs on-demand. Start with DGX Spark at $4,000 for 100 hours of compute. Enterprise AI infrastructure by Hanzo.AI." />
|
||||
<title>Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access</title>
|
||||
<meta name="title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta name="description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://hanzo.computer/" />
|
||||
<meta property="og:title" content="Hanzo - On-Demand AI Supercomputing | DGX, H100, H200 GPU Access" />
|
||||
<meta property="og:description" content="Access NVIDIA DGX systems, H100 and H200 GPUs on-demand. Start with DGX Spark at $4,000 for 100 hours of compute. Enterprise AI infrastructure by Hanzo.AI." />
|
||||
<meta property="og:title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta property="og:description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
<meta property="og:image" content="https://hanzo.computer/og-image.jpg" />
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta property="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:url" content="https://hanzo.computer/" />
|
||||
<meta property="twitter:title" content="Hanzo - On-Demand AI Supercomputing | DGX, H100, H200 GPU Access" />
|
||||
<meta property="twitter:description" content="Access NVIDIA DGX systems, H100 and H200 GPUs on-demand. Start with DGX Spark at $4,000 for 100 hours of compute. Enterprise AI infrastructure by Hanzo.AI." />
|
||||
<meta property="twitter:title" content="Hanzo - AI Supercomputing | Blackwell, Hopper, DGX GPU Access" />
|
||||
<meta property="twitter:description" content="Access NVIDIA Blackwell B200, B300, GB200 NVL72, and DGX Spark GPUs on-demand. Enterprise AI infrastructure by Hanzo.AI starting at $3,999." />
|
||||
<meta property="twitter:image" content="https://hanzo.computer/og-image.jpg" />
|
||||
<meta name="twitter:site" content="@hanzoai" />
|
||||
|
||||
<!-- Additional Meta Tags -->
|
||||
<meta name="keywords" content="AI supercomputing, NVIDIA DGX, H100 GPU, H200 GPU, GPU rental, AI infrastructure, machine learning, deep learning, cloud GPU, DGX Spark" />
|
||||
<meta name="keywords" content="AI supercomputing, NVIDIA DGX, H100 GPU, H200 GPU, Blackwell, B200, B300, GB200, GB300, DGX Spark, Vera Rubin, GPU rental, AI infrastructure, machine learning, deep learning, cloud GPU" />
|
||||
<meta name="author" content="Hanzo Industries Inc" />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<link rel="canonical" href="https://hanzo.computer/" />
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
|
||||
<p class="subtitle">
|
||||
Access NVIDIA DGX, H100 & H200 GPUs<br>
|
||||
Starting at $4,000
|
||||
Starting at $3,999
|
||||
</p>
|
||||
|
||||
<div class="badges">
|
||||
|
||||
@@ -153,7 +153,7 @@ const FeaturesPage: React.FC = () => {
|
||||
to="/#dgx-spark"
|
||||
className="px-10 py-4 bg-primary text-black font-bold rounded-lg hover:bg-primary-dark transition-all text-lg"
|
||||
>
|
||||
Buy DGX Spark - $4,000
|
||||
Buy DGX Spark - $3,999
|
||||
</Link>
|
||||
<Link
|
||||
to="/request-quote"
|
||||
|
||||
@@ -55,7 +55,7 @@ const TermsOfService: React.FC = () => {
|
||||
|
||||
<h3 className="text-xl font-semibold text-white mb-2 mt-4">4.1 DGX Spark</h3>
|
||||
<ul className="list-disc list-inside space-y-2 pl-4 mb-4">
|
||||
<li>One-time payment of $4,000 includes dedicated DGX instance</li>
|
||||
<li>One-time payment of $3,999 includes dedicated DGX instance</li>
|
||||
<li>Includes 100 hours of compute time</li>
|
||||
<li>Additional compute hours available for purchase</li>
|
||||
<li>Maximum 5 units per order</li>
|
||||
|
||||