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>
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 & 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 & 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 | |