🎓 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)
🏠 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-motionand 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 endpoint —
GET /api/healthfor 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 | Multi-provider AI chat — Anthropic, OpenAI, and more in one unified interface | Repo · Release · DMG | |
| 💻 Zyquo Local | 100% local LLMs with Apple MLX — private, offline, no API keys | Repo · Release · DMG | |
| 🤖 Zyquo Agent | Autonomous AI agent for the Mac — tool calling, automation, multi-step workflows | Repo · Release · DMG | |
| 🌍 Zyquo Atlas | AI-native web browser — page understanding, summarization, assisted browsing | Repo · Release · DMG | |
| ⚒️ Zyquo MLX | On-device model forge — LoRA/QLoRA fine-tuning, quantization, model management | Repo · Release · DMG | |
| 🔀 Zyquo Router | Local LLM gateway — one unified endpoint across providers and local models | Repo · Release · DMG |
🚀 Quick Start
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"]
# 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 runngrok http --url=www.spboucher.ai 3100manually). - Health check:
GET /api/health→{"status":"ok","service":"spboucher-ai"}.
📁 Project Structure
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 inCLAUDE.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. 🚇