SPB Git

spb/spboucher.ai Public

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

TypeScript 93.4% HTML 5.5% CSS 1%
ZIP
NameLast commitUpdated
app Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
blog Blog: add essay 'The Macroeconomics of White-Collar Automation' yesterday
components Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
cv-source Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
lib Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
public Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
scripts Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
.gitignore Initial release: spboucher.ai personal website 10 days ago
CLAUDE.md feat: replace all GitHub links with git.spboucher.ai (self-hosted... yesterday
next.config.ts Initial release: spboucher.ai personal website 10 days ago
package-lock.json Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
package.json Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
postcss.config.mjs Initial release: spboucher.ai personal website 10 days ago
README.md feat: replace all GitHub links with git.spboucher.ai (self-hosted... yesterday
tsconfig.json Add SPB Agent chat widget (Claude Haiku 4.5, streaming) +... 2 h ago
README.md

# 🎓 spboucher.ai

# Personal website of Simon-Pierre Boucher

Financial econometrics researcher and macOS/AI developer.

Professor — Department of Administrative Sciences, Université du Québec en Outaouais (UQO)


Website Next.js React TypeScript

Tailwind CSS shadcn/ui Framer Motion PM2 ngrok Made in Québec


🏠 Home · 🔬 Research · 📚 Teaching · 🖥️ Apps · 📄 CV


# 👋 About

This repository powers www.spboucher.ai — the personal academic and developer website of Simon-Pierre Boucher. It presents his academic profile (research in financial econometrics, commodity markets, monetary policy announcements, high-frequency finance, volatility modelling, textual analysis, and financialization) alongside the Zyquo suite: six native macOS applications focused on AI and local LLMs.

# ✨ Features

  • Next.js 16 App Router — server components everywhere, static prerendering on every page
  • 🎨 Tailwind CSS v4 + shadcn/ui-style components — clean academic aesthetic with a modern developer edge
  • 🌗 Dark mode — system-aware with a manual toggle, no flash on load
  • 🎬 Framer Motion — subtle scroll reveals, with prefers-reduced-motion and no-JS fallbacks
  • 📱 Fully responsive — mobile-first, 1/2/3-column app grid
  • Accessible — semantic HTML, alt text on all app icons, keyboard-friendly nav
  • 💚 Health endpointGET /api/health for uptime monitoring

# 🗺️ Site Map

Route Content
/ Hero, bio, education, research highlight, technical skills
/research Publications, working papers, conference presentations
/teaching Courses taught (lecturer & teaching assistant, Université Laval)
/apps Zyquo macOS app portfolio
/cv CV summary + contact
/api/health JSON health check

# 🖥️ The Zyquo macOS Suite

Six native macOS applications for AI and local LLMs — Swift/SwiftUI, built for Apple Silicon.

App Description Links
Zyquo Cloud icon ☁️ Zyquo Cloud Multi-provider AI chat — Anthropic, OpenAI, and more in one unified interface Repo · Release · DMG
Zyquo Local icon 💻 Zyquo Local 100% local LLMs with Apple MLX — private, offline, no API keys Repo · Release · DMG
Zyquo Agent icon 🤖 Zyquo Agent Autonomous AI agent for the Mac — tool calling, automation, multi-step workflows Repo · Release · DMG
Zyquo Atlas icon 🌍 Zyquo Atlas AI-native web browser — page understanding, summarization, assisted browsing Repo · Release · DMG
Zyquo MLX icon ⚒️ Zyquo MLX On-device model forge — LoRA/QLoRA fine-tuning, quantization, model management Repo · Release · DMG
Zyquo Router icon 🔀 Zyquo Router Local LLM gateway — one unified endpoint across providers and local models Repo · Release · DMG

# 🚀 Quick Start

bash
git clone https://git.spboucher.ai/spboucher.ai.git
cd spboucher.ai

npm install          # install dependencies
npm run dev          # local dev server → http://localhost:3000
npm run build        # production build
npm run start        # serve production build
npm run typecheck    # TypeScript check

# 🌐 Production Deployment (node m2u64)

The site runs on cluster node m2u64 and is exposed publicly with ngrok bound to the custom domain. On m2u64 the app listens on port 3100 (port 3000 is already in use on that node); both the app and the tunnel run under PM2 for auto-restart.

flowchart LR
    A["🌍 Visitor"] --> B["🔒 ngrok edge<br/>www.spboucher.ai"]
    B --> C["🖥️ m2u64 : 3100<br/>next start (PM2: spboucher)"]
    C --> D["💚 /api/health"]
bash
# on m2u64
npm ci && npm run build
pm2 start scripts/start-production.sh --name spboucher --interpreter /bin/zsh
pm2 start "ngrok http --url=www.spboucher.ai 3100" --name spboucher-ngrok
pm2 save
  • Always serve the production build (npm run build && npm run start) behind ngrok — never the dev server.
  • If the tunnel drops, restart it: pm2 restart spboucher-ngrok (or run ngrok http --url=www.spboucher.ai 3100 manually).
  • Health check: GET /api/health{"status":"ok","service":"spboucher-ai"}.

# 📁 Project Structure

text
app/
├── layout.tsx            Root layout (theme init, header, footer)
├── page.tsx              Home — hero, bio, education, highlight, skills
├── research/page.tsx     Publications, working papers, presentations
├── teaching/page.tsx     Courses taught
├── apps/page.tsx         Zyquo macOS app portfolio
├── cv/page.tsx           CV summary + contact
├── api/health/route.ts   Health check endpoint
└── globals.css           Tailwind v4 theme tokens (light/dark)

components/
├── site-header.tsx       Sticky nav + mobile menu
├── site-footer.tsx       Footer
├── theme-toggle.tsx      Dark mode toggle
├── reveal.tsx            Framer Motion scroll reveal
├── app-card.tsx          Zyquo app card (icon, description, 3 links)
└── ui/                   shadcn/ui-style primitives (button, card, badge)

lib/
├── apps.ts               Zyquo suite data (single source of truth)
└── utils.ts              cn() class merger

public/icons/             Zyquo app icons (fetched from the app repos)
scripts/                  Production start script (PM2)

# 📐 Conventions

  • 📝 Every source file starts with the mandatory project header comment (see CLAUDE.md)
  • 🇬🇧 All site content is in English
  • 🔗 App download links on /apps (Repo / Release / DMG) must remain exactly as specified in CLAUDE.md
  • 🧩 Server components by default; client components only where interactivity requires it

# 📫 Contact

🎓 Academic simon-pierre.boucher@uqo.ca
✉️ Personal contact@spboucher.ai
🐙 GitHub @spboucher-ai
📍 Office UQO, Gatineau — Pavillon Alexandre-Taché

© Simon-Pierre Boucher — Université du Québec en Outaouais (UQO)

Built with Next.js · Tailwind CSS · shadcn/ui · Framer Motion — served from a Mac, tunneled to the world. 🚇