feat: enhance SEO and public files for Velxio
- Added comprehensive SEO meta tags to `frontend/index.html` including Open Graph and Twitter Card data. - Updated `frontend/public` with new favicon assets and a PWA manifest. - Created a favicon generation script to automate favicon creation from SVG. - Implemented `robots.txt` to allow all crawlers and point to the sitemap. - Added `sitemap.xml` with public routes and priorities for better indexing.pull/10/head
|
|
@ -243,6 +243,14 @@ Wire positions auto-update when components move via `updateWirePositions()`.
|
|||
- [frontend/src/pages/UserProfilePage.tsx](frontend/src/pages/UserProfilePage.tsx) - Profile with project grid
|
||||
- [frontend/src/pages/ProjectPage.tsx](frontend/src/pages/ProjectPage.tsx) - Loads project into editor
|
||||
|
||||
### Frontend - SEO & Public Files
|
||||
- `frontend/index.html` — Full SEO meta tags, OG, Twitter Card, JSON-LD. **Domain is `https://velxio.dev`** — update if domain changes.
|
||||
- `frontend/public/favicon.svg` — SVG chip favicon (scales to all sizes)
|
||||
- `frontend/public/og-image.svg` — 1200×630 social preview image (OG/Twitter). Export as PNG for max compatibility.
|
||||
- `frontend/public/robots.txt` — Allow all crawlers, points to sitemap
|
||||
- `frontend/public/sitemap.xml` — All public routes with priorities
|
||||
- `frontend/public/manifest.webmanifest` — PWA manifest, theme color `#007acc`
|
||||
|
||||
### Docker & CI
|
||||
- [Dockerfile.standalone](Dockerfile.standalone) - Multi-stage Docker build
|
||||
- [.github/workflows/docker-publish.yml](.github/workflows/docker-publish.yml) - Publishes to GHCR + Docker Hub on push to master
|
||||
|
|
|
|||
|
|
@ -2,9 +2,206 @@
|
|||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>frontend</title>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
PRIMARY SEO
|
||||
Replace https://velxio.dev with your real domain
|
||||
═══════════════════════════════════════════════ -->
|
||||
<title>Velxio — Free Local Arduino Emulator | AVR8 · RP2040 · 48+ Components</title>
|
||||
<meta name="description" content="Velxio is a free, open-source Arduino emulator that runs entirely in your browser. Real AVR8 emulation at 16 MHz, 48+ electronic components, Monaco Editor, Serial Monitor, and Library Manager — no cloud, no latency." />
|
||||
<meta name="keywords" content="arduino emulator, arduino simulator, avr8 emulator, avr simulator, rp2040 emulator, arduino online, wokwi alternative, arduino ide browser, arduino simulator free, attmega328p simulator, raspberry pi pico emulator, arduino uno simulator, electronics simulator, velxio" />
|
||||
<meta name="author" content="David Montero Crespo" />
|
||||
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />
|
||||
<link rel="canonical" href="https://velxio.dev/" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
OPEN GRAPH (Facebook, LinkedIn, WhatsApp, Telegram, Discord, Slack…)
|
||||
═══════════════════════════════════════════════ -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="Velxio" />
|
||||
<meta property="og:title" content="Velxio — Free Local Arduino Emulator" />
|
||||
<meta property="og:description" content="Write, compile, and simulate Arduino sketches entirely in your browser. Real AVR8 CPU at 16 MHz, 48+ electronic components, Serial Monitor, and Library Manager. Free & open source." />
|
||||
<meta property="og:url" content="https://velxio.dev/" />
|
||||
<meta property="og:image" content="https://velxio.dev/og-image.svg" />
|
||||
<meta property="og:image:width" content="1200" />
|
||||
<meta property="og:image:height" content="630" />
|
||||
<meta property="og:image:alt" content="Velxio Arduino Emulator — Real AVR8, 48+ Components, Monaco Editor" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
TWITTER / X CARD
|
||||
═══════════════════════════════════════════════ -->
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:site" content="@velxio_app" />
|
||||
<meta name="twitter:creator" content="@velxio_app" />
|
||||
<meta name="twitter:title" content="Velxio — Free Local Arduino Emulator" />
|
||||
<meta name="twitter:description" content="Write, compile, and simulate Arduino sketches entirely in your browser. Real AVR8 CPU at 16 MHz, 48+ components, Serial Monitor, Library Manager. Free & open source." />
|
||||
<meta name="twitter:image" content="https://velxio.dev/og-image.svg" />
|
||||
<meta name="twitter:image:alt" content="Velxio Arduino Emulator — Real AVR8, 48+ Components, Monaco Editor" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
THEME & APP
|
||||
═══════════════════════════════════════════════ -->
|
||||
<meta name="theme-color" content="#007acc" />
|
||||
<meta name="color-scheme" content="dark" />
|
||||
<meta name="application-name" content="Velxio" />
|
||||
<meta name="generator" content="Vite + React + FastAPI" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
FAVICON — full set generated by scripts/generate-favicons.mjs
|
||||
═══════════════════════════════════════════════ -->
|
||||
<!-- SVG: modern browsers (scales perfectly) -->
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<!-- ICO: legacy browsers / Windows taskbar -->
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
<!-- PNG fallbacks -->
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||
<!-- Apple devices (Safari, iOS home screen) -->
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
PWA / WEB APP MANIFEST
|
||||
═══════════════════════════════════════════════ -->
|
||||
<link rel="manifest" href="/manifest.webmanifest" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
PRECONNECT (speed up external resources)
|
||||
═══════════════════════════════════════════════ -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://github.com" />
|
||||
|
||||
<!-- ═══════════════════════════════════════════════
|
||||
JSON-LD STRUCTURED DATA
|
||||
Helps Google understand the page type and show
|
||||
rich results in search (ratings, price, etc.)
|
||||
═══════════════════════════════════════════════ -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@graph": [
|
||||
{
|
||||
"@type": "WebSite",
|
||||
"@id": "https://velxio.dev/#website",
|
||||
"url": "https://velxio.dev/",
|
||||
"name": "Velxio",
|
||||
"description": "Free local Arduino emulator with real AVR8 CPU emulation.",
|
||||
"inLanguage": "en-US",
|
||||
"potentialAction": {
|
||||
"@type": "SearchAction",
|
||||
"target": {
|
||||
"@type": "EntryPoint",
|
||||
"urlTemplate": "https://velxio.dev/examples?q={search_term_string}"
|
||||
},
|
||||
"query-input": "required name=search_term_string"
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "SoftwareApplication",
|
||||
"@id": "https://velxio.dev/#app",
|
||||
"name": "Velxio",
|
||||
"alternateName": ["Velxio Arduino Emulator", "Velxio AVR Simulator"],
|
||||
"description": "Free, open-source Arduino emulator running entirely in the browser. Features real ATmega328p (AVR8) emulation at 16 MHz, RP2040 emulation, 48+ interactive electronic components, Monaco Editor, Serial Monitor with baud-rate detection, arduino-cli compilation backend, and Library Manager.",
|
||||
"url": "https://velxio.dev/",
|
||||
"applicationCategory": "DeveloperApplication",
|
||||
"applicationSubCategory": "Electronics Simulator",
|
||||
"operatingSystem": "Web Browser",
|
||||
"browserRequirements": "Requires JavaScript. Works in Chrome, Firefox, Safari, Edge.",
|
||||
"softwareVersion": "1.0.0",
|
||||
"releaseNotes": "https://github.com/davidmonterocrespo24/velxio/releases",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD",
|
||||
"availability": "https://schema.org/InStock"
|
||||
},
|
||||
"featureList": [
|
||||
"Real ATmega328p AVR8 emulation at 16 MHz",
|
||||
"RP2040 (Raspberry Pi Pico) emulation",
|
||||
"48+ electronic web components",
|
||||
"Monaco Code Editor with C++ syntax highlighting",
|
||||
"arduino-cli compilation backend",
|
||||
"Serial Monitor with auto baud-rate detection",
|
||||
"Library Manager for Arduino libraries",
|
||||
"Multi-file workspace",
|
||||
"Wire system with orthogonal routing",
|
||||
"ILI9341 TFT display simulation",
|
||||
"I2C, SPI, USART, ADC, PWM support"
|
||||
],
|
||||
"screenshot": "https://velxio.dev/og-image.svg",
|
||||
"downloadUrl": "https://hub.docker.com/r/davidmonterocrespo24/velxio",
|
||||
"installUrl": "https://velxio.dev/editor",
|
||||
"codeRepository": "https://github.com/davidmonterocrespo24/velxio",
|
||||
"license": "https://opensource.org/licenses/MIT",
|
||||
"isAccessibleForFree": true,
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"name": "David Montero Crespo",
|
||||
"url": "https://github.com/davidmonterocrespo24"
|
||||
},
|
||||
"maintainer": {
|
||||
"@type": "Person",
|
||||
"name": "David Montero Crespo",
|
||||
"url": "https://github.com/davidmonterocrespo24"
|
||||
},
|
||||
"keywords": "arduino emulator, avr8 simulator, rp2040 emulator, arduino online ide, electronics simulator, wokwi alternative",
|
||||
"inLanguage": "en-US"
|
||||
},
|
||||
{
|
||||
"@type": "WebPage",
|
||||
"@id": "https://velxio.dev/#webpage",
|
||||
"url": "https://velxio.dev/",
|
||||
"name": "Velxio — Free Local Arduino Emulator | AVR8 · RP2040 · 48+ Components",
|
||||
"description": "Velxio is a free, open-source Arduino emulator. Real AVR8 CPU emulation, 48+ components, Monaco Editor, Serial Monitor — no cloud, no latency.",
|
||||
"isPartOf": { "@id": "https://velxio.dev/#website" },
|
||||
"about": { "@id": "https://velxio.dev/#app" },
|
||||
"inLanguage": "en-US",
|
||||
"potentialAction": {
|
||||
"@type": "ReadAction",
|
||||
"target": "https://velxio.dev/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Velxio free?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, Velxio is completely free and open source under the MIT License."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Does Velxio work offline?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Velxio can be self-hosted via Docker. Once running, the simulation engine works fully offline in the browser. Compilation requires the local arduino-cli backend."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What boards does Velxio support?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Velxio supports Arduino Uno (ATmega328p) with full AVR8 emulation and Raspberry Pi Pico (RP2040) emulation. More boards are planned."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Velxio a Wokwi alternative?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes. Velxio is a free, self-hosted alternative to Wokwi. It uses the same avr8js and wokwi-elements open-source libraries but runs entirely on your machine with no cloud dependency."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
"type": "module",
|
||||
"scripts": {
|
||||
"generate:metadata": "cd .. && npx tsx scripts/generate-component-metadata.ts",
|
||||
"generate:favicons": "node ../scripts/generate-favicons.mjs",
|
||||
"dev": "npm run generate:metadata && vite",
|
||||
"build": "npm run generate:metadata && tsc -b && vite build",
|
||||
"build:docker": "vite build",
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 532 B |
|
After Width: | Height: | Size: 751 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -0,0 +1,17 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
|
||||
<rect width="32" height="32" rx="7" fill="#0d0d0f"/>
|
||||
<rect x="7" y="7" width="18" height="18" rx="2.5" stroke="#007acc" stroke-width="2"/>
|
||||
<rect x="11" y="11" width="10" height="10" rx="1.5" stroke="#007acc" stroke-width="1.5"/>
|
||||
<!-- top pins -->
|
||||
<line x1="12" y1="3" x2="12" y2="7" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="20" y1="3" x2="20" y2="7" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<!-- bottom pins -->
|
||||
<line x1="12" y1="25" x2="12" y2="29" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="20" y1="25" x2="20" y2="29" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<!-- left pins -->
|
||||
<line x1="3" y1="12" x2="7" y2="12" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="3" y1="20" x2="7" y2="20" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<!-- right pins -->
|
||||
<line x1="25" y1="12" x2="29" y2="12" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<line x1="25" y1="20" x2="29" y2="20" stroke="#007acc" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"name": "Velxio — Arduino Emulator",
|
||||
"short_name": "Velxio",
|
||||
"description": "Free local Arduino emulator with real AVR8 CPU emulation, 48+ electronic components, Monaco Editor, and Serial Monitor. No cloud, no latency.",
|
||||
"start_url": "/editor",
|
||||
"scope": "/",
|
||||
"display": "standalone",
|
||||
"orientation": "landscape",
|
||||
"background_color": "#0d0d0f",
|
||||
"theme_color": "#007acc",
|
||||
"categories": ["developer", "education", "productivity"],
|
||||
"lang": "en",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicon-16x16.png",
|
||||
"sizes": "16x16",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/favicon-32x32.png",
|
||||
"sizes": "32x32",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/android-chrome-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/android-chrome-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
},
|
||||
{
|
||||
"src": "/favicon.svg",
|
||||
"sizes": "any",
|
||||
"type": "image/svg+xml",
|
||||
"purpose": "any maskable"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"src": "/og-image.svg",
|
||||
"sizes": "1200x630",
|
||||
"type": "image/svg+xml",
|
||||
"label": "Velxio Arduino Emulator"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" width="1200" height="630">
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" stop-color="#0d0d0f"/>
|
||||
<stop offset="100%" stop-color="#0a1520"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="title-grad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" stop-color="#007acc"/>
|
||||
<stop offset="100%" stop-color="#00c896"/>
|
||||
</linearGradient>
|
||||
<filter id="glow">
|
||||
<feGaussianBlur stdDeviation="20" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="1200" height="630" fill="url(#bg)"/>
|
||||
|
||||
<!-- Glow blob -->
|
||||
<ellipse cx="600" cy="280" rx="380" ry="240" fill="#007acc" opacity="0.06" filter="url(#glow)"/>
|
||||
|
||||
<!-- Grid lines decoration -->
|
||||
<g stroke="#1e1e2a" stroke-width="1" opacity="0.6">
|
||||
<line x1="0" y1="105" x2="1200" y2="105"/>
|
||||
<line x1="0" y1="210" x2="1200" y2="210"/>
|
||||
<line x1="0" y1="315" x2="1200" y2="315"/>
|
||||
<line x1="0" y1="420" x2="1200" y2="420"/>
|
||||
<line x1="0" y1="525" x2="1200" y2="525"/>
|
||||
<line x1="200" y1="0" x2="200" y2="630"/>
|
||||
<line x1="400" y1="0" x2="400" y2="630"/>
|
||||
<line x1="600" y1="0" x2="600" y2="630"/>
|
||||
<line x1="800" y1="0" x2="800" y2="630"/>
|
||||
<line x1="1000" y1="0" x2="1000" y2="630"/>
|
||||
</g>
|
||||
|
||||
<!-- Left decorative chip -->
|
||||
<g transform="translate(80, 200)" opacity="0.15" stroke="#007acc" stroke-width="2" fill="none">
|
||||
<rect x="0" y="0" width="80" height="80" rx="8"/>
|
||||
<rect x="15" y="15" width="50" height="50" rx="4"/>
|
||||
<line x1="20" y1="-15" x2="20" y2="0"/>
|
||||
<line x1="60" y1="-15" x2="60" y2="0"/>
|
||||
<line x1="20" y1="80" x2="20" y2="95"/>
|
||||
<line x1="60" y1="80" x2="60" y2="95"/>
|
||||
<line x1="-15" y1="20" x2="0" y2="20"/>
|
||||
<line x1="-15" y1="60" x2="0" y2="60"/>
|
||||
<line x1="80" y1="20" x2="95" y2="20"/>
|
||||
<line x1="80" y1="60" x2="95" y2="60"/>
|
||||
</g>
|
||||
|
||||
<!-- Right decorative chip -->
|
||||
<g transform="translate(1020, 320)" opacity="0.12" stroke="#00c896" stroke-width="2" fill="none">
|
||||
<rect x="0" y="0" width="60" height="60" rx="6"/>
|
||||
<rect x="12" y="12" width="36" height="36" rx="3"/>
|
||||
<line x1="15" y1="-12" x2="15" y2="0"/>
|
||||
<line x1="45" y1="-12" x2="45" y2="0"/>
|
||||
<line x1="15" y1="60" x2="15" y2="72"/>
|
||||
<line x1="45" y1="60" x2="45" y2="72"/>
|
||||
<line x1="-12" y1="15" x2="0" y2="15"/>
|
||||
<line x1="-12" y1="45" x2="0" y2="45"/>
|
||||
<line x1="60" y1="15" x2="72" y2="15"/>
|
||||
<line x1="60" y1="45" x2="72" y2="45"/>
|
||||
</g>
|
||||
|
||||
<!-- Top-right small chip -->
|
||||
<g transform="translate(1050, 80)" opacity="0.10" stroke="#007acc" stroke-width="1.5" fill="none">
|
||||
<rect x="0" y="0" width="44" height="44" rx="5"/>
|
||||
<rect x="9" y="9" width="26" height="26" rx="2.5"/>
|
||||
<line x1="11" y1="-10" x2="11" y2="0"/>
|
||||
<line x1="33" y1="-10" x2="33" y2="0"/>
|
||||
<line x1="11" y1="44" x2="11" y2="54"/>
|
||||
<line x1="33" y1="44" x2="33" y2="54"/>
|
||||
<line x1="-10" y1="11" x2="0" y2="11"/>
|
||||
<line x1="-10" y1="33" x2="0" y2="33"/>
|
||||
<line x1="44" y1="11" x2="54" y2="11"/>
|
||||
<line x1="44" y1="33" x2="54" y2="33"/>
|
||||
</g>
|
||||
|
||||
<!-- Badge pill -->
|
||||
<rect x="480" y="140" width="240" height="34" rx="17" fill="none" stroke="#007acc" stroke-width="1.5" opacity="0.5"/>
|
||||
<rect x="481" y="141" width="238" height="32" rx="16" fill="#007acc" opacity="0.1"/>
|
||||
<text x="600" y="163" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="600" fill="#007acc" letter-spacing="2">OPEN SOURCE · FREE · LOCAL</text>
|
||||
|
||||
<!-- Main logo chip icon -->
|
||||
<g transform="translate(548, 192)" stroke="#007acc" stroke-width="3" fill="none" stroke-linecap="round">
|
||||
<rect x="0" y="0" width="44" height="44" rx="6"/>
|
||||
<rect x="10" y="10" width="24" height="24" rx="3"/>
|
||||
<line x1="14" y1="-10" x2="14" y2="0"/>
|
||||
<line x1="30" y1="-10" x2="30" y2="0"/>
|
||||
<line x1="14" y1="44" x2="14" y2="54"/>
|
||||
<line x1="30" y1="44" x2="30" y2="54"/>
|
||||
<line x1="-10" y1="14" x2="0" y2="14"/>
|
||||
<line x1="-10" y1="30" x2="0" y2="30"/>
|
||||
<line x1="44" y1="14" x2="54" y2="14"/>
|
||||
<line x1="44" y1="30" x2="54" y2="30"/>
|
||||
</g>
|
||||
|
||||
<!-- Title: VELXIO -->
|
||||
<text x="600" y="340" text-anchor="middle"
|
||||
font-family="system-ui, -apple-system, 'Segoe UI', sans-serif"
|
||||
font-size="96" font-weight="900" letter-spacing="-3"
|
||||
fill="url(#title-grad)">VELXIO</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="600" y="400" text-anchor="middle"
|
||||
font-family="system-ui, -apple-system, sans-serif"
|
||||
font-size="26" font-weight="400" fill="#7a7a8c">
|
||||
Arduino Emulator — Real AVR8 · 48+ Components · Monaco Editor
|
||||
</text>
|
||||
|
||||
<!-- Tags row -->
|
||||
<g font-family="'Consolas', 'Courier New', monospace" font-size="15" fill="#007acc">
|
||||
<!-- Tag 1 -->
|
||||
<rect x="282" y="444" width="100" height="30" rx="6" fill="#007acc" opacity="0.12" stroke="#007acc" stroke-width="1" opacity2="0.3"/>
|
||||
<text x="332" y="464" text-anchor="middle" fill="#007acc">arduino-cli</text>
|
||||
<!-- Tag 2 -->
|
||||
<rect x="398" y="444" width="80" height="30" rx="6" fill="#007acc" opacity="0.12" stroke="#007acc" stroke-width="1"/>
|
||||
<text x="438" y="464" text-anchor="middle" fill="#007acc">avr8js</text>
|
||||
<!-- Tag 3 -->
|
||||
<rect x="494" y="444" width="90" height="30" rx="6" fill="#007acc" opacity="0.12" stroke="#007acc" stroke-width="1"/>
|
||||
<text x="539" y="464" text-anchor="middle" fill="#007acc">rp2040js</text>
|
||||
<!-- Tag 4 -->
|
||||
<rect x="600" y="444" width="110" height="30" rx="6" fill="#007acc" opacity="0.12" stroke="#007acc" stroke-width="1"/>
|
||||
<text x="655" y="464" text-anchor="middle" fill="#007acc">TypeScript</text>
|
||||
<!-- Tag 5 -->
|
||||
<rect x="726" y="444" width="70" height="30" rx="6" fill="#00c896" opacity="0.12" stroke="#00c896" stroke-width="1"/>
|
||||
<text x="761" y="464" text-anchor="middle" fill="#00c896">FastAPI</text>
|
||||
<!-- Tag 6 -->
|
||||
<rect x="812" y="444" width="60" height="30" rx="6" fill="#00c896" opacity="0.12" stroke="#00c896" stroke-width="1"/>
|
||||
<text x="842" y="464" text-anchor="middle" fill="#00c896">React</text>
|
||||
</g>
|
||||
|
||||
<!-- Bottom border accent -->
|
||||
<rect x="0" y="622" width="1200" height="8" fill="url(#title-grad)" opacity="0.8"/>
|
||||
|
||||
<!-- URL bottom -->
|
||||
<text x="600" y="608" text-anchor="middle"
|
||||
font-family="system-ui, -apple-system, sans-serif"
|
||||
font-size="16" fill="#444" letter-spacing="0.5">
|
||||
github.com/davidmonterocrespo24/velxio
|
||||
</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Sitemap
|
||||
Sitemap: https://velxio.dev/sitemap.xml
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<url>
|
||||
<loc>https://velxio.dev/</loc>
|
||||
<lastmod>2026-03-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
|
||||
<url>
|
||||
<loc>https://velxio.dev/editor</loc>
|
||||
<lastmod>2026-03-06</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
|
||||
<url>
|
||||
<loc>https://velxio.dev/examples</loc>
|
||||
<lastmod>2026-03-06</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
|
||||
<url>
|
||||
<loc>https://velxio.dev/login</loc>
|
||||
<lastmod>2026-03-06</lastmod>
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.3</priority>
|
||||
</url>
|
||||
|
||||
<url>
|
||||
<loc>https://velxio.dev/register</loc>
|
||||
<lastmod>2026-03-06</lastmod>
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.3</priority>
|
||||
</url>
|
||||
|
||||
</urlset>
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/**
|
||||
* Favicon generator — converts favicon.svg into all required sizes.
|
||||
* Run from project root: node scripts/generate-favicons.mjs
|
||||
*
|
||||
* Generates:
|
||||
* frontend/public/favicon-16x16.png
|
||||
* frontend/public/favicon-32x32.png
|
||||
* frontend/public/favicon-48x48.png
|
||||
* frontend/public/apple-touch-icon.png (180x180)
|
||||
* frontend/public/android-chrome-192.png
|
||||
* frontend/public/android-chrome-512.png
|
||||
* frontend/public/favicon.ico (16+32+48 multi-size)
|
||||
*/
|
||||
|
||||
import { readFileSync, writeFileSync } from 'fs';
|
||||
import { join, dirname } from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const ROOT = join(__dirname, '..');
|
||||
const PUBLIC = join(ROOT, 'frontend', 'public');
|
||||
|
||||
// ── install deps on the fly if missing ─────────────────────────────
|
||||
import { createRequire } from 'module';
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
async function ensureDep(pkg) {
|
||||
try { return await import(pkg); } catch {}
|
||||
console.log(`Installing ${pkg}…`);
|
||||
const { execSync } = await import('child_process');
|
||||
execSync(`npm install --no-save ${pkg}`, { stdio: 'inherit', cwd: ROOT });
|
||||
return await import(pkg);
|
||||
}
|
||||
|
||||
const { Resvg } = await ensureDep('@resvg/resvg-js');
|
||||
const pngToIcoMod = await ensureDep('png-to-ico');
|
||||
const pngToIco = pngToIcoMod.default ?? pngToIcoMod;
|
||||
|
||||
// ── render helper ───────────────────────────────────────────────────
|
||||
const svgSrc = readFileSync(join(PUBLIC, 'favicon.svg'));
|
||||
|
||||
function renderPng(size) {
|
||||
const resvg = new Resvg(svgSrc, {
|
||||
fitTo: { mode: 'width', value: size },
|
||||
font: { loadSystemFonts: false },
|
||||
});
|
||||
return resvg.render().asPng();
|
||||
}
|
||||
|
||||
// ── generate PNGs ───────────────────────────────────────────────────
|
||||
const sizes = [
|
||||
{ name: 'favicon-16x16.png', size: 16 },
|
||||
{ name: 'favicon-32x32.png', size: 32 },
|
||||
{ name: 'favicon-48x48.png', size: 48 },
|
||||
{ name: 'apple-touch-icon.png', size: 180 },
|
||||
{ name: 'android-chrome-192.png', size: 192 },
|
||||
{ name: 'android-chrome-512.png', size: 512 },
|
||||
];
|
||||
|
||||
const pngBuffers = {};
|
||||
for (const { name, size } of sizes) {
|
||||
const buf = renderPng(size);
|
||||
writeFileSync(join(PUBLIC, name), buf);
|
||||
pngBuffers[size] = buf;
|
||||
console.log(`✓ ${name} (${size}x${size})`);
|
||||
}
|
||||
|
||||
// ── generate favicon.ico (16 + 32 + 48) ────────────────────────────
|
||||
const icoBuffer = await pngToIco([
|
||||
pngBuffers[16],
|
||||
pngBuffers[32],
|
||||
pngBuffers[48],
|
||||
]);
|
||||
writeFileSync(join(PUBLIC, 'favicon.ico'), icoBuffer);
|
||||
console.log('✓ favicon.ico (16+32+48)');
|
||||
|
||||
console.log('\nAll favicon assets generated in frontend/public/');
|
||||