SPB Git

spb/spboucher.ai Public

spboucher.ai — personal website of Simon-Pierre Boucher.

TypeScript 93.4% HTML 5.5% CSS 1%

Apps page: add Web Platforms & Open Source section (8 new repos)

New ProjectCard component and openSourceProjects data: VQuant,
AI Risk Index, Metrika, Forge, Zyquo Cloud Web, PhD Thesis,
UQO Course Material, and the site itself — each with GitHub link,
live demo when available, and language badge. Zyquo macOS cards
unchanged. Home hero button renamed to 'Apps & Open Source'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 5 days ago (Aug 5, 2026) parent 5a6607b

Showing 4 changed files with +189 and −4

modified app/apps/page.tsx +23 −3
@@ -8,13 +8,14 @@
8 8 import type { Metadata } from "next";
9 9
10 10 import { AppCard } from "@/components/app-card";
11 +import { ProjectCard } from "@/components/project-card";
11 12 import { Reveal } from "@/components/reveal";
12 import { zyquoApps } from "@/lib/apps";
13 +import { openSourceProjects, zyquoApps } from "@/lib/apps";
13 14
14 15 export const metadata: Metadata = {
15 title: "Apps — Zyquo macOS Suite",
16 + title: "Apps — Zyquo macOS Suite & Open Source",
16 17 description:
17 "The Zyquo suite: six native macOS applications for AI and local LLMs — multi-provider chat, on-device MLX models, autonomous agents, an AI-native browser, model fine-tuning, and LLM routing.",
18 + "The Zyquo suite: six native macOS applications for AI and local LLMs — plus open-source platforms and research: VQuant, AI Risk Index, Metrika, Forge, and more.",
18 19 };
19 20
20 21 export default function AppsPage() {
@@ -37,6 +38,25 @@ export default function AppsPage() {
37 38 </Reveal>
38 39 ))}
39 40 </div>
41 +
42 + <Reveal className="mt-20">
43 + <h2 className="text-2xl font-bold tracking-tight sm:text-3xl">
44 + Web Platforms &amp; Open Source
45 + </h2>
46 + <p className="mt-3 max-w-2xl text-muted-foreground">
47 + Open-source platforms, research code, and teaching material — from an
48 + AI-powered financial analysis platform to LLM training in pure C++ on
49 + Apple Silicon.
50 + </p>
51 + </Reveal>
52 +
53 + <div className="mt-10 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
54 + {openSourceProjects.map((project, i) => (
55 + <Reveal key={project.slug} delay={i * 0.06} className="h-full">
56 + <ProjectCard project={project} />
57 + </Reveal>
58 + ))}
59 + </div>
40 60 </div>
41 61 );
42 62 }
modified app/page.tsx +1 −1
@@ -137,7 +137,7 @@ export default function HomePage() {
137 137 href="/apps"
138 138 className={cn(buttonVariants({ variant: "secondary" }))}
139 139 >
140 Zyquo macOS Apps
140 + Apps &amp; Open Source
141 141 </Link>
142 142 <a
143 143 href="https://github.com/spboucher-ai"
added components/project-card.tsx +67 −0
@@ -0,0 +1,67 @@
1 +/*
2 + project-card.tsx
3 + spboucher.ai Web
4 + Author: Simon-Pierre Boucher
5 + Mail: contact@spboucher.ai
6 +*/
7 +
8 +import { ExternalLink, Github } from "lucide-react";
9 +
10 +import type { OpenSourceProject } from "@/lib/apps";
11 +import { buttonVariants } from "@/components/ui/button";
12 +import {
13 + Card,
14 + CardContent,
15 + CardDescription,
16 + CardFooter,
17 + CardHeader,
18 + CardTitle,
19 +} from "@/components/ui/card";
20 +import { cn } from "@/lib/utils";
21 +
22 +export function ProjectCard({ project }: { project: OpenSourceProject }) {
23 + return (
24 + <Card className="flex h-full flex-col transition-shadow hover:shadow-md">
25 + <CardHeader className="flex-row items-center gap-4 space-y-0">
26 + <div
27 + aria-hidden="true"
28 + className="flex h-16 w-16 shrink-0 items-center justify-center rounded-2xl bg-muted text-3xl shadow-sm"
29 + >
30 + {project.emoji}
31 + </div>
32 + <div className="min-w-0">
33 + <CardTitle className="text-lg">{project.name}</CardTitle>
34 + <CardDescription className="mt-1">{project.tagline}</CardDescription>
35 + </div>
36 + </CardHeader>
37 + <CardContent className="flex-1">
38 + <p className="text-sm text-muted-foreground">{project.description}</p>
39 + </CardContent>
40 + <CardFooter className="flex flex-wrap items-center gap-2">
41 + <a
42 + href={project.repo}
43 + target="_blank"
44 + rel="noopener noreferrer"
45 + className={cn(buttonVariants({ variant: "outline", size: "sm" }))}
46 + >
47 + <Github aria-hidden="true" />
48 + GitHub Repo
49 + </a>
50 + {project.demo ? (
51 + <a
52 + href={project.demo}
53 + target="_blank"
54 + rel="noopener noreferrer"
55 + className={cn(buttonVariants({ variant: "default", size: "sm" }))}
56 + >
57 + <ExternalLink aria-hidden="true" />
58 + Live Demo
59 + </a>
60 + ) : null}
61 + <span className="ml-auto rounded-full border px-2.5 py-0.5 text-xs text-muted-foreground">
62 + {project.language}
63 + </span>
64 + </CardFooter>
65 + </Card>
66 + );
67 +}
modified lib/apps.ts +98 −0
@@ -17,6 +17,104 @@ export interface ZyquoApp {
17 17 dmg: string;
18 18 }
19 19
20 +export interface OpenSourceProject {
21 + slug: string;
22 + name: string;
23 + emoji: string;
24 + tagline: string;
25 + description: string;
26 + language: string;
27 + repo: string;
28 + demo?: string;
29 +}
30 +
31 +export const openSourceProjects: OpenSourceProject[] = [
32 + {
33 + slug: "vquant",
34 + name: "VQuant",
35 + emoji: "📈",
36 + tagline: "AI financial intelligence platform",
37 + description:
38 + "Claude-powered financial analysis platform: 265+ market-data endpoints, a quantitative Python engine (Monte Carlo, GARCH, VaR, Black-Scholes, portfolio optimization), multi-source web research, and streaming chat with PDF/Word/Slides export.",
39 + language: "TypeScript",
40 + repo: "https://github.com/spboucher-ai/vquant",
41 + demo: "https://www.vquant.ai",
42 + },
43 + {
44 + slug: "airiskindex",
45 + name: "AI Risk Index",
46 + emoji: "🤖",
47 + tagline: "Task-based AI job-exposure index",
48 + description:
49 + "The transparent, task-based AI job-exposure index — 923 occupations scored from 18,796 O*NET tasks by a multi-model LLM panel, with confidence intervals.",
50 + language: "TypeScript",
51 + repo: "https://github.com/spboucher-ai/airiskindex",
52 + demo: "https://www.airiskindex.io",
53 + },
54 + {
55 + slug: "metrika",
56 + name: "Metrika",
57 + emoji: "📊",
58 + tagline: "GPU-accelerated statistics for macOS",
59 + description:
60 + "Stata-class statistics for macOS, GPU-accelerated by Apple Silicon — native Swift 6, DuckDB engine, MLX/Metal compute, R-validated to 1e-10. Regression, panel FE, IV, GLMs, GPU bootstrap, Bayesian Gibbs, lasso, gradient boosting.",
61 + language: "Swift",
62 + repo: "https://github.com/spboucher-ai/metrika",
63 + },
64 + {
65 + slug: "forge",
66 + name: "Forge",
67 + emoji: "🔥",
68 + tagline: "LLM training in pure C++ + Metal",
69 + description:
70 + "LLM training from scratch in pure C++20 + Metal on Apple Silicon — no PyTorch, no MLX, no ML dependencies. Fused flash attention (fwd+bwd) and simdgroup_matrix GEMM at 10.8 TFLOPS.",
71 + language: "C++",
72 + repo: "https://github.com/spboucher-ai/forge",
73 + },
74 + {
75 + slug: "zyquo-cloud-web",
76 + name: "Zyquo Cloud Web",
77 + emoji: "🌐",
78 + tagline: "Browser edition of Zyquo Cloud",
79 + description:
80 + "Multi-provider AI chat (12 providers, 170 models) that runs entirely in your browser. Bring your own keys — no backend, no accounts.",
81 + language: "TypeScript",
82 + repo: "https://github.com/spboucher-ai/zyquo-cloud-web",
83 + demo: "https://www.zyquo.cloud",
84 + },
85 + {
86 + slug: "phd-thesis",
87 + name: "PhD Thesis",
88 + emoji: "🎓",
89 + tagline: "Three essays in high-frequency finance",
90 + description:
91 + "PhD thesis (Université Laval) — Three Essays on High-Frequency Return and Volatility Dynamics in Commodities and Financial Futures Markets. Full LaTeX source.",
92 + language: "LaTeX",
93 + repo: "https://github.com/spboucher-ai/phd-thesis",
94 + },
95 + {
96 + slug: "uqo-cours",
97 + name: "UQO Course Material",
98 + emoji: "🏫",
99 + tagline: "Real-estate appraisal & cost methods",
100 + description:
101 + "Course material for UQO — Éléments d'évaluation immobilière (IMM1003) and Méthodes du coût (IMM1033): Beamer slides, practical assignments with Excel templates, and a Québec real-estate market report.",
102 + language: "LaTeX",
103 + repo: "https://github.com/spboucher-ai/UQO_COURS_PUBLIC",
104 + },
105 + {
106 + slug: "spboucher-ai",
107 + name: "spboucher.ai",
108 + emoji: "🏠",
109 + tagline: "This website",
110 + description:
111 + "The source of this very site — Next.js 16 App Router, Tailwind CSS v4, shadcn/ui, and Framer Motion, with full dark-mode support.",
112 + language: "TypeScript",
113 + repo: "https://github.com/spboucher-ai/spboucher.ai",
114 + demo: "https://www.spboucher.ai",
115 + },
116 +];
117 +
20 118 export const zyquoApps: ZyquoApp[] = [
21 119 {
22 120 slug: "zyquo-cloud",
23 121