commit
6f76aaa224
|
|
@ -56,6 +56,12 @@ jobs:
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
|
- name: Ping search engines with sitemap
|
||||||
|
if: success()
|
||||||
|
run: |
|
||||||
|
curl -s "https://www.google.com/ping?sitemap=https%3A%2F%2Fvelxio.dev%2Fsitemap.xml" -o /dev/null -w "Google ping: %{http_code}\n"
|
||||||
|
curl -s "https://www.bing.com/ping?sitemap=https%3A%2F%2Fvelxio.dev%2Fsitemap.xml" -o /dev/null -w "Bing ping: %{http_code}\n"
|
||||||
|
|
||||||
- name: Update Docker Hub description
|
- name: Update Docker Hub description
|
||||||
uses: peter-evans/dockerhub-description@v4
|
uses: peter-evans/dockerhub-description@v4
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,10 @@
|
||||||
"generate:metadata": "cd .. && npx tsx scripts/generate-component-metadata.ts",
|
"generate:metadata": "cd .. && npx tsx scripts/generate-component-metadata.ts",
|
||||||
"generate:favicons": "node ../scripts/generate-favicons.mjs",
|
"generate:favicons": "node ../scripts/generate-favicons.mjs",
|
||||||
"generate:og-image": "node ../scripts/generate-og-image.mjs",
|
"generate:og-image": "node ../scripts/generate-og-image.mjs",
|
||||||
|
"generate:sitemap": "cd .. && npx tsx scripts/generate-sitemap.ts",
|
||||||
"dev": "npm run generate:metadata && vite",
|
"dev": "npm run generate:metadata && vite",
|
||||||
"build": "npm run generate:metadata && tsc -b && vite build",
|
"build": "npm run generate:metadata && npm run generate:sitemap && tsc -b && vite build",
|
||||||
"build:docker": "vite build",
|
"build:docker": "npm run generate:sitemap && vite build",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"test": "vitest run",
|
"test": "vitest run",
|
||||||
|
|
|
||||||
|
|
@ -2,192 +2,162 @@
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||||
|
|
||||||
<!-- ── Main pages ─────────────────────────────────── -->
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/</loc>
|
<loc>https://velxio.dev/</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/editor</loc>
|
<loc>https://velxio.dev/editor</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/examples</loc>
|
<loc>https://velxio.dev/examples</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<!-- ── Documentation ──────────────────────────────── -->
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs</loc>
|
<loc>https://velxio.dev/docs</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/intro</loc>
|
<loc>https://velxio.dev/docs/intro</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/getting-started</loc>
|
<loc>https://velxio.dev/docs/getting-started</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/emulator</loc>
|
<loc>https://velxio.dev/docs/emulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/esp32-emulation</loc>
|
<loc>https://velxio.dev/docs/esp32-emulation</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/riscv-emulation</loc>
|
<loc>https://velxio.dev/docs/riscv-emulation</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/rp2040-emulation</loc>
|
<loc>https://velxio.dev/docs/rp2040-emulation</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/raspberry-pi3-emulation</loc>
|
<loc>https://velxio.dev/docs/raspberry-pi3-emulation</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/components</loc>
|
<loc>https://velxio.dev/docs/components</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/architecture</loc>
|
<loc>https://velxio.dev/docs/architecture</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/wokwi-libs</loc>
|
<loc>https://velxio.dev/docs/wokwi-libs</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/mcp</loc>
|
<loc>https://velxio.dev/docs/mcp</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/setup</loc>
|
<loc>https://velxio.dev/docs/setup</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/docs/roadmap</loc>
|
<loc>https://velxio.dev/docs/roadmap</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<!-- ── SEO keyword landing pages ──────────────────── -->
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/arduino-simulator</loc>
|
<loc>https://velxio.dev/arduino-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/arduino-emulator</loc>
|
<loc>https://velxio.dev/arduino-emulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/atmega328p-simulator</loc>
|
<loc>https://velxio.dev/atmega328p-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.85</priority>
|
<priority>0.85</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/arduino-mega-simulator</loc>
|
<loc>https://velxio.dev/arduino-mega-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.85</priority>
|
<priority>0.85</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/esp32-simulator</loc>
|
<loc>https://velxio.dev/esp32-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/esp32-s3-simulator</loc>
|
<loc>https://velxio.dev/esp32-s3-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.85</priority>
|
<priority>0.85</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/esp32-c3-simulator</loc>
|
<loc>https://velxio.dev/esp32-c3-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.85</priority>
|
<priority>0.85</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/raspberry-pi-pico-simulator</loc>
|
<loc>https://velxio.dev/raspberry-pi-pico-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/raspberry-pi-simulator</loc>
|
<loc>https://velxio.dev/raspberry-pi-simulator</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.85</priority>
|
<priority>0.85</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<!-- ── Release pages ────────────────────────────────── -->
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://velxio.dev/v2</loc>
|
<loc>https://velxio.dev/v2</loc>
|
||||||
<lastmod>2026-03-23</lastmod>
|
<lastmod>2026-03-23</lastmod>
|
||||||
|
|
@ -195,6 +165,4 @@
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
<!-- Auth/admin/project pages intentionally excluded (noindex) -->
|
|
||||||
|
|
||||||
</urlset>
|
</urlset>
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,64 @@
|
||||||
background: #484848;
|
background: #484848;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Repository cards ────────────────────────────────── */
|
||||||
|
.v2-repos {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 12px;
|
||||||
|
background: #121214;
|
||||||
|
border: 1px solid #1c1c1e;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 1rem 1.15rem;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: border-color 0.2s, transform 0.15s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card:hover {
|
||||||
|
border-color: #333;
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card > svg {
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-top: 2px;
|
||||||
|
color: #8b949e;
|
||||||
|
fill: #8b949e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card h3 {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #e6edf3;
|
||||||
|
margin: 0 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card p {
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: #8b949e;
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card--primary {
|
||||||
|
border-color: rgba(0, 122, 204, 0.3);
|
||||||
|
background: rgba(0, 122, 204, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card--primary:hover {
|
||||||
|
border-color: #007acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v2-repo-card--primary h3 {
|
||||||
|
color: #007acc;
|
||||||
|
}
|
||||||
|
|
||||||
/* ── Bottom community ────────────────────────────────── */
|
/* ── Bottom community ────────────────────────────────── */
|
||||||
.v2-bottom-community {
|
.v2-bottom-community {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ const JSON_LD: object[] = [
|
||||||
operatingSystem: 'Any (browser-based)',
|
operatingSystem: 'Any (browser-based)',
|
||||||
softwareVersion: '2.0.0',
|
softwareVersion: '2.0.0',
|
||||||
description:
|
description:
|
||||||
'Velxio 2.0 — a free, open-source multi-board embedded systems simulator. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, sensor simulation, 68+ examples. Runs in your browser.',
|
'Velxio 2.0 — simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser. 19 boards, 68+ examples, realistic sensor simulation. Free and open-source.',
|
||||||
url: 'https://velxio.dev/v2',
|
url: 'https://velxio.dev/v2',
|
||||||
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
||||||
author: { '@type': 'Person', name: 'David Montero Crespo' },
|
author: { '@type': 'Person', name: 'David Montero Crespo' },
|
||||||
|
|
@ -236,7 +236,7 @@ export const Velxio2Page: React.FC = () => {
|
||||||
useSEO({
|
useSEO({
|
||||||
title: 'Velxio 2.0 — Multi-Board Embedded Simulator | ESP32, Raspberry Pi, Arduino, RISC-V',
|
title: 'Velxio 2.0 — Multi-Board Embedded Simulator | ESP32, Raspberry Pi, Arduino, RISC-V',
|
||||||
description:
|
description:
|
||||||
'Velxio 2.0 is here. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, realistic sensor simulation, 68+ examples. A free, open-source multi-platform embedded systems simulator.',
|
'Velxio 2.0 is here. Simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser. 19 boards, 68+ examples, realistic sensor simulation. Free and open-source.',
|
||||||
url: 'https://velxio.dev/v2',
|
url: 'https://velxio.dev/v2',
|
||||||
jsonLd: JSON_LD,
|
jsonLd: JSON_LD,
|
||||||
});
|
});
|
||||||
|
|
@ -255,9 +255,9 @@ export const Velxio2Page: React.FC = () => {
|
||||||
<span className="accent">Multi-Platform Embedded Simulator</span>
|
<span className="accent">Multi-Platform Embedded Simulator</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p className="subtitle">
|
<p className="subtitle">
|
||||||
19 boards across 5 CPU architectures — AVR8, RP2040, RISC-V, Xtensa, and ARM Linux.
|
Simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser.
|
||||||
QEMU-based ESP32 emulation, realistic sensor simulation, 68+ ready-to-run examples.
|
19 boards, 68+ ready-to-run examples, realistic sensor simulation.
|
||||||
Free, open-source, runs in your browser.
|
Free, open-source, no install needed.
|
||||||
</p>
|
</p>
|
||||||
<div className="seo-cta-group">
|
<div className="seo-cta-group">
|
||||||
<Link to="/editor" className="seo-btn-primary">
|
<Link to="/editor" className="seo-btn-primary">
|
||||||
|
|
@ -479,6 +479,72 @@ export const Velxio2Page: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{/* ── Open-source libraries ── */}
|
||||||
|
<section className="seo-section">
|
||||||
|
<h2>Built on open-source</h2>
|
||||||
|
<p className="lead">
|
||||||
|
Velxio is powered by these open-source projects. Without them, none of this would be possible.
|
||||||
|
</p>
|
||||||
|
<div className="v2-repos">
|
||||||
|
<a href="https://github.com/wokwi/avr8js" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>avr8js</h3>
|
||||||
|
<p>AVR8 CPU emulator in JavaScript — powers Arduino Uno, Nano, Mega simulation</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wokwi/rp2040js" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>rp2040js</h3>
|
||||||
|
<p>RP2040 emulator — powers Raspberry Pi Pico and Pico W simulation</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wokwi/wokwi-elements" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>wokwi-elements</h3>
|
||||||
|
<p>Web Components for electronic parts — LEDs, buttons, sensors, displays, and more</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wokwi/wokwi-boards" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>wokwi-boards</h3>
|
||||||
|
<p>SVG board definitions for Arduino, ESP32, Raspberry Pi Pico, and other boards</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/lcgamboa/qemu" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>QEMU (lcgamboa fork)</h3>
|
||||||
|
<p>QEMU fork with ESP32 Xtensa LX6/LX7 emulation support</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/espressif/qemu" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>QEMU (Espressif)</h3>
|
||||||
|
<p>Official Espressif QEMU fork for ESP32 development and testing</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/wokwi/wokwi-features" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>wokwi-features</h3>
|
||||||
|
<p>Feature tracking and component specifications for the Wokwi ecosystem</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="v2-repo-card v2-repo-card--primary">
|
||||||
|
<IcoGitHub />
|
||||||
|
<div>
|
||||||
|
<h3>Velxio</h3>
|
||||||
|
<p>This project — free, open-source multi-board embedded simulator</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
{/* ── Bottom CTA ── */}
|
{/* ── Bottom CTA ── */}
|
||||||
<div className="seo-bottom">
|
<div className="seo-bottom">
|
||||||
<h2>Try Velxio 2.0 now</h2>
|
<h2>Try Velxio 2.0 now</h2>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
/**
|
||||||
|
* Single source of truth for all public, indexable routes.
|
||||||
|
* Used by:
|
||||||
|
* 1. scripts/generate-sitemap.ts → builds sitemap.xml at build time
|
||||||
|
* 2. Any component that needs the canonical URL list
|
||||||
|
*
|
||||||
|
* Routes with `noindex: true` are excluded from the sitemap.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface SeoRoute {
|
||||||
|
path: string;
|
||||||
|
/** 0.0 – 1.0 (default 0.5) */
|
||||||
|
priority?: number;
|
||||||
|
changefreq?: 'daily' | 'weekly' | 'monthly' | 'yearly';
|
||||||
|
/** If true, excluded from sitemap */
|
||||||
|
noindex?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SEO_ROUTES: SeoRoute[] = [
|
||||||
|
// ── Main pages
|
||||||
|
{ path: '/', priority: 1.0, changefreq: 'weekly' },
|
||||||
|
{ path: '/editor', priority: 0.9, changefreq: 'weekly' },
|
||||||
|
{ path: '/examples', priority: 0.8, changefreq: 'weekly' },
|
||||||
|
|
||||||
|
// ── Documentation
|
||||||
|
{ path: '/docs', priority: 0.8, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/intro', priority: 0.8, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/getting-started', priority: 0.8, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/emulator', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/esp32-emulation', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/riscv-emulation', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/rp2040-emulation', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/raspberry-pi3-emulation', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/components', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/architecture', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/wokwi-libs', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/mcp', priority: 0.7, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/setup', priority: 0.6, changefreq: 'monthly' },
|
||||||
|
{ path: '/docs/roadmap', priority: 0.6, changefreq: 'monthly' },
|
||||||
|
|
||||||
|
// ── SEO keyword landing pages
|
||||||
|
{ path: '/arduino-simulator', priority: 0.9, changefreq: 'monthly' },
|
||||||
|
{ path: '/arduino-emulator', priority: 0.9, changefreq: 'monthly' },
|
||||||
|
{ path: '/atmega328p-simulator', priority: 0.85, changefreq: 'monthly' },
|
||||||
|
{ path: '/arduino-mega-simulator', priority: 0.85, changefreq: 'monthly' },
|
||||||
|
{ path: '/esp32-simulator', priority: 0.9, changefreq: 'monthly' },
|
||||||
|
{ path: '/esp32-s3-simulator', priority: 0.85, changefreq: 'monthly' },
|
||||||
|
{ path: '/esp32-c3-simulator', priority: 0.85, changefreq: 'monthly' },
|
||||||
|
{ path: '/raspberry-pi-pico-simulator', priority: 0.9, changefreq: 'monthly' },
|
||||||
|
{ path: '/raspberry-pi-simulator', priority: 0.85, changefreq: 'monthly' },
|
||||||
|
|
||||||
|
// ── Release pages
|
||||||
|
{ path: '/v2', priority: 0.9, changefreq: 'monthly' },
|
||||||
|
|
||||||
|
// ── Auth / admin (noindex)
|
||||||
|
{ path: '/login', noindex: true },
|
||||||
|
{ path: '/register', noindex: true },
|
||||||
|
{ path: '/admin', noindex: true },
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
/**
|
||||||
|
* Auto-generates frontend/public/sitemap.xml from seoRoutes.ts
|
||||||
|
* Run: npx tsx scripts/generate-sitemap.ts
|
||||||
|
* Integrated into: npm run build (via generate:sitemap)
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { writeFileSync } from 'fs';
|
||||||
|
import { resolve } from 'path';
|
||||||
|
|
||||||
|
// Import the single source of truth
|
||||||
|
import { SEO_ROUTES } from '../frontend/src/seoRoutes';
|
||||||
|
|
||||||
|
const DOMAIN = 'https://velxio.dev';
|
||||||
|
const TODAY = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
||||||
|
|
||||||
|
const indexableRoutes = SEO_ROUTES.filter((r) => !r.noindex);
|
||||||
|
|
||||||
|
const xml = `<?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">
|
||||||
|
${indexableRoutes
|
||||||
|
.map(
|
||||||
|
(r) => `
|
||||||
|
<url>
|
||||||
|
<loc>${DOMAIN}${r.path}</loc>
|
||||||
|
<lastmod>${TODAY}</lastmod>
|
||||||
|
<changefreq>${r.changefreq ?? 'monthly'}</changefreq>
|
||||||
|
<priority>${r.priority ?? 0.5}</priority>
|
||||||
|
</url>`
|
||||||
|
)
|
||||||
|
.join('')}
|
||||||
|
|
||||||
|
</urlset>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const outPath = resolve(__dirname, '../frontend/public/sitemap.xml');
|
||||||
|
writeFileSync(outPath, xml.trimStart(), 'utf-8');
|
||||||
|
console.log(`sitemap.xml generated → ${indexableRoutes.length} URLs (${TODAY})`);
|
||||||
|
|
||||||
|
// Also ping Google & Bing sitemap endpoints (non-blocking, best-effort)
|
||||||
|
const SITEMAP_URL = `${DOMAIN}/sitemap.xml`;
|
||||||
|
const PING_URLS = [
|
||||||
|
`https://www.google.com/ping?sitemap=${encodeURIComponent(SITEMAP_URL)}`,
|
||||||
|
`https://www.bing.com/ping?sitemap=${encodeURIComponent(SITEMAP_URL)}`,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (process.argv.includes('--ping')) {
|
||||||
|
console.log('Pinging search engines...');
|
||||||
|
Promise.allSettled(
|
||||||
|
PING_URLS.map(async (url) => {
|
||||||
|
try {
|
||||||
|
const res = await fetch(url);
|
||||||
|
console.log(` ${res.ok ? 'OK' : 'FAIL'} ${url.split('?')[0]}`);
|
||||||
|
} catch (e: any) {
|
||||||
|
console.log(` FAIL ${url.split('?')[0]}: ${e.message}`);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue