diff --git a/site/astro.config.mjs b/site/astro.config.mjs
index b2687c4e3..e8dc4c163 100644
--- a/site/astro.config.mjs
+++ b/site/astro.config.mjs
@@ -13,7 +13,7 @@ import sitemap from '@astrojs/sitemap';
*/
function scopedIsolation() {
// Keep in sync with public/_headers and src/middleware.ts.
- const ISOLATED_PREFIXES = ['/blog/porting-kicad-graphics-to-webgl-in-2026', '/gerber-demo'];
+ const ISOLATED_PREFIXES = ['/blog/porting-kicad-graphics-to-webgl-in-2026', '/gerber-demo', '/compare'];
/** @type {import('vite').Connect.NextHandleFunction} */
const middleware = (req, res, next) => {
const url = req.url ?? '';
diff --git a/site/public/_headers b/site/public/_headers
index a450879ca..4108a2867 100644
--- a/site/public/_headers
+++ b/site/public/_headers
@@ -33,3 +33,14 @@
/gerber-demo/*
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
+
+# The comparison pages embed the same Gerber viewer as the blog post, so they
+# need the same isolation. Both URL forms for the same reason as above. The
+# landing page stays un-isolated (YouTube embed).
+/compare
+ Cross-Origin-Opener-Policy: same-origin
+ Cross-Origin-Embedder-Policy: require-corp
+
+/compare/*
+ Cross-Origin-Opener-Policy: same-origin
+ Cross-Origin-Embedder-Policy: require-corp
diff --git a/site/src/components/CompareDemo.astro b/site/src/components/CompareDemo.astro
new file mode 100644
index 000000000..0554137bd
--- /dev/null
+++ b/site/src/components/CompareDemo.astro
@@ -0,0 +1,23 @@
+---
+/**
+ * "Do not take our word for it": the real KiCad Gerber viewer, embedded. Loads
+ * ~22 MB on demand (click), nothing on page view.
+ *
+ * Needs COOP/COEP on the route: public/_headers covers /compare and /compare/*,
+ * and src/middleware.ts + the vite plugin in astro.config.mjs mirror it in dev.
+ * The glue is loaded through a same-origin blob in public/gerber-demo/boot.js,
+ * which is what makes the pthread worker spawn legal on a cross-origin CDN.
+ */
+import GerberDemo from './GerberDemo.astro';
+import SectionTitle from './SectionTitle.astro';
+---
+
+
+ Do not take our word for it
+
+ This is the real KiCad Gerber viewer, running on this page. Pan, zoom, toggle layers. The full
+ editor, with schematic capture and layout, is one click away in the
+ demo.
+
+
+
+
+
diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro
index 4dd3cc96c..47b01119f 100644
--- a/site/src/components/Footer.astro
+++ b/site/src/components/Footer.astro
@@ -28,6 +28,9 @@ const BUILD_COMMIT_URL = `https://github.com/PCBJam/pcbjam/commit/${BUILD_SHA}`;
const links = [
{ href: '/blog', label: 'blog' },
{ href: '/pricing', label: 'pricing' },
+ { href: '/compare/', label: 'compare' },
+ { href: '/viewer/', label: 'viewer' },
+ { href: '/collaboration/', label: 'collaboration' },
{ href: GITHUB_URL, label: 'github', external: true },
{ href: DISCORD_URL, label: 'discord', external: true },
{ href: 'mailto:hello@pcbjam.com', label: 'hello@pcbjam.com' },
diff --git a/site/src/data/compare.ts b/site/src/data/compare.ts
new file mode 100644
index 000000000..50141a9be
--- /dev/null
+++ b/site/src/data/compare.ts
@@ -0,0 +1,271 @@
+/**
+ * Comparison data for /compare and /compare/.
+ *
+ * Every competitor cell was checked against the vendor's own pages on
+ * CHECKED_ON; the URLs are in `sources` and render on the page. Rule for
+ * edits: only state what an official page or one of our own devblogs says.
+ * If a fact cannot be sourced, leave it out rather than guess. Prices and
+ * Apple's Safari schedule go stale first — re-check them before a redeploy.
+ */
+
+export const CHECKED_ON = '3 September 2026';
+
+export type Tone = 'yes' | 'part' | 'no' | 'info';
+export type ColKey = 'pcbjam' | 'kicad' | 'easyeda' | 'flux';
+
+export interface Cell {
+ tone: Tone;
+ note: string;
+}
+
+export interface Row {
+ label: string;
+ cells: Record;
+}
+
+export interface Source {
+ label: string;
+ url: string;
+}
+
+export interface Competitor {
+ slug: 'kicad' | 'easyeda' | 'flux';
+ name: string;
+ /** Short label for the switcher. */
+ tab: string;
+ /** for the pair page (must contain "PCBJam" — see BaseLayout). */
+ title: string;
+ description: string;
+ lead: string;
+ pickThem: string;
+ pickUs: string;
+ sources: Source[];
+}
+
+export const columnNames: Record = {
+ pcbjam: 'PCBJam',
+ kicad: 'KiCad',
+ easyeda: 'EasyEDA',
+ flux: 'Flux',
+};
+
+export const competitors: Competitor[] = [
+ {
+ slug: 'kicad',
+ name: 'KiCad',
+ tab: 'KiCad (desktop)',
+ title: 'PCBJam vs KiCad: the same KiCad, in the browser',
+ description:
+ 'PCBJam is KiCad compiled to WebAssembly: the same editors and the same files, running in a browser, with several people in one board. Where the two differ, checked against the docs.',
+ lead: 'Same editors, same files, same shortcuts. The difference is where it runs and how many people can be in the board at once. This is not either-or: PCBJam reads and writes the files desktop KiCad does.',
+ pickThem:
+ 'You work alone, you need to work offline, or you depend on KiCad’s Python plugins. KiCad is free, open source and runs on your own machine.',
+ pickUs:
+ 'You want the KiCad you already know with your team in the same board, nothing to install, and a link instead of a zip when someone needs to look at a design.',
+ sources: [
+ { label: 'KiCad licenses', url: 'https://www.kicad.org/about/licenses/' },
+ { label: 'KiCad 10.0.0 release', url: 'https://www.kicad.org/blog/2026/03/Version-10.0.0-Released/' },
+ { label: 'KiCad downloads', url: 'https://www.kicad.org/download/' },
+ ],
+ },
+ {
+ slug: 'easyeda',
+ name: 'EasyEDA',
+ tab: 'EasyEDA',
+ title: 'PCBJam vs EasyEDA',
+ description:
+ 'Both run in a browser and both are free to use. EasyEDA is built around the LCSC catalogue in its own format; PCBJam is KiCad, with files you can take anywhere. Thirteen criteria, checked against the vendors’ docs.',
+ lead: 'Both run in a browser and both are free to use. EasyEDA is built around the LCSC catalogue and ordering from JLCPCB, in its own format; PCBJam is KiCad, with files you can take anywhere.',
+ pickThem:
+ 'You order from JLCPCB and the LCSC catalogue is your parts bin, and EasyEDA’s own file format is fine for you.',
+ pickUs:
+ 'You want KiCad’s editors and KiCad’s file format, so you can move between desktop KiCad and the browser at any time, with your team in the board.',
+ sources: [
+ { label: 'EasyEDA pricing', url: 'https://easyeda.com/page/pricing' },
+ { label: 'EasyEDA Pro: import KiCad', url: 'https://prodocs.easyeda.com/en/import-export/import-kicad/' },
+ { label: 'EasyEDA Std: import KiCad', url: 'https://docs.easyeda.com/en/Import/Import-KiCAD/' },
+ { label: 'EasyEDA Pro 3.0 release notes', url: 'https://prodocs.easyeda.com/en/release-note/v3.0.x/' },
+ { label: 'EasyEDA Pro: project collaboration', url: 'https://prodocs.easyeda.com/en/project/project-collaboration/' },
+ { label: 'EasyEDA Pro: desktop client', url: 'https://prodocs.easyeda.com/en/faq/client/' },
+ { label: 'EasyEDA Pro: extension API', url: 'https://prodocs.easyeda.com/en/api/guide/' },
+ { label: 'EasyEDA Pro: simulation', url: 'https://prodocs.easyeda.com/en/simulation/introduction/' },
+ { label: 'EasyEDA mobile viewer', url: 'https://easyeda.com/editor-mobile/' },
+ { label: 'KiCad: importing EasyEDA projects', url: 'https://dev-docs.kicad.org/en/import-formats/easyeda/index.html' },
+ ],
+ },
+ {
+ slug: 'flux',
+ name: 'Flux',
+ tab: 'Flux',
+ title: 'PCBJam vs Flux',
+ description:
+ 'Both are browser-based and collaborative. Flux is its own editor with an AI copilot and a proprietary format on a subscription; PCBJam is the real KiCad engine with KiCad’s files and a free tier. Checked against the vendors’ docs.',
+ lead: 'Both are browser-based and collaborative. Flux is its own editor with an AI copilot and a proprietary format; PCBJam is the real KiCad engine with KiCad’s own files.',
+ pickThem:
+ 'AI assistance is the point for you, and a proprietary format plus a subscription from $50 a month is an acceptable trade.',
+ pickUs:
+ 'You want the KiCad you know, open files and a free tier, with real-time collaboration.',
+ sources: [
+ { label: 'Flux pricing', url: 'https://www.flux.ai/p/pricing' },
+ { label: 'Flux: importing KiCad components', url: 'https://docs.flux.ai/reference/reference-import-kicad' },
+ { label: 'Flux: collaboration', url: 'https://docs.flux.ai/tutorials/tutorial-collaboration-deep-dive' },
+ { label: 'Flux: how the API works', url: 'https://docs.flux.ai/reference/how-the-api-works' },
+ { label: 'Flux: the simulator', url: 'https://docs.flux.ai/flux-beta/Introduction/the-simulator' },
+ { label: 'Flux: not available on mobile', url: 'https://feedback.flux.ai/bugreports/p/sign-in-on-mobile-leads-to-beta-application' },
+ ],
+ },
+];
+
+export const pcbjamSources: Source[] = [
+ { label: 'Devblog week 28: collaboration, presence, comments, mobile view', url: '/blog/devblog-2026-w28/' },
+ { label: 'Devblog week 29: ngspice in WebAssembly', url: '/blog/devblog-2026-w29/' },
+ { label: 'Devblog week 30: comment threads, reactions, mentions', url: '/blog/devblog-2026-w30/' },
+ { label: 'Devblog weeks 32 to 35: the JSPI switch and Safari', url: '/blog/devblog-2026-w32-35/' },
+ { label: 'PCBJam pricing', url: '/pricing/' },
+ { label: 'PCBJam on GitHub (GPL-3.0)', url: 'https://github.com/emergence-engineering/pcbjam' },
+];
+
+const SAFARI =
+ 'Chromium browsers and Firefox. Safari, iPhone and iPad wait on a WebAssembly feature (JSPI) that Apple has scheduled for its September 2026 Safari release.';
+
+export const rows: Row[] = [
+ {
+ label: 'Runs in the browser, nothing to install',
+ cells: {
+ pcbjam: { tone: 'part', note: SAFARI },
+ kicad: { tone: 'no', note: 'an install on Windows, macOS or Linux' },
+ easyeda: { tone: 'yes', note: 'browser, or a desktop client' },
+ flux: { tone: 'yes', note: 'desktop browsers' },
+ },
+ },
+ {
+ label: 'It is KiCad: the same editors, shortcuts and libraries',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'the KiCad engine compiled to WebAssembly' },
+ kicad: { tone: 'yes', note: '' },
+ easyeda: { tone: 'no', note: 'its own editor' },
+ flux: { tone: 'no', note: 'its own editor' },
+ },
+ },
+ {
+ label: 'An open file format you can take anywhere',
+ cells: {
+ pcbjam: { tone: 'yes', note: '.kicad_pro, .kicad_sch and .kicad_pcb; import and export at any time' },
+ kicad: { tone: 'yes', note: 'the same files' },
+ easyeda: {
+ tone: 'part',
+ note: 'its own format. Imports KiCad 5-era files only; no export to KiCad, though KiCad’s own importer reads EasyEDA projects',
+ },
+ flux: {
+ tone: 'part',
+ note: 'its own format. Imports KiCad parts and libraries, not schematics or boards; no export to KiCad',
+ },
+ },
+ },
+ {
+ label: 'Several people in one board at the same time',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'live cursors, selection highlights, follow a teammate' },
+ kicad: { tone: 'no', note: 'no built-in collaboration' },
+ easyeda: {
+ tone: 'yes',
+ note: 'since EasyEDA Pro 3.0 (June 2026): the same document at once, with history and rollback',
+ },
+ flux: { tone: 'yes', note: 'real-time multiplayer' },
+ },
+ },
+ {
+ label: 'Review by link and comments, nothing to install for the reviewer',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'invite links; reader and commenter roles; comment threads with mentions' },
+ kicad: { tone: 'no', note: 'send the files, or use a third-party viewer' },
+ easyeda: { tone: 'part', note: 'member roles including an observer role; public projects' },
+ flux: { tone: 'yes', note: 'share the URL, permissions, comments on the design' },
+ },
+ },
+ {
+ label: 'Open a board on a phone or tablet',
+ cells: {
+ pcbjam: {
+ tone: 'part',
+ note: 'a touch-friendly read-only view on mobile, except iPhone and iPad until the Safari release above; mobile editing is on the roadmap',
+ },
+ kicad: { tone: 'no', note: '' },
+ easyeda: { tone: 'part', note: 'a limited mobile viewer' },
+ flux: { tone: 'no', note: 'desktop browsers only' },
+ },
+ },
+ {
+ label: 'Schematic, layout, DRC, 3D and Gerber export',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'the full KiCad flow' },
+ kicad: { tone: 'yes', note: '' },
+ easyeda: { tone: 'yes', note: '' },
+ flux: { tone: 'yes', note: '' },
+ },
+ },
+ {
+ label: 'Circuit simulation',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'ngspice runs in the browser; XSPICE and CIDER work' },
+ kicad: { tone: 'yes', note: 'ngspice, built in' },
+ easyeda: { tone: 'yes', note: 'NGSpice, plus SimulIDE in Pro' },
+ flux: { tone: 'yes', note: 'built in' },
+ },
+ },
+ {
+ label: 'Plugins and extensions',
+ cells: {
+ pcbjam: { tone: 'part', note: 'custom extensions are on the roadmap' },
+ kicad: { tone: 'yes', note: 'Python API and a plugin manager' },
+ easyeda: { tone: 'yes', note: 'Pro extension API and a marketplace' },
+ flux: { tone: 'part', note: 'an API for integrations' },
+ },
+ },
+ {
+ label: 'Component libraries',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'KiCad’s libraries, plus libraries shared inside a team' },
+ kicad: { tone: 'yes', note: 'the official libraries' },
+ easyeda: { tone: 'yes', note: 'the LCSC catalogue' },
+ flux: { tone: 'yes', note: 'its own parts library; KiCad parts can be imported' },
+ },
+ },
+ {
+ label: 'Open source',
+ cells: {
+ pcbjam: { tone: 'part', note: 'the editor is GPL-3.0 on GitHub; the collaboration platform is not open source' },
+ kicad: { tone: 'yes', note: 'GPLv3 or later' },
+ easyeda: { tone: 'no', note: '' },
+ flux: { tone: 'no', note: '' },
+ },
+ },
+ {
+ label: 'Where your files live',
+ cells: {
+ pcbjam: { tone: 'yes', note: 'in your PCBJam projects, exportable at any time; self-hosting is on the roadmap' },
+ kicad: { tone: 'yes', note: 'on your disk' },
+ easyeda: {
+ tone: 'part',
+ note: 'in EasyEDA’s cloud by default; the Pro desktop client has offline modes that keep projects local',
+ },
+ flux: { tone: 'no', note: 'in Flux’s cloud' },
+ },
+ },
+ {
+ label: `Price, checked ${CHECKED_ON}`,
+ cells: {
+ pcbjam: { tone: 'info', note: 'free tier; Pro $10 a month' },
+ kicad: { tone: 'info', note: 'free' },
+ easyeda: { tone: 'info', note: 'free (Std and Pro); paid tiers from $19.90 a month add storage and support' },
+ flux: { tone: 'info', note: 'no free plan; 14-day trial, then $50 to $250 a month; Teams $158 per editor' },
+ },
+ },
+];
+
+export const toneMark: Record = { yes: '[x]', part: '[~]', no: '[ ]', info: '' };
+export const toneWord: Record = { yes: 'yes', part: 'partly', no: 'no', info: '' };
+
+export function competitorBySlug(slug: string): Competitor | undefined {
+ return competitors.find((c) => c.slug === slug);
+}
diff --git a/site/src/middleware.ts b/site/src/middleware.ts
index 3ecf7d7ff..ea549d344 100644
--- a/site/src/middleware.ts
+++ b/site/src/middleware.ts
@@ -16,7 +16,7 @@ import { defineMiddleware } from 'astro:middleware';
* Production is static (output: 'static'); the headers come from public/_headers,
* so we no-op outside dev to keep the prerender/build output untouched.
*/
-const ISOLATED_PREFIXES = ['/blog/porting-kicad-graphics-to-webgl-in-2026', '/gerber-demo'];
+const ISOLATED_PREFIXES = ['/blog/porting-kicad-graphics-to-webgl-in-2026', '/gerber-demo', '/compare'];
export const onRequest = defineMiddleware(async (context, next) => {
const response = await next();
diff --git a/site/src/pages/collaboration.astro b/site/src/pages/collaboration.astro
new file mode 100644
index 000000000..bcda9c00a
--- /dev/null
+++ b/site/src/pages/collaboration.astro
@@ -0,0 +1,271 @@
+---
+import BaseLayout from '../layouts/BaseLayout.astro';
+import SectionTitle from '../components/SectionTitle.astro';
+import WaitlistForm from '../components/WaitlistForm.astro';
+
+// Sourced from devblog week 28 (presence, selection highlights, soft locks,
+// follow, comment threads, undo, library sync, mobile read-only view), week 30
+// (comment bubbles, seen marks, reactions, mentions), week 31 (library sync per
+// team), the pricing page (roles, public projects, free seats) and weeks 32-35
+// (Safari / JSPI). The three clips are the ones published with week 28.
+const DISCORD_URL = 'https://discord.gg/ybhqJxjR3E';
+
+const title = 'Real-time KiCad collaboration: one board, your whole team';
+const description =
+ 'Several people in one KiCad board at the same time, in a browser: live cursors, selection highlights, follow mode, comment threads with mentions, invite links and roles. Nothing to install, files stay in KiCad’s format.';
+
+const clips = [
+ { src: '/blog/w28-assets/follow.mp4', caption: 'follow a teammate: see what they see, move with their viewport' },
+ { src: '/blog/w28-assets/comments.mp4', caption: 'a comment thread on the board: reply, hide, resolve' },
+];
+---
+
+
+
+
KiCad collaboration
+
One board. Your whole team. At the same time.
+
+ Real-time collaboration in KiCad. Everyone opens the same project in a browser, sees each
+ other’s cursors and selections, and edits together. Comments and invite links for review.
+ Nothing to install, and the files stay KiCad’s own.
+
+ two people on one board: cursors and selection highlights · devblog, week 28
+
+
+
+
+ What works today
+
+
[x] live cursors and selection highlights
+
[x] highlights cross files: select a footprint on the board, its symbol lights up in the schematic
+
[x] selected elements are soft-locked, so nobody moves them from under you
+
[x] follow a teammate: see what they see, move with their cursor and viewport
+
[x] comments on the board, in threads: reply, hide, resolve
+
[x] avatar pins on the canvas, a panel listing the threads, seen marks, reactions, @-mentions
+
[x] invite links with an expiry and a use limit
+
[x] readers, commenters and editors
+
[x] component libraries synced across the team
+
[x] public projects: free for everyone, unlimited members
+
+
+ {
+ clips.map((c) => (
+
+
+
+
+ {c.caption}
+
+ ))
+ }
+
+
+
+
+ How it works
+
+ Edits travel as small changes over our own sync protocol; a move is about 30 bytes on the
+ wire. Undo is yours alone: it takes back your own edits, not your teammate’s. Libraries sync
+ per team, so a part added by one person is there for the next. The details, including what
+ was hard, are in the week-28 devblog.
+
+
+
+
+ A review, start to finish
+
+
Create an invite link. Seven days and one use, or whatever the reviewer needs.
+
They open it in a browser and sign in. Nothing to install. Reading only works on mobile too, except iPhone and iPad until Apple’s September 2026 Safari release.
+
They leave a comment on the board, on the exact footprint, and mention you.
+
You fix it in the same project, resolve the thread, and export to desktop KiCad if you like. Same file.
+
+
+
+
+ Next for collaboration
+
+
[ ] comment-only mode
+
[ ] per-project invites
+
[ ] history: who changed what
+
[ ] git integration
+
[ ] organization support
+
[ ] mobile editing
+
+
+
+
+ FAQ
+
+
+
Does everyone need an account?
+
Joining a project from an invite link needs a sign-in, so comments have a name on them. The demo needs no account.
+
+
+
What if two people grab the same thing?
+
Whatever someone has selected is soft-locked: others cannot move it until they let go. Undo only ever takes back your own edits.
+
+
+
What does it cost for a team?
+
Public projects are free for everyone, editing included. Private work is free for three people and seven projects in your personal team, then one seat per person. Details on the pricing page.
+
+
+
+
+
+ Get your team in the board
+
+
+ discord.gg/ybhqJxjR3E ·
+ hello@pcbjam.com ·
+ privacy
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/compare/[competitor].astro b/site/src/pages/compare/[competitor].astro
new file mode 100644
index 000000000..e821e9368
--- /dev/null
+++ b/site/src/pages/compare/[competitor].astro
@@ -0,0 +1,114 @@
+---
+import type { GetStaticPaths } from 'astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import SectionTitle from '../../components/SectionTitle.astro';
+import CompareSwitcher from '../../components/CompareSwitcher.astro';
+import CompareTable from '../../components/CompareTable.astro';
+import CompareDemo from '../../components/CompareDemo.astro';
+import CompareSources from '../../components/CompareSources.astro';
+import WaitlistForm from '../../components/WaitlistForm.astro';
+import { competitors, type Competitor } from '../../data/compare';
+
+// One URL per pair: search wants a page whose title, heading and body are all
+// about "PCBJam vs ". The index page shows all three side by side.
+export const getStaticPaths = (() =>
+ competitors.map((c) => ({ params: { competitor: c.slug }, props: { c } }))) satisfies GetStaticPaths;
+
+const { c } = Astro.props as { c: Competitor };
+---
+
+
+
+
Compare
+
PCBJam vs {c.name}
+
{c.lead}
+
+
+
+
+
+
+
+
+ Which one, honestly
+
+
+
Choose {c.name} if
+
{c.pickThem}
+
+
+
Choose PCBJam if
+
{c.pickUs}
+
+
+
+
+
+
+
+
+
+ Bring your KiCad project, keep your KiCad project
+
+
+
+
+
diff --git a/site/src/pages/compare/index.astro b/site/src/pages/compare/index.astro
new file mode 100644
index 000000000..60c038857
--- /dev/null
+++ b/site/src/pages/compare/index.astro
@@ -0,0 +1,120 @@
+---
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import SectionTitle from '../../components/SectionTitle.astro';
+import CompareSwitcher from '../../components/CompareSwitcher.astro';
+import CompareTable from '../../components/CompareTable.astro';
+import CompareDemo from '../../components/CompareDemo.astro';
+import CompareSources from '../../components/CompareSources.astro';
+import WaitlistForm from '../../components/WaitlistForm.astro';
+import { competitors } from '../../data/compare';
+
+const title = 'PCBJam vs KiCad, EasyEDA and Flux';
+const description =
+ 'How PCBJam compares with desktop KiCad and with two other browser-based PCB editors, EasyEDA and Flux: file format, collaboration, simulation, plugins, price. Checked against the vendors’ own docs.';
+---
+
+
+
+
Compare
+
PCBJam vs KiCad, EasyEDA and Flux
+
+ Three tools people weigh PCBJam against: the desktop KiCad it is built from, and two other
+ browser-based editors. Pick one for the two-column view, or read all three side by side.
+
+ You want real KiCad, open files and your team in the board, without installing anything.
+
+
+
+
+
+
+
+ ({ name: c.name, sources: c.sources }))} />
+
+
+ Bring your KiCad project, keep your KiCad project
+
+
+
+
+
diff --git a/site/src/pages/viewer.astro b/site/src/pages/viewer.astro
new file mode 100644
index 000000000..f4080953e
--- /dev/null
+++ b/site/src/pages/viewer.astro
@@ -0,0 +1,284 @@
+---
+import { Image } from 'astro:assets';
+import BaseLayout from '../layouts/BaseLayout.astro';
+import SectionTitle from '../components/SectionTitle.astro';
+import WaitlistForm from '../components/WaitlistForm.astro';
+import eeschema from '../assets/screens/eeschema.png';
+import pcbnew from '../assets/screens/pcbnew.png';
+import gerbview from '../assets/screens/gerbview.png';
+
+// Everything on this page is sourced: the demo's own description ("nothing
+// uploaded", "open your own KiCad project"), the pricing page (roles, public
+// projects), devblog week 28 (mobile read-only view, comments) and weeks 32-35
+// (Safari / JSPI). Do not add claims that are not in one of those.
+const DEMO_URL = 'https://demo.pcbjam.com';
+const DISCORD_URL = 'https://discord.gg/ybhqJxjR3E';
+
+const title = 'KiCad viewer online: open and share KiCad files in a browser';
+const description =
+ 'View a KiCad schematic or board in a browser without installing KiCad: layers, 3D, Gerbers, rendered by KiCad itself. Share a project with an invite link; the other person needs a browser and nothing else.';
+
+const shots = [
+ { img: eeschema, label: 'schematic', alt: 'KiCad schematic open in the PCBJam viewer in a browser tab' },
+ { img: pcbnew, label: 'board', alt: 'KiCad board open in the PCBJam viewer in a browser tab' },
+ { img: gerbview, label: 'gerbers', alt: 'Gerber files open in the PCBJam viewer in a browser tab' },
+];
+---
+
+
+
+
KiCad viewer online
+
View any KiCad project in a browser.
+
+ Open a schematic, a board or a whole KiCad project without installing KiCad. It is KiCad’s own
+ renderer, running in your browser, so what you see is what the designer saw. Share it with a
+ link; the other person needs a browser and nothing else.
+
+
+ Open the viewer
+ no account · nothing is uploaded, your file is read in your browser
+
+
Open the example boards, or your own KiCad project.
+
+
+
+ What the viewer shows
+
Not an approximation of the file. The file, drawn by KiCad.
+
+
[x] schematics and boards, as KiCad draws them
+
[x] layers on and off
+
[x] the 3D view
+
[x] Gerber and drill files, for the fab check
+
[~] a touch-friendly read-only view on mobile, except iPhone and iPad until Apple’s September 2026 Safari release
+
+
+
+ Share a KiCad project with someone who does not have KiCad
+
+ Send an invite link with an expiry and a use limit; anyone with an active link can join after
+ signing in. Members are readers, commenters or editors. Public projects are free for everyone,
+ with unlimited members. Comments live on the board itself, in threads, with mentions.
+ More on collaboration.
+
+
+
+ Invite links
+ Anyone with an active link can join after signing in.
+
+
+ Expires (days)7
+ Max uses1
+ Create invite link
+
+ The invite links panel of a PCBJam project: expiry in days and maximum uses.
+
+
+
+
+ When looking is not enough
+
+ The viewer is the same KiCad as the editor. Open the project in the editor and route, run DRC
+ and export Gerbers, in the same tab. The file stays in KiCad’s own format the whole way.
+ More about the editor.
+
+
+
+
+ FAQ
+
+
+
Does my file get uploaded?
+
Not in the demo viewer: the file is read in your browser. Sharing by link needs the project in PCBJam, where your team can open it.
+
+
+
Which KiCad is this?
+
PCBJam is built on KiCad 10.
+
+
+
How is this different from KiCanvas?
+
KiCanvas is a browser viewer that re-implements KiCad’s rendering in TypeScript. PCBJam runs KiCad itself, so everything renders as KiCad renders it, and the same project can be edited.
+
+
+
+
+
+ Open a board now, or get the full editor
+
+
+ open the viewer (no account) ·
+ discord ·
+ privacy
+
+
+
+
+
+
diff --git a/site/src/sections/FullKicad.astro b/site/src/sections/FullKicad.astro
index 6fb212336..988575fed 100644
--- a/site/src/sections/FullKicad.astro
+++ b/site/src/sections/FullKicad.astro
@@ -20,7 +20,8 @@ const shots = [
The same KiCad you already use, online. Schematic capture, PCB layout, DRC, 3D view, Gerber
and drill export. Nothing stripped down, no rewrite. New to KiCad? It is the
open-source suite for
- designing circuit boards.
+ designing circuit boards. How PCBJam compares with desktop KiCad,
+ EasyEDA and Flux.
{
diff --git a/site/src/sections/SharePublish.astro b/site/src/sections/SharePublish.astro
index 98e70fad4..06703a709 100644
--- a/site/src/sections/SharePublish.astro
+++ b/site/src/sections/SharePublish.astro
@@ -6,7 +6,7 @@ import SectionTitle from '../components/SectionTitle.astro';
Share and publish components and designs
Component libraries are shared inside your team. Projects can be published to the public, so
- a review is one link away.
+ a review is one link away. How collaboration works.
{/* The project's invite-links panel, redrawn as a static figure. */}
@@ -32,7 +32,7 @@ import SectionTitle from '../components/SectionTitle.astro';
- Viewer mode also works on Android phones and tablets. Open a board on your phone to check a footprint or review a change. iPhone and iPad follow with Apple’s September Safari release.
+ Viewer mode also works on Android phones and tablets. Open a board on your phone to check a footprint or review a change. iPhone and iPad follow with Apple’s September Safari release.