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>
4 changed files +189 −4
modified
app/apps/page.tsx
+23 −3
@@ -8,13 +8,14 @@ | |||||
| 8 | import type { Metadata } from "next"; | 8 | import type { Metadata } from "next"; | ||
| 9 | 9 | ||||
| 10 | import { AppCard } from "@/components/app-card"; | 10 | import { AppCard } from "@/components/app-card"; | ||
| 11 | +import { ProjectCard } from "@/components/project-card"; | ||||
| 11 | import { Reveal } from "@/components/reveal"; | 12 | import { Reveal } from "@/components/reveal"; | ||
| 12 | −import { zyquoApps } from "@/lib/apps"; | 13 | +import { openSourceProjects, zyquoApps } from "@/lib/apps"; | ||
| 13 | 14 | ||||
| 14 | export const metadata: Metadata = { | 15 | export const metadata: Metadata = { | ||
| 15 | − title: "Apps — Zyquo macOS Suite", | 16 | + title: "Apps — Zyquo macOS Suite & Open Source", | ||
| 16 | description: | 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 | export default function AppsPage() { | 21 | export default function AppsPage() { | ||
@@ -37,6 +38,25 @@ export default function AppsPage() { | |||||
| 37 | </Reveal> | 38 | </Reveal> | ||
| 38 | ))} | 39 | ))} | ||
| 39 | </div> | 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 | </div> | 60 | </div> | ||
| 41 | ); | 61 | ); | ||
| 42 | } | 62 | } | ||
modified
app/page.tsx
+1 −1
@@ -137,7 +137,7 @@ export default function HomePage() { | |||||
| 137 | href="/apps" | 137 | href="/apps" | ||
| 138 | className={cn(buttonVariants({ variant: "secondary" }))} | 138 | className={cn(buttonVariants({ variant: "secondary" }))} | ||
| 139 | > | 139 | > | ||
| 140 | − Zyquo macOS Apps | 140 | + Apps & Open Source | ||
| 141 | </Link> | 141 | </Link> | ||
| 142 | <a | 142 | <a | ||
| 143 | href="https://github.com/spboucher-ai" | 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 | dmg: string; | 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 | export const zyquoApps: ZyquoApp[] = [ | 118 | export const zyquoApps: ZyquoApp[] = [ | ||
| 21 | { | 119 | { | ||
| 22 | slug: "zyquo-cloud", | 120 | slug: "zyquo-cloud", | ||
| 23 | 121 | ||||