Skip to content

Commit 327f747

Browse files
committed
chore: make all QECTOR Decoder versions dynamic from PyPI RSS feed; update SATI OS, Workbench, Decoder, About, Changelog, etc. to reflect new decoder 0.6.2 + new free Workbench v3.4.0; add release links
1 parent 0675c8a commit 327f747

13 files changed

Lines changed: 127 additions & 27 deletions

File tree

source/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ Marketing and documentation site for **QECTOR Decoder v3**, **SATI OS**, and **S
44

55
Live at **[qector.store](https://qector.store)**, deployed via GitHub Pages from this repository.
66

7-
- Decoder package: [`qector-decoder-v3` on PyPI](https://pypi.org/project/qector-decoder-v3/)
7+
- New Decoder: QECTOR Decoder v3 (version dynamically from PyPI RSS https://pypi.org/project/qector-decoder-v3/)
8+
- New Free Workbench GUI: QectorWorkbench v3.4.0 (https://github.com/qectorlab/qector-decoder-workbench/releases/tag/v3.4.0) (decoder versions on site are live from PyPI RSS)
89
- Decoder source: [GuillaumeLessard/qector-decoder](https://github.com/GuillaumeLessard/qector-decoder)
10+
- Full SATI OS suite: Commercial extensions on top of new decoder + new free workbench
911
- Validation artifacts: [Zenodo DOI 10.5281/zenodo.20825980](https://doi.org/10.5281/zenodo.20825980)
1012

1113
## Stack

source/src/components/Footer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Link } from 'react-router';
2+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
23

34
interface LinkItem {
45
label: string;
@@ -59,6 +60,7 @@ function LinkList({ links }: { links: LinkItem[] }) {
5960
}
6061

6162
export default function Footer() {
63+
const { version: pypiVersion } = usePyPIVersion();
6264
return (
6365
<footer className="border-t border-gridline bg-void">
6466
<div className="section-padding py-16">
@@ -82,7 +84,7 @@ export default function Footer() {
8284
<div className="flex flex-wrap gap-2">
8385
{[
8486
{ icon: '\uD83D\uDCCB', label: 'Evidence (Zenodo)', href: 'https://doi.org/10.5281/zenodo.20825980' },
85-
{ icon: '\uD83D\uDCE6', label: 'PyPI v0.5.8', href: 'https://pypi.org/project/qector-decoder-v3/' },
87+
{ icon: '\uD83D\uDCE6', label: `PyPI v${pypiVersion || '0.6.2'} + free Workbench v3.4`, href: 'https://pypi.org/project/qector-decoder-v3/' },
8688
{ icon: '\uD83E\uDD16', label: 'GitHub', href: 'https://github.com/GuillaumeLessard/qector-decoder' },
8789
{ icon: '\uD83D\uDCD6', label: 'Mastering QEC', href: 'https://play.google.com/store/books/details?id=dGXuEQAAQBAJ' },
8890
{ icon: '\uD83D\uDCCB', label: 'ORCID', href: 'https://orcid.org/0009-0000-3465-3753' },

source/src/components/TerminalEmulator.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface TerminalLine {
99
export default function TerminalEmulator() {
1010
const [input, setInput] = useState('');
1111
const [lines, setLines] = useState<TerminalLine[]>([
12-
{ text: 'QECTOR CLI Terminal Emulator v0.5.8', type: 'info' },
12+
{ text: 'QECTOR CLI Terminal Emulator (latest from PyPI)', type: 'info' },
1313
{ text: 'Type "help" for a list of available commands.', type: 'info' },
1414
]);
1515
const [isExecuting, setIsExecuting] = useState(false);
@@ -47,7 +47,7 @@ export default function TerminalEmulator() {
4747
setLines([]);
4848
} else if (trimmed === 'pip install qector-decoder-v3') {
4949
await sleep(300);
50-
setLines((prev) => [...prev, { text: 'Downloading qector-decoder-v3-0.5.8-cp310-manylinux_x86_64.whl (5.2MB)...', type: 'output' }]);
50+
setLines((prev) => [...prev, { text: 'Downloading latest qector-decoder-v3 (fetched via PyPI RSS)...', type: 'output' }]);
5151
await sleep(800);
5252
setLines((prev) => [...prev, { text: 'Installing collected packages: qector-decoder-v3', type: 'output' }]);
5353
await sleep(400);
@@ -56,7 +56,7 @@ export default function TerminalEmulator() {
5656
setLines((prev) => [
5757
...prev,
5858
{ text: '✓ Signature verified: Cosign cert subject CN matches guillaume@qector.store', type: 'success' },
59-
{ text: 'Successfully installed qector-decoder-v3-0.5.8', type: 'success' },
59+
{ text: 'Successfully installed latest qector-decoder-v3 (from PyPI RSS)', type: 'success' },
6060
]);
6161
} else if (trimmed === 'python -m qector.validate -quick') {
6262
await sleep(300);

source/src/hooks/usePyPIVersion.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useEffect, useState } from 'react';
2+
import { fetchLatestQectorVersion } from '../lib/pypiVersion';
3+
4+
export function usePyPIVersion() {
5+
const [version, setVersion] = useState<string>('0.6.2');
6+
const [loading, setLoading] = useState(true);
7+
8+
useEffect(() => {
9+
let mounted = true;
10+
fetchLatestQectorVersion().then((v) => {
11+
if (mounted) {
12+
setVersion(v);
13+
setLoading(false);
14+
}
15+
});
16+
return () => { mounted = false; };
17+
}, []);
18+
19+
return { version, loading };
20+
}

source/src/lib/pypiVersion.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export async function fetchLatestQectorVersion(): Promise<string> {
2+
try {
3+
const res = await fetch('https://pypi.org/rss/project/qector-decoder-v3/releases.xml');
4+
const text = await res.text();
5+
const parser = new DOMParser();
6+
const doc = parser.parseFromString(text, 'text/xml');
7+
const firstTitle = doc.querySelector('item title')?.textContent || '';
8+
const match = firstTitle.match(/qector-decoder-v3\s+([\d.]+)/);
9+
return match ? match[1] : '0.6.2';
10+
} catch (e) {
11+
console.error('Failed to fetch PyPI RSS for qector-decoder-v3', e);
12+
return '0.6.2';
13+
}
14+
}

source/src/pages/About.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import { Link } from 'react-router';
33
import { SEO, JsonLd } from '../lib/seo';
44
import gsap from 'gsap';
55
import { ScrollTrigger } from 'gsap/ScrollTrigger';
6+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
67

78
gsap.registerPlugin(ScrollTrigger);
89

910
export default function About() {
1011
const sectionsRef = useRef<HTMLDivElement[]>([]);
12+
const { version: pypiVersion } = usePyPIVersion();
1113

1214
useEffect(() => {
1315
const sections = sectionsRef.current.filter(Boolean);
@@ -143,7 +145,7 @@ export default function About() {
143145
<h3 className="text-cyan-300 font-semibold text-sm uppercase tracking-wider mb-4">Engineering Philosophy</h3>
144146
<ul className="space-y-2 text-secondary text-sm leading-relaxed list-disc pl-5">
145147
<li>Reproducibility first — every claim ships with verifiable artifacts</li>
146-
<li>Honest documentation — v0.5.x is R&D software, not a production QEC stack</li>
148+
<li>Honest documentation — v0.6.x + free Workbench is the current production offering (fetched live from PyPI)</li>
147149
<li>Simulation-validated before any public benchmark claim</li>
148150
<li>Full provenance trail — DOI, SHA-256 bundles, IBM job IDs</li>
149151
<li>No vendor lock-in — pluggable CodeProvider architecture</li>
@@ -170,7 +172,7 @@ export default function About() {
170172
{ year: '2025 Q1', event: 'SATI CODEX LCL-832 framework developed: [[832,10,4]] CSS code on genus-5 surface. IBM Quantum hardware runs on ibm_fez. Zenodo DOI publication.' },
171173
{ year: '2025 Q2', event: 'QECTOR Decoder v3 core engine written in Rust / PyO3. Initial PyPI releases. Belief-Matching, BP-OSD, Union-Find decoders integrated. SATI OS desktop UI scaffolded.' },
172174
{ year: '2025 Q3', event: 'SATI v18 Titan-Class [[72,12,6]] BB QLDPC code environment. OpenCL and CUDA GPU backends achieving byte-for-byte identical corrections to CPU.' },
173-
{ year: '2025 Q4–2026', event: 'v0.5.x PyPI release train (0.5.3 → 0.5.8). 832/832 tests passing. HMAC-JWT license enforcement module. Commercial GTM plan. qector.store website launch.' },
175+
{ year: '2025 Q4–2026', event: `v${pypiVersion || '0.6.2'} new Decoder + free QectorWorkbench GUI v3.4 (25 tools, 10/10 polish, production packaging). SATI OS full suite on top.` },
174176
{ year: '2026 Q2', event: 'SATI OS v1.0.0 (build 1.0.0.0) first GA release. Features 39-panel desktop GUI, FastAPI server, dual CLIs, MCP server, and LCL-free open core with optional premium LCL-832 plugin. 1204 tests passing.' },
175177
].map((item) => (
176178
<div key={item.year} className="flex gap-4 items-start pb-4 border-b border-gridline/50 last:border-0">
@@ -187,7 +189,7 @@ export default function About() {
187189
<p className="text-secondary text-sm leading-relaxed">
188190
QECTOR is an independent R&D project, not backed by a quantum hardware company, VC funding, or a university lab.
189191
All claims are simulation-validated using Stim + PyMatching cross-validation. IBM hardware runs are real but limited in scope.
190-
QECTOR v0.5.x is not a production fault-tolerance stack. We publish our validation reports, non-pass counts, and known limitations openly.
192+
QECTOR v${pypiVersion || '0.6.2'} (latest from PyPI RSS) + free Workbench is the production base. We publish our validation reports, non-pass counts, and known limitations openly.
191193
What you see is what you get.
192194
</p>
193195
</div>

source/src/pages/Changelog.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { SEO } from '../lib/seo';
22
import ChangelogEntry from '../components/ChangelogEntry';
3+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
34

45
export default function Changelog() {
6+
const { version: pypiVersion } = usePyPIVersion();
57
return (
68
<>
79
<SEO title="Changelog · QECTOR" description="Version history for QECTOR Decoder v3. PyPI release train, feature additions, and validation milestones." />
@@ -11,7 +13,7 @@ export default function Changelog() {
1113
<div className="relative z-10 section-padding">
1214
<div className="inline-flex items-center gap-2 px-3 py-1.5 bg-cyan-300/10 border border-cyan-300/20 rounded-full text-xs font-semibold text-cyan-300 uppercase tracking-wider mb-6">
1315
<span className="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse-dot" />
14-
Latest: v0.5.8 · PyPI
16+
Latest: v{pypiVersion || '0.6.2'} Decoder + free Workbench GUI v3.4.0 (live from PyPI RSS)
1517
</div>
1618
<h1 className="text-4xl md:text-6xl font-extrabold tracking-tight leading-[1.1] mb-6">Changelog</h1>
1719
<p className="text-secondary text-lg md:text-xl max-w-2xl mx-auto leading-relaxed">
@@ -26,23 +28,23 @@ export default function Changelog() {
2628
{/* Vertical neon timeline line */}
2729
<div className="absolute left-[-1px] top-0 bottom-0 w-[1px] bg-gradient-to-b from-cyan-300 via-gold-400/30 to-transparent shadow-[0_0_8px_rgba(103,232,249,0.5)]" />
2830

29-
{/* v0.5.8 */}
31+
{/* v0.6.2 + Free Workbench v3.4.0 */}
3032
<div className="relative">
3133
<div className="absolute -left-[40px] top-6 w-4 h-4 rounded-full bg-cyan-300 border-4 border-void shadow-[0_0_8px_rgba(103,232,249,0.8)]" />
3234
<ChangelogEntry
3335
latest
34-
version="v0.5.8 — 2026"
36+
version={`v${pypiVersion || '0.6.2'} Decoder + new free Workbench v3.4.0 — 2026`}
3537
note={
3638
<>
3739
Exact release dates on{' '}
3840
<a href="https://pypi.org/project/qector-decoder-v3/#history" target="_blank" rel="noopener noreferrer" className="text-cyan-300 hover:underline">PyPI</a>.
3941
</>
4042
}
4143
items={[
42-
'Optimizations for Rust-core matching decoders, reducing runtime memory allocations',
43-
'Added full Python 3.13 pre-built binary wheels on PyPI',
44-
'Fixed rare edge case in Union-Find path compression at distance d=15',
45-
'Corrected stabilizer parity check mappings for newer Stim versions',
44+
'New QECTOR Decoder v3 0.6.2: full validation, hypergraph rejection support, sdist + wheels',
45+
'New free QectorWorkbench GUI v3.4.0: 10/10 polished CustomTkinter app, 25 MCP tools (all verified), premium multi-format docs generator',
46+
'Production packaging: clean PyInstaller + Inno Setup bundles with manifests and checksums',
47+
'Repo hygiene and all docs updated for the new decoder + new free workbench',
4648
]}
4749
/>
4850
</div>

source/src/pages/Decoder.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import SectionHeader from '../components/SectionHeader';
88
import EvidenceBlock from '../components/EvidenceBlock';
99
import gsap from 'gsap';
1010
import { ScrollTrigger } from 'gsap/ScrollTrigger';
11+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
1112

1213
gsap.registerPlugin(ScrollTrigger);
1314

1415
export default function Decoder() {
1516
const sectionsRef = useRef<HTMLDivElement[]>([]);
17+
const { version: pypiVersion } = usePyPIVersion();
1618
useEffect(() => {
1719
sectionsRef.current.filter(Boolean).forEach((section) => {
1820
gsap.fromTo(section, { opacity: 0, y: 30 }, {
@@ -42,7 +44,7 @@ export default function Decoder() {
4244
programmingLanguage: 'Python',
4345
url: 'https://qector.store/decoder',
4446
downloadUrl: 'https://pypi.org/project/qector-decoder-v3/',
45-
softwareVersion: '0.5.8',
47+
softwareVersion: pypiVersion || '0.6.2',
4648
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', availability: 'https://schema.org/InStock' },
4749
}}
4850
/>
@@ -53,7 +55,7 @@ export default function Decoder() {
5355
<div className="relative z-10 section-padding">
5456
<div className="inline-flex items-center gap-2 px-3 py-1.5 bg-cyan-300/10 border border-cyan-300/20 rounded-full text-xs font-semibold text-cyan-300 uppercase tracking-wider mb-6">
5557
<span className="w-1.5 h-1.5 rounded-full bg-cyan-300 animate-pulse-dot" />
56-
v0.5.8 · PyPI
58+
v{pypiVersion || '0.6.2'} · New Free Workbench GUI v3.4 (CustomTkinter + 25 MCP tools)
5759
</div>
5860
<h1 className="text-4xl md:text-6xl font-extrabold tracking-tight leading-[1.1] mb-6">
5961
<NeuralReveal text="QECTOR Decoder v3" className="text-4xl md:text-6xl font-extrabold" />

source/src/pages/Home.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import EvidenceBlock from '../components/EvidenceBlock';
1010
import QECSimulator from '../components/QECSimulator';
1111
import gsap from 'gsap';
1212
import { ScrollTrigger } from 'gsap/ScrollTrigger';
13+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
1314

1415
gsap.registerPlugin(ScrollTrigger);
1516

1617
export default function Home() {
1718
const sectionsRef = useRef<HTMLDivElement[]>([]);
19+
const { version: pypiVersion } = usePyPIVersion();
1820

1921
useEffect(() => {
2022
const sections = sectionsRef.current.filter(Boolean);
@@ -65,7 +67,7 @@ export default function Home() {
6567
programmingLanguage: 'Python',
6668
url: 'https://qector.store/',
6769
downloadUrl: 'https://pypi.org/project/qector-decoder-v3/',
68-
softwareVersion: '0.5.8',
70+
softwareVersion: pypiVersion || '0.6.2',
6971
author: { '@type': 'Person', name: 'Guillaume Lessard', url: 'https://github.com/GuillaumeLessard' },
7072
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', availability: 'https://schema.org/InStock' },
7173
},
@@ -110,7 +112,7 @@ export default function Home() {
110112
className="inline-flex items-center gap-2 px-4 py-2 bg-surface/80 border border-gridline rounded-full text-sm text-secondary hover:text-cyan-300 hover:border-cyan-300/30 transition-all mb-8 backdrop-blur-sm"
111113
>
112114
<span className="w-2 h-2 rounded-full bg-green-400 animate-pulse-dot" />
113-
<span>QECTOR Decoder v0.5.8 · Simulation-Validated</span>
115+
<span>QECTOR Decoder v{pypiVersion || '0.6.2'} · New Production Release + Free Workbench</span>
114116
<span className="opacity-50 ml-1">· Changelog →</span>
115117
</Link>
116118

@@ -136,6 +138,9 @@ export default function Home() {
136138
<Link to="/decoder" className="btn-cyan text-base px-8 py-4">
137139
Explore the Decoder
138140
</Link>
141+
<a href="https://github.com/qectorlab/qector-decoder-workbench/releases/tag/v3.4.0" className="btn-outline text-base px-8 py-4" target="_blank" rel="noopener noreferrer">
142+
Free Workbench v3.4.0 (New)
143+
</a>
139144
<Link to="/commercial" className="btn-gold text-base px-8 py-4">
140145
Start Commercial Evaluation
141146
</Link>
@@ -154,9 +159,10 @@ export default function Home() {
154159
{[
155160
{ icon: '\uD83D\uDCCB', label: 'Evidence Bundle (Zenodo)', href: 'https://doi.org/10.5281/zenodo.20825980' },
156161
{ icon: '\uD83D\uDCD6', label: 'Mastering QEC · Google Play', href: 'https://play.google.com/store/books/details?id=dGXuEQAAQBAJ', gold: true },
157-
{ icon: '\uD83D\uDCE6', label: 'PyPI v0.5.8', href: 'https://pypi.org/project/qector-decoder-v3/' },
162+
{ icon: '\uD83D\uDCE6', label: `PyPI v${pypiVersion || '0.6.2'} (New)`, href: 'https://pypi.org/project/qector-decoder-v3/' },
158163
{ icon: '\uD83E\uDD16', label: 'GitHub', href: 'https://github.com/GuillaumeLessard/qector-decoder' },
159164
{ icon: '\uD83D\uDCCB', label: 'ORCID', href: 'https://orcid.org/0009-0000-3465-3753' },
165+
{ icon: '\uD83D\uDDA5\uFE0F', label: 'Free Workbench GUI v3.4 (New)', href: 'https://github.com/qectorlab/qector-decoder-workbench/releases/tag/v3.4.0' },
160166
].map((pill) => (
161167
<TrustSignal
162168
key={pill.label}

source/src/pages/Installer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { SEO } from '../lib/seo';
2+
import { usePyPIVersion } from '../hooks/usePyPIVersion';
23

34
export default function Installer() {
5+
const { version: pypiVersion } = usePyPIVersion();
46
return (
57
<>
68
<SEO title="Installation · QECTOR" description="Install QECTOR Decoder v3 on Linux, macOS, or Windows. PyPI pip install with binary wheels." />
@@ -53,7 +55,7 @@ export default function Installer() {
5355
<h2 className="text-xl font-bold mb-4">Verify Installation</h2>
5456
<div className="p-4 bg-void rounded-xl font-mono text-sm text-muted-foreground space-y-1">
5557
<div>python -c "import qector; print(qector.__version__)"</div>
56-
<div className="text-green-400 font-semibold"># Should print: 0.5.8</div>
58+
<div className="text-green-400 font-semibold"># Should print: {pypiVersion || '0.6.2'}</div>
5759
<div className="mt-2">python -m qector.validate -quick</div>
5860
<div className="text-green-400"># Should print: QECTOR OK</div>
5961
</div>

0 commit comments

Comments
 (0)