/** * /custom-chip-simulator — SEO landing page * Target keywords: "custom chip simulator", "custom chip arduino", * "wokwi custom chips", "build custom ic" */ import React from 'react'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { AppHeader } from '../components/layout/AppHeader'; import { useLocalizedHref } from '../i18n/useLocalizedNavigate'; import { useSEO } from '../utils/useSEO'; import { getSeoMeta } from '../seoRoutes'; import { trackClickCTA } from '../utils/analytics'; import './SEOPage.css'; const META = getSeoMeta('/custom-chip-simulator')!; const FAQ_ITEMS = [ { q: 'What is a custom chip in Velxio?', a: 'A custom chip is a user-defined integrated circuit. You write the chip\'s logic in C, Rust, or AssemblyScript — Velxio compiles it to WebAssembly, instantiates it on the canvas like any other component, and drives its pins from the simulator.', }, { q: 'Which API does Velxio use?', a: 'Velxio implements the Wokwi Custom Chips API — the same API used by Wokwi — so chips you write for Velxio are portable to Wokwi and vice versa. Velxio adds a WASI shim so you can use standard library functions in your chip code.', }, { q: 'What can I build?', a: 'Behavioural models of real ICs (sensors, decoders, level translators, protocol bridges), custom digital logic, sensor stand-ins for hardware you don\'t have yet, and protocol-level mocks for testing firmware. Chips can drive pins, read attributes, register timers, and bridge to I²C / SPI buses.', }, { q: 'How do I share or reuse a chip?', a: 'Save the chip to your Velxio account and reuse it across projects. The chip definition includes its pin layout, attributes, and the compiled WASM — drop it onto any project canvas like a built-in component.', }, { q: 'Do I need a backend to run my chip?', a: 'No. Compiled chip WASM runs in the same browser tab as the rest of the simulation. Pin updates, attribute reads, and timer ticks are all local.', }, { q: 'Can my custom chip talk to an Arduino?', a: 'Yes — that is the typical use case. Wire its pins to Arduino GPIOs, SPI, or I²C lines and the firmware on the Arduino interacts with your chip exactly like a real IC.', }, ]; const JSON_LD: object[] = [ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Velxio — Free Online Custom Chip Simulator', applicationCategory: 'DeveloperApplication', applicationSubCategory: 'IC Authoring & Simulation', operatingSystem: 'Any (browser-based)', description: 'Define your own integrated circuits in C, Rust, or AssemblyScript using the Wokwi-compatible Custom Chips API. Compile to WebAssembly and drive pins, attributes, timers, I²C and SPI from your simulated chip. Free and open-source.', url: 'https://velxio.dev/custom-chip-simulator', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' }, author: { '@type': 'Person', name: 'David Montero Crespo' }, license: 'https://www.gnu.org/licenses/agpl-3.0.html', }, { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: FAQ_ITEMS.map(({ q, a }) => ({ '@type': 'Question', name: q, acceptedAnswer: { '@type': 'Answer', text: a }, })), }, { '@context': 'https://schema.org', '@type': 'BreadcrumbList', itemListElement: [ { '@type': 'ListItem', position: 1, name: 'Velxio', item: 'https://velxio.dev/' }, { '@type': 'ListItem', position: 2, name: 'Custom Chip Simulator', item: 'https://velxio.dev/custom-chip-simulator', }, ], }, ]; export const CustomChipSimulatorPage: React.FC = () => { const { t } = useTranslation(); const localize = useLocalizedHref(); useSEO({ ...META, jsonLd: JSON_LD }); const faqKeys = ['1', '2', '3', '4', '5', '6'] as const; return (
{/* Hero */}

{t('seo.customChip.hero.title')}
{t('seo.customChip.hero.accent')}

{t('seo.customChip.hero.subtitle')}

trackClickCTA('custom-chip-simulator', '/editor')} > {t('seo.customChip.hero.ctaPrimary')} → {t('seo.customChip.hero.ctaSecondary')}

{t('seo.customChip.hero.trust')}

{/* What you can do */}

{t('seo.customChip.build.heading')}

{t('seo.customChip.build.lead')}

{t('seo.customChip.build.sensorTitle')}

{t('seo.customChip.build.sensorBody')}

{t('seo.customChip.build.bridgeTitle')}

{t('seo.customChip.build.bridgeBody')}

{t('seo.customChip.build.logicTitle')}

{t('seo.customChip.build.logicBody')}

{t('seo.customChip.build.icTitle')}

{t('seo.customChip.build.icBody')}

{t('seo.customChip.build.fixturesTitle')}

{t('seo.customChip.build.fixturesBody')}

{t('seo.customChip.build.reuseTitle')}

{t('seo.customChip.build.reuseBody')}

{/* API capabilities */}

{t('seo.customChip.api.heading')}

{t('seo.customChip.api.lead')}

{t('seo.customChip.api.pinTitle')}

{t('seo.customChip.api.pinBody')}

{t('seo.customChip.api.attrTitle')}

{t('seo.customChip.api.attrBody')}

{t('seo.customChip.api.timersTitle')}

{t('seo.customChip.api.timersBody')}

{t('seo.customChip.api.i2cTitle')}

{t('seo.customChip.api.i2cBody')}

{t('seo.customChip.api.spiTitle')}

{t('seo.customChip.api.spiBody')}

{t('seo.customChip.api.wasiTitle')}

{t('seo.customChip.api.wasiBody')}

{/* FAQ */}

{t('seo.customChip.faq.heading')}

{faqKeys.map((k) => (
{t(`seo.customChip.faq.q${k}`)}
{t(`seo.customChip.faq.a${k}`)}
))}
{/* Bottom CTA */}

{t('seo.customChip.bottom.title')}

{t('seo.customChip.bottom.body')}

trackClickCTA('custom-chip-simulator', '/editor')} > {t('seo.customChip.bottom.cta')} →
{t('seo.links.circuit')} {t('seo.links.spice')} {t('seo.links.electronics')} {t('seo.links.arduino')} {t('seo.links.esp32')} {t('seo.links.rpiPico')} {t('seo.links.attiny85')}
); };