SPB Git

spb/spboucher.ai Public

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

TypeScript 93.4% HTML 5.5% CSS 1%
214.0 KB · 4,102 lines typescript
Raw Blame History
1/*2  project-details.ts3  spboucher.ai Web4  Author: Simon-Pierre Boucher5  Mail: contact@spboucher.ai6*/78/** Rich per-project content for the /apps/[slug] detail pages. */9export interface ProjectDetail {10  slug: string;11  hero: { headline: string; subheadline: string };12  overview: string[];13  stats: { value: string; label: string }[];14  features: { icon: string; title: string; description: string }[];15  techStack: { category: string; items: string[] }[];16  architecture: { title: string; description: string }[];17  highlights: string[];18}1920export const projectDetails: ProjectDetail[] = [21  {22    "slug": "zyquo-cloud",23    "hero": {24      "headline": "Your keys, every cloud model, one native chat",25      "subheadline": "A truly native macOS AI chat client for 12 cloud providers and 170 models — BYOK, encrypted vault, built entirely without Xcode."26    },27    "overview": [28      "Zyquo Cloud is a native macOS chat client that unifies 12 cloud AI providers — OpenAI, Anthropic, xAI, Mistral, Google Gemini, Qwen, DeepSeek, Kimi, Perplexity, Together AI, DeepInfra, and Cerebras — behind one polished SwiftUI interface. Bring your own API keys; there is no subscription, no middleman, and no telemetry.",29      "The app streams token-by-token over SSE, renders extended-thinking output in collapsible sections, shows per-message token usage and cost from real model pricing, and lets you switch models per conversation or per message. A 202-test live verification harness drives the exact production provider clients against every one of the 170 catalog models.",30      "It is 100% SwiftUI and AppKit — no Electron, no web views — with exactly one dependency (Apple's swift-markdown). API keys live in a machine-bound AES-256-GCM vault derived via HKDF-SHA256, deliberately outside the macOS Keychain, decrypted only at request time."31    ],32    "stats": [33      {34        "value": "12",35        "label": "cloud providers"36      },37      {38        "value": "170",39        "label": "built-in models"40      },41      {42        "value": "202/202",43        "label": "live API tests green"44      },45      {46        "value": "58",47        "label": "prompt templates"48      },49      {50        "value": "1",51        "label": "third-party dependency"52      },53      {54        "value": "11",55        "label": "syntax-highlighted language families"56      }57    ],58    "features": [59      {60        "icon": "Cloud",61        "title": "12 providers, one interface",62        "description": "OpenAI, Anthropic, Gemini, Mistral, DeepSeek, Grok and more — provider quirks isolated in a dedicated client layer that never leaks upward."63      },64      {65        "icon": "Zap",66        "title": "True token streaming",67        "description": "Server-Sent Events with a stop button, blinking stream caret, smooth auto-scroll, and reasoning tokens streamed into a collapsible thinking section."68      },69      {70        "icon": "Split",71        "title": "Compare mode",72        "description": "Broadcast one prompt to 2–4 models side-by-side, each column streaming independently with its own copy and regenerate controls."73      },74      {75        "icon": "Lock",76        "title": "Machine-bound encrypted vault",77        "description": "AES-256-GCM via CryptoKit with an HKDF key derived from the Mac's hardware UUID — the vault is useless if copied to another computer."78      },79      {80        "icon": "Command",81        "title": "Command palette and Quick Chat",82        "description": "One ⌘K search box over models, templates and personas, plus a global ⌥Space Spotlight-style panel available from any app."83      },84      {85        "icon": "Eye",86        "title": "Vision and attachments",87        "description": "Drag and drop images for vision models, encoded per provider automatically; text and code files in 30+ extensions injected inline."88      },89      {90        "icon": "DollarSign",91        "title": "Token usage and cost tracking",92        "description": "Per-message and per-conversation cost computed from each model's real pricing, visible on hover and in the sidebar footer."93      },94      {95        "icon": "FileText",96        "title": "Markdown done right",97        "description": "GFM tables, task lists, blockquotes, and code blocks with language labels, copy buttons, and a built-in highlighter covering 11 language families."98      },99      {100        "icon": "Sparkles",101        "title": "Prompt library and personas",102        "description": "58 hand-crafted templates across 8 categories and 8 built-in personas bundling system prompts with preferences, applied in two keystrokes."103      }104    ],105    "techStack": [106      {107        "category": "App",108        "items": [109          "Swift 5.9+",110          "SwiftUI",111          "AppKit",112          "macOS 13+",113          "Universal (arm64 + x86_64)"114        ]115      },116      {117        "category": "Core",118        "items": [119          "URLSession (SSE streaming)",120          "CryptoKit (AES-256-GCM, HKDF)",121          "swift-markdown",122          "Swift Package Manager"123        ]124      },125      {126        "category": "AI",127        "items": [128          "OpenAI-compatible client (11 providers)",129          "Native Anthropic Messages API",130          "Custom OpenAI-compatible endpoints",131          "170-model catalog"132        ]133      },134      {135        "category": "Quality",136        "items": [137          "zyquo-verify live harness",138          "Swift Testing",139          "Developer ID signed + notarized + stapled"140        ]141      }142    ],143    "architecture": [144      {145        "title": "Provider layer",146        "description": "One OpenAICompatibleClient covers 11 providers plus custom endpoints; a native AnthropicClient speaks the Messages API. Quirks like auth headers and reasoning-effort values never leak past this layer."147      },148      {149        "title": "StreamingService and ModelCatalog",150        "description": "SSE streaming, a generated 170-model catalog as the single source of truth for models, and a SecureKeyStore backing the encrypted vault."151      },152      {153        "title": "ConversationStore chat engine",154        "description": "A @MainActor view-model layer built on structured concurrency — async/await and AsyncThrowingStream drive the chat, compare mode, and Quick Chat surfaces."155      },156      {157        "title": "ZyquoTheme design system",158        "description": "Every color, font, spacing, and radius comes from one semantic token system with light and dark themes and five accent colors — no raw hex in views."159      },160      {161        "title": "zyquo-verify harness",162        "description": "A --verify mode drives the exact production clients against live APIs: /models diffs, a completion on all 170 models, streaming and vision sweeps — 202/202 green."163      }164    ],165    "highlights": [166      "Built entirely without the Xcode IDE — Swift Package Manager and Command Line Tools only",167      "Every one of the 170 catalog models verified live against the real APIs: 202/202 tests green",168      "Developer ID signed, notarized by Apple, and stapled — universal arm64 + x86_64 binary",169      "Exactly one third-party dependency: Apple's swift-markdown; networking is plain URLSession, crypto is CryptoKit",170      "Deliberately avoids the macOS Keychain — a machine-bound AES-256-GCM vault with no keychain prompts and no iCloud sync of secrets",171      "Provider behavior documented in a 1,600-line API research dossier (docs/PROVIDERS.md)"172    ]173  },174  {175    "slug": "zyquo-local",176    "hero": {177      "headline": "Every token stays on your Mac",178      "subheadline": "A native macOS chat client that runs large language models 100% locally on Apple Silicon with MLX — no API keys, no cloud."179    },180    "overview": [181      "Zyquo Local runs large language models entirely on-device through Apple's MLX framework. There is no server to send your prompts to: inference happens on your Mac's unified memory and GPU, and the only network calls are the model downloads you trigger yourself from Hugging Face.",182      "The app supports 57 model architectures out of the box — Llama, Qwen, Mistral, Gemma, Phi, DeepSeek distills, gpt-oss and more — with a curated Featured catalog of 30 verified models, live Hugging Face search, and RAM verdicts (Fits / Tight / Too large) computed against your specific Mac before you download anything.",183      "It is 7,300+ lines of Swift 6 with zero compiler warnings, built without the Xcode IDE. Generation streams with a live tokens-per-second ticker, thinking models get a collapsible thought-process section, and unloading a model provably returns gigabytes of memory to the OS."184    ],185    "stats": [186      {187        "value": "57",188        "label": "supported architectures"189      },190      {191        "value": "30",192        "label": "curated catalog models"193      },194      {195        "value": "100%",196        "label": "on-device inference"197      },198      {199        "value": "222.8",200        "label": "tok/s (Llama-3.2-1B, M5 Max)"201      },202      {203        "value": "56",204        "label": "prompt templates"205      },206      {207        "value": "7,300+",208        "label": "lines of Swift 6"209      }210    ],211    "features": [212      {213        "icon": "WifiOff",214        "title": "Fully offline inference",215        "description": "100% on-device generation via mlx-swift-lm — no API keys, no accounts, no telemetry; chat works completely offline once a model is downloaded."216      },217      {218        "icon": "Search",219        "title": "In-app Hugging Face discovery",220        "description": "Live search across the Featured catalog, mlx-community, and all MLX-tagged repos, with gated-repo and unsupported-architecture warnings on every card."221      },222      {223        "icon": "Download",224        "title": "Industrial-grade download manager",225        "description": "Pause, resume, and cancel per model; HTTP Range resume that survives app restarts; automatic retry with backoff; disk-space pre-checks before a single byte."226      },227      {228        "icon": "Gauge",229        "title": "RAM verdicts everywhere",230        "description": "A MemoryAdvisor reads your Mac's physical memory and stamps every model Fits, Tight, or Too large — you never download something you can't run."231      },232      {233        "icon": "Brain",234        "title": "Reasoning display",235        "description": "Think-tag output from DeepSeek-R1 distills, Qwen3 thinking mode and QwQ-class models streams into a collapsible thought-process section, parsed incrementally."236      },237      {238        "icon": "LineChart",239        "title": "First-class generation stats",240        "description": "Tokens per second, token count, and time-to-first-token under every response, plus peak-memory tracking per generation and a live context-usage bar."241      },242      {243        "icon": "HardDrive",244        "title": "Verifiable memory hygiene",245        "description": "One model loaded at a time with explicit Load/Unload — unloading measurably returns memory to the OS, from gigabytes down to kilobytes."246      },247      {248        "icon": "Split",249        "title": "Compare two models",250        "description": "Race two local models side-by-side on the same prompt with independent streaming and stats, RAM-gated so you can't load a pair your memory can't hold."251      },252      {253        "icon": "Command",254        "title": "Quick Chat from anywhere",255        "description": "A global ⌥Space Spotlight-style floating panel for one-shot questions to the loaded model, from any app, with no accessibility permissions needed."256      }257    ],258    "techStack": [259      {260        "category": "App",261        "items": [262          "Swift 6",263          "SwiftUI",264          "macOS 14+",265          "Apple Silicon (arm64)"266        ]267      },268      {269        "category": "Inference",270        "items": [271          "Apple MLX",272          "mlx-swift-lm",273          "swift-transformers",274          "swift-huggingface"275        ]276      },277      {278        "category": "Core",279        "items": [280          "Swift actors",281          "AsyncThrowingStream",282          "Custom URLSession transport (Range-resumable)",283          "swift-markdown"284        ]285      },286      {287        "category": "Quality",288        "items": [289          "--verify end-to-end harness",290          "Developer ID signed + notarized + stapled",291          "Swift Package Manager (no .xcodeproj)"292        ]293      }294    ],295    "architecture": [296      {297        "title": "InferenceEngine actor",298        "description": "All inference lives behind one Swift actor with states flowing unloaded → loading → ready ⇄ generating; generation is an AsyncThrowingStream of token, stats, and finish events, and cancellation genuinely stops the GPU loop."299      },300      {301        "title": "Hub layer",302        "description": "HubService, DownloadManager, FileTransfer and ModelStore handle discovery and delivery: chunked, delegate-backed downloads with atomic .partial-to-final completion and per-file size verification."303      },304      {305        "title": "ChatController with think-parser",306        "description": "Streams tokens into the UI while incrementally parsing <think> tags — robust even when tags split across token chunks — and manages KV-cache reuse across turns with automatic oldest-turn truncation."307      },308      {309        "title": "MemoryAdvisor",310        "description": "Reads physical memory and current pressure to gate model loads, stamp catalog entries with Fits/Tight/Too-large verdicts, and RAM-gate compare mode."311      },312      {313        "title": "Verification harness",314        "description": "ZyquoLocal --verify downloads real models through the app's own pipeline and checks loading, deterministic generation, multi-turn recall, streaming cancellation, and memory release."315      }316    ],317    "highlights": [318      "No server exists to read your prompts — conversations, tokens, and system prompts never leave the machine",319      "Every Featured-catalog repo ID and download size verified against the live Hugging Face Hub (30/30)",320      "Verified on an Apple M5 Max: up to 222.8 tok/s on Llama-3.2-1B and 0.08 s time-to-first-token on Qwen3-0.6B",321      "Built with plain Swift Package Manager — no .xcodeproj, the Xcode IDE never required",322      "Developer ID signed, notarized by Apple, and stapled — installs with zero Gatekeeper warnings",323      "KV-cache reuse across turns means no re-prefill, with the system prompt always surviving context truncation"324    ]325  },326  {327    "slug": "zyquo-agent",328    "hero": {329      "headline": "The autonomous agent that actually operates your Mac",330      "subheadline": "A native macOS agent that plans, runs real bash and AppleScript, verifies its own work — and always asks before anything risky."331    },332    "overview": [333      "Zyquo Agent turns cloud LLMs into an agent that does things on your Mac: it runs bash commands, drives apps with AppleScript, reads and writes files, and keeps iterating until a task is genuinely done. It is not a chat window with a shell attached — it is a real plan → act → observe → reflect loop with a live, editable checklist.",334      "Safety is the headline feature. Every action passes a PolicyEngine gate that parses commands rather than pattern-matching them, splitting compound lines and classifying each subcommand. Hard denies block catastrophic commands outright; an always-ask class — sudo, out-of-workspace deletes, curl-pipe-to-shell — requires approval in every mode, including Autonomous. An append-only audit log records everything.",335      "Everything is measured, not claimed: 77 of 80 agent-capable models pass a live tool-calling battery, 11 of 11 end-to-end scenarios pass in real workspaces, 8 of 8 safety tests pass, and the PolicyEngine self-check runs 38 assertions. The app is roughly 19,000 lines of Swift across 82 files, built without the Xcode IDE."336    ],337    "stats": [338      {339        "value": "77/80",340        "label": "models tool-calling verified live"341      },342      {343        "value": "8/8",344        "label": "safety tests passed"345      },346      {347        "value": "11/11",348        "label": "end-to-end scenarios passed"349      },350      {351        "value": "38",352        "label": "PolicyEngine self-check assertions"353      },354      {355        "value": "12",356        "label": "providers, 170 models"357      },358      {359        "value": "~19,000",360        "label": "lines of Swift, 82 files"361      }362    ],363    "features": [364      {365        "icon": "Workflow",366        "title": "True agentic loop",367        "description": "A stop_reason-keyed while-loop streams a model turn, executes its tool calls, threads results back, and repeats — handling truncation, refusals, and transient errors."368      },369      {370        "icon": "ShieldCheck",371        "title": "Policy gate on every action",372        "description": "Commands are parsed, not pattern-matched: compound lines split per subcommand and the verdict is the most severe — ls && rm -rf still asks."373      },374      {375        "icon": "ListChecks",376        "title": "Live editable plan",377        "description": "The agent maintains a real checklist through an internal update_plan tool, persisted to disk, rendered live, and editable by you mid-run."378      },379      {380        "icon": "Terminal",381        "title": "Real tools, streamed live",382        "description": "bash, AppleScript, and five file tools with line-by-line stdout/stderr streaming, timeouts, exit codes, and full cancellability — even partial tool arguments stream."383      },384      {385        "icon": "Timer",386        "title": "LoopGuard budgets",387        "description": "Step, token, and wall-clock budgets plus repetition and stall detection — on a trip it pauses and asks you, never silently spins or aborts."388      },389      {390        "icon": "Brain",391        "title": "Memory and context compaction",392        "description": "At 85% of context, older steps are summarized by the same model while the plan, MEMORY.md, and the last 6 steps stay verbatim; large outputs offload to disk."393      },394      {395        "icon": "FolderTree",396        "title": "Scoped workspaces",397        "description": "Every task gets its own directory; file tools are scoped there by default and escaping requires explicit approval, with created and modified files tracked."398      },399      {400        "icon": "FileText",401        "title": "Append-only audit log",402        "description": "Every executed action recorded with timestamp, exact payload, cwd, policy ruling, exit code, and output — viewable in-app and exportable."403      },404      {405        "icon": "Bot",406        "title": "Headless CLI mode",407        "description": "The app binary doubles as a CLI for scripting and CI: run tasks headlessly with live rendering, stdin approvals, and policy self-checks."408      }409    ],410    "techStack": [411      {412        "category": "App",413        "items": [414          "Swift 6",415          "SwiftUI",416          "AppKit",417          "macOS 13+",418          "Universal (arm64 + x86_64)"419        ]420      },421      {422        "category": "Agent Core",423        "items": [424          "AgentLoop (Swift actor)",425          "PolicyEngine",426          "LoopGuard",427          "MemoryManager",428          "AuditLog",429          "WorkspaceManager"430        ]431      },432      {433        "category": "AI",434        "items": [435          "12 providers",436          "170-model catalog",437          "Native Anthropic tool_use client",438          "OpenAI-compatible tool-calls client",439          "Custom endpoints"440        ]441      },442      {443        "category": "Security",444        "items": [445          "AES-256-GCM key vault (CryptoKit)",446          "HKDF machine-bound key derivation",447          "Hardened runtime, Developer ID notarized"448        ]449      },450      {451        "category": "Quality",452        "items": [453          "Live verification harness (--verify)",454          "--verify-policy (38 assertions)",455          "swift-markdown (sole dependency)"456        ]457      }458    ],459    "architecture": [460      {461        "title": "AgentLoop",462        "description": "A Swift actor running the plan → act → observe → reflect cycle: stream a turn, execute tool calls, thread results back, repeat until the model answers without tools."463      },464      {465        "title": "PolicyEngine and ExecutionService",466        "description": "Shell execution never leaks into views — everything goes through ExecutionService and passes PolicyEngine first, evaluating deny → ask → allow per parsed subcommand."467      },468      {469        "title": "Tool layer",470        "description": "Eight tools behind a Tool protocol (name, description, JSON-Schema parameters, execute) registered in a ToolRegistry — adding a tool is deliberately trivial."471      },472      {473        "title": "MemoryManager",474        "description": "Live token accounting calibrated by provider usage numbers, compaction at 85% of context with a thrash guard, output offloading over 8 KB, and an agent-owned MEMORY.md."475      },476      {477        "title": "Provider layer",478        "description": "A native AnthropicClient and one OpenAICompatibleClient normalized behind a single ProviderClient protocol, so the agent loop never sees a wire format."479      },480      {481        "title": "Event-driven UI",482        "description": "The command-center interface renders exclusively from an AgentEvent stream and the persisted Transcript — step cards, plan panel, live terminal feed, and audit views."483      }484    ],485    "highlights": [486      "sudo is never run silently in any mode — proven by a test that forces a sudo tool call and confirms denial in all three safety modes",487      "Three safety modes (Manual, Guarded, Autonomous) with an always-ask circuit-breaker class that no mode and no remembered rule can override",488      "77 of 80 agent-capable models verified live for streamed tool calling; the 3 failures are external and documented",489      "Found and fixed real provider quirks: Gemini thought-signature round-tripping and OpenAI reasoning_effort downgrading with tools",490      "A task that triggered 4 context compactions still produced a fully correct result, verified live",491      "Design traced to a 413-line research document citing 79 sources; built entirely without the Xcode IDE"492    ]493  },494  {495    "slug": "zyquo-atlas",496    "hero": {497      "headline": "The AI-native macOS browser — every surface intelligent",498      "subheadline": "A fast, radically customizable, privacy-first WebKit browser with AI woven into the omnibox, the page, your selection, and your tabs."499    },500    "overview": [501      "Zyquo Atlas is a native macOS web browser built in Swift and SwiftUI on Apple's WebKit engine. Unlike browsers that bolt a chatbot onto a sidebar, Atlas weaves AI into every surface: ask from the omnibox, chat with the current page, act on any text selection, and reason across multiple open tabs — powered by your own keys across 12 providers and 169 models.",502      "Privacy is structural, not a setting. Page content leaves the device only when you invoke an AI action, always to the provider you chose via your own key — never to Zyquo. Extraction runs Mozilla Readability in an isolated JavaScript world, keeps visible text only, and wraps page content as untrusted data, so a hostile page can produce a bad summary but never an action.",503      "It is a complete browser underneath: real multi-tab WKWebView browsing with pinning and background-tab suspension, private windows, reader mode, profiles with isolated data stores, full-text history, bookmarks with Netscape HTML import/export, and a theming engine with 10 built-in themes and a live custom editor — in roughly 8,300 lines of Swift with zero warnings."504    ],505    "stats": [506      {507        "value": "12",508        "label": "AI providers"509      },510      {511        "value": "169",512        "label": "chat models"513      },514      {515        "value": "183/183",516        "label": "verification checks green"517      },518      {519        "value": "10",520        "label": "built-in themes"521      },522      {523        "value": "~8,300",524        "label": "lines of Swift, 58 files"525      }526    ],527    "features": [528      {529        "icon": "Globe",530        "title": "Real multi-tab browsing",531        "description": "Each tab owns its WKWebView and navigation state, with pinning, background-tab suspension that frees memory, and per-profile session restore."532      },533      {534        "icon": "Search",535        "title": "Smart omnibox with Ask AI",536        "description": "One input resolves into navigate, web search, or a streamed grounded AI answer — without leaving the page you're on."537      },538      {539        "icon": "MessageSquare",540        "title": "Chat-with-page sidebar",541        "description": "A per-tab, multi-turn conversation grounded in the page's extracted content, with an in-panel model picker across all 169 models."542      },543      {544        "icon": "Sparkles",545        "title": "Selection floating toolbar",546        "description": "Select any text on a page and get Explain, Summarize, Translate, Rewrite, or Ask right at the cursor."547      },548      {549        "icon": "Layers",550        "title": "Multi-tab reasoning",551        "description": "Compare-these-tabs gathers several open pages and answers across them; long articles are summarized via map-reduce beyond the model's context."552      },553      {554        "icon": "ShieldCheck",555        "title": "Prompt-injection hardening",556        "description": "Extraction drops hidden and off-screen text, labels page content untrusted, and gives the AI layer no navigation or tool access whatsoever."557      },558      {559        "icon": "Lock",560        "title": "Machine-bound key vault",561        "description": "API keys encrypted with AES-256-GCM and bound to the Mac via IOPlatformUUID + HKDF — not the Keychain, decrypted on demand, never logged."562      },563      {564        "icon": "Palette",565        "title": "Theming engine",566        "description": "10 built-in light and dark themes plus a live custom theme editor, backgrounds, top or Arc-style vertical tabs, density control, and a UI-size slider."567      },568      {569        "icon": "BookOpen",570        "title": "Reader mode with AI summary",571        "description": "A clean, themeable article view with an optional AI-generated summary at the top, plus native find-in-page and full-text history."572      }573    ],574    "techStack": [575      {576        "category": "App",577        "items": [578          "Swift 5.9",579          "SwiftUI",580          "AppKit",581          "macOS 13+",582          "Universal (arm64 + x86_64)"583        ]584      },585      {586        "category": "Browser",587        "items": [588          "WebKit (WKWebView)",589          "Mozilla Readability (vendored)",590          "Isolated WKContentWorld extraction",591          "Combine"592        ]593      },594      {595        "category": "AI",596        "items": [597          "12 providers, 169 models",598          "OpenAI-compatible + native Anthropic clients",599          "SSE streaming, reasoning-token aware"600        ]601      },602      {603        "category": "Security",604        "items": [605          "CryptoKit (AES-256-GCM, HKDF)",606          "IOKit machine binding",607          "Hardened Runtime, notarized + stapled"608        ]609      }610    ],611    "architecture": [612      {613        "title": "Browser layer",614        "description": "WebView wraps WKWebView with TabManager, ProfileStore, OmniIntent resolution, and a DownloadManager — each profile gets an isolated WebKit data store."615      },616      {617        "title": "Content extraction pipeline",618        "description": "ContentExtractor runs Readability.js and AtlasExtractor.js in an isolated WKContentWorld, producing visible-text-only PageContext with a Chunker for long documents."619      },620      {621        "title": "AI layer",622        "description": "AIService streams responses and cancels automatically on navigation; AIActions and Summarizer implement quick actions, selection actions, and map-reduce summarization."623      },624      {625        "title": "Shared Zyquo provider layer",626        "description": "The same ModelCatalog, SecureKeyStore, and streaming clients as Zyquo Cloud — byte-compatible across the family, so keys and models feel identical."627      },628      {629        "title": "Verification harness",630        "description": "A built-in --verify mode exercises extraction, a grounded summarize across every one of the 169 models, the full AI-action matrix, and privacy invariants — 183/183 green."631      }632    ],633    "highlights": [634      "AI has no navigation or tool access by design — a hostile page can only produce a bad summary, never an action",635      "183/183 live verification checks green, including a grounded summarize on every one of the 169 catalog models",636      "Browsing works fully without any API key; content leaves the device only on user-invoked AI actions",637      "Built with Swift Package Manager on WebKit — no Xcode project, no third-party HTTP libraries, Apple frameworks only",638      "Streamed AI responses cancel automatically on navigation as a privacy invariant",639      "Developer ID signed, notarized and stapled; source-available with the compiled app free for personal use"640    ]641  },642  {643    "slug": "zyquo-mlx",644    "hero": {645      "headline": "The on-device model foundry for Apple Silicon",646      "subheadline": "Run, fine-tune, quantize, and convert LLMs 100% locally with MLX — the complete model workbench, nothing leaves your machine."647    },648    "overview": [649      "Zyquo MLX is the foundry of the Zyquo family: where Zyquo Local is the chat client, MLX is the complete workbench for the on-device model lifecycle on Apple Silicon. It runs every MLX model type — streaming LLM chat, vision-language models with images, embeddings with a live similarity inspector, and Whisper speech-to-text — with tokens/sec, time-to-first-token, and verified memory release on every run.",650      "Fine-tuning is first-class: LoRA, QLoRA, DoRA, and full fine-tuning through a real configurator with live loss curves, checkpoints, cancel and warm resume, and memory gating that blocks impossible configs before they run. Quantization to 4 or 8 bits ships size previews accurate to 0.1%, adapter fusing with a smart de-quantize default, and Hugging Face to MLX conversion.",651      "Everything stays local — no API keys, no telemetry; the only network traffic is downloading the models you ask for. A live-verified Featured catalog and full mlx-community search come with RAM compatibility badges for your specific Mac, and datasets get row-by-row JSONL validation with concrete fixes and deterministic train/valid splits."652    ],653    "stats": [654      {655        "value": "4",656        "label": "fine-tuning methods (LoRA, QLoRA, DoRA, full)"657      },658      {659        "value": "604–630",660        "label": "tok/s inference (Qwen3-0.6B, M5 Max)"661      },662      {663        "value": "0.1%",664        "label": "quantization size-preview accuracy"665      },666      {667        "value": "~3,300",668        "label": "tok/s LoRA training throughput"669      },670      {671        "value": "1.0 s",672        "label": "to transcribe a 7 s clip (Whisper large-v3-turbo)"673      },674      {675        "value": "100%",676        "label": "local — zero telemetry"677      }678    ],679    "features": [680      {681        "icon": "Cpu",682        "title": "Every MLX model type",683        "description": "Streaming LLM chat, vision-language models with images, embeddings with a live similarity inspector, and Whisper speech-to-text — all on-device."684      },685      {686        "icon": "Flame",687        "title": "Fine-tune on your data",688        "description": "LoRA, QLoRA, DoRA, and full fine-tuning with live loss curves, checkpoints, cancel and warm resume, and a real training configurator."689      },690      {691        "icon": "Scale",692        "title": "Memory-gated training",693        "description": "Impossible training configurations are blocked before they run, based on your Mac's actual memory — no mid-run out-of-memory surprises."694      },695      {696        "icon": "Boxes",697        "title": "Quantize and convert",698        "description": "4/8-bit affine quantization with size previews accurate to 0.1%, adapter fusing with a smart de-quantize default, and Hugging Face to MLX conversion."699      },700      {701        "icon": "Database",702        "title": "Datasets done right",703        "description": "Import JSONL in chat, prompt-completion, or text formats with row-by-row validation, concrete fixes, deterministic train/valid splits, and token stats."704      },705      {706        "icon": "Search",707        "title": "Model discovery with RAM badges",708        "description": "A live-verified Featured catalog plus full mlx-community search, stamped with RAM compatibility badges for your Mac, and resumable downloads."709      },710      {711        "icon": "BarChart3",712        "title": "Side-by-side evaluation",713        "description": "Compare the base model against your fine-tune on the same prompt, with per-side generation statistics."714      },715      {716        "icon": "LineChart",717        "title": "Measured, verified performance",718        "description": "Tokens/sec, time-to-first-token, and verified memory release on every run; quantization predicted 335.3 MB and produced 335.5 MB."719      },720      {721        "icon": "WifiOff",722        "title": "Nothing leaves your machine",723        "description": "No API keys and no telemetry — the only network traffic is downloading the models you explicitly request."724      }725    ],726    "techStack": [727      {728        "category": "App",729        "items": [730          "Swift",731          "SwiftUI",732          "macOS 14+",733          "Apple Silicon (arm64)"734        ]735      },736      {737        "category": "Inference",738        "items": [739          "mlx-swift",740          "mlx-swift-lm",741          "Swift-native quantization"742        ]743      },744      {745        "category": "Training",746        "items": [747          "Pinned mlx-lm 0.31.3 via PyBridge",748          "Isolated uv-provisioned Python venv",749          "Strict JSON-lines progress protocol"750        ]751      },752      {753        "category": "Quality",754        "items": [755          "Live verification matrix (docs/VERIFICATION.md)",756          "Developer ID signed + notarized",757          "Command-line build, no .xcodeproj"758        ]759      }760    ],761    "architecture": [762      {763        "title": "InferenceEngine actor",764        "description": "A Swift actor handling LLM, VLM, and embedding inference natively via mlx-swift, with a MemoryAdvisor gating loads and a SpeechService for Whisper transcription."765      },766      {767        "title": "Training layer",768        "description": "TrainingService, RunStore, and MetricsStream drive fine-tuning runs through a live JSON protocol — loss curves, checkpoints, and warm resume all flow through it."769      },770      {771        "title": "PyBridge",772        "description": "A PythonRunner drives a pinned mlx-lm 0.31.3 in an isolated, uv-provisioned venv through strict JSON-lines scripts — Python is an implementation detail, never the interface."773      },774      {775        "title": "Convert and Data services",776        "description": "ConversionService combines Swift-native quantization with Python fuse/convert paths; DatasetService validates JSONL row-by-row, splits deterministically, and previews token stats."777      },778      {779        "title": "Hub layer",780        "description": "HubService, a resumable DownloadManager, and ModelStore handle catalog discovery, mlx-community search, and verified model delivery."781      }782    ],783    "highlights": [784      "Quantization size predictions accurate to 0.1% — a 1.19 GB fp16 model predicted at 335.3 MB came out at 335.5 MB",785      "QLoRA training at ~2,300 tok/s with a 0.8 GB peak; LoRA at ~3,300 tok/s — measured on an M5 Max",786      "Works around two documented upstream mlx-lm landmines, with the research published in docs/TRAINING-RESEARCH.md",787      "Swift-native inference and quantization; Python only for training and speech, pinned and sandboxed behind a JSON protocol",788      "Built without the Xcode IDE — command-line only, no .xcodeproj",789      "Signed and notarized with a Developer ID; MIT licensed"790    ]791  },792  {793    "slug": "zyquo-router",794    "hero": {795      "headline": "One local endpoint. Every AI provider.",796      "subheadline": "A native macOS gateway that puts 170 models from 12 providers behind a single OpenAI-compatible API — private, spec-exact, gorgeous."797    },798    "overview": [799      "Every AI provider speaks a slightly different dialect — Anthropic wants x-api-key and content blocks, Gemini wants camelCase contents/parts, Perplexity ends streams with non-spec events. Your tools speak one dialect: the OpenAI API. Zyquo Router runs a tiny native gateway on your Mac that translates all of them into byte-exact OpenAI wire format.",800      "Store your provider keys once in an AES-256-GCM encrypted, machine-bound vault, pick a port, press Start — and anything that can talk to OpenAI can now talk to twelve providers through localhost, with per-request model routing, fallback chains, live traffic inspection, and real per-model cost tracking.",801      "It is 100% native Swift: a SwiftUI control room with a menu bar extra, a SwiftNIO 2 server with structured concurrency, and zero heavyweight dependencies. Think OpenRouter or LiteLLM — but local, private, and a real Mac app, not a Docker container with a YAML file."802    ],803    "stats": [804      {805        "value": "170",806        "label": "models in the catalog"807      },808      {809        "value": "12",810        "label": "AI providers"811      },812      {813        "value": "170/170",814        "label": "verification matrix green"815      },816      {817        "value": "~15 MB",818        "label": "disk footprint"819      },820      {821        "value": "0",822        "label": "accounts required"823      }824    ],825    "features": [826      {827        "icon": "Braces",828        "title": "Spec-exact OpenAI API",829        "description": "Byte-exact chat.completion.chunk SSE streams that the official OpenAI Python and JS SDKs parse unmodified, verified across all 170 models."830      },831      {832        "icon": "ArrowLeftRight",833        "title": "Full protocol translation",834        "description": "Anthropic Messages API and Gemini generateContent translated bidirectionally — system extraction, tool calls, images, finish-reason and usage normalization."835      },836      {837        "icon": "GitBranch",838        "title": "Routing, aliases, fallback chains",839        "description": "Namespaced provider/model routing, friendly aliases like fast and best, and ordered fallback lists tried on upstream failure with honest model reporting."840      },841      {842        "icon": "KeyRound",843        "title": "Encrypted key vault",844        "description": "AES-256-GCM with an HKDF-derived, machine-bound master key. Local zyquo-sk bearer tokens are SHA-256-hashed at rest with per-key model allow-lists."845      },846      {847        "icon": "Gauge",848        "title": "Live observability",849        "description": "Requests/min sparkline, token and cost tracking from real per-model pricing, and a request inspector with an upstream-TTFB timing waterfall."850      },851      {852        "icon": "Brain",853        "title": "Reasoning-model normalization",854        "description": "Thinking output unified into reasoning_content across Claude thinking, Gemini thoughts, DeepSeek-R1, Qwen, Magistral, and Perplexity think tags."855      },856      {857        "icon": "FlaskConical",858        "title": "Built-in playground and docs",859        "description": "An in-app tester that calls the router's own endpoint with side-by-side request JSON and raw SSE panes, plus fully rendered API docs."860      },861      {862        "icon": "Terminal",863        "title": "Headless CLI modes",864        "description": "Run the gateway without the UI via --serve, and seed the key vault from environment variables with --load-vault for scripting and CI."865      },866      {867        "icon": "RefreshCw",868        "title": "Production-grade resilience",869        "description": "Exponential-backoff retries with jitter, honest OpenAI-format error mapping, and client disconnects that cancel the upstream call in under one second."870      }871    ],872    "techStack": [873      {874        "category": "Native App",875        "items": [876          "Swift 5.9",877          "SwiftUI",878          "SwiftNIO 2",879          "Swift Package Manager",880          "Universal binary (Apple Silicon + Intel)"881        ]882      },883      {884        "category": "Security",885        "items": [886          "AES-256-GCM vault",887          "HKDF machine-bound keys",888          "SHA-256 hashed local API keys",889          "Developer ID signed & notarized"890        ]891      },892      {893        "category": "Compatibility",894        "items": [895          "OpenAI Chat Completions API",896          "Anthropic Messages API",897          "Gemini generateContent",898          "SSE streaming"899        ]900      },901      {902        "category": "Tooling",903        "items": [904          "Makefile build pipeline",905          "Fixture-tested translators",906          "verify.py 170-model matrix",907          "Mock-upstream integration tests"908        ]909      }910    ],911    "architecture": [912      {913        "title": "SwiftNIO HTTP server",914        "description": "An HTTP/1.1 server built on structured concurrency with one task per connection and a spec-exact SSE writer; disconnects propagate as cancellation into the upstream transfer."915      },916      {917        "title": "RequestRouter",918        "description": "Resolves namespaces, aliases, fallback chains, and capability gates to pick the upstream provider and model for every request."919      },920      {921        "title": "Translation layer",922        "description": "Fixture-tested state machines — AnthropicTranslator, GeminiTranslator, and a CompatAdjuster with per-provider parameter tables — iron ten providers' quirks into exact OpenAI chunks."923      },924      {925        "title": "Upstream calls and vault",926        "description": "Requests go straight from your Mac to the provider using keys from the AES-256-GCM vault; no middleman, no telemetry, no accounts."927      },928      {929        "title": "Local persistence",930        "description": "JSON documents in Application Support and keys in vault.zq with a machine-bound HKDF key — no Keychain, no plaintext, ever."931      }932    ],933    "highlights": [934      "Every release drives all 170 catalog models through the endpoint with the official OpenAI Python SDK — streaming discipline, tool calling, vision, and reasoning — and the matrix is 170/170 green.",935      "100% native Swift with zero heavyweight dependencies: SwiftNIO, swift-nio-extras, and swift-markdown. No Electron, no Python sidecar, no Docker.",936      "Provider quirks like Together's eos finish reason, Mistral thinking arrays, and Perplexity's non-spec done events are all normalized into the spec.",937      "LAN exposure is an explicit opt-in that requires at least one local API key; logging redacts request bodies by default.",938      "Developer ID signed, notarized, and stapled universal binary — Gatekeeper opens it without warnings on macOS 13+.",939      "Ships with a menu bar extra, a Command-K palette, and copy-as-code snippets for curl, Python, and JavaScript pre-filled with your port."940    ]941  },942  {943    "slug": "zyquo-cloud-web",944    "hero": {945      "headline": "Every cloud model. One chat. Zero backend.",946      "subheadline": "A browser-native AI chat for 170 models across 12 providers — bring your own keys, nothing ever leaves your device."947    },948    "overview": [949      "Zyquo Cloud Web is the browser edition of the native Zyquo Cloud app: a full multi-provider AI chat that runs entirely client-side. There is no backend, no account, and no telemetry — your API keys live in your browser and are sent only to the provider you call, directly over CORS.",950      "Under the hood are two faithfully ported wire clients — one OpenAI-compatible client covering 11 providers plus custom endpoints, and one native Anthropic Messages API client — driven by a hand-rolled incremental SSE parser over fetch and ReadableStream. Reasoning streams, Perplexity citations, vision attachments, and auto-retry with backoff are all handled.",951      "Power features go well beyond chat: multi-model compare across up to four streaming columns, variants and branching, a Command-K palette, slash commands, 8 personas, 56 prompt templates, a token-and-cost HUD, and local-first persistence in IndexedDB with optional AES-GCM passphrase encryption."952    ],953    "stats": [954      {955        "value": "170",956        "label": "models"957      },958      {959        "value": "12",960        "label": "providers"961      },962      {963        "value": "169/169",964        "label": "models verified live"965      },966      {967        "value": "288 kB",968        "label": "gzipped core bundle"969      },970      {971        "value": "56",972        "label": "prompt templates"973      },974      {975        "value": "0",976        "label": "backend servers"977      }978    ],979    "features": [980      {981        "icon": "ShieldCheck",982        "title": "BYOK, no backend",983        "description": "Keys stay in your browser and go only to the provider you call. Strict CSP locks connections to exactly the 12 provider origins plus localhost."984      },985      {986        "icon": "Zap",987        "title": "Hand-rolled streaming engine",988        "description": "Token-by-token rendering with live tok/s, stop and continue, and one incremental SSE parser handling both OpenAI-style and Anthropic named events."989      },990      {991        "icon": "Split",992        "title": "Multi-model compare",993        "description": "Broadcast one prompt to 2-4 columns streaming independently, each with its own stop, copy, and regenerate — then promote the best answer into your thread."994      },995      {996        "icon": "GitBranch",997        "title": "Variants and branching",998        "description": "Regenerate keeps previous answers as swipeable variants, branch whole conversations from any message, and edit-and-resend forks from earlier turns."999      },1000      {1001        "icon": "Command",1002        "title": "Command palette and slash commands",1003        "description": "A Command-K palette for actions, conversations, models, personas, and templates, plus slash commands with input substitution from a 56-template library."1004      },1005      {1006        "icon": "Eye",1007        "title": "Vision and attachments",1008        "description": "Drag, drop, or paste images as base64 parts and inject text files as fenced context blocks, gated by each model's real capabilities."1009      },1010      {1011        "icon": "Gauge",1012        "title": "Token and cost HUD",1013        "description": "Per-message and per-conversation token counts and cost estimates from catalog pricing, with a context-window bar and auto-trim at 90% capacity."1014      },1015      {1016        "icon": "HardDrive",1017        "title": "Local-first persistence",1018        "description": "Conversations in schema-versioned IndexedDB, settings in namespaced localStorage, full JSON export/import, and undo for deletes — surviving full browser restarts."1019      },1020      {1021        "icon": "Lock",1022        "title": "Optional passphrase vault",1023        "description": "The key map can be encrypted at rest with AES-GCM via WebCrypto and a PBKDF2-derived key using 310k iterations."1024      }1025    ],1026    "techStack": [1027      {1028        "category": "Frontend",1029        "items": [1030          "React 19",1031          "TypeScript (strict)",1032          "Vite 7",1033          "Zustand 5",1034          "CSS custom properties (ZyquoTheme tokens)"1035        ]1036      },1037      {1038        "category": "Rendering",1039        "items": [1040          "react-markdown",1041          "remark-gfm",1042          "rehype-highlight",1043          "KaTeX",1044          "Mermaid (lazy-loaded)"1045        ]1046      },1047      {1048        "category": "Storage & Security",1049        "items": [1050          "IndexedDB (dependency-free wrapper)",1051          "namespaced localStorage",1052          "AES-GCM WebCrypto vault",1053          "strict CSP"1054        ]1055      },1056      {1057        "category": "Testing & Deploy",1058        "items": [1059          "Playwright (Chromium/WebKit/Firefox)",1060          "GitHub Actions CI",1061          "GitHub Pages",1062          "PWA via Workbox",1063          "zero-dependency Node prod server"1064        ]1065      }1066    ],1067    "architecture": [1068      {1069        "title": "providers/ — all networking",1070        "description": "A 12-provider registry, one OpenAI-compatible client, a native Anthropic Messages client, the SSE parser with retry, and the complete 170-model typed catalog."1071      },1072      {1073        "title": "storage/ — all persistence",1074        "description": "The only code touching localStorage and IndexedDB: key map with vault overlay, conversation CRUD with schema migration, settings, and backup export/import."1075      },1076      {1077        "title": "Zustand store",1078        "description": "A single store orchestrating send, stream, stop, regenerate, branch, and auto-titling — components stay presentational by enforced architectural invariant."1079      },1080      {1081        "title": "Static deployment",1082        "description": "A 100% static build hosted anywhere; production runs a zero-dependency Node server adding CSP, HSTS, and security headers under PM2 behind an ngrok custom domain."1083      }1084    ],1085    "highlights": [1086      "Verified live with real keys from a real browser: 169/169 models streaming, 12/12 providers on non-streaming, stop, and CORS, and a network audit showing the page contacted provider origins and localhost — nothing else.",1087      "CORS feasibility was empirically probed per provider — preflight, authenticated POST, and streaming — and documented with official sources in a public CORS matrix.",1088      "Dependency-light on purpose: no icon packs, no CSS framework, no IndexedDB wrapper library, no auth SDKs — every dependency is key-theft surface.",1089      "The ZyquoTheme design system is ported token-for-token from the native macOS app, with light and dark themes, 5 accent choices, and reduced-motion support.",1090      "Installable PWA with a 1.15 MB app-shell precache that never caches API responses or keys, fully responsive down to phones.",1091      "Live at www.zyquo.cloud with an auto-deployed GitHub Pages mirror; a per-provider base-URL override can point any provider at a local Zyquo Router."1092    ]1093  },1094  {1095    "slug": "vquant",1096    "hero": {1097      "headline": "Institutional-grade financial intelligence, AI-powered",1098      "subheadline": "A Claude-driven financial analysis platform pairing 265+ data endpoints with a quantitative Python engine and streaming research reports."1099    },1100    "overview": [1101      "VibeQuant is a production-grade, full-stack financial analysis platform. A Claude AI agent — six selectable models with up to 1M tokens of context, Fable 5 by default — wields 213 specialized financial tools over 265+ data endpoints, a quantitative Python engine, and multi-source web research, delivering institutional-grade insight through a real-time streaming conversational interface.",1102      "The data layer covers company fundamentals, market data, technical indicators, analyst ratings, insider and institutional activity, SEC filings, macro indicators, ETFs, forex, and crypto. The quant engine runs Monte Carlo simulation, Black-Scholes with full Greeks, GARCH volatility, VaR, mean-variance portfolio optimization, and arbitrary Python across 17 scientific libraries.",1103      "Finished analyses export in one click to PDF, Word, and LaTeX Beamer slides, and a searchable community showcase publishes hundreds of analyses with the exact tool-chain the agent used on every card. Built in TypeScript with React 18, Express, Drizzle ORM, and Zod validation — live at www.vquant.ai."1104    ],1105    "stats": [1106      {1107        "value": "265+",1108        "label": "financial data endpoints"1109      },1110      {1111        "value": "213",1112        "label": "Claude agent tools"1113      },1114      {1115        "value": "17",1116        "label": "Python scientific libraries"1117      },1118      {1119        "value": "6",1120        "label": "selectable Claude models"1121      },1122      {1123        "value": "36,000+",1124        "label": "lines of code"1125      },1126      {1127        "value": "41",1128        "label": "tests passing"1129      }1130    ],1131    "features": [1132      {1133        "icon": "Bot",1134        "title": "Claude agent with 1M context",1135        "description": "Six selectable Claude models with adaptive extended thinking shown live in a collapsible reasoning widget, plus vision support for charts and documents."1136      },1137      {1138        "icon": "Database",1139        "title": "265+ financial data endpoints",1140        "description": "Fundamentals, market data, technical indicators, analyst ratings, insider and Congressional trading, SEC filings, macro, ETFs, forex, and crypto via FMP."1141      },1142      {1143        "icon": "Calculator",1144        "title": "Quantitative Python engine",1145        "description": "Monte Carlo with 10k+ paths, Black-Scholes with full Greeks, GARCH(1,1) forecasting, three flavors of VaR, and mean-variance portfolio optimization."1146      },1147      {1148        "icon": "FlaskConical",1149        "title": "Arbitrary Python execution",1150        "description": "The agent writes and runs custom analysis code with access to 17 scientific libraries — numpy, pandas, scipy, arch, cvxpy, quantstats, and more — plus live FMP data."1151      },1152      {1153        "icon": "Search",1154        "title": "Multi-source web research",1155        "description": "Tavily AI search, Firecrawl scraping with PDF extraction up to 750 pages, Exa semantic search, and SerpAPI Google surfaces feed the agent's research."1156      },1157      {1158        "icon": "Zap",1159        "title": "Real-time streaming interface",1160        "description": "Server-Sent Events stream responses instantly, with intelligent tool batching of 5 tools per batch and per-session token and cost tracking."1161      },1162      {1163        "icon": "FileText",1164        "title": "One-click report export",1165        "description": "Puppeteer-rendered PDFs, Pandoc Word documents, LaTeX Beamer slide decks, CSV/XLSX/JSON data files, and shareable report links with unique IDs."1166      },1167      {1168        "icon": "Users",1169        "title": "Community showcase",1170        "description": "Hundreds of public analyses, searchable, each card showing the exact tool-chain the agent used to produce the report."1171      }1172    ],1173    "techStack": [1174      {1175        "category": "Frontend",1176        "items": [1177          "React 18.3",1178          "TypeScript 5.6",1179          "Vite 5",1180          "Tailwind CSS 3.4",1181          "Radix UI"1182        ]1183      },1184      {1185        "category": "Backend",1186        "items": [1187          "Express 4.21",1188          "Drizzle ORM",1189          "Zod validation",1190          "SQLite / PostgreSQL",1191          "SSE streaming"1192        ]1193      },1194      {1195        "category": "AI",1196        "items": [1197          "Claude Fable 5 (default)",1198          "Opus 4.8 / 4.7 / 4.6",1199          "Sonnet 4.6",1200          "Haiku 4.5",1201          "213-tool agent"1202        ]1203      },1204      {1205        "category": "Quant & Data",1206        "items": [1207          "Python 3.11+",1208          "numpy / pandas / scipy",1209          "arch (GARCH)",1210          "cvxpy",1211          "FMP API (230 endpoints)"1212        ]1213      },1214      {1215        "category": "Research & Quality",1216        "items": [1217          "Tavily",1218          "Firecrawl",1219          "Exa",1220          "SerpAPI",1221          "Vitest",1222          "ESLint + Prettier"1223        ]1224      }1225    ],1226    "architecture": [1227      {1228        "title": "Streaming agent loop",1229        "description": "An Express backend drives the Claude API with 213 tools, batching 5 tools per round and streaming responses and reasoning to the React client over SSE."1230      },1231      {1232        "title": "Financial data service",1233        "description": "A typed FMP service layer exposes 230 endpoints across twelve categories, from fundamentals and technicals to SEC filings and alternative data."1234      },1235      {1236        "title": "Python analysis engine",1237        "description": "Eleven Python scientific services run Monte Carlo, Black-Scholes, GARCH, VaR, and portfolio optimization in a managed virtual environment with 17 libraries."1238      },1239      {1240        "title": "Export pipeline",1241        "description": "Reports render to PDF through Puppeteer, to DOCX through Pandoc, and to Beamer slides through LaTeX, alongside CSV/XLSX/JSON data downloads."1242      },1243      {1244        "title": "Validated persistence",1245        "description": "Drizzle ORM over SQLite or PostgreSQL stores sessions, analyses, and token metrics, with Zod schemas validating every boundary."1246      }1247    ],1248    "highlights": [1249      "Live demo at www.vquant.ai — a working, deployed platform, not a prototype.",1250      "Six selectable Claude models with up to 1M tokens of context; the reasoning widget auto-expands while the model thinks.",1251      "44 documented API endpoints, 6 route modules, 57 React components, and 6 Vitest suites with 41 passing tests across 150+ source files.",1252      "The quant engine spans 8 built-in models, from Monte Carlo simulation to Sharpe, Sortino, Calmar, and max-drawdown risk metrics.",1253      "Four independent web-research providers — Tavily, Firecrawl, Exa, and SerpAPI — give the agent search, scraping, and semantic retrieval.",1254      "Every public analysis in the community showcase exposes the exact tool-chain the agent used, making results auditable."1255    ]1256  },1257  {1258    "slug": "llmindex",1259    "hero": {1260      "headline": "The LLM leaderboard that can't be gamed",1261      "subheadline": "A discriminative, contamination-resistant, fully transparent LLM ranking built on IRT psychometrics and Bradley-Terry duels — updated live."1262    },1263    "overview": [1264      "Classic leaderboards fail twice: top models cluster above 95% on saturated benchmarks, giving zero discrimination, and fixed test sets leak into training data. LLM Index is engineered against both from the psychometrics up — every item carries a fitted difficulty and discrimination, ability is a 2PL IRT MAP estimate with Fisher-information standard errors, and raw accuracy is never the score.",1265      "There is no fixed test set to memorize: every scored batch is freshly generated from seeded template generators, and the fixed-versus-fresh gap is published per model as a contamination delta. Home-made agentic, terminal, and context-load benches are graded deterministically by simulators; writing, safety, and SVG logo duels use a position-swapped, never-self-judging 3-judge panel feeding a Bradley-Terry fit.",1266      "Everything is transparent: 135 models across 12 equally weighted domains, every score with a 95% confidence interval, and a page per model showing every answer on every test with judge verdicts, latency, and cost. Cost and latency live on a separate Pareto frontier — never blended into quality."1267    ],1268    "stats": [1269      {1270        "value": "135",1271        "label": "models ranked"1272      },1273      {1274        "value": "12",1275        "label": "evaluation domains"1276      },1277      {1278        "value": "25",1279        "label": "template item generators"1280      },1281      {1282        "value": "3",1283        "label": "cross-provider judges"1284      },1285      {1286        "value": "95%",1287        "label": "CI on every score"1288      },1289      {1290        "value": "60+",1291        "label": "published sources behind the design"1292      }1293    ],1294    "features": [1295      {1296        "icon": "LineChart",1297        "title": "IRT 2PL scoring",1298        "description": "Each item has fitted difficulty and discrimination; ability theta is a MAP estimate with Fisher-information standard errors, and non-discriminating items are auto-retired."1299      },1300      {1301        "icon": "ShieldCheck",1302        "title": "Contamination resistance by design",1303        "description": "Every scored batch is freshly generated from seeded template generators — values, paraphrases, structures — with the fixed-vs-fresh gap published per model."1304      },1305      {1306        "icon": "Workflow",1307        "title": "Original agentic bench",1308        "description": "Simulated tool-calling environments with distractor tools where a deterministic simulator computes the unique correct call sequence — graded by canonical-JSON equality, no judges."1309      },1310      {1311        "icon": "Terminal",1312        "title": "Simulated terminal bench",1313        "description": "A closed, unambiguous POSIX subset simulated in TypeScript: models predict exact pipeline stdout, file trees after mutations, and exit-code traces."1314      },1315      {1316        "icon": "Scale",1317        "title": "Bradley-Terry judged duels",1318        "description": "SVG logo reproduction, writing, and safety duels scored by a position-swapped, cross-provider 3-judge panel that never self-judges, fitted with Bradley-Terry."1319      },1320      {1321        "icon": "Eye",1322        "title": "Vision OCR under clutter",1323        "description": "Generated scenes with rotated codes, noise, and decoys rasterized to PNG; text-only models skip the domain and weights renormalize."1324      },1325      {1326        "icon": "Zap",1327        "title": "Live, one model at a time",1328        "description": "Parallel evaluation lanes stream results; after every completed model, the IRT refit re-runs and the public leaderboard re-ranks in real time."1329      },1330      {1331        "icon": "Search",1332        "title": "Total transparency",1333        "description": "Every model page shows every answer on every test with judge verdicts, confidence, latency, and cost — each number traces to an immutable score run."1334      },1335      {1336        "icon": "Braces",1337        "title": "Public versioned API",1338        "description": "Leaderboard, per-domain scores, model profiles, machine-readable methodology, and live run progress over a frozen v1 JSON API."1339      }1340    ],1341    "techStack": [1342      {1343        "category": "Frontend",1344        "items": [1345          "Next.js 14",1346          "TypeScript (strict)",1347          "Tailwind CSS"1348        ]1349      },1350      {1351        "category": "Data",1352        "items": [1353          "PostgreSQL 16",1354          "Prisma",1355          "Redis"1356        ]1357      },1358      {1359        "category": "Psychometrics",1360        "items": [1361          "Python + NumPy",1362          "2PL IRT (MAP + Fisher SE)",1363          "Bradley-Terry (MM + SE)",1364          "calibration analysis"1365        ]1366      },1367      {1368        "category": "Infrastructure",1369        "items": [1370          "pnpm + Turborepo monorepo",1371          "OpenRouter model access",1372          "typed client with retries and cost tracking"1373        ]1374      }1375    ],1376    "architecture": [1377      {1378        "title": "apps/web",1379        "description": "Next.js 14 serves the live leaderboard, per-model transparency pages, the public methodology, and the versioned /api/v1 endpoints."1380      },1381      {1382        "title": "apps/worker",1383        "description": "The eval runner, duel runner, parallel benchmark orchestrator, and refit trigger — evaluation lanes run models in parallel with a full audit trail."1384      },1385      {1386        "title": "apps/psychometrics",1387        "description": "Python fits the 2PL IRT model with MAP estimates and Fisher standard errors, the Bradley-Terry duel model, and calibration metrics."1388      },1389      {1390        "title": "packages/items",1391        "description": "25 template generators plus the agentic, terminal, and ledger simulators and a lenient, robust answer-extraction cascade that never cheats models on formatting."1392      },1393      {1394        "title": "Scoring pipeline",1395        "description": "OpenRouter catalog sync, seeded batch generation, temperature-0 scoring with consistency samples, per-domain 2PL fits, Bradley-Terry duels, and 95% CIs on every score."1396      }1397    ],1398    "highlights": [1399      "Domain weights are equal by design — the maximum-entropy prior — and per-domain scores are always published so anyone can re-weight.",1400      "Cost and latency are never blended into quality: they live on a separate Pareto frontier.",1401      "Answer keys and rubrics never ship to the client or public API; scored batches keep the frozen anchor subset at or below 20% of any run.",1402      "Every displayed number traces to an immutable score-run row with item-set hash, model set, index version, and fit diagnostics.",1403      "Methodology changes bump a semver INDEX_VERSION with a public changelog; weights and hyperparameters live in exactly one file, served machine-readable.",1404      "Backed by a 19-page LaTeX white paper and 60+ published sources — yet every environment, item, simulator, and grader is original."1405    ]1406  },1407  {1408    "slug": "airiskindex",1409    "hero": {1410      "headline": "AI job exposure, measured task by task",1411      "subheadline": "A transparent, task-based index scoring 923 U.S. occupations from 18,796 O*NET tasks rated by a multi-model LLM panel."1412    },1413    "overview": [1414      "AI Risk Index scores every U.S. occupation on its exposure to AI-driven automation with a task-based methodology: each of the ~18,800 O*NET task statements is rated individually by a multi-model LLM panel across five weighted dimensions, and occupation scores are derived from importance-weighted task scores. Every number is transparent, versioned, and reproducible.",1415      "The index never collapses to one number. Three separate scores answer three different questions — Exposure (is AI technically capable?), Substitution (does AI actually replace the human after cost, barriers, and adoption?), and Augmentation (does AI assist without replacing?). Each ships with a confidence interval derived from rater disagreement, because single-model exposure ratings can vary by an order of magnitude.",1416      "The headline run finds 32% of the U.S. wage bill — roughly $4.7T of $14.5T — under substitution pressure, while 47.8M workers sit in high-augmentation occupations against 5.3M in high-substitution ones. The index is explicitly built as adaptation guidance, not doom, and its scores are published under CC BY 4.0."1417    ],1418    "stats": [1419      {1420        "value": "923",1421        "label": "occupations scored"1422      },1423      {1424        "value": "18,796",1425        "label": "O*NET tasks rated"1426      },1427      {1428        "value": "~225k",1429        "label": "dimension ratings"1430      },1431      {1432        "value": "32%",1433        "label": "of U.S. wage bill under pressure"1434      },1435      {1436        "value": "194.2M",1437        "label": "workers covered (BLS OEWS)"1438      }1439    ],1440    "features": [1441      {1442        "icon": "ListChecks",1443        "title": "Task-based methodology",1444        "description": "Every occupation score is built bottom-up from individually rated O*NET task statements, aggregated with official importance weights — never a vibes-based occupation guess."1445      },1446      {1447        "icon": "Bot",1448        "title": "Multi-model LLM rater panel",1449        "description": "Claude Sonnet 5 and Haiku 4.5 rate every task independently; disagreement between raters becomes the published confidence interval."1450      },1451      {1452        "icon": "Layers",1453        "title": "Three scores, never collapsed",1454        "description": "Exposure, Substitution, and Augmentation answer distinct questions — technical capability, actual replacement, and productivity assistance — and are always reported separately."1455      },1456      {1457        "icon": "BarChart3",1458        "title": "Confidence intervals on everything",1459        "description": "CI bounds are a worst/best-case envelope over the rater panel, making multi-model disagreement visible instead of hiding it behind a single number."1460      },1461      {1462        "icon": "Calculator",1463        "title": "Pure, deterministic scoring engine",1464        "description": "The TypeScript scoring core has no I/O, clock, or randomness — pinned by property-based tests and a published worked example reproduced to three decimals."1465      },1466      {1467        "icon": "Eye",1468        "title": "Full audit trail",1469        "description": "Every rating stores model, prompt version, raw response, parsed score, and rationale — visible on every occupation page by expanding any task."1470      },1471      {1472        "icon": "Braces",1473        "title": "Versioned public API",1474        "description": "Health, machine-readable methodology, occupation search, and full score breakdowns with sub-scores, CI bounds, tasks, and wages — index_version in every payload."1475      },1476      {1477        "icon": "Lock",1478        "title": "Immutable score runs",1479        "description": "Weight, formula, or prompt changes bump INDEX_VERSION with a changelog entry; every published score traces to an immutable run that stays queryable forever."1480      },1481      {1482        "icon": "Palette",1483        "title": "Colorblind-safe data design",1484        "description": "Charts follow a validated palette with CI whiskers, data-table fallbacks, and a dark mode with selected rather than flipped color steps."1485      }1486    ],1487    "techStack": [1488      {1489        "category": "Frontend",1490        "items": [1491          "Next.js 14",1492          "TypeScript (strict)",1493          "shared React UI package"1494        ]1495      },1496      {1497        "category": "Data",1498        "items": [1499          "PostgreSQL 16",1500          "Prisma",1501          "Redis + BullMQ"1502        ]1503      },1504      {1505        "category": "AI Rating",1506        "items": [1507          "Anthropic Message Batches",1508          "Claude Sonnet 5",1509          "Claude Haiku 4.5",1510          "prompt-cached rubric",1511          "schema-constrained JSON"1512        ]1513      },1514      {1515        "category": "ETL & Sources",1516        "items": [1517          "Python 3.12",1518          "O*NET 30.3",1519          "BLS OEWS May 2025",1520          "pnpm + Turborepo"1521        ]1522      }1523    ],1524    "architecture": [1525      {1526        "title": "ETL pipeline (apps/etl)",1527        "description": "Python 3.12 downloads O*NET 30.3 and BLS OEWS, transforms them with committed manifests of hashes and row counts, and loads 1,016 occupations and 18,796 tasks into Postgres."1528      },1529      {1530        "title": "Rating worker (apps/worker)",1531        "description": "A BullMQ pipeline drives Anthropic Message Batches — one request per task per model with deterministic custom IDs — making runs idempotent and resumable at a 50% batch discount."1532      },1533      {1534        "title": "Scoring engine (packages/scoring)",1535        "description": "The auditable core: five weighted dimensions, inverted adoption-barriers orientation, importance-weighted aggregation, and CI envelopes — pure, deterministic, and property-tested."1536      },1537      {1538        "title": "Web and API (apps/web)",1539        "description": "Next.js 14 serves the ranking, insights, occupation detail pages with expandable per-task audit trails, and the versioned public JSON API."1540      },1541      {1542        "title": "Immutable runs (packages/db)",1543        "description": "Prisma schema for occupations, tasks, the full rating audit trail, and immutable score_runs rows — historical runs stay queryable forever."1544      }1545    ],1546    "highlights": [1547      "Multi-model replication shows single-model exposure ratings can vary by an order of magnitude — so a single-model index is an artifact; this one makes disagreement visible.",1548      "Five dimensions with published weights: task automatability (0.35), technical feasibility (0.20), adoption barriers (0.20, inverted — strong barriers protect), cost vs. wage (0.15), and adoption velocity (0.10).",1549      "Headline finding: 32% of the U.S. wage bill (~$4.7T) overlaps with what AI can plausibly take over — framed explicitly as adaptation guidance, not a payroll forecast.",1550      "Scores and derived data are CC BY 4.0; the methodology is served live as machine-readable JSON at /api/v1/methodology.",1551      "Raw data dumps are immutable and never committed — derived artifacts commit manifests only, with hashes and row counts.",1552      "Grounded in a public research corpus reviewing 20+ existing AI-exposure indices, with a roadmap for human review samples, sensitivity analyses, and EU/France coverage via ESCO and ROME."1553    ]1554  },1555  {1556    "slug": "coinexplorer",1557    "hero": {1558      "headline": "A blockchain explorer with zero API keys",1559      "subheadline": "A self-hosted indexer, API, and dashboard for stablecoins and major crypto across 24 chains — built entirely on free public RPCs."1560    },1561    "overview": [1562      "coinexplorer is a complete blockchain explorer platform built from scratch — indexer, REST/WebSocket API, and an 8-page dashboard — that reads raw JSON-RPC and REST from free public endpoints only. No Etherscan keys, no Infura, no paid data vendors: point it at the internet and it indexes 11 stablecoins and major crypto across four chain families.",1563      "Every transfer from 21 EVM chains, Tron, Solana, and Bitcoin lands in one canonical event schema, making the API, WebSocket stream, and dashboard fully chain-agnostic. The production instance at www.coinexplorer.io has indexed over 20 million transfers, with hot endpoints answering in under 200 ms at any index size thanks to incrementally maintained aggregates.",1564      "The platform is engineered for hostile free infrastructure: per-endpoint token buckets, health-scored failover with exponential cooldowns, adaptive range halving for oversized queries, reorg-safe cursors with automatic rollback, and a watchdog that rebuilds any dead worker thread within 30 seconds."1565    ],1566    "stats": [1567      {1568        "value": "24",1569        "label": "chains indexing live"1570      },1571      {1572        "value": "94",1573        "label": "on-chain verified assets"1574      },1575      {1576        "value": "20M+",1577        "label": "transfers indexed"1578      },1579      {1580        "value": "<200 ms",1581        "label": "hot API endpoints"1582      },1583      {1584        "value": "22",1585        "label": "API endpoints"1586      },1587      {1588        "value": "0",1589        "label": "API keys required"1590      }1591    ],1592    "features": [1593      {1594        "icon": "Coins",1595        "title": "Four chain families, one schema",1596        "description": "EVM logs, Tron tx-infos, Solana balance diffs, and Bitcoin UTXOs all normalize into a single canonical transfer event."1597      },1598      {1599        "icon": "KeyRound",1600        "title": "Zero paid API keys",1601        "description": "Reads raw JSON-RPC and REST from free public endpoints only — no Etherscan, no Infura, no data vendors."1602      },1603      {1604        "icon": "Eye",1605        "title": "Whale watch, live",1606        "description": "Incremental whale extraction with a $100K floor — a $72M BTC move was caught minutes after boot."1607      },1608      {1609        "icon": "Zap",1610        "title": "Real-time WebSocket feed",1611        "description": "wss stream pushes every transfer above your chosen USD floor, straight from the indexer."1612      },1613      {1614        "icon": "LineChart",1615        "title": "Stablecoin issuance signals",1616        "description": "Net mints minus burns per token, on-chain supply history per chain, native versus bridged tagging."1617      },1618      {1619        "icon": "ShieldCheck",1620        "title": "Reorg-safe indexing",1621        "description": "Parent-hash chain-linking on every cursor advance plus chain-specific confirmation depths, with automatic rollback."1622      },1623      {1624        "icon": "Gauge",1625        "title": "Scale-proof reads",1626        "description": "Background workers maintain aggregates incrementally, so no UI query rescans the transfers table — 26 s cut to 2 ms, measured."1627      },1628      {1629        "icon": "Blocks",1630        "title": "Add a chain in 30 lines",1631        "description": "New EVM chains are config-only YAML; non-EVM families are roughly 150-line adapters, with 13 chains pre-verified and waiting."1632      },1633      {1634        "icon": "CheckCircle2",1635        "title": "Verified before indexed",1636        "description": "Every EVM token address is checked on-chain via symbol() and decimals() before a single transfer is stored."1637      }1638    ],1639    "techStack": [1640      {1641        "category": "Backend",1642        "items": [1643          "Python 3.12+",1644          "FastAPI",1645          "WebSocket",1646          "Prometheus metrics"1647        ]1648      },1649      {1650        "category": "Storage",1651        "items": [1652          "SQLite WAL",1653          "PostgreSQL",1654          "one codebase, both engines"1655        ]1656      },1657      {1658        "category": "Chain access",1659        "items": [1660          "Raw JSON-RPC",1661          "eth_getLogs + hand-rolled ABI decoding",1662          "TronGrid",1663          "Solana RPC",1664          "esplora REST"1665        ]1666      },1667      {1668        "category": "Frontend",1669        "items": [1670          "8-page responsive dashboard",1671          "hand-rolled SVG charts",1672          "native dark mode"1673        ]1674      },1675      {1676        "category": "Deployment",1677        "items": [1678          "Docker Compose",1679          "bare-metal venv",1680          "MIT license"1681        ]1682      }1683    ],1684    "architecture": [1685      {1686        "title": "RPC pools",1687        "description": "Per-endpoint token buckets respect documented rate limits before getting 429'd, with health-scored EMA failover and exponential cooldowns across free public endpoints."1688      },1689      {1690        "title": "Family adapters",1691        "description": "Four adapters — EVM, Tron, Solana, Bitcoin — decode raw chain data into one canonical transfer event, including a from-scratch Base58Check codec."1692      },1693      {1694        "title": "Two-cursor indexing",1695        "description": "Head-tailing always has priority while history grows backwards one slice per cycle, with reorg detection and rollback on every cursor advance."1696      },1697      {1698        "title": "Background workers",1699        "description": "Prices, supply, whale extraction, and rolling aggregates are maintained incrementally by dedicated workers, each supervised by a watchdog that rebuilds dead threads within 30 seconds."1700      },1701      {1702        "title": "FastAPI layer",1703        "description": "REST /v1, a live WebSocket transfer stream, Prometheus /metrics, and the dashboard all read from the same database over either SQLite or PostgreSQL."1704      }1705    ],1706    "highlights": [1707      "Live in production at www.coinexplorer.io — the README's BTC/ETH price badges render from the platform's own API",1708      "94 asset deployments verified on-chain (symbol() + decimals()) before indexing — the verifier refuses wrong addresses and chain IDs",1709      "A $72M BTC whale move was detected minutes after first boot",1710      "Incremental aggregates turned a 26-second table scan into a 2-millisecond read, measured",1711      "13 additional chains (XRPL, Stellar, TON, Aptos, Sui, Starknet, ...) already configured with verified identifiers, awaiting adapters",1712      "Four test suites, 19 checks: token-bucket pacing, failover classification, reorg rollback, Base58Check vectors, TRC-20/SPL decoding"1713    ]1714  },1715  {1716    "slug": "os-vault",1717    "hero": {1718      "headline": "One phrase. Six chains. Nothing leaves your Mac.",1719      "subheadline": "A self-custody, multi-chain crypto wallet for macOS with its own vault encryption, keyless public RPCs, and sign-and-forget key handling."1720    },1721    "overview": [1722      "OS Vault refuses the usual wallet trade-off between convenience and sovereignty. It is a native macOS wallet where a single BIP-39 recovery phrase derives addresses for six chain families — Bitcoin, 11 EVM chains, Solana, Tron, XRPL, and TON — and where every endpoint is public and keyless, with automatic failover.",1723      "The mnemonic is sealed with OS Vault's own vault format: PBKDF2-HMAC-SHA512 at 600,000 rounds feeding AES-256-GCM, stored in a local file with no macOS Keychain, no iCloud, and no telemetry. Private keys exist only for the milliseconds a transaction is signed — every send re-derives the key from your password and discards it.",1724      "Real fee models are handled per chain: EIP-1559, OP-stack L1 data fees via oracle, Tron energy burn estimated pre-send, XRPL reserves shown as locked, and TON jetton-wallet indirection with excess refunds. Every stablecoin contract and decimal count was verified live on-chain before registration."1725    ],1726    "stats": [1727      {1728        "value": "6",1729        "label": "chain families"1730      },1731      {1732        "value": "11",1733        "label": "EVM chains"1734      },1735      {1736        "value": "600k",1737        "label": "PBKDF2 rounds"1738      },1739      {1740        "value": "32",1741        "label": "passing tests"1742      },1743      {1744        "value": "0",1745        "label": "API keys required"1746      },1747      {1748        "value": "12",1749        "label": "words, one phrase"1750      }1751    ],1752    "features": [1753      {1754        "icon": "Lock",1755        "title": "Own vault encryption",1756        "description": "PBKDF2-HMAC-SHA512 (600k rounds) into AES-256-GCM in a local 0600 file — no Keychain, no iCloud, no telemetry."1757      },1758      {1759        "icon": "KeyRound",1760        "title": "Sign-and-forget keys",1761        "description": "The private key exists only during signing: every send re-derives it from your password and immediately discards it."1762      },1763      {1764        "icon": "Globe",1765        "title": "One phrase, every chain",1766        "description": "The same 12 words derive Bitcoin (BIP-84), 11 EVM chains, Solana, Tron, XRPL, and TON — cross-validated against independent crypto stacks."1767      },1768      {1769        "icon": "WifiOff",1770        "title": "Zero mandatory API keys",1771        "description": "Every endpoint is public and keyless with health-scored failover; the only optional egress is CoinGecko prices, one toggle to kill."1772      },1773      {1774        "icon": "Gauge",1775        "title": "Real fee models, per chain",1776        "description": "EIP-1559, OP-stack L1 data fees, Tron energy burn estimated pre-send, Solana ATA rent, TON jetton attachments with refunds."1777      },1778      {1779        "icon": "CheckCircle2",1780        "title": "On-chain verified tokens",1781        "description": "Every stablecoin address and decimal was checked live — including traps like 18-decimal BNB-peg USDT and bridged USDC.e."1782      },1783      {1784        "icon": "ShieldCheck",1785        "title": "Notarized and sandboxed",1786        "description": "App Sandbox, Hardened Runtime, Developer ID signed, notarized and stapled by Apple, with forced written-backup verification."1787      },1788      {1789        "icon": "Eye",1790        "title": "Watch-only Bitcoin",1791        "description": "The Bitcoin wallet holds public descriptors only; a throwaway in-memory signer signs PSBTs on demand."1792      }1793    ],1794    "techStack": [1795      {1796        "category": "Core",1797        "items": [1798          "Swift 6",1799          "SwiftUI",1800          "Pure SwiftPM (no .xcodeproj)",1801          "macOS 15.5+"1802        ]1803      },1804      {1805        "category": "Crypto",1806        "items": [1807          "Trust wallet-core (vendored)",1808          "bdk-swift (Bitcoin Dev Kit)",1809          "solana-swift",1810          "BIP-39 / BIP-84 HD derivation"1811        ]1812      },1813      {1814        "category": "Infrastructure",1815        "items": [1816          "PublicNode",1817          "mempool.space Esplora",1818          "TronGrid",1819          "xrplcluster",1820          "toncenter",1821          "CoinGecko (optional)"1822        ]1823      },1824      {1825        "category": "Release",1826        "items": [1827          "Developer ID signing",1828          "Apple notarization + stapling",1829          "DMG with volume icon"1830        ]1831      }1832    ],1833    "architecture": [1834      {1835        "title": "VaultCrypto + KeyManager",1836        "description": "The encryption mechanism and BIP-39 HD derivation lifecycle — password to key to vault.json, with wrong passwords and tampering indistinguishable under GCM authentication."1837      },1838      {1839        "title": "Per-chain services",1840        "description": "Dedicated services for EVM JSON-RPC, Bitcoin (bdk-swift watch-only plus transient signer), Solana SPL/ATA, Tron, XRPL, and TON, each pairing wallet-core signing with keyless REST/RPC."1841      },1842      {1843        "title": "TransactionService",1844        "description": "Implements EIP-1559 plus five other real fee models, including OP-stack L1 data fee oracles, BSC zero-base-fee, and Linea pinned base fees."1845      },1846      {1847        "title": "Verified token registry",1848        "description": "Network and Token models encode a matrix of live-verified contract addresses and decimals across all supported chains, testnet defaults included."1849      }1850    ],1851    "highlights": [1852      "32 tests cross-validate BIP-39/BIP-84 vectors, vault crypto, decimals, and address validators against independent crypto stacks",1853      "The vendoring script repackages Trust wallet-core for macOS SwiftPM — including an ld -r pass that resolves a duplicate Rust runtime symbol shared with the Bitcoin Dev Kit",1854      "Forced written-backup verification: the app makes you prove you wrote down 3 random words before the wallet exists",1855      "Every chain defaults to a testnet (Base Sepolia, Signet, Devnet, Nile) with TESTNET badges everywhere",1856      "One-tap RLUSD trustline on XRPL, with recipient trustlines checked before sending",1857      "No accounts, no keys, no configuration — macOS 15.5+ is the only requirement"1858    ]1859  },1860  {1861    "slug": "metrika",1862    "hero": {1863      "headline": "Stata-class statistics, GPU-accelerated by Apple Silicon",1864      "subheadline": "A native Swift 6 econometrics app with a DuckDB engine, invisible Metal/MLX compute, and every estimator validated against R to 1e-10."1865    },1866    "overview": [1867      "Metrika brings the Stata mental model to a fully native Mac app: one line like `reg log_rev price i.region, cluster(firm_id)` yields publication-ready output with factor variables, if/in qualifiers, and robust or cluster-robust inference. No Electron, no Python runtime — Swift 6, SwiftUI, and Accelerate all the way down.",1868      "The GPU is invisible: a planner dispatches every command to CPU (LAPACK) or GPU (MLX) automatically, and large bootstrap runs execute as batched Metal solves. All randomness flows through a counter-based Philox4x32 generator, so `set seed 42` produces bit-identical resamples on CPU and GPU, in any chunk order, across any parallelism.",1869      "Under the hood, a DuckDB columnar engine loads 10 million rows in 0.2 seconds, and a Metal point-sprite renderer takes over scatter plots past 100k points and shrugs at 2,000,000. Estimation spans OLS, GLMs, 2SLS, panel fixed effects, GPU bootstrap, permutation tests, Bayesian Gibbs sampling, lasso/elastic net, and gradient boosting."1870    ],1871    "stats": [1872      {1873        "value": "116",1874        "label": "R-validated tests"1875      },1876      {1877        "value": "1e-10",1878        "label": "relative tolerance vs R"1879      },1880      {1881        "value": "0.2 s",1882        "label": "to load 10M rows"1883      },1884      {1885        "value": "2M",1886        "label": "points in the Metal renderer"1887      },1888      {1889        "value": "38",1890        "label": "built-in commands"1891      }1892    ],1893    "features": [1894      {1895        "icon": "Terminal",1896        "title": "The Stata mental model",1897        "description": "Familiar one-line syntax with factor variables, if/in qualifiers, robust and cluster-robust inference — console, do-files, or headless CLI."1898      },1899      {1900        "icon": "Cpu",1901        "title": "Invisible GPU dispatch",1902        "description": "A planner routes each command to LAPACK or MLX automatically; large bootstraps run as batched Metal solves without you choosing a backend."1903      },1904      {1905        "icon": "RefreshCw",1906        "title": "Bit-identical reproducibility",1907        "description": "Counter-based Philox4x32 RNG makes seeded resamples bit-identical on CPU and GPU, across any chunk order or parallelism."1908      },1909      {1910        "icon": "CheckCircle2",1911        "title": "R-validated to 1e-10",1912        "description": "Coefficients, HC0-HC3 and cluster SEs, p-values into the far tails, and delta-method marginal effects all match R golden values."1913      },1914      {1915        "icon": "Database",1916        "title": "DuckDB columnar engine",1917        "description": "Bulk C-API extraction loads 10 million rows in 0.2 s, summarizes in ~0.3 s, and regresses in ~0.2 s — on a laptop."1918      },1919      {1920        "icon": "FlaskConical",1921        "title": "Full inference toolbox",1922        "description": "GPU pairs bootstrap, exact permutation tests, and Bayesian regression via Gibbs sampling, all seed-reproducible."1923      },1924      {1925        "icon": "Brain",1926        "title": "glmnet- and xgboost-exact ML",1927        "description": "Lasso and elastic net match glmnet including its y-standardization convention; boosted-tree predictions match xgboost observation-by-observation."1928      },1929      {1930        "icon": "BarChart3",1931        "title": "Charts that scale",1932        "description": "Swift Charts for scatter, line, histogram, and kdensity, with a Metal point-sprite renderer taking over beyond 100k points."1933      },1934      {1935        "icon": "Wrench",1936        "title": "Extensible by design",1937        "description": "Drop-in .zyq script commands with args macros, or native Swift plugins with syntax validation and gated dataset mutation."1938      }1939    ],1940    "techStack": [1941      {1942        "category": "Core",1943        "items": [1944          "Swift 6",1945          "SwiftUI",1946          "Swift Charts",1947          "macOS 14+ (Apple Silicon)"1948        ]1949      },1950      {1951        "category": "Compute",1952        "items": [1953          "MLX",1954          "Metal",1955          "Accelerate (LAPACK)",1956          "Philox4x32 RNG"1957        ]1958      },1959      {1960        "category": "Data",1961        "items": [1962          "DuckDB",1963          "Parquet / CSV / JSON / Arrow",1964          "Native Stata .dta (read 117-119, write 118)"1965        ]1966      },1967      {1968        "category": "Validation",1969        "items": [1970          "R golden fixtures",1971          "glmnet",1972          "xgboost",1973          "Random123 known-answer vectors"1974        ]1975      }1976    ],1977    "architecture": [1978      {1979        "title": "ZQParser + ZQPlanner",1980        "description": "A command grammar parses Stata-style input into a typed AST, which the planner dispatches to CPU, GPU, or hybrid execution paths."1981      },1982      {1983        "title": "ZQData over DuckDB",1984        "description": "A DataFrame facade over the DuckDB columnar engine plus native .dta support, with explicit missing-value semantics and listwise-deletion reporting."1985      },1986      {1987        "title": "ZQStats and ZQGPU",1988        "description": "LAPACK estimators (OLS via QR, never X'X) live in ZQStats; ZQGPU is the only module touching MLX/Metal — backends stay swappable."1989      },1990      {1991        "title": "ZQGraphics",1992        "description": "Plot specs render through Swift Charts, with a Metal point-sprite renderer taking over automatically past 100k points."1993      },1994      {1995        "title": "MetrikaKit package",1996        "description": "The entire engine has zero UI dependencies and is fully testable with swift test; the SwiftUI app is a thin shell over console, data browser, editor, and manual."1997      }1998    ],1999    "highlights": [2000      "Every CPU estimator validated against R to 1e-10 relative tolerance — a p-value of 4x10^-22 matches R exactly",2001      "GPU bootstrap resample indices asserted bit-identical to the CPU Philox reference, itself pinned to Random123 known-answer vectors",2002      "10 million rows: load 0.2 s, summarize ~0.3 s, regress ~0.2 s",2003      "Reads and writes native Stata .dta files (formats 117-119)",2004      "Bayesian posteriors with diffuse priors reproduce the frequentist answer within Monte-Carlo error — asserted, not assumed",2005      "Signed, notarized, and stapled DMG; documentation regenerated from the command registry so it can never drift from the app"2006    ]2007  },2008  {2009    "slug": "forge",2010    "hero": {2011      "headline": "LLM training from scratch in C++20 and Metal",2012      "subheadline": "A complete transformer training stack for Apple Silicon with zero ML dependencies — including the fused flash-attention backward kernel no major framework ships."2013    },2014    "overview": [2015      "Forge is a complete, working transformer training stack built from nothing on Apple Silicon: tensors, autograd, Metal compute kernels, flash attention forward and backward, AdamW and Muon optimizers, a BPE tokenizer, checkpointing, and generation — all hand-written in roughly 6,500 lines of C++20, with no PyTorch, no MLX, and no ML dependencies.",2016      "As of July 2026, no major open-source framework ships a fused attention backward kernel for Metal — MLX throws NYI, llama.cpp lacks the op, PyTorch MPS and Candle are forward-only. Forge has one, and it is 15.2x faster than the naive version. Hand-tuned simdgroup_matrix GEMM reaches 10.8 TFLOPS f32, and Metal 4's matmul2d hits 51.5 TFLOPS f16 on the M5 neural accelerators.",2017      "Architecture is entirely config-driven: the same binary trains a 12M or a 205M parameter model by changing a JSON file, with GQA, RoPE, SwiGLU, MoE routing, and BitNet-style ternary quantization-aware training all selectable from config. Every op is validated against a CPU reference through 85 parity checks and numerical gradient checks."2018    ],2019    "stats": [2020      {2021        "value": "38.2k",2022        "label": "tokens/s training throughput"2023      },2024      {2025        "value": "10.8",2026        "label": "TFLOPS GEMM f32"2027      },2028      {2029        "value": "51.5",2030        "label": "TFLOPS matmul2d f16 (M5)"2031      },2032      {2033        "value": "15.2x",2034        "label": "flash-attention backward speedup"2035      },2036      {2037        "value": "85",2038        "label": "CPU-Metal parity checks"2039      },2040      {2041        "value": "~6.5k",2042        "label": "lines of code"2043      }2044    ],2045    "features": [2046      {2047        "icon": "Flame",2048        "title": "Fused flash attention backward",2049        "description": "The Metal kernel no major framework ships — MLX, llama.cpp, PyTorch MPS, and Candle all lack it. Forge's runs 15.2x faster than naive."2050      },2051      {2052        "icon": "Cpu",2053        "title": "Hand-written Metal GEMM",2054        "description": "Naive, tiled, and simdgroup_matrix variants reaching 10.8 TFLOPS f32, plus Metal 4 matmul2d at 51.5 TFLOPS f16."2055      },2056      {2057        "icon": "Braces",2058        "title": "Zero ML dependencies",2059        "description": "Pure C++20, Metal kernels, and a JSON parser. Tensors, autograd, optimizers, and tokenizer all built from nothing."2060      },2061      {2062        "icon": "Settings2",2063        "title": "Config-driven architecture",2064        "description": "The same binary trains 12M to 205M parameter models by editing JSON: GQA, RoPE, SwiGLU or GELU, MoE, tied embeddings."2065      },2066      {2067        "icon": "CheckCircle2",2068        "title": "Measured, not assumed",2069        "description": "85 CPU-Metal parity checks, numerical gradient checks on every parameterized op, single-batch overfit, exact checkpoint resume."2070      },2071      {2072        "icon": "Package",2073        "title": "The .forge weight format",2074        "description": "A git-style model repository: content-addressed 95 MB shards, zero-copy mmap loading on unified memory, delta-only saves."2075      },2076      {2077        "icon": "Workflow",2078        "title": "Modern training modes",2079        "description": "Muon orthogonalized momentum, WSD schedules, int8 and BitNet-style ternary QAT, and top-k MoE with load-balance loss — all config-selected."2080      },2081      {2082        "icon": "Download",2083        "title": "Streaming HF data pipeline",2084        "description": "Streams any of 13 registered Hugging Face datasets or weighted mixtures straight to training binaries — no full-corpus downloads."2085      },2086      {2087        "icon": "Microscope",2088        "title": "Published GPU findings",2089        "description": "Documented compiler traps and profiling results, including a constant constexpr pitfall that cost 12x and a 4352-byte register spill."2090      }2091    ],2092    "techStack": [2093      {2094        "category": "Core",2095        "items": [2096          "C++20",2097          "metal-cpp",2098          "CMake",2099          "MIT license"2100        ]2101      },2102      {2103        "category": "GPU",2104        "items": [2105          "Metal 4",2106          "simdgroup_matrix MMA",2107          "mpp::tensor_ops::matmul2d",2108          "14 .metal kernel files"2109        ]2110      },2111      {2112        "category": "Training",2113        "items": [2114          "AdamW",2115          "Muon (Newton-Schulz)",2116          "warmup+cosine / WSD schedules",2117          "int8 / ternary QAT",2118          "MoE"2119        ]2120      },2121      {2122        "category": "Data & formats",2123        "items": [2124          "Byte-level BPE tokenizer",2125          ".forge weight format",2126          "safetensors export",2127          "TinyStories + 13 HF datasets"2128        ]2129      }2130    ],2131    "architecture": [2132      {2133        "title": "Core tensor layer",2134        "description": "Shared-storage tensor views, a bucketed MTLBuffer pool allocator, a device wrapper with pipeline caching, and an autograd tape."2135      },2136      {2137        "title": "Dual-backend ops",2138        "description": "CPU reference implementations and Metal dispatch live side by side; the autograd layer routes to either backend, and the parity suite keeps them bit-comparable."2139      },2140      {2141        "title": "Metal kernel suite",2142        "description": "14 .metal files covering GEMM in four generations, flash attention (scalar and MMA), softmax, norms, embeddings, cross-entropy, AdamW, fake-quant, and MoE gating."2143      },2144      {2145        "title": "Config-driven transformer",2146        "description": "Decoder-only model with RMSNorm or LayerNorm, SwiGLU or GELU, RoPE or learned positions, GQA, and optional top-k MoE — all assembled from JSON."2147      },2148      {2149        "title": ".forge model repository",2150        "description": "Tensors page-aligned inside content-addressed shards; loading is mmap plus bytesNoCopy, so on unified memory a multi-GB model loads in milliseconds. Saves write only changed tensors."2151      }2152    ],2153    "highlights": [2154      "A 12.2M-parameter model trains in ~8 minutes to 20.27 validation perplexity and generates coherent English stories",2155      "One MSL fix — replacing constant constexpr with an enum — took the GEMM kernel from 0.82 to 10.21 TFLOPS (12x)",2156      "gpudebug profiling exposed a 4352-byte register spill in the fused backward kernel; splitting it recovered another 27%",2157      "M5 neural accelerators deliver 4.9x via matmul2d — but only through f16, making mixed precision the entry condition, not a memory optimization",2158      "f32 matmul2d output is bit-exact against the CPU reference; f16 differs by 3.8e-06",2159      "Ships with a LaTeX paper and research notes documenting measured findings on MSL compiler behavior"2160    ]2161  },2162  {2163    "slug": "forge-studio",2164    "hero": {2165      "headline": "The native macOS cockpit for LLM training",2166      "subheadline": "Train language models from scratch on Apple Silicon without opening a terminal — dataset prep, run supervision, and live loss dashboards for Forge."2167    },2168    "overview": [2169      "Forge Studio is the native GUI companion to Forge, the from-scratch C++20 + Metal LLM training framework. It wraps the entire train-a-model workflow — prepare data, design an architecture, launch and monitor runs, compare experiments, and generate from checkpoints — as a first-party-feeling Mac app built in Swift, SwiftUI, and Swift Charts with zero third-party dependencies.",2170      "The centerpiece is a loss dashboard built to the TensorBoard/W&B standard: raw and EMA-smoothed loss, hover crosshairs with full callouts, pinch-zoom and pan with a follow-live pill, best-val markers, and secondary charts for LR schedule, tokens/sec, and gradient norm. Raw data is never discarded — the UI reads LTTB-downsampled snapshots sized to pixel width.",2171      "Runs cannot lie: a single-writer state machine makes illegal transitions unrepresentable, the registry persists atomically so you can kill -9 the app at will, crash recovery truthfully resolves interrupted runs, and a watchdog flags stalls. Studio never reimplements training — it drives the real forge binary and reads its structured metrics."2172    ],2173    "stats": [2174      {2175        "value": "200k",2176        "label": "CSV rows ingested in ~1.1 s"2177      },2178      {2179        "value": "<250 ms",2180        "label": "chart snapshot at any size"2181      },2182      {2183        "value": "0",2184        "label": "third-party dependencies"2185      },2186      {2187        "value": "30 s",2188        "label": "stall watchdog threshold"2189      }2190    ],2191    "features": [2192      {2193        "icon": "LineChart",2194        "title": "TensorBoard-grade loss dashboard",2195        "description": "Raw train loss under a bias-corrected EMA with TensorBoard semantics, val loss points, hover crosshair, and a best-val marker annotation."2196      },2197      {2198        "icon": "Gauge",2199        "title": "Hitch-free at 100k steps",2200        "description": "LTTB downsampling to ~2x pixel width keeps hover interactions smooth; 200,000 CSV rows ingest in about 1.1 seconds."2201      },2202      {2203        "icon": "ShieldCheck",2204        "title": "Runs that can't lie",2205        "description": "A single-writer state machine with an explicit legal-transition table makes illegal run states unrepresentable."2206      },2207      {2208        "icon": "RefreshCw",2209        "title": "Honest crash recovery",2210        "description": "Atomic temp-file-then-rename persistence plus launch-time resolution of interrupted runs — including detecting a forge process still alive."2211      },2212      {2213        "icon": "Boxes",2214        "title": "Dataset prep built in",2215        "description": "TinyStories or streamed Hugging Face mixtures like FineWeb-Edu, DCLM, and Cosmopedia, prepared with a live console."2216      },2217      {2218        "icon": "Settings2",2219        "title": "Full config editor",2220        "description": "Every Forge config field from n_layers to DeepSeek-style MoE routing, with live validation, presets, derived math, and an LR preview."2221      },2222      {2223        "icon": "ArrowLeftRight",2224        "title": "Compare runs honestly",2225        "description": "Multi-run overlays plotted on the tokens axis — the honest one — for apples-to-apples experiment comparison."2226      },2227      {2228        "icon": "Sparkles",2229        "title": "Generate and eval in-app",2230        "description": "Sample text and run evaluation from any checkpoint directly inside the app, no terminal required."2231      },2232      {2233        "icon": "Bell",2234        "title": "Finish-line notifications",2235        "description": "Local notifications deliver the final loss when a run finishes or fails, plus a possibly-stalled badge after 30 s of silence."2236      }2237    ],2238    "techStack": [2239      {2240        "category": "Core",2241        "items": [2242          "Swift",2243          "SwiftUI",2244          "Swift Charts",2245          "Swift Concurrency (actors)",2246          "macOS 14+"2247        ]2248      },2249      {2250        "category": "Data pipeline",2251        "items": [2252          "Header-driven CSV parsing",2253          "LTTB downsampling",2254          "Bias-corrected EMA smoothing"2255        ]2256      },2257      {2258        "category": "Release",2259        "items": [2260          "SwiftPM app packaging",2261          "Developer ID + hardened runtime",2262          "notarytool + stapler DMG"2263        ]2264      }2265    ],2266    "architecture": [2267      {2268        "title": "ProcessRunner + LogParser",2269        "description": "An actor streams the real forge binary's output incrementally, parsing header-driven CSV metrics and stdout events off the main thread."2270      },2271      {2272        "title": "MetricsStore",2273        "description": "An actor-isolated store tails logs incrementally and serves LTTB-downsampled snapshots to the charts — raw data is never discarded."2274      },2275      {2276        "title": "Run state machine",2277        "description": "queued, launching, running through finished, failed, or stopped — with an explicit legal-transition table and atomic registry persistence."2278      },2279      {2280        "title": "ForgeConfig models",2281        "description": "A Codable mirror of every Forge config field with validation and derived math, round-tripped byte-compatible against the real configs/*.json."2282      },2283      {2284        "title": "RunSupervisor + watchdog",2285        "description": "Supervises live processes, flags stalls after 30 seconds of silent metrics, and handles SIGTERM stops with honest UI messaging about checkpoint loss."2286      }2287    ],2288    "highlights": [2289      "Never reimplements training — drives the real forge binary and reads its structured metrics, so what you see is exactly what the framework did",2290      "The Swift parameter-count formula is tested to match forge info for every shipped config",2291      "RESEARCH.md documents the full Forge contract — config schema, CLI, log.csv grammar, signal behavior — extracted from source and enforced by tests",2292      "kill -9 safe: atomic temp-file-then-rename persistence for the run registry",2293      "Measured performance: 200,000 CSV rows ingest in ~1.1 s and snapshot to chart width in under 250 ms",2294      "Zero third-party packages — pure Swift, SwiftUI, and Swift Charts"2295    ]2296  },2297  {2298    "slug": "air",2299    "hero": {2300      "headline": "LLVM for the Ledger",2301      "subheadline": "Compiler infrastructure for accounting: LLMs describe economic events, a deterministic compiler produces balanced, fully traceable journal entries."2302    },2303    "overview": [2304      "AIR (Accounting Intermediate Representation) applies the LLVM playbook to bookkeeping. LLMs are brilliant at understanding documents and unreliable at applying hundreds of tax rules, so AIR separates the two: any frontend — an LLM reading an invoice, a bank feed, a POS — only ever emits perspective-neutral economic events, never journal entries. A deterministic pass pipeline compiles those events into balanced entries.",2305      "The double-entry invariant Assets = Liabilities + Equity is verified after every compiler pass, and failures surface as clang-style diagnostics with location, cause, and a suggested fix — a compiler error instead of a wrong number. Every tax rate and threshold lives in versioned ALSL policy files with mandatory source citations; the loader rejects uncited rates.",2306      "AIR is also a standalone accounting system: an append-only, hash-chained ledger, git-style corrections via reversal-plus-replacement entries, full financial statements, bank reconciliation for camt.053, MT940 and CSV, and an agent SDK where AI agents keep books exclusively through audited syscalls."2307    ],2308    "stats": [2309      {2310        "value": "99",2311        "label": "offline tests"2312      },2313      {2314        "value": "21",2315        "label": "golden test cases"2316      },2317      {2318        "value": "7",2319        "label": "hard guarantees"2320      },2321      {2322        "value": "9",2323        "label": "cited research reports"2324      },2325      {2326        "value": "0",2327        "label": "floats allowed"2328      }2329    ],2330    "features": [2331      {2332        "icon": "Braces",2333        "title": "A universal accounting language",2334        "description": "REA-based EconomicEvent schema for sales, purchases, refunds, payments and FX — perspective-neutral, schema-validated, with no debits or account codes anywhere."2335      },2336      {2337        "icon": "Workflow",2338        "title": "A real compiler pipeline",2339        "description": "Validation, classification, tax, FX and posting passes under a pass manager that re-verifies the double-entry invariant after every single pass."2340      },2341      {2342        "icon": "FileText",2343        "title": "Rules as cited data",2344        "description": "GST, QST, HST rates, capitalization thresholds and rounding modes live in versioned ALSL YAML policies; the loader rejects any rate without a source citation."2345      },2346      {2347        "icon": "Lock",2348        "title": "Hash-chained, append-only ledger",2349        "description": "Standalone books with a tamper-evident ledger and content-addressed document archive — corrections post reversals and replacements, history is never edited."2350      },2351      {2352        "icon": "Bot",2353        "title": "Agent syscall SDK",2354        "description": "AI agents keep books only through syscalls like Post, Reverse, ClosePeriod and Reconcile; every call, including refusals, lands in a hash-chained audit log."2355      },2356      {2357        "icon": "Search",2358        "title": "Total provenance traceability",2359        "description": "Every posted cent walks back through an accounting SSA provenance graph to its source event, document, extraction confidence, policy version and rounding mode."2360      },2361      {2362        "icon": "Landmark",2363        "title": "Bank reconciliation built in",2364        "description": "Ingests camt.053, MT940 (with statement integrity checks) and CSV statements, matches them against the books, and reports differences on both sides."2365      },2366      {2367        "icon": "Zap",2368        "title": "Provenance-preserving optimizations",2369        "description": "Fuses 50 identical payments into one batch entry, nets refunds against sales, and detects duplicates — provenance survives every transformation."2370      },2371      {2372        "icon": "WifiOff",2373        "title": "Fully offline development",2374        "description": "The QuickBooks backend and LLM ingestion develop and test entirely offline via mock transports; determinism is property-tested with byte-identical double compiles in CI."2375      }2376    ],2377    "techStack": [2378      {2379        "category": "Core",2380        "items": [2381          "Python 3.11+",2382          "JSON Schema",2383          "Exact decimal arithmetic",2384          "YAML (ALSL policies)"2385        ]2386      },2387      {2388        "category": "Integrations",2389        "items": [2390          "Claude structured outputs",2391          "QuickBooks backend",2392          "CSV export",2393          "camt.053 / MT940 / ISO 20022"2394        ]2395      },2396      {2397        "category": "Quality",2398        "items": [2399          "pytest (99 offline + 2 live tests)",2400          "21 golden cases",2401          "Property-based determinism tests",2402          "GitHub Actions CI"2403        ]2404      }2405    ],2406    "architecture": [2407      {2408        "title": "schemas/ + core/ — the IR",2409        "description": "The AIR JSON Schema plus events, Money, provenance and invariants — the intermediate representation and its verifier, in the LLVM analogy."2410      },2411      {2412        "title": "aic/ — the compiler",2413        "description": "Pass manager, compilation passes, clang-style diagnostics and incremental recompilation: the opt/llc of accounting, deterministic with no LLM, network or clock inside."2414      },2415      {2416        "title": "alsl/ — rules as data",2417        "description": "The rule language and cited, versioned policy sets for taxes, thresholds and rounding — AIR's TableGen equivalent."2418      },2419      {2420        "title": "kernel/ + backends/ — the runtime and targets",2421        "description": "Hash-chained ledger, reporting, workspace, audit and reconciliation, plus native, CSV and QuickBooks output backends."2422      },2423      {2424        "title": "sdk/ + ingestion/ — the surface",2425        "description": "CLI, agent syscalls and a demo agent on one side; document extractors, confidence routing and a human approval queue on the other."2426      }2427    ],2428    "highlights": [2429      "The one rule that never bends: an LLM only ever produces AIR events — the deterministic compiler alone writes journal entries.",2430      "Same input plus same policies yields byte-identical output, always — property-tested, and CI compiles the demo twice and diffs the results.",2431      "Floats are forbidden end to end: exact decimals everywhere, rejected at every boundary.",2432      "Refused agent actions are audited exactly like successful ones; editing any record breaks the hash chain.",2433      "Real Quebec tax law is encoded and cited down to the statute — GST 5% and QST 9.975% with half-up rounding per Excise Tax Act s.165.2(2).",2434      "Phases 0 through 6 of the roadmap — research, core, compiler, backends, ingestion, agent SDK, optimizations and reconciliation — are complete."2435    ]2436  },2437  {2438    "slug": "ultra-sharp-agent-skills",2439    "hero": {2440      "headline": "72 Production-Ready Skills for AI Agents",2441      "subheadline": "A research-first skill-authoring system plus seven linted, trigger-tested collections covering documents, frontend, databases, backend, writing, and US/Canada tax."2442    },2443    "overview": [2444      "Skills are folders of instructions — a SKILL.md plus resources — that AI agents load on demand. This repository was built in two deliberate phases: first, 20+ primary-source searches across Anthropic docs, the official skills repo and engineering blogs were distilled into a research synthesis of 15 core principles, the Sharp Skill Checklist, and an ideal SKILL.md template.",2445      "Then came the build: 72 skills across 7 collections — document processing, frontend design, database management, backend development, writing, US/Canada tax and accounting, plus two founding examples. Every skill ships a trigger-optimized description, one default per decision, a validation-loop workflow, and pairwise-exclusive boundaries so no request ever fires two skills.",2446      "Quality is mechanical, not aspirational. A stdlib-only Python linter enforces the full checklist on every skill: frontmatter validity, literal 'Use when' trigger clauses and 'Do not use' boundaries, author headers in every file, bodies capped at 500 lines, and zero broken reference links. Validation includes positive and negative trigger tests with real execution evidence."2447    ],2448    "stats": [2449      {2450        "value": "72",2451        "label": "skills"2452      },2453      {2454        "value": "7",2455        "label": "collections"2456      },2457      {2458        "value": "20+",2459        "label": "primary-source research fetches"2460      },2461      {2462        "value": "15",2463        "label": "core authoring principles"2464      },2465      {2466        "value": "500",2467        "label": "max lines per SKILL.md body"2468      },2469      {2470        "value": "0",2471        "label": "broken reference links"2472      }2473    ],2474    "features": [2475      {2476        "icon": "FileText",2477        "title": "Document processing collection",2478        "description": "10 skills covering every major document type — Excel, Word, PowerPoint, PDF, JSON, CSV, XML, YAML, Markdown, HTML — with re-parse validation after every write."2479      },2480      {2481        "icon": "Palette",2482        "title": "Frontend design collection",2483        "description": "10 skills grounded in Anthropic's frontend-design skill and 2026 standards: WCAG 2.2 AA, LCP under 2.5s, INP under 200ms, CLS under 0.1."2484      },2485      {2486        "icon": "Database",2487        "title": "Database management collection",2488        "description": "10 PostgreSQL-first skills with MySQL/SQLite deviations noted — schema design, query optimization, migrations, backups, security, and a 5-stage incident triage runbook."2489      },2490      {2491        "icon": "Server",2492        "title": "Backend development collection",2493        "description": "20 skills spanning REST and GraphQL design, auth, validation, observability, caching, rate limiting, containers, CI/CD, and service boundaries."2494      },2495      {2496        "icon": "PenTool",2497        "title": "Writing collection",2498        "description": "10 stylistic skills where every rule ships with a do/never example pair and every workflow ends in a self-review pass — including the meta-skill for authoring skills."2499      },2500      {2501        "icon": "Calculator",2502        "title": "US/Canada tax and accounting",2503        "description": "10 skills with tax-year-2026 figures and official verification sources; every skill refuses evasion and refers complex cases to a CPA."2504      },2505      {2506        "icon": "ListChecks",2507        "title": "Mechanical quality gate",2508        "description": "A stdlib-only linter validates all 72 skills: frontmatter, naming rules, trigger descriptions, author headers, line budgets, and reference links."2509      },2510      {2511        "icon": "Split",2512        "title": "Pairwise-exclusive triggers",2513        "description": "Descriptions pair literal 'Use when' phrases with 'Do not use' boundaries per collection, so no request can plausibly fire two skills at once."2514      },2515      {2516        "icon": "Layers",2517        "title": "Progressive disclosure by design",2518        "description": "Lean SKILL.md files keep context cheap; depth lives exactly one level down in references/ directories with a table of contents."2519      }2520    ],2521    "techStack": [2522      {2523        "category": "Standard",2524        "items": [2525          "Agent Skills (SKILL.md)",2526          "Claude Code",2527          "Markdown + YAML frontmatter"2528        ]2529      },2530      {2531        "category": "Tooling",2532        "items": [2533          "Python 3 (stdlib only)",2534          "validate_skills.py linter",2535          "Trigger-test validation fixtures"2536        ]2537      },2538      {2539        "category": "Method",2540        "items": [2541          "RESEARCH-SYNTHESIS.md (15 principles)",2542          "Sharp Skill Checklist",2543          "VALIDATION-REPORT.md"2544        ]2545      }2546    ],2547    "architecture": [2548      {2549        "title": "Research phase",2550        "description": "20+ primary-source searches and fetches — Anthropic docs, the official anthropics/skills repo, engineering blogs, eval guides — distilled into RESEARCH-SYNTHESIS.md."2551      },2552      {2553        "title": "Build phase",2554        "description": "72 skills authored across 7 collections against the synthesized template, each with one default per decision and a validation-loop workflow."2555      },2556      {2557        "title": "Lint gate",2558        "description": "tools/validate_skills.py mechanically enforces the Sharp Skill Checklist — names, descriptions, headers, budgets and links — across the entire repository."2559      },2560      {2561        "title": "Trigger validation",2562        "description": "Every skill is validated with positive and negative trigger tests plus real execution evidence, documented in VALIDATION-REPORT.md with fixtures in validation/."2563      }2564    ],2565    "highlights": [2566      "Installing a skill is one cp command into ~/.claude/skills/ or a project's .claude/skills/ — no dependencies, no build step.",2567      "The entire toolchain is Python standard library only: python3 tools/validate_skills.py checks all 72 skills and passes clean.",2568      "The backend collection is the largest at 20 skills; documents, frontend, databases, writing and finance each contribute 10.",2569      "Includes writing-agent-skills, the meta-skill that teaches an agent to author new SKILL.md files with the same Sharp Skill method.",2570      "Finance skills carry a built-in ethical boundary: educational, legal planning only — evasion is refused by design.",2571      "Every figure in the repo is sourced, every skill linted, every trigger tested — the badges are backed by reports in the repo."2572    ]2573  },2574  {2575    "slug": "artificial-neural-networks-book",2576    "hero": {2577      "headline": "Every Neural Architecture, Rigorously Drawn",2578      "subheadline": "A 119-page LaTeX book covering all major neural network families — each with exact equations, pseudocode training algorithms, and native TikZ figures."2579    },2580    "overview": [2581      "Artificial Neural Networks — Methods, Equations and Graphical Representations is a complete, self-contained book spanning the field from Rosenblatt's 1958 perceptron to 2024's Kolmogorov–Arnold networks. It is built on one strict organizing principle: every architecture gets rigorous equations, an estimation or training algorithm in pseudocode, and a faithful graphical representation.",2582      "Every one of the 42 figures is drawn natively in TikZ/pgfplots — no imported images — so each diagram is exactly as precise as the equations it illustrates. Notation is unified across all 13 chapters: bold lowercase vectors, bold uppercase matrices, the Hadamard product, and a shared color palette for inputs, hidden units, outputs, gates and memory.",2583      "Coverage runs through five parts: foundations and learning (backpropagation, Adam, regularization), core architectures (CNNs, LSTMs, Transformers, ViT, MoE, Mamba), graphs and energy (GCN, GAT, GIN, Hopfield, RBMs), generative models (VAEs, GANs, normalizing flows, DDPM diffusion), and specialized architectures from spiking networks to Neural ODEs and KANs."2584    ],2585    "stats": [2586      {2587        "value": "119",2588        "label": "pages"2589      },2590      {2591        "value": "13",2592        "label": "chapters in 5 parts"2593      },2594      {2595        "value": "256",2596        "label": "numbered equations"2597      },2598      {2599        "value": "42",2600        "label": "native TikZ figures"2601      },2602      {2603        "value": "26",2604        "label": "pseudocode algorithms"2605      },2606      {2607        "value": "36",2608        "label": "cited bibliography entries"2609      }2610    ],2611    "features": [2612      {2613        "icon": "BookOpen",2614        "title": "One principle, applied everywhere",2615        "description": "Every architecture is presented as equations plus a training algorithm plus a faithful figure — from the perceptron to Kolmogorov–Arnold networks."2616      },2617      {2618        "icon": "PenTool",2619        "title": "100% native TikZ figures",2620        "description": "All 42 diagrams are drawn in TikZ/pgfplots with zero imported images, so figures carry the same precision as the mathematics."2621      },2622      {2623        "icon": "Braces",2624        "title": "Unified notation throughout",2625        "description": "Bold vectors and matrices, Hadamard products and a shared color palette are defined once in main.tex and reused by every chapter."2626      },2627      {2628        "icon": "Brain",2629        "title": "Full deep learning canon",2630        "description": "Backpropagation's three equations, Adam with bias correction, ResNet gradients, the six LSTM equations, and scaled dot-product attention with the variance argument."2631      },2632      {2633        "icon": "Sparkles",2634        "title": "Modern architectures included",2635        "description": "Vision Transformers, Mixture of Experts with noisy top-k routing, state-space models and Mamba's selective scan, and scaling laws."2636      },2637      {2638        "icon": "Network",2639        "title": "Graphs, energy and memory",2640        "description": "Message passing, GCN's spectral derivation, GAT, GIN with the 1-WL expressiveness theorem, Hopfield energy descent, and contrastive divergence for RBMs."2641      },2642      {2643        "icon": "FlaskConical",2644        "title": "Generative models in depth",2645        "description": "The VAE ELBO with closed-form Gaussian KL, GAN minimax theory through WGAN, RealNVP flows, and DDPM with both training and sampling algorithms."2646      },2647      {2648        "icon": "Microscope",2649        "title": "Emerging and bio-inspired frontiers",2650        "description": "Spiking neurons with STDP and surrogate gradients, self-organizing maps, echo state networks, capsule routing, Neural ODEs and Neural Turing Machines."2651      },2652      {2653        "icon": "CheckCircle2",2654        "title": "Clean by construction",2655        "description": "The three-pass pdflatex build finishes with zero errors, zero undefined references and zero unresolved citations."2656      }2657    ],2658    "techStack": [2659      {2660        "category": "Typesetting",2661        "items": [2662          "LaTeX",2663          "TikZ",2664          "pgfplots",2665          "algorithm / algpseudocode",2666          "booktabs",2667          "microtype",2668          "hyperref"2669        ]2670      },2671      {2672        "category": "Build",2673        "items": [2674          "TeX Live",2675          "pdflatex (3-pass build)"2676        ]2677      }2678    ],2679    "architecture": [2680      {2681        "title": "Part I — Foundations and Learning",2682        "description": "Perceptron with the Novikoff convergence theorem, backpropagation, the optimizer family up to Adam, initialization, and the full regularization toolbox."2683      },2684      {2685        "title": "Part II — Core Architectures",2686        "description": "CNNs with a worked convolution grid, RNN/LSTM/GRU with BPTT, the complete Transformer encoder–decoder, and modern variants from ViT to Mamba."2687      },2688      {2689        "title": "Part III — Graphs, Energy and Memory",2690        "description": "Graph neural networks (GCN, GraphSAGE, GAT, GIN) and energy-based models from Hopfield networks to RBMs and deep belief networks."2691      },2692      {2693        "title": "Part IV — Generative Models",2694        "description": "Autoencoders, VAEs, GANs, normalizing flows, DDPM/DDIM diffusion with classifier-free guidance, and WaveNet's dilated causal convolutions."2695      },2696      {2697        "title": "Part V — Specialized and Emerging",2698        "description": "Biologically inspired networks — spiking neurons, SOMs, reservoir computing — plus capsules, Neural ODEs, Neural Turing Machines and KANs."2699      }2700    ],2701    "highlights": [2702      "Spans 66 years of the field in one consistent framework — from the 1958 perceptron to 2024 Kolmogorov–Arnold networks.",2703      "Every figure is code: 42 TikZ/pgfplots diagrams and not a single imported image.",2704      "26 estimation algorithms in pseudocode, including both the training and sampling procedures for diffusion models.",2705      "All 36 bibliography entries are actually cited in the text — no padding.",2706      "Includes rigorous theorem-level results: universal approximation, Novikoff convergence, Hopfield energy descent, and 1-WL expressiveness for GINs.",2707      "The compiled PDF ships in the repository alongside the full LaTeX source."2708    ]2709  },2710  {2711    "slug": "phd-thesis",2712    "hero": {2713      "headline": "Three Essays in High-Frequency Finance",2714      "subheadline": "A Université Laval PhD thesis on return and volatility dynamics in commodity and financial futures, built on minute-level data around information events."2715    },2716    "overview": [2717      "This thesis-by-articles at Université Laval's Faculty of Business Administration studies how information moves markets when you watch at one-to-five-minute resolution. Three essays, co-authored with Marie-Hélène Gagnon and Gabriel J. Power, share one lens: high-frequency return, volatility and liquidity dynamics around information events in commodity and financial futures markets.",2718      "Chapter 1 — revised for The Energy Journal — shows that speculative trading dampens, rather than amplifies, the impact of macroeconomic surprises on energy and metals futures, with money managers (not swap dealers) improving liquidity and price discovery. Chapter 2 builds a novel minute-level indicative NAV dataset for four commodity ETFs and finds that volatility transmission runs primarily through jumps.",2719      "Chapter 3 decomposes FOMC statements into policy tone and informational novelty using a dual-model NLP ensemble (MiniLM + BERT), then links them to one-minute futures data: tone predicts directional returns while novelty predicts volatility, with pre-announcement placebos coming up null. The assembled ULaval thesis compiles to 188 pages with zero errors and a consolidated 271-key bibliography."2720    ],2721    "stats": [2722      {2723        "value": "3",2724        "label": "essays"2725      },2726      {2727        "value": "188",2728        "label": "pages"2729      },2730      {2731        "value": "~45M",2732        "label": "tick observations (Ch. 2)"2733      },2734      {2735        "value": "148",2736        "label": "FOMC events analyzed"2737      },2738      {2739        "value": "271",2740        "label": "consolidated references"2741      },2742      {2743        "value": "26",2744        "label": "macro announcement types (Ch. 1)"2745      }2746    ],2747    "features": [2748      {2749        "icon": "Flame",2750        "title": "Speculation and macro surprises",2751        "description": "5-minute futures data (2007–2024) across crude oil, natural gas, gold, silver, copper and palladium, conditioned on a CFTC-based speculation intensity proxy."2752      },2753      {2754        "icon": "TrendingUp",2755        "title": "Speculators dampen, not amplify",2756        "description": "Higher speculative intensity reduces the impact of macro surprises on price drift, volatility and bid-ask spreads — driven by money managers, not swap dealers."2757      },2758      {2759        "icon": "LineChart",2760        "title": "A novel minute-level iNAV dataset",2761        "description": "Roughly 45 million tick observations (2010–2023) for GLD, SLV, USO and UNG give a sharper image of ETF–underlying volatility transmission than daily data can."2762      },2763      {2764        "icon": "Zap",2765        "title": "Transmission runs through jumps",2766        "description": "Barndorff-Nielsen–Shephard decomposition shows volatility flows via jumps, not diffusion; 1-minute estimates run up to 2x larger than 30-minute ones."2767      },2768      {2769        "icon": "MessageSquare",2770        "title": "NLP on the Fed's own words",2771        "description": "217 FOMC statements (2000–2025) decomposed into hawkish/dovish tone and informational novelty via a MiniLM + BERT ensemble with TSDAE+MNRL fine-tuning."2772      },2773      {2774        "icon": "Landmark",2775        "title": "Tone moves returns, novelty moves volatility",2776        "description": "A 1-sigma dovish shift builds to roughly +12 bps in equities within two hours; the stance-novelty interaction on VIX persists 5–120 minutes."2777      },2778      {2779        "icon": "BarChart3",2780        "title": "Econometrics at full depth",2781        "description": "WLS-EWMA and GARCH event studies, HAR-X and HAR-CJ-X models, Minnesota BVARs, minute-level panels, Jorda local projections and five inference methods."2782      },2783      {2784        "icon": "ShieldCheck",2785        "title": "Identification taken seriously",2786        "description": "Pre-announcement placebo tests are null across designs, confirming that measured effects are announcement-driven rather than spurious."2787      },2788      {2789        "icon": "CheckCircle2",2790        "title": "Reproducible LaTeX build",2791        "description": "The full ulthese/memoir document compiles with latexmk to 0 errors, 0 undefined references and 0 missing citations, with an exhaustive assembly audit."2792      }2793    ],2794    "techStack": [2795      {2796        "category": "Methods",2797        "items": [2798          "WLS-EWMA event studies",2799          "GARCH",2800          "HAR-X / HAR-CJ-X",2801          "Minnesota BVAR",2802          "Jorda local projections",2803          "Jump decomposition (BNS)"2804        ]2805      },2806      {2807        "category": "NLP",2808        "items": [2809          "MiniLM",2810          "BERT",2811          "TSDAE + MNRL fine-tuning",2812          "PCA-based reference selection"2813        ]2814      },2815      {2816        "category": "Data",2817        "items": [2818          "1–5 min futures ticks",2819          "CFTC disaggregated COT",2820          "Intraday iNAV (GLD, SLV, USO, UNG)",2821          "FOMC statements 2000–2025"2822        ]2823      },2824      {2825        "category": "Document",2826        "items": [2827          "LaTeX (ulthese / memoir)",2828          "latexmk",2829          "BibTeX (271 consolidated keys)"2830        ]2831      }2832    ],2833    "architecture": [2834      {2835        "title": "Chapter 1 — Speculative trading in energy markets",2836        "description": "Macro announcement surprises interacted with CFTC-based speculation intensity across six futures contracts; 14 tables, 6 figures, COVID and ZLB robustness appendices."2837      },2838      {2839        "title": "Chapter 2 — iNAV and volatility transmission",2840        "description": "Minute-level iNAV construction, realized variance decomposition into continuous and jump components, HAR-X models at three frequencies, and a Bayesian VAR; 13 tables, 8 figures."2841      },2842      {2843        "title": "Chapter 3 — FOMC tone and novelty",2844        "description": "NLP ensemble scoring of statements linked to 1-minute data on seven futures contracts via event regressions, panels and local projections; 24 tables, 19 figures, proofs appendix."2845      },2846      {2847        "title": "these-ulaval/ — the assembled thesis",2848        "description": "French front matter with English abstracts, general introduction and conclusion, appendices, and a merged 271-key bibliography; article sources are frozen snapshots, never edited in place."2849      }2850    ],2851    "highlights": [2852      "Chapter 1 is revised for The Energy Journal; Chapter 2 is at submission stage with the Journal of Futures Markets.",2853      "Precious-metals volatility transmission is unidirectional (iNAV to ETF, passive arbitrage) while energy is bidirectional and asymmetric.",2854      "Policy stance moves realized volatility in 6 of 7 futures contracts at p < 0.01; the key VIX interaction carries t = -5.06.",2855      "Markets covered span energy, metals, equity and rates: CL, NG, GC, SI, HG, PA futures plus ES, VX, ZN, ZF and DX.",2856      "Funded by SSHRC and the Chaire Industrielle-Alliance Groupe financier.",2857      "Each article folder is a frozen dated snapshot; every thesis adaptation is documented in an exhaustive INVENTAIRE.md audit."2858    ]2859  },2860  {2861    "slug": "uqo-cours",2862    "hero": {2863      "headline": "Real-Estate Valuation Courses, Built on Real Data",2864      "subheadline": "Complete UQO course material for two real-estate appraisal courses: 28 Beamer lectures, 6 practical assignments with Excel templates, and a 106-page Quebec market report."2865    },2866    "overview": [2867      "This is the full public course material for two undergraduate courses in UQO's business administration program (real-estate appraisal concentration): IMM1003 — Elements of Real Estate Appraisal (Fall 2026), covering the Quebec professional framework, market economics and the three valuation approaches; and IMM1033 — Cost Approach Methods (Winter 2026), covering land valuation, construction cost estimation and full depreciation breakdown.",2868      "Every practical assignment pairs a LaTeX case brief with a formula-driven Excel Dashboard workbook — pre-filled data, answer cells, dropdowns, KPIs, native charts and conditional formatting — personalized by each student's permanent code. Cases are anchored in real, cited data: actual MLS listings in Gatineau, Aylmer and Hull, Bank of Canada rates, CMHC, Statistics Canada indices and real construction permits.",2869      "The material is explicitly designed for teaching in the AI era: take-home work where AI use is tolerated and framed, per-student personalized data, answers that must be grounded in the case file (generic answers score nothing), formula-chained workbooks, and a mandatory tool-use declaration. This public version excludes all exams, solution keys and grading rubrics."2870    ],2871    "stats": [2872      {2873        "value": "28",2874        "label": "Beamer lecture decks"2875      },2876      {2877        "value": "6",2878        "label": "practical assignments"2879      },2880      {2881        "value": "6",2882        "label": "Excel Dashboard templates"2883      },2884      {2885        "value": "106",2886        "label": "market report pages"2887      },2888      {2889        "value": "67",2890        "label": "figures"2891      },2892      {2893        "value": "2",2894        "label": "full courses"2895      }2896    ],2897    "features": [2898      {2899        "icon": "GraduationCap",2900        "title": "Two complete course packages",2901        "description": "Syllabi, 28 fully compiled Beamer lecture decks with sources and bibliographies, six graded assignments and supporting resources for IMM1003 and IMM1033."2902      },2903      {2904        "icon": "Home",2905        "title": "Cases built on real listings",2906        "description": "Assignments cite actual MLS listings — an Aylmer residence, a Hull triplex, vacant land parcels for sale — plus real Gatineau construction permits."2907      },2908      {2909        "icon": "Table2",2910        "title": "Formula-driven Excel dashboards",2911        "description": "Each assignment ships a Dashboard workbook with pre-filled data, formula answer cells, dropdowns, KPIs, native charts and conditional formatting."2912      },2913      {2914        "icon": "Fingerprint",2915        "title": "Personalized per student",2916        "description": "Workbooks and data are customized by each student's permanent code, and answers must be anchored in the case file — generic responses earn nothing."2917      },2918      {2919        "icon": "BarChart3",2920        "title": "106-page Quebec market report",2921        "description": "The Rapport immobilier Quebec covers HPI indices, regions, property types, macro conditions and affordability, with 67 figures and its full Python analysis code."2922      },2923      {2924        "icon": "CheckCircle2",2925        "title": "Verified, cited, reproducible",2926        "description": "LaTeX compiles with zero errors, Excel formulas were recalculated in Microsoft Excel with zero error cells, and every source carries a URL and consultation date."2927      },2928      {2929        "icon": "Brain",2930        "title": "Designed for the AI era",2931        "description": "Take-home assignments tolerate and frame AI use, require case-grounded answers, chain workbooks by formulas, and mandate a tool-use declaration."2932      },2933      {2934        "icon": "Landmark",2935        "title": "Anchored in official sources",2936        "description": "APCIQ, Bank of Canada, CMHC, Statistics Canada, Realtor.ca, City of Gatineau, GCR, CCQ, CBRE, Altus and the TAL — all cited with access dates."2937      },2938      {2939        "icon": "Wrench",2940        "title": "Fully regenerable toolchain",2941        "description": "One latexmk command rebuilds any deck or brief, one Python script regenerates each Excel template, and the market report rebuilds from CREA/FRED data."2942      }2943    ],2944    "techStack": [2945      {2946        "category": "Typesetting",2947        "items": [2948          "LuaLaTeX",2949          "Beamer",2950          "biber",2951          "TeX Live 2026",2952          "Custom uqo-examen.sty",2953          "TeX Gyre Termes/Heros"2954        ]2955      },2956      {2957        "category": "Data & tooling",2958        "items": [2959          "Python 3",2960          "openpyxl",2961          "pandas",2962          "matplotlib"2963        ]2964      },2965      {2966        "category": "Data sources",2967        "items": [2968          "APCIQ",2969          "Bank of Canada",2970          "CMHC",2971          "Statistics Canada",2972          "CREA / FRED",2973          "Realtor.ca"2974        ]2975      }2976    ],2977    "architecture": [2978      {2979        "title": "Course trees (IMM1003 / IMM1033)",2980        "description": "Each course directory holds the syllabus, lecture sources and compiled PDFs, the practical assignments with briefs and Excel templates, and shared resources."2981      },2982      {2983        "title": "Assignment pairs",2984        "description": "Every TP couples an 8–12 page LaTeX brief — professional scenario, tables, figures, 8–10 cell-referenced questions on a /100 scale — with its matching Excel Dashboard workbook."2985      },2986      {2987        "title": "Quebec market report",2988        "description": "A 106-page report with PDF, LaTeX source, 67 figures and the Python HPI analysis pipeline that regenerates it from CREA and FRED data."2989      },2990      {2991        "title": "Tooling layer",2992        "description": "A shared UQO LaTeX style, openpyxl scripts that generate each Excel template deterministically, and per-folder autonomous latexmk builds."2993      }2994    ],2995    "highlights": [2996      "Assignments progress from market dashboards through comparison grids and income approach to full depreciation breakdown, weighted from 10% to 20% of the course grade.",2997      "All real data was consulted and date-stamped on August 4, 2026; anything not freely accessible is flagged as calibrated pedagogical data — never silently invented.",2998      "Excel templates were verified inside Microsoft Excel with a full recalculation and zero error cells.",2999      "The public repo deliberately excludes exams, solution keys and grading rubrics, which live in a separate private teaching repository.",3000      "Raw CREA/ACI data is not redistributed per its terms of use; the report's README documents how to obtain it and reproduce every figure.",3001      "Depreciation cases draw on professional-grade references: Statistics Canada indices, ASHRAE/InterNACHI service lives, CBRE and Altus cost data."3002    ]3003  },3004  {3005    "slug": "lou-ka",3006    "hero": {3007      "headline": "Every rental in Quebec. One search.",3008      "subheadline": "An independent aggregator that turns 70+ scattered property-manager websites into one continuously synchronized, searchable rental market for the whole province."3009    },3010    "overview": [3011      "Apartment hunting in Quebec means opening dozens of manager websites, each with its own navigation, filters, and formats. Lou-Ka inverts the problem: a dedicated Python connector per property manager visits each site, normalizes every listing into a single Listing schema — address, sector, unit type, price, availability, amenities, and every photo — and links back to the original ad.",3012      "Agency sites offer no webhooks, so Lou-Ka rebuilds the equivalent: periodic synchronization plus content hashing detects additions, updates, and removals automatically. A listing that disappears from the source disappears from Lou-Ka. An hourly watcher under PM2 keeps the whole inventory current without human intervention.",3013      "The system is built for polite, resilient scale: throttled requests with an identified User-Agent, no invented prices, per-listing fault isolation, and auto-discovering connectors — dropping a ~30-line module into the connectors folder is all it takes to onboard a new manager."3014    ],3015    "stats": [3016      {3017        "value": "255",3018        "label": "sources catalogued"3019      },3020      {3021        "value": "194",3022        "label": "active connectors"3023      },3024      {3025        "value": "8,000+",3026        "label": "listings aggregated"3027      },3028      {3029        "value": "≈30",3030        "label": "lines to add a connector"3031      },3032      {3033        "value": "1 day",3034        "label": "from market research to production"3035      }3036    ],3037    "features": [3038      {3039        "icon": "Network",3040        "title": "One connector per manager",3041        "description": "A dedicated Python adapter per property manager handles server-rendered HTML, internal JSON APIs (Building Stack, RealVuu, Planpoint, Rentsync, and more), or Firecrawl for Cloudflare-protected sites."3042      },3043      {3044        "icon": "RefreshCw",3045        "title": "Webhook-equivalent change detection",3046        "description": "Hourly synchronization with content hashing upserts new, modified, and removed listings automatically — vanished listings are deactivated, never left stale."3047      },3048      {3049        "icon": "Layers",3050        "title": "Single normalized schema",3051        "description": "Every listing lands in one standardized Listing model: address, sector, city, Quebec unit types (3½…), price, availability, amenities, and all images."3052      },3053      {3054        "icon": "Search",3055        "title": "Faceted search API",3056        "description": "FastAPI endpoints filter by city, sector, unit size, price range, manager, and full-text query, with facets, stats, and an on-demand sync trigger."3057      },3058      {3059        "icon": "Blocks",3060        "title": "Auto-discovering connector registry",3061        "description": "Drop a ~30-line module in the connectors folder and it registers itself — no shared file to modify, and a broken connector never affects the others."3062      },3063      {3064        "icon": "Globe",3065        "title": "Province-wide coverage",3066        "description": "Quebec City, Lévis, and Greater Montreal managers — from Logisco and Cogir to Akelius, CAPREIT, Minto, and Devimco — plus documented reasons for every non-connectable source."3067      },3068      {3069        "icon": "Eye",3070        "title": "Editorial-sharp PWA frontend",3071        "description": "React 18 + Vite interface with Space Grotesk type, offset shadows, real-time ticker, mobile bottom sheet, photo galleries, and installable PWA support."3072      },3073      {3074        "icon": "ShieldCheck",3075        "title": "Polite and faithful by design",3076        "description": "Requests throttled at 0.5 s minimum with crawl guardrails; prices are never invented — if a source shows no price, the field stays null."3077      }3078    ],3079    "techStack": [3080      {3081        "category": "Backend",3082        "items": [3083          "Python 3.14",3084          "FastAPI",3085          "SQLite"3086        ]3087      },3088      {3089        "category": "Frontend",3090        "items": [3091          "React 18",3092          "Vite",3093          "TypeScript",3094          "PWA"3095        ]3096      },3097      {3098        "category": "Ingestion",3099        "items": [3100          "Per-site connectors",3101          "Firecrawl",3102          "Content-hash diff engine"3103        ]3104      },3105      {3106        "category": "Operations",3107        "items": [3108          "PM2",3109          "ngrok",3110          "Hourly watcher"3111        ]3112      }3113    ],3114    "architecture": [3115      {3116        "title": "Connectors",3117        "description": "One Python module per property manager fetches listings from rendered HTML, internal JSON APIs, or Firecrawl, with per-listing error isolation."3118      },3119      {3120        "title": "Normalization",3121        "description": "Raw listings are mapped to a single standardized Listing schema — city inference, Quebec unit-type normalization, price parsing, and complete image sets."3122      },3123      {3124        "title": "Diff engine",3125        "description": "SQLite upserts keyed by content hash classify each listing as new, modified, or gone; removed listings are deactivated and every sync is logged."3126      },3127      {3128        "title": "API layer",3129        "description": "FastAPI serves filtered search, per-listing detail, facets, the 74-manager source registry with counters, provincial stats, and a background sync trigger."3130      },3131      {3132        "title": "Frontend",3133        "description": "A React 18 + Vite PWA renders the aggregated market with real-time ticker, filters, galleries, and mobile-first bottom-sheet navigation."3134      },3135      {3136        "title": "Production loop",3137        "description": "Three PM2 processes — web server, hourly watcher, ngrok tunnel — keep the site self-maintaining: only code gets pushed, the server refreshes its own data."3138      }3139    ],3140    "highlights": [3141      "Designed, built, and deployed to production in a single day — including market research verifying 74 property managers.",3142      "255 rental sources catalogued and 194 active connectors, aggregating 8,000+ listings across all of Quebec.",3143      "Adding a new property manager takes roughly 30 lines of Python thanks to auto-discovering connector registration.",3144      "Content hashing recreates webhooks that agency sites never offer: additions, updates, and removals detected automatically.",3145      "Every non-connectable source is documented with the specific reason (no prices shown, empty inventory, placeholder site).",3146      "Strict fidelity rule: no invented prices, and every listing links back to the manager's original ad."3147    ]3148  },3149  {3150    "slug": "vrai-prix",3151    "hero": {3152      "headline": "Your property's true value, no black box",3153      "subheadline": "A transparent valuation engine for every property in Quebec — 3.7 million properties, 745,119 real sales, and every calculation shown in full."3154    },3155    "overview": [3156      "Vrai-Prix estimates the market value of any Quebec property — single-family homes, plexes, condos, cottages, land — and shows exactly why: every comparable sale, every dollar adjustment, the model weighting, the value range, and a mandatory A–D confidence grade. The differentiator is total transparency: no magic score, no black box.",3157      "The engine fuses two approaches: a LightGBM hedonic model trained on log-prices with 18 variables and quantile heads for P10–P90 ranges (65% weight), blended with a weighted median of market-, size-, and age-adjusted comparable sales (35%). Six assessment-roll vintages — 22,150,285 observations from Quebec's open MAMH data — feed 22 million pre-computed estimates.",3158      "Validation follows the IAAO ratio-study standard on 102,943 never-seen sales: 11.0% median error, a 0.995 median ratio squarely inside the 0.90–1.10 target, and 72.1% of estimates within ±20% of the actual price. A strict temporal test on 68,364 sales from 2026 confirms out-of-time robustness."3159    ],3160    "stats": [3161      {3162        "value": "3,747,008",3163        "label": "properties covered"3164      },3165      {3166        "value": "745,119",3167        "label": "real sales"3168      },3169      {3170        "value": "11.0%",3171        "label": "median error (MdAPE)"3172      },3173      {3174        "value": "0.995",3175        "label": "median ratio (IAAO target 0.90–1.10)"3176      },3177      {3178        "value": "99.88%",3179        "label": "spatial match rate"3180      },3181      {3182        "value": "$2.01T",3183        "label": "total provincial value computed"3184      }3185    ],3186    "features": [3187      {3188        "icon": "Search",3189        "title": "Full-text address search",3190        "description": "SQLite FTS5 search across all 3,747,008 assessment units in the province, with instant autocompletion."3191      },3192      {3193        "icon": "Calculator",3194        "title": "Hybrid estimation engine",3195        "description": "65% LightGBM hedonic model plus 35% weighted-median adjusted comparables, with every adjustment displayed in dollars — market conditions, size, and age."3196      },3197      {3198        "icon": "Gauge",3199        "title": "Ranges with mandatory confidence",3200        "description": "P10–P90 ranges from quantile regression and an A–D confidence grade driven by comparable count, dispersion, and range width — never hidden."3201      },3202      {3203        "icon": "Map",3204        "title": "Surveyor-style comparables map",3205        "description": "A hand-built pure-SVG 'surveyor's plan' with real azimuths and distances — zero map tiles, zero third-party dependencies."3206      },3207      {3208        "icon": "Home",3209        "title": "Data-drawn property portrait",3210        "description": "An SVG facade drawn from registry data, a to-scale lot rendering, and a breakdown of value composition per property."3211      },3212      {3213        "icon": "LineChart",3214        "title": "Six vintages of history",3215        "description": "Estimates from 2021 through 2026 for every property, tracing how each valuation evolved across assessment-roll vintages."3216      },3217      {3218        "icon": "Building2",3219        "title": "Portfolio valuation",3220        "description": "Aggregate up to 40 properties into a single portfolio view with a consolidated multi-page PDF report."3221      },3222      {3223        "icon": "FileText",3224        "title": "Fully vectorial PDF reports",3225        "description": "Standard (3 pages), bank-grade professional (6 pages), portfolio, and provincial statistical reports — 100% vector output with embedded fonts via pdfkit."3226      },3227      {3228        "icon": "Scale",3229        "title": "Law 25 compliant",3230        "description": "Quebec privacy-law compliance, a cookie-consent selector, and the complete public methodology embedded in the product."3231      }3232    ],3233    "techStack": [3234      {3235        "category": "Frontend / API",3236        "items": [3237          "Next.js 16 (App Router)",3238          "TypeScript strict",3239          "Tailwind CSS 4"3240        ]3241      },3242      {3243        "category": "Data",3244        "items": [3245          "SQLite (better-sqlite3)",3246          "FTS5 full-text",3247          "Spatial indexes"3248        ]3249      },3250      {3251        "category": "Model pipeline",3252        "items": [3253          "LightGBM",3254          "scikit-learn",3255          "pandas",3256          "pyogrio/GDAL"3257        ]3258      },3259      {3260        "category": "Reports & testing",3261        "items": [3262          "pdfkit",3263          "Vitest",3264          "Playwright"3265        ]3266      }3267    ],3268    "architecture": [3269      {3270        "title": "Open-data ingestion",3271        "description": "Six vintages of Quebec's georeferenced assessment rolls (MAMH, 2021–2026) — roughly 3.7M units per vintage, 22,150,285 observations in total."3272      },3273      {3274        "title": "Spatial fusion",3275        "description": "Sales are matched to assessment units via XY join in EPSG:32198 — kNN k=25 within 200 m plus value-based join within 500 m — achieving 99.88% matches at 0.6 m median distance."3276      },3277      {3278        "title": "Hedonic model",3279        "description": "LightGBM on log(price) with 18 variables and P10/P90 quantile heads produces 22 million pre-computed estimates across all vintages."3280      },3281      {3282        "title": "Comparables engine",3283        "description": "Candidate sales within an adaptive 2.2–28 km radius are filtered by type and size, adjusted for market, size, and age, then combined by Gaussian-weighted median."3284      },3285      {3286        "title": "Fusion and confidence",3287        "description": "The final estimate blends 65% hedonic model with 35% comparables; comparable count, dispersion, and range width determine the A–D confidence grade."3288      },3289      {3290        "title": "Application layer",3291        "description": "Next.js 16 serves search, estimation, portfolio, and report APIs over a SQLite base with FTS5, spatial indexes, and a smoothed monthly market index."3292      }3293    ],3294    "highlights": [3295      "Validated to the IAAO ratio-study standard: 0.995 median ratio on 102,943 held-out sales, plus a strict temporal test on 68,364 sales from 2026.",3296      "Condos hit a COD of 11.9 — inside the IAAO's toughest ≤15 target band.",3297      "Computes the total value of Quebec's residential stock — $2.01 trillion — with a ranking of the top 200 municipalities.",3298      "Every dollar adjustment is shown: market conditions from a 3-month-smoothed $/m² index, size at 50% of the comparable's $/m² capped at ±25%, age at 0.5%/year capped at ±10%.",3299      "All maps and property portraits are pure SVG drawn from registry data — no tiles, no external map services.",3300      "Built entirely on open data: Quebec's MAMH property assessment rolls under an open license, with owner information redacted at the source."3301    ]3302  },3303  {3304    "slug": "valoplex",3305    "hero": {3306      "headline": "The true value of your plex, door by door",3307      "subheadline": "A valuation engine built specifically for Quebec's income properties — 393,867 multi-unit buildings, 1.7 million doors, one scale-proof ratio hedonic model."3308    },3309    "overview": [3310      "A plex is an income property: its value is reasoned per door, per revenue, per cap rate — not like a single-family home. ValoPlex covers every residential multi-unit building in Quebec, from duplexes to towers, with a model and interface dedicated to that logic, including per-door economics benchmarked against the local market.",3311      "The model targets log(price / assessed value) rather than raw price. A raw-price model dominated by the mass of duplexes crushes large buildings — one tower assessed at $705M was predicted at $5.6M. In ratio space, a $400K duplex and a $700M tower are valued with the same relative accuracy. Beyond 12 doors, estimates shrink toward empirical size-band anchors, and P10–P90 ranges use Mondrian conformal calibration per door band, with a measured — not promised — 80.0% coverage.",3312      "The interactive investor pro forma inverts the income approach: it derives the closed-form implicit rent the estimated value assumes, then builds a full operating statement, Canadian semi-annual mortgage, DSCR, cashflow per door, 5-year projection, break-even rent and rate, and interest-rate sensitivity — all recalculated live from five sliders."3313    ],3314    "stats": [3315      {3316        "value": "393,867",3317        "label": "plex buildings covered"3318      },3319      {3320        "value": "1,733,744",3321        "label": "doors"3322      },3323      {3324        "value": "91,060",3325        "label": "plex sales"3326      },3327      {3328        "value": "13.8%",3329        "label": "median error (MdAPE)"3330      },3331      {3332        "value": "80.0%",3333        "label": "measured range coverage"3334      },3335      {3336        "value": "$400.6B",3337        "label": "total Quebec plex value"3338      }3339    ],3340    "features": [3341      {3342        "icon": "DollarSign",3343        "title": "Per-door economics",3344        "description": "Value per door, assessment per door, area per door, and land per door — each benchmarked against the local market."3345      },3346      {3347        "icon": "Calculator",3348        "title": "Interactive investor pro forma",3349        "description": "Implicit rent, full operating statement, Canadian mortgage, DSCR, cashflow per door, 5-year projection, break-even, and rate sensitivity — five sliders, live recalculation."3350      },3351      {3352        "icon": "Coins",3353        "title": "Full closing costs",3354        "description": "Transfer duties under both the provincial scale and Montreal's enhanced scale (up to 4%), plus notary, inspection, and total cash-to-close."3355      },3356      {3357        "icon": "Building2",3358        "title": "Signature doors frieze",3359        "description": "One SVG door drawn per unit, with a DUPLEX/TRIPLEX/…/MULTI-N-DOORS badge — the visual signature of every property page."3360      },3361      {3362        "icon": "Scale",3363        "title": "Scale-proof ratio model",3364        "description": "Targets log(price/assessed value) so duplexes and towers are valued with equal relative accuracy, informed by roll-vintage age in months."3365      },3366      {3367        "icon": "Gauge",3368        "title": "Mondrian conformal calibration",3369        "description": "P10–P90 ranges calibrated per door band on a dedicated calibration set — 80.0% coverage measured, not promised."3370      },3371      {3372        "icon": "Map",3373        "title": "Honest comparables map",3374        "description": "A surveyor-plan SVG map with real azimuths and distances, plus a fourth per-door adjustment (50% of price/door, capped ±30%) — and an honest empty state when no comparable plex exists."3375      },3376      {3377        "icon": "FileText",3378        "title": "PDF report suite",3379        "description": "Standard 3-page report with pro forma, 6-page bank-grade professional report, portfolio report, and a provincial statistical report."3380      },3381      {3382        "icon": "BarChart3",3383        "title": "Provincial plex statistics",3384        "description": "Quebec's plexes are worth $400.6B — broken down by building size band and by municipality."3385      }3386    ],3387    "techStack": [3388      {3389        "category": "Application",3390        "items": [3391          "Next.js 16 (App Router)",3392          "TypeScript strict",3393          "Tailwind CSS 4"3394        ]3395      },3396      {3397        "category": "Data",3398        "items": [3399          "SQLite",3400          "MAMH assessment rolls",3401          "Enriched transactions"3402        ]3403      },3404      {3405        "category": "Model pipeline",3406        "items": [3407          "Python",3408          "Ratio hedonic model",3409          "Mondrian conformal calibration"3410        ]3411      },3412      {3413        "category": "Reports & testing",3414        "items": [3415          "pdfkit",3416          "Vitest (33 tests)"3417        ]3418      }3419    ],3420    "architecture": [3421      {3422        "title": "Ratio hedonic model",3423        "description": "Trains on log(price / assessed value) with roll-age awareness, producing predictions for 2021–2026 that stay accurate from duplexes to towers."3424      },3425      {3426        "title": "Out-of-domain shrinkage",3427        "description": "Beyond 12 doors, where sales are rare, the model weight slides from 55% to 20% toward the empirical anchor of the building's size band."3428      },3429      {3430        "title": "Conformal calibration",3431        "description": "P10–P90 ranges are calibrated per door band (Mondrian) on a dedicated set, achieving verified 80.0% coverage."3432      },3433      {3434        "title": "Comparables engine",3435        "description": "Adds a fourth plex-specific adjustment — 50% of the comparable's price per door, capped at ±30% — on top of market, size, and age adjustments."3436      },3437      {3438        "title": "Pro forma library",3439        "description": "A 20-test finance module derives closed-form implicit rent, Canadian semi-annual mortgage math, DSCR, break-even by bisection, and 5-year equity projections."3440      },3441      {3442        "title": "Application layer",3443        "description": "Next.js 16 app over a SQLite base built by the Python pipeline, serving valuations, pro formas, statistics, and pdfkit reports."3444      }3445    ],3446    "highlights": [3447      "The ratio-target insight came from a measured failure: a raw-price model predicted a $705M-assessed tower at just $5.6M.",3448      "Validated on 13,617 never-seen sales to the IAAO standard — 13.8% MdAPE overall, 12.6% on triplexes — plus a temporal test on 9,172 sales from 2026.",3449      "80.0% range coverage is measured on a dedicated calibration set, not assumed — Mondrian conformal calibration per door band.",3450      "The pro forma inverts the income approach: closed-form implicit rent RB = (V·TGA + F) / (1 − vacancy − %variables), then a full investor statement.",3451      "Computes that all of Quebec's plexes are worth $400.6 billion, broken down by size band and municipality.",3452      "Companion product to Vrai-Prix — same editorial-sharp design language, orange accent instead of red, 33/33 tests passing."3453    ]3454  },3455  {3456    "slug": "qwhpi-platform",3457    "hero": {3458      "headline": "Measuring Quebec home prices, not composition",3459      "subheadline": "A production-grade index platform that separates true price movement from sales-mix shifts across 81 geography-by-type segments, with uncertainty published on every observation."3460    },3461    "overview": [3462      "QHPI is an economic-measurement platform, not a median-price tracker: a week where only mansions sell must not register as a price increase. A robust hedonic time-dummy model with hierarchical pooling estimates quality-adjusted indexes for the province, 17 administrative regions, and major municipalities, each split by property type — unifamilial, condo, plex, and composite.",3463      "Three estimation regimes are arbitrated by empirical validation. A rolling time-dummy backbone with Huber-IRLS weighting and mean splicing makes published history revision-free by construction. The 50 liquid cells get their own local regressions; the 31 thin cells follow a Kalman-filtered deviation from their parent's path, with the shrinkage weight published on every row.",3464      "Uncertainty is never hidden: every observation carries a 95% confidence interval, an A–E reliability grade, effective sample size, and vintage stamp. The full stack ships in one repo — Python engine, PostgreSQL store, FastAPI service, Next.js dashboard, LaTeX methodology paper — while distributing zero individual transaction records."3465    ],3466    "stats": [3467      {3468        "value": "~745k",3469        "label": "raw transactions ingested"3470      },3471      {3472        "value": "81",3473        "label": "published index cells"3474      },3475      {3476        "value": "17",3477        "label": "administrative regions"3478      },3479      {3480        "value": "1,100+",3481        "label": "municipalities covered"3482      },3483      {3484        "value": "112",3485        "label": "series in the dashboard"3486      },3487      {3488        "value": "2021→now",3489        "label": "coverage period"3490      }3491    ],3492    "features": [3493      {3494        "icon": "LineChart",3495        "title": "Hedonic, not median",3496        "description": "In a composition-shock simulation the raw median jumps +11.7% while the hedonic index moves −0.7% — the index measures prices, not sales mix."3497      },3498      {3499        "icon": "GitBranch",3500        "title": "Three arbitrated estimation regimes",3501        "description": "Rolling time-dummy backbone, direct local regressions for 50 liquid cells, and hierarchical Kalman shrinkage for 31 thin cells — chosen by validation, not convenience."3502      },3503      {3504        "icon": "ShieldCheck",3505        "title": "Uncertainty on every row",3506        "description": "95% confidence intervals, A–E reliability grades, effective sample size, and shrinkage weight are published with every single observation."3507      },3508      {3509        "icon": "CheckCircle2",3510        "title": "Revision-free published history",3511        "description": "13-month rolling windows combined by mean splice make the published index history revision-free by construction; first releases and revisions remain queryable."3512      },3513      {3514        "icon": "Microscope",3515        "title": "Benchmarked against repeat sales",3516        "description": "Validated against a ~85k-address repeat-sales benchmark — Quebec condos land at 132.0 vs 132, Quebec City condos at 163.5 vs 162."3517      },3518      {3519        "icon": "Database",3520        "title": "No microdata distributed",3521        "description": "The repo ships only cell-level aggregates with transaction counts; individual sale records never enter version control, enforced at the .gitignore boundary."3522      },3523      {3524        "icon": "Server",3525        "title": "Full-stack index service",3526        "description": "FastAPI exposes every series with CIs, vintages, liquidity, comparisons, choropleth payloads, stats, and publication-grade PDF reports."3527      },3528      {3529        "icon": "BarChart3",3530        "title": "Interactive dashboard",3531        "description": "Next.js frontend with a ⌘K palette over 112 series, CI bands, brush zoom, Bank-of-Canada event annotations, choropleth time-lapse, and PNG/CSV export."3532      },3533      {3534        "icon": "BookOpen",3535        "title": "Methodology paper included",3536        "description": "A LaTeX paper — 'A High-Frequency Hedonic Housing Price Index for Quebec' — documents the methodology with researched citations from index-number theory."3537      }3538    ],3539    "techStack": [3540      {3541        "category": "Index engine",3542        "items": [3543          "Python 3.11+",3544          "pandas/polars",3545          "numpy",3546          "Huber-IRLS",3547          "Kalman state-space"3548        ]3549      },3550      {3551        "category": "Data store",3552        "items": [3553          "Parquet lake",3554          "PostgreSQL",3555          "Alembic migrations"3556        ]3557      },3558      {3559        "category": "API",3560        "items": [3561          "FastAPI",3562          "ETag caching",3563          "CSV/JSON export",3564          "Rate limiting"3565        ]3566      },3567      {3568        "category": "Dashboard",3569        "items": [3570          "Next.js",3571          "TypeScript",3572          "Custom zero-dependency charts"3573        ]3574      },3575      {3576        "category": "Ops & research",3577        "items": [3578          "docker-compose",3579          "CI with header gate",3580          "LaTeX paper",3581          "matplotlib PDF reports"3582        ]3583      }3584    ],3585    "architecture": [3586      {3587        "title": "Engine pipeline",3588        "description": "Eleven ordered, idempotent scripts run profile → spatial join → documented cleaning → estimation → validation → canonical Parquet, each emitting a run manifest with input hashes."3589      },3590      {3591        "title": "Geography layer",3592        "description": "Transactions are spatially joined by lat/lng against authoritative Quebec SDA cadastral boundaries — the free-text city field alone is never trusted."3593      },3594      {3595        "title": "Estimation core",3596        "description": "Robust hedonic time-dummy regressions over 13-month rolling windows with Huber-IRLS, mean-spliced; buildingType is banned after its staggered backfill fabricated a −38 log-point cliff."3597      },3598      {3599        "title": "Hierarchical pooling",3600        "description": "Liquid cells get direct local regressions with their own coefficients; thin cells follow Kalman-smoothed deviations from their parent path with published shrinkage weights."3601      },3602      {3603        "title": "Serving layer",3604        "description": "The canonical monthly Parquet (7,504 rows) loads into PostgreSQL behind a FastAPI service; a weekly scheduler ingests new rows, re-estimates, and stamps a new data vintage."3605      },3606      {3607        "title": "Dashboard",3608        "description": "The Next.js frontend at www.indexqc.house offers explore, compare, choropleth map with time-lapse, methodology, and an in-page API playground."3609      }3610    ],3611    "highlights": [3612      "The composition-shock test is the thesis in one number: mix shock moves the raw median +11.7%, the hedonic index −0.7%.",3613      "buildingType is banned from all hedonic models — its region-staggered backfill fabricated a −38 log-point cliff in Montreal indexes, and the ban is documented in code.",3614      "Direct local estimation was chosen because pooled deviations compressed real divergence: Quebec City condos moved ~+55%, confirmed independently by repeat sales.",3615      "A–E reliability tiers are justified empirically by a downsampling experiment thinning Montreal condos to as few as 5 transactions per period.",3616      "Strict data policy: zero transaction microdata in the repo — only cell-level aggregates — yet the API and dashboard run fully from the included Parquet.",3617      "Every file carries an author header enforced by a pre-commit hook and CI gate; runs are deterministic and stamped with model version and data vintage."3618    ]3619  },3620  {3621    "slug": "spboucher-ai",3622    "hero": {3623      "headline": "Where research meets shipped software",3624      "subheadline": "The personal site of Simon-Pierre Boucher — financial econometrics researcher and macOS/AI developer — presenting his research, teaching, and the six-app Zyquo suite."3625    },3626    "overview": [3627      "spboucher.ai is the academic and developer home of Simon-Pierre Boucher, Professor in the Department of Administrative Sciences at Université du Québec en Outaouais. The site presents his research in financial econometrics — commodity markets, monetary policy announcements, high-frequency finance, volatility modelling — alongside his teaching record and a portfolio of native macOS applications.",3628      "Built on Next.js 16 with the App Router, the site uses server components everywhere with static prerendering on every page. Tailwind CSS v4 and shadcn/ui-style components deliver a clean academic aesthetic with a developer edge; Framer Motion adds subtle scroll reveals that respect prefers-reduced-motion and degrade gracefully without JavaScript.",3629      "The site is self-hosted with character: it runs on a Mac Studio node of the author's personal cluster under PM2 process management, tunneled to the world through ngrok on the custom domain — production build only, with a JSON health endpoint for uptime monitoring."3630    ],3631    "stats": [3632      {3633        "value": "6",3634        "label": "Zyquo macOS apps showcased"3635      },3636      {3637        "value": "5",3638        "label": "content sections"3639      },3640      {3641        "value": "16",3642        "label": "Next.js version"3643      },3644      {3645        "value": "100%",3646        "label": "static prerendering"3647      }3648    ],3649    "features": [3650      {3651        "icon": "Zap",3652        "title": "Server components everywhere",3653        "description": "Next.js 16 App Router with static prerendering on every page; client components only where interactivity genuinely requires them."3654      },3655      {3656        "icon": "Palette",3657        "title": "System-aware dark mode",3658        "description": "Dark mode follows the system with a manual toggle and no flash on load, themed through Tailwind v4 design tokens."3659      },3660      {3661        "icon": "Sparkles",3662        "title": "Motion with restraint",3663        "description": "Framer Motion scroll reveals honor prefers-reduced-motion and fall back cleanly when JavaScript is disabled."3664      },3665      {3666        "icon": "Package",3667        "title": "Zyquo app portfolio",3668        "description": "Six native macOS AI apps — Cloud, Local, Agent, Atlas, MLX, Router — each with icon, description, and Repo/Release/DMG download links."3669      },3670      {3671        "icon": "GraduationCap",3672        "title": "Full academic profile",3673        "description": "Research publications, working papers, conference presentations, and courses taught at Université Laval, in dedicated sections."3674      },3675      {3676        "icon": "CheckCircle2",3677        "title": "Accessible by design",3678        "description": "Semantic HTML, alt text on all app icons, keyboard-friendly navigation, and a mobile-first responsive 1/2/3-column grid."3679      },3680      {3681        "icon": "Server",3682        "title": "Self-hosted on a Mac",3683        "description": "Runs on a personal cluster node under PM2 with auto-restart, exposed through an ngrok tunnel bound to the custom domain."3684      },3685      {3686        "icon": "Gauge",3687        "title": "Health monitoring",3688        "description": "A dedicated GET /api/health JSON endpoint enables uptime monitoring of the production deployment."3689      }3690    ],3691    "techStack": [3692      {3693        "category": "Framework",3694        "items": [3695          "Next.js 16 (App Router)",3696          "React 19",3697          "TypeScript 5"3698        ]3699      },3700      {3701        "category": "UI",3702        "items": [3703          "Tailwind CSS 4",3704          "shadcn/ui-style components",3705          "Framer Motion 12"3706        ]3707      },3708      {3709        "category": "Operations",3710        "items": [3711          "PM2",3712          "ngrok",3713          "Health endpoint"3714        ]3715      }3716    ],3717    "architecture": [3718      {3719        "title": "App Router pages",3720        "description": "Five routes — home, research, teaching, apps, CV — rendered as server components with static prerendering, plus a JSON health API route."3721      },3722      {3723        "title": "Single source of truth for apps",3724        "description": "The Zyquo suite data lives in one lib/apps.ts module that drives the app cards — icons, descriptions, and the three canonical links per app."3725      },3726      {3727        "title": "Production deployment",3728        "description": "The production build runs under PM2 on cluster node m2u64, port 3100, with a second PM2 process holding the ngrok tunnel to www.spboucher.ai."3729      }3730    ],3731    "highlights": [3732      "Served from a Mac, tunneled to the world: the site runs on the author's personal Apple Silicon cluster, not a commercial cloud.",3733      "Showcases the Zyquo suite — six native Swift/SwiftUI macOS apps for AI and local LLMs, each with direct DMG downloads.",3734      "Every source file carries a mandatory author header, enforced as a project convention.",3735      "Framer Motion animations degrade gracefully: prefers-reduced-motion respected and no-JS fallbacks in place.",3736      "Both processes — app and tunnel — run under PM2 with save/restore, making the deployment survive reboots."3737    ]3738  },3739  {3740    "slug": "hfmarketdata",3741    "hero": {3742      "headline": "26.5 billion rows of market data, no key required",3743      "subheadline": "A full-history downloader, a DuckDB-over-Parquet data lake and an open REST API serving intraday bars and complete options chains at www.hfmarketdata.io."3744    },3745    "overview": [3746      "HF Market Data is an open high-frequency market data platform built end to end: ingestion, storage, API and documentation. A single-file downloader pulls everything FirstRate Data publishes — stocks, ETFs, futures, crypto, indices, FX and options — and converts it straight into a query-ready Parquet lake. The full ingestion completed as 745/745 jobs with zero data loss.",3747      "The data layer is deliberately radical: 26,464,775,098 rows across 558,814 zstd Parquet files, queried in place by DuckDB with predicate pushdown — no database server anywhere in the stack. Bars span five timeframes from 1-minute to daily, and options coverage runs 66/66 quarters since 2010 across 5,800+ US underlyings with quotes, implied volatilities and full Greeks.",3748      "On top sits an open, keyless REST API (FastAPI) serving JSON and CSV — up to 2 million rows per CSV request — with endpoints for bars, multi-ticker watchlists, point-in-time snapshots, options chains and contract histories. The same process serves a React 18 + Vite documentation platform with a full endpoint reference, request snippets in curl, Python and JavaScript, and live example responses."3749    ],3750    "stats": [3751      { "value": "26.5B", "label": "Rows in the lake" },3752      { "value": "558,814", "label": "Parquet files" },3753      { "value": "350 GB", "label": "Lake size (zstd)" },3754      { "value": "5,800+", "label": "Options underlyings" },3755      { "value": "66/66", "label": "Options quarters since 2010" },3756      { "value": "7", "label": "Asset classes" }3757    ],3758    "features": [3759      { "icon": "Download", "title": "Full-history downloader", "description": "A single-file, fully resumable downloader ingests everything FirstRate Data publishes across a 745-job plan, with retries, a disk-space guard and a resume manifest." },3760      { "icon": "Database", "title": "DuckDB-over-Parquet lake", "description": "558,814 zstd Parquet files — one per instrument or segment — queried in place with predicate pushdown, no database server required." },3761      { "icon": "Globe", "title": "Open, keyless REST API", "description": "Every endpoint is public and key-free, returning JSON or CSV with precise start/end windows and up to 2 million rows per CSV request." },3762      { "icon": "LineChart", "title": "Intraday to daily bars", "description": "OHLCV bars at 1min, 5min, 30min, 1hour and 1day across stocks, ETFs, futures, crypto, indices and FX, with split and dividend adjustments." },3763      { "icon": "Layers", "title": "Complete options history", "description": "Every quarterly options archive since 2010 — quotes, bid/ask IV, open interest, volume and the full set of Greeks, 16 fields per row." },3764      { "icon": "Clock", "title": "Point-in-time snapshots", "description": "Query a whole watchlist at one precise moment, or pull multi-ticker bars in a single call with per-ticker limits." },3765      { "icon": "RefreshCw", "title": "Zero-loss ingestion", "description": "CSV converts to Parquet via DuckDB with raw archives deleted on the fly — 745/745 jobs completed with zero data loss." },3766      { "icon": "BookOpen", "title": "Live documentation platform", "description": "A React 18 + Vite docs site with parameter tables, curl/Python/JavaScript snippets, live responses and a real-time dataset status page." }3767    ],3768    "techStack": [3769      { "category": "Data", "items": ["Python", "DuckDB", "Parquet (zstd)", "pandas"] },3770      { "category": "API", "items": ["FastAPI", "Uvicorn", "OpenAPI / Swagger"] },3771      { "category": "Frontend", "items": ["React 18", "Vite 6", "Fraunces / Inter / JetBrains Mono"] },3772      { "category": "Ops", "items": ["ngrok", "Single-process API + static serving", "Resume manifest state"] }3773    ],3774    "architecture": [3775      { "title": "Ingest", "description": "frd_downloader.py works through a 745-job plan against the FirstRate Data API — options quarters since 2010, stocks and ETFs A–Z across all timeframes and adjustments, futures, crypto, indices and FX — fully resumable via a state manifest." },3776      { "title": "Convert", "description": "Each downloaded archive is converted CSV-to-Parquet through DuckDB with zstd compression, one file per instrument or segment, and the raw zips are deleted on the fly to keep the footprint at 350 GB." },3777      { "title": "Query in place", "description": "The API layer (FastAPI + DuckDB) queries the 26.5-billion-row lake directly with predicate pushdown into the Parquet row groups — no database server, no ETL into a warehouse." },3778      { "title": "Serve openly", "description": "Keyless endpoints expose the live inventory, ticker discovery, OHLCV bars, watchlist snapshots and full options chains with Greeks, in JSON or CSV up to 2 million rows." },3779      { "title": "Document and publish", "description": "The same process serves the React + Vite documentation platform, exposed publicly at www.hfmarketdata.io through ngrok." }3780    ],3781    "highlights": [3782      "26,464,775,098 rows queried in place — no database server anywhere in the stack",3783      "745/745 ingestion jobs completed with zero data loss",3784      "Full US options history since 2010: 66/66 quarters, 5,800+ underlyings, quotes, IV and all Greeks",3785      "Open and keyless — no signup, no API key, JSON and CSV out of the box",3786      "Serves up to 2 million rows in a single CSV request",3787      "The entire pipeline is two Python files: a 661-line downloader and a 480-line API"3788    ]3789  },3790  {3791    "slug": "hfchart",3792    "hero": {3793      "headline": "Every pixel drawn by hand. Zero dependencies.",3794      "subheadline": "A high-frequency financial charting platform built on a from-scratch canvas rendering engine — no TradingView, no chart library, no framework."3795    },3796    "overview": [3797      "HFChart is a catalogue-grade platform for high-frequency financial charts where every pixel is drawn by hand on a 2D canvas. There is no TradingView widget, no charting library, and no framework anywhere in the stack — the entire application weighs in at 4,805 lines of code with exactly zero dependencies, front end and server included.",3798      "Data flows straight from the open HF Market Data API (hfmarketdata.io), queried directly by the browser across 6 asset classes — indices, ETFs, stocks, futures, crypto, and FX — covering roughly 13,200 instruments. Fourteen chart types, from candlesticks and Heikin-Ashi to Renko, Kagi, Point & Figure, and dynamic percent-comparison of up to 4 symbols, are rendered by a custom engine with linear and log scales, multi-pane layouts, and full touch support including two-finger pinch-zoom.",3799      "Beyond charting, HFChart ships an Options Lab built on real historical option chains going back to 2010: dated chains as they traded that day, a multi-leg strategy builder with presets, exact payoff analysis with aggregated Greeks, and a day-by-day historical replay that marks positions to market using actual contract prices — not a Black-Scholes simulation. An export button generates a fully interactive, self-contained embed snippet that makes zero network requests."3800    ],3801    "stats": [3802      { "value": "0", "label": "Dependencies (front + server)" },3803      { "value": "14", "label": "Chart types" },3804      { "value": "8", "label": "Technical indicators" },3805      { "value": "~13,200", "label": "Instruments across 6 asset classes" },3806      { "value": "18.3 KB", "label": "Full embed bundle, gzipped" },3807      { "value": "4,805", "label": "Total lines of code" }3808    ],3809    "features": [3810      { "icon": "LineChart", "title": "14 chart types", "description": "Candles, hollow candles, OHLC bars, line, step, area, baseline, Heikin-Ashi, Renko, Three-Line Break, Range Bars, Kagi, Point & Figure, and percent comparison — all hand-rendered." },3811      { "icon": "Cpu", "title": "From-scratch canvas engine", "description": "A custom 867-line rendering engine handles panes, linear/log scales, axes, crosshair, and zoom/pan/pinch, with a high-density fast path that switches to hi-lo strokes below 2 px per bar." },3812      { "icon": "BarChart3", "title": "8 built-in indicators", "description": "SMA, EMA, Bollinger, session VWAP with ±2σ bands, and volume profile with POC as overlays, plus RSI, MACD, and ATR in dedicated panes — every calculation implemented from scratch." },3813      { "icon": "FlaskConical", "title": "Options Lab", "description": "Real historical option chains since 2010 with quotes, IV, open interest, and Greeks, a multi-leg builder with presets from covered calls to iron condors, and exact payoff analysis." },3814      { "icon": "Clock", "title": "Real historical replay", "description": "Mark-to-market a strategy day by day through expiry using actual historical contract prices — with a slider, realized P&L, and daily Greeks — not a Black-Scholes simulation." },3815      { "icon": "Package", "title": "Self-contained embeds", "description": "The export button generates an HTML snippet with the data baked in, so the pasted chart stays fully interactive while making zero network requests — one 18.3 KB gzipped script." },3816      { "icon": "Split", "title": "Percent comparison mode", "description": "Overlay up to 4 symbols with dynamic rebasing on the first visible bar, so every zoom and pan recomputes relative performance on the fly." },3817      { "icon": "Palette", "title": "Colorblind-safe by design", "description": "The classic green/red scheme is doubled by a blue/red pair that passes every palette-validator check (CVD ΔE 19.2, contrast ≥ 3:1 on both surfaces), with a fixed, never-recycled categorical series order." },3818      { "icon": "Globe", "title": "Shareable URL state", "description": "Symbol, timeframe, chart type, indicators, theme, and comparison sets all encode into the URL, so any view — including Options Lab setups — can be shared as a link." }3819    ],3820    "techStack": [3821      { "category": "Frontend", "items": ["Vanilla JavaScript", "Canvas 2D API", "Hand-written CSS design tokens (light/dark)", "Responsive layout with mobile drawer"] },3822      { "category": "Server", "items": ["Python (pure stdlib, 109 lines)", "ThreadingHTTPServer", "Concatenated /embed.js bundle with mtime caching"] },3823      { "category": "Data", "items": ["HF Market Data API (hfmarketdata.io)", "Client-side resampling (1h→4h, 1D→1W, 5min→15m)", "Capability detection via /v1/status"] },3824      { "category": "Testing & Deployment", "items": ["node --test (10/10 passing on options-math.js)", "PM2 + ngrok on custom domain"] }3825    ],3826    "architecture": [3827      { "title": "Static host & bundle route", "description": "A 109-line pure-stdlib Python server serves the app shell and exposes /embed.js — the full engine (transforms, indicators, renderers, engine, embed bootstrapper) concatenated into a single script with mtime-based caching." },3828      { "title": "Direct browser data fetch", "description": "The browser queries the HF Market Data API directly via a 185-line client; timeframes missing from the data lake are derived client-side by resampling, and timeframe buttons auto-enable through /v1/status as the lake fills." },3829      { "title": "Series transformation", "description": "Raw OHLC bars are reshaped by transforms.js into Heikin-Ashi, Renko (ATR-auto-sized bricks), Kagi, Point & Figure, Three-Line Break, and Range Bars before rendering." },3830      { "title": "Canvas rendering pipeline", "description": "engine.js orchestrates panes, linear/log scales, axes, crosshair, and zoom/pan/pinch interactions while renderers.js draws all 14 chart types plus volume columns, bands, and the volume profile — pixel by pixel." },3831      { "title": "Export & embed", "description": "The export button serializes visible bars, chart type, indicators, and settings into a self-contained snippet that embed-boot.js hydrates into a fully interactive chart with zero network requests; a live iframe variant (?embed=1) is also available." }3832    ],3833    "highlights": [3834      "4,805 lines of hand-written code with exactly zero dependencies — front end and server",3835      "The complete interactive embed bundle ships at 18.3 KB gzipped (68.5 KB raw)",3836      "14 chart types and 8 indicators drawn pixel-by-pixel on a 2D canvas — no chart library, no framework",3837      "Options Lab replays real historical option chains since 2010 with actual mark-to-market, not a Black-Scholes simulation",3838      "Colorblind-safe up/down scheme validated at CVD ΔE 19.2 with ≥ 3:1 contrast on both surfaces",3839      "The entire production server is 109 lines of pure Python stdlib"3840    ]3841  },3842  {3843    "slug": "tendril",3844    "hero": {3845      "headline": "Web ingestion that reaches what other crawlers can't",3846      "subheadline": "Tendril scrapes and maps the web from a residential Mac in real WebKit, returning deterministic Markdown and structured data you can regression-test."3847    },3848    "overview": [3849      "Cloud crawlers run in headless Chromium on datacenter IPs — and get blocked for it. Tendril takes the opposite bet: it runs on a residential Apple Silicon machine, in WebKit, Safari's actual engine, behind a real IP. Sites that block conventional scrapers often don't block Tendril at all.",3850      "Extraction is fully deterministic — zero LLMs in the pipeline. The same page always yields the same Markdown, which means golden-file tests, versioned extraction rules, and reproducible output that enterprise workflows can actually depend on. JSON-LD, OpenGraph, Readability with a density-based fallback, and hand-tuned Turndown rules do the work parsers were built for.",3851      "At its core sits a three-tier escalation router: every request starts at a cheap undici HTTP fetch with Safari-fidelity header ordering, and escalates toward a native WKWebView pool and a real Safari driver only on evidence of failure. The whole platform is live at www.ten-dril.com, hardened against SSRF, honouring robots.txt by default, and self-identifying with a bot User-Agent — stealth means matching a real browser's fingerprint, not hiding who you are."3852    ],3853    "stats": [3854      { "value": "86", "label": "Hermetic tests passing, zero network" },3855      { "value": "0", "label": "LLMs in the extraction path" },3856      { "value": "3", "label": "Tiers in the escalation router" },3857      { "value": "4", "label": "Public API endpoints" },3858      { "value": "3", "label": "MCP tools exposed to agents" },3859      { "value": "6", "label": "Workspace packages in the monorepo" }3860    ],3861    "features": [3862      { "icon": "Fingerprint", "title": "Real-browser fidelity", "description": "WebKit on macOS ARM behind a residential IP is not a headless-Chromium signature, so sites that block other crawlers often let Tendril through." },3863      { "icon": "FlaskConical", "title": "Deterministic extraction", "description": "No model inference anywhere in the pipeline — the same page always yields the same Markdown, so extraction is covered by golden-file tests." },3864      { "icon": "Map", "title": "Map without rendering", "description": "Merges sitemaps, robots directives, homepage links, and /llms.txt into one deduplicated URL list in seconds." },3865      { "icon": "Split", "title": "Three-tier escalation router", "description": "A pure, unit-tested shouldEscalate() function starts every request at cheap HTTP and escalates to WKWebView or real Safari only on evidence of failure." },3866      { "icon": "Braces", "title": "Structured data harvest", "description": "JSON-LD, OpenGraph, and standard meta are parsed into a normalized structured object alongside clean Markdown and deduplicated links." },3867      { "icon": "Bot", "title": "Agent-ready integrations", "description": "A single-file MCP server (tendril_scrape, tendril_map, tendril_status) and a drop-in Agent Skill plug Tendril into any AI agent with no npm install and no API key." },3868      { "icon": "ShieldCheck", "title": "SSRF-hardened egress", "description": "Resolve-then-validate with IP pinning blocks private addresses and re-checks every redirect hop before any byte is fetched." },3869      { "icon": "Scale", "title": "Fair by default", "description": "Identifiable bot User-Agent with a contact URL, full RFC 9309 robots.txt compliance, and per-host rate limiting are the defaults, not options." },3870      { "icon": "Server", "title": "Self-hosted on Apple Silicon", "description": "Runs on a single Mac under PM2 with ngrok as the sole ingress, the API bound strictly to 127.0.0.1." }3871    ],3872    "techStack": [3873      { "category": "Core", "items": ["TypeScript (strict)", "Node 22+", "Fastify 5", "pnpm workspaces", "Zod"] },3874      { "category": "Fetch & Rendering", "items": ["undici (Tier 0 HTTP)", "WKWebView pool (Swift, Tier 1)", "Safari + safaridriver (Tier 2)"] },3875      { "category": "Extraction", "items": ["linkedom", "Mozilla Readability", "Turndown", "JSON-LD / OpenGraph harvesting"] },3876      { "category": "Infrastructure & Testing", "items": ["macOS ARM", "PM2", "ngrok reserved domain", "Vitest", "Pino"] }3877    ],3878    "architecture": [3879      { "title": "Request intake", "description": "A POST to /v1/scrape or /v1/map hits the Fastify API, where Zod schemas validate the payload and SSRF checks resolve and pin the target IP before anything is fetched." },3880      { "title": "Tier 0 HTTP fetch", "description": "undici fetches the page with Safari's exact header order, manual redirect handling with per-hop SSRF revalidation, and gzip/brotli decoding — the cheapest path that serves most traffic." },3881      { "title": "Escalation decision", "description": "The pure shouldEscalate() function inspects status codes, challenge markers, and empty SPA shells; on evidence of blocking, the router escalates toward the WKWebView pool and real Safari tiers." },3882      { "title": "Deterministic extraction", "description": "Raw HTML flows through a versioned pipeline — linkedom parsing, JSON-LD/OpenGraph harvest, Readability with a text-density fallback, and custom Turndown rules — producing Markdown, structured data, and links." },3883      { "title": "Response & delivery", "description": "Every response is a uniform { success, data, error } envelope with an X-Request-Id header, served from a Mac where the API binds only to localhost and ngrok is the sole public ingress." }3884    ],3885    "highlights": [3886      "Runs in real WebKit on a residential Mac — not a headless-Chromium datacenter signature",3887      "Zero LLMs in the extraction path: the same page always yields the same Markdown, verified by golden-file tests",3888      "86 hermetic unit and contract tests that pass with no network, on strict TypeScript with Result<T,E> error handling",3889      "Full RFC 9309 robots.txt parsing, identifiable bot User-Agent with contact URL, and per-host rate limiting by default",3890      "Single-file MCP server and Agent Skill make it a drop-in tool for Claude and any MCP-capable agent — no API key required",3891      "SSRF-hardened with resolve-then-validate IP pinning re-checked on every redirect hop"3892    ]3893  },3894  {3895    "slug": "khaelor",3896    "hero": {3897      "headline": "The autonomous engineer whose every decision you can replay",3898      "subheadline": "KHAELOR understands first, designs second, implements third, and verifies always — writing every action, even the ones at 3 AM, into an append-only log you can fork, replay, and diff."3899    },3900    "overview": [3901      "KHAELOR is not another coding-agent clone. It is a terminal-native autonomous engineering agent built on a deliberate discipline — understand first, design second, implement third, verify always — enforced at runtime, not just in a prompt. Write tools stay locked behind phase gates until a design artifact is approved.",3902      "Every session is event-sourced: an append-only JSONL log with torn-write recovery and byte-exact replay, where the conversation, costs, diffs, and phases are all pure folds over the same history. That makes runs auditable by construction — you can /fork any checkpoint, /replay a run with another model in a throwaway worktree, and /sdiff the two runs.",3903      "Beyond the interactive TUI, khaelord is a persistent daemon that pursues structured, event-sourced goals on a schedule: throwaway worktrees, phase gates even at night, mandatory verification, hard budget ceilings, and an async approval queue where a suspended run costs zero. Every overnight decision is one line in a log you replay the next morning."3904    ],3905    "stats": [3906      { "value": "698", "label": "Tests passing" },3907      { "value": "40", "label": "Durable event types" },3908      { "value": "11", "label": "Tools in the runtime" },3909      { "value": "16 ms", "label": "Coalesced render frames" },3910      { "value": "6", "label": "Capabilities no other CLI agent combines" },3911      { "value": "0", "label": "Invented numbers — real API metadata only" }3912    ],3913    "features": [3914      { "icon": "Workflow", "title": "Phase gates", "description": "Understand → design → implement is a runtime mechanism — write tools stay locked until a design artifact is approved, with strict, auto, or off modes." },3915      { "icon": "CheckCircle2", "title": "Native verification", "description": "After each edit batch KHAELOR runs your own typecheck, tests, and lint, repairing failures in a bounded loop before handing back." },3916      { "icon": "Split", "title": "Fork, replay, sdiff", "description": "Fork any checkpoint, replay a run with another model in a throwaway worktree, then diff the two runs side by side." },3917      { "icon": "Network", "title": "Semantic repo index", "description": "The symbols and refs tools find definitions with signatures and map callers, callees, and importers before an edit — skeletons instead of whole files." },3918      { "icon": "Brain", "title": "Memory with provenance", "description": "The agent maintains its own MEMORY.md, with every entry anchored to the exact session and event that produced it." },3919      { "icon": "Boxes", "title": "Parallel worktrees", "description": "Spawn subtasks in isolated git worktrees with attenuated capabilities and supervised no-fast-forward merges — your working copy is never touched." },3920      { "icon": "Clock", "title": "khaelord daemon", "description": "A persistent daemon runs structured, scheduled goals overnight with hard budget ceilings, mandatory verification, and an approval queue where a suspended run costs zero." },3921      { "icon": "ShieldCheck", "title": "The honesty contract", "description": "Costs come from real API usage metadata, test results from real exit codes, and permissions are capability-based where silence is never consent." },3922      { "icon": "Terminal", "title": "Custom ANSI renderer", "description": "Print-once scrollback, a bounded live region, 16 ms coalesced frames, and sub-millisecond input latency keep the TUI instantaneous while the model thinks." }3923    ],3924    "techStack": [3925      { "category": "Core", "items": ["TypeScript", "Node.js ≥ 22", "ESM", "Small-kernel architecture (deriveNext as a pure fold)"] },3926      { "category": "AI Runtime", "items": ["Anthropic SDK", "Streaming model events", "Isolated ModelClient interface", "Real usage-metadata cost accounting"] },3927      { "category": "Terminal", "items": ["Custom ANSI renderer", "khaelis theme (obsidian + magma)", "OKLCH gradients", "truecolor → 256 → 16 → mono ladder"] },3928      { "category": "Quality & Tooling", "items": ["Vitest (698 tests)", "ESLint", "tsc strict typechecking", "Mandatory file-header CI check"] }3929    ],3930    "architecture": [3931      { "title": "Understand", "description": "The context engine builds tiered context from the semantic RepoGraph — symbols with signatures and reference maps of callers, callees, and importers — feeding the model skeletons instead of whole files." },3932      { "title": "Design", "description": "Phase gates keep all write tools locked until the agent submits a design artifact and it is approved, so implementation never starts before a plan exists." },3933      { "title": "Implement", "description": "The tool runtime executes 11 tools — including a 9-strategy edit replacer — through the Workspace, the single filesystem and process seam, under capability-based deny > ask > allow permissions." },3934      { "title": "Verify", "description": "After each edit batch KHAELOR runs the project's own typecheck, tests, and lint with real exit codes, repairing failures in a bounded loop before claiming anything is done." },3935      { "title": "Record and replay", "description": "Every step appends to a JSONL event log with torn-write recovery; the session state is a pure fold over 40 durable event types, enabling byte-exact replay, forking, and run-vs-run diffing." }3936    ],3937    "highlights": [3938      "Six capabilities no other CLI agent ships together: phase gates, native verification, fork/replay/sdiff, semantic index, memory with provenance, parallel worktrees",3939      "Byte-exact session replay from an append-only JSONL log with torn-write recovery",3940      "698 passing tests behind a single npm run check with typecheck, lint, and header enforcement",3941      "khaelord runs autonomous overnight goals under hard budget ceilings — a suspended run costs exactly zero",3942      "Custom ANSI renderer delivers sub-millisecond input latency with 16 ms coalesced frames",3943      "Zero invented numbers: every cost, token count, and test result comes from real API metadata and real exit codes"3944    ]3945  },3946  {3947    "slug": "spbgit",3948    "hero": {3949      "headline": "A personal GitHub, built from scratch",3950      "subheadline": "SPB Git is a self-hosted software forge where every repository is public and clonable, writes are owner-only, and the filesystem is the database."3951    },3952    "overview": [3953      "SPB Git is the canonical home for all of Simon-Pierre Boucher's repositories, live at git.spboucher.ai. It implements Git Smart HTTP v2 by hand — streamed upload-pack and receive-pack, anonymous clone and fetch, token-authenticated push, post-receive hooks, and zip/tar.gz snapshots — on a Node.js Fastify server with no SQL or NoSQL database anywhere.",3954      "The web UI is a server-rendered showcase designed to match GitHub's polish: pinned repos, an activity feed, a contribution heatmap, badge-perfect README rendering with mermaid diagrams and relative-image resolution, shiki-highlighted file browsing with line anchors, commits, diffs, blame, global search, dynamic Open Graph cards, and an Atom feed. Dark and light themes ship with self-hosted fonts and zero third-party requests.",3955      "Day-to-day, everything runs through the spbgit CLI — a terminal command center covering the full lifecycle from repo creation to multi-repo sync and GitHub-style release uploads with sha256 sidecars. Bare repos on disk are the source of truth, expensive renders are cached per repo-and-commit, and a push instantly busts and rewarms the cache."3956    ],3957    "stats": [3958      { "value": "15", "label": "CLI commands" },3959      { "value": "52", "label": "Weeks of contribution heatmap" },3960      { "value": "200/min", "label": "Public API rate limit" },3961      { "value": "14", "label": "Nightly backups retained" },3962      { "value": "≥ 95", "label": "Lighthouse performance target" },3963      { "value": "0", "label": "Databases — filesystem is the store" }3964    ],3965    "features": [3966      { "icon": "GitBranch", "title": "Git Smart HTTP v2", "description": "Streamed upload-pack and receive-pack with anonymous clone and token-gated push, packfiles never buffered in memory." },3967      { "icon": "Terminal", "title": "spbgit CLI", "description": "One terminal command center for init, create --push, clone --all, status, sync, releases, and a self-diagnosing doctor." },3968      { "icon": "FileText", "title": "GitHub-grade README rendering", "description": "Badges, mermaid diagrams, task lists, footnotes, emoji shortcodes, and relative images all render pixel-perfect in dark and light themes." },3969      { "icon": "Package", "title": "Releases with binary assets", "description": "DMG, pkg, and zip assets attach to git tags, stream to disk with sha256 sidecars, and download publicly per tag." },3970      { "icon": "KeyRound", "title": "PAT-secured writes", "description": "Personal access tokens are argon2id-hashed at rest, revocable, and tracked with last-used timestamps — reads never need an account." },3971      { "icon": "Search", "title": "Global search", "description": "A cache-backed inverted index searches repo names, descriptions, topics, and README content, refreshed on every push." },3972      { "icon": "Braces", "title": "JSON API", "description": "Public reads and bearer-token writes at /api/v1 cover repos, languages, commits, tokens, and site-wide stats." },3973      { "icon": "Database", "title": "Filesystem as the database", "description": "Bare repos are the source of truth, meta.json holds repo metadata, and every expensive artifact is cached per repo@sha and busted on push." },3974      { "icon": "ShieldCheck", "title": "Hardened by design", "description": "Double path-traversal checks, strict Markdown sanitization, nosniff plus sandbox CSP on raw files, and loopback-only hook routes." }3975    ],3976    "techStack": [3977      { "category": "Server", "items": ["Node.js 20+ (ESM)", "Fastify 5", "zod", "@fastify/rate-limit", "pino"] },3978      { "category": "Rendering", "items": ["Nunjucks SSR", "markdown-it + GFM plugins", "shiki", "mermaid", "satori + resvg OG cards", "sanitize-html"] },3979      { "category": "CLI & Auth", "items": ["commander", "picocolors", "native fetch", "argon2 PAT hashing"] },3980      { "category": "Ops", "items": ["pm2", "ngrok custom domain", "vitest e2e", "eslint", "nightly backup cron"] }3981    ],3982    "architecture": [3983      { "title": "Ingress via ngrok", "description": "The public domain git.spboucher.ai terminates TLS at an ngrok tunnel and forwards to the Fastify app on the host node." },3984      { "title": "One server, four surfaces", "description": "Fastify routes every request to the SSR web UI, the /api/v1 JSON API, the /:repo.git Smart HTTP backend, or raw/archive file serving." },3985      { "title": "Filesystem as source of truth", "description": "Bare repositories live under the git root, a single meta.json indexes descriptions, topics, and pins — no database process exists." },3986      { "title": "Push-driven cache lifecycle", "description": "A post-receive hook hits a loopback-only route that busts caches, recomputes language stats, rewarms the README render, logs the activity feed, and regenerates the OG image." },3987      { "title": "Resilient operations", "description": "pm2 keeps the server and tunnel alive across reboots, /healthz feeds monitoring, and a nightly cron archives repos and data, keeping 14 backups." }3988    ],3989    "highlights": [3990      "Implements the Git Smart HTTP protocol by hand — clone works for any stranger, push is rejected without a PAT",3991      "Zero databases: bare git repos plus one meta.json, cached per commit SHA and invalidated by push hooks",3992      "README rendering built to be indistinguishable from GitHub, badges and mermaid included",3993      "spbgit sync commits, rebases, and pushes every workspace repo in one command",3994      "GitHub-style releases serve DMG downloads for the entire Zyquo app suite",3995      "SSR pages with self-hosted fonts and no render-blocking third-party requests, targeting Lighthouse 95+"3996    ]3997  },3998  {3999    "slug": "spbdrive",4000    "hero": {4001      "headline": "Your files, your server, zero compromises",4002      "subheadline": "A private, self-hosted cloud drive that previews everything, shares anything, and never phones home."4003    },4004    "overview": [4005      "SPB Drive is a self-hosted Google Drive and Dropbox replacement designed for exactly one user. The entire drive sits behind a single argon2id-hashed password; the only public surfaces are share links you explicitly create. It runs live at drive.spboucher.ai from a Fastify server on a Mac Studio node, exposed through an ngrok custom domain.",4006      "At its core is a content-addressed blob store: every file is stored once by its sha256 hash, so identical files cost nothing extra, while a SQLite database (WAL mode, FTS5) maps the virtual folder tree onto blobs. Uploads are chunked and resumable in 8 MB slices, entire folder trees drag-and-drop with hierarchy preserved, and everything streams — nothing is ever buffered whole in memory.",4007      "Beyond storage, it is a universal previewer and a sharing machine. Video transcodes in the background to play anywhere, Office documents convert to PDF via headless LibreOffice, archives are browsable from the inside, and code highlights in 100+ languages. Any file or folder becomes a clean public URL with optional expiry, password, and download limits — and v2.0 added file versioning, an in-browser text editor, inbound file requests, and storage insights."4008    ],4009    "stats": [4010      { "value": "27", "label": "Tests passing" },4011      { "value": "100+", "label": "Code languages highlighted" },4012      { "value": "8 MB", "label": "Resumable upload chunks" },4013      { "value": "20", "label": "Versions kept per file" },4014      { "value": "30 days", "label": "Trash retention" },4015      { "value": "0", "label": "Third-party requests" }4016    ],4017    "features": [4018      { "icon": "HardDrive", "title": "Content-addressed vault", "description": "Files are stored once by sha256 hash for free deduplication, organized in unlimited nested folders with tags, stars, and folder colors." },4019      { "icon": "Eye", "title": "Universal previewer", "description": "Images, video, audio waveforms, PDF, Office-to-PDF, code, Markdown, CSV, notebooks, archives, fonts, and email all preview in-browser — with an elegant fallback for everything else." },4020      { "icon": "Globe", "title": "Sharing machine", "description": "Any file or folder becomes an unguessable base58 URL with optional expiry, argon2 password, download limits, QR codes, Open Graph unfurls, and instant revocation." },4021      { "icon": "Search", "title": "Full-content search", "description": "SQLite FTS5 indexes names, tags, and extracted file contents — it finds a word inside an uploaded PDF." },4022      { "icon": "GitBranch", "title": "File versioning", "description": "Replacing or editing a file archives the previous content, up to 20 CAS-backed versions per file, browsable and restorable from the Info panel." },4023      { "icon": "RefreshCw", "title": "Resumable uploads", "description": "Chunked 8 MB uploads survive interruptions and resume where they left off, with drag-drop of entire folder trees and paste-to-upload." },4024      { "icon": "PenTool", "title": "In-browser editor", "description": "Edit code, Markdown, JSON, or CSV directly in the drive, with every save archived as a new version." },4025      { "icon": "Terminal", "title": "Companion CLI", "description": "The spbdrive CLI handles list, upload, download, share, search, and one-way push sync from any terminal via API-token auth." },4026      { "icon": "ShieldCheck", "title": "Hardened by default", "description": "Argon2id auth with lockout, hashed session ids, CSRF protection, sandboxed previews, and a strict self-only CSP with no third-party requests anywhere." }4027    ],4028    "techStack": [4029      { "category": "Server", "items": ["Node.js 20+ (ESM)", "Fastify 5", "better-sqlite3 (WAL + FTS5)", "Nunjucks SSR", "pino", "zod"] },4030      { "category": "Media & Previews", "items": ["sharp", "ffmpeg", "LibreOffice headless", "pdf.js", "Shiki", "wavesurfer.js", "SheetJS", "pdftotext"] },4031      { "category": "Security", "items": ["argon2id", "signed base58 tokens", "double-submit CSRF", "CSP default-src 'self'", "sandboxed SVG/HTML"] },4032      { "category": "Ops", "items": ["pm2", "ngrok custom domain", "rsync --link-dest backups", "vitest", "ESLint"] }4033    ],4034    "architecture": [4035      { "title": "Edge & auth", "description": "An ngrok tunnel terminates TLS at drive.spboucher.ai and forwards to a Fastify server; every route except login, share pages, and healthz requires a session backed by a single argon2id-hashed password with per-IP lockout." },4036      { "title": "Content-addressed storage", "description": "Uploads stream in 8 MB resumable chunks and are sha256-hashed into a content-addressed blob store, so identical bytes are stored exactly once; a SQLite nodes table maps the virtual folder tree onto blobs and garbage-collects at refcount zero." },4037      { "title": "Preview pipeline", "description": "A small in-process job queue (concurrency 2) produces thumbnails, H.264 video transcodes, and LibreOffice PDF conversions, all cached by blob hash — each unique file is processed once, ever." },4038      { "title": "Sharing & search", "description": "Signed base58 tokens serve polished public share pages with expiry, passwords, download caps, and ZIP-all folder streaming, while an FTS5 index over names, tags, and extracted text powers instant full-content search." },4039      { "title": "Operations", "description": "pm2 keeps the server and tunnel alive across reboots; a nightly 02:30 backup writes a SQLite snapshot plus hardlinked blob copies, retaining 14 dailies and 8 weeklies, with a documented and tested restore procedure." }4040    ],4041    "highlights": [4042      "Previews virtually everything — mkv transcodes to H.264, Office converts to PDF, archives browse from the inside, and unknowns get a graceful fallback card",4043      "Zero third-party requests anywhere: fonts, pdf.js, and wavesurfer are all self-hosted behind a strict CSP",4044      "Content-addressed storage makes deduplication free — identical files and file versions cost zero extra bytes",4045      "Search reaches inside file contents: PDFs, Office documents, and code are text-extracted and FTS5-indexed",4046      "Full companion CLI with chunked uploads, share management, and one-way push sync",4047      "Nightly hardlink-deduplicated backups with a restore procedure that has actually been tested"4048    ]4049  },4050  {4051    "slug": "svgarden",4052    "hero": {4053      "headline": "Copy-ready SVG + CSS animations, taught properly",4054      "subheadline": "A searchable, zero-dependency bank of 74 self-contained animations where every snippet ships with a live customizer and a short lesson on how it works."4055    },4056    "overview": [4057      "SVGarden is a static-first web platform hosting a large, ever-growing library of SVG and CSS animations. Every animation is one self-contained .html file: paste it into a blank page and it works — no frameworks, no CDNs, no build step required by the snippets themselves. Each one carries a short \"How it works\" lesson, so the bank doubles as a course in modern SVG and CSS technique.",4058      "The bank currently holds 74 snippets across 14 categories — loaders, filters, backgrounds, scroll-driven scenes, charts, motion paths, text effects, and more — teaching 177 distinct techniques from feTurbulence and goo filters to @property sweeps, animation-timeline, and SMIL morphing. 67 of the 74 snippets need zero JavaScript, and cutting-edge CSS always sits behind @supports with a graceful static fallback and a documented browser-support caveat.",4059      "The platform is engineered to scale by design: adding an animation means adding one file, and the gallery, detail pages, category pages, search index, and tag filters all regenerate at build time. A validation script enforces attribution headers, YAML frontmatter, class scoping, self-containment, and a 150-line size cap on every build — and the site itself scores a perfect 100/100 on Lighthouse performance and accessibility."4060    ],4061    "stats": [4062      { "value": "74", "label": "Copy-ready snippets" },4063      { "value": "14", "label": "Categories" },4064      { "value": "177", "label": "Distinct techniques taught" },4065      { "value": "100/100", "label": "Lighthouse perf & accessibility" },4066      { "value": "90%", "label": "JavaScript-free snippets (67/74)" },4067      { "value": "0", "label": "Dependencies for visitors" }4068    ],4069    "features": [4070      { "icon": "Package", "title": "Self-contained snippets", "description": "Every animation is one .html file with inline styles that renders correctly when pasted into a blank page — no external assets, ever." },4071      { "icon": "Search", "title": "Instant client-side search", "description": "Lazy-loaded Fuse.js searches titles, tags, and techniques with category and difficulty filters, all on a fully static site." },4072      { "icon": "Palette", "title": "Live customizer", "description": "Controls auto-generated from each snippet's frontmatter tweak --sg-* custom properties in real time and rewrite the code block and clipboard output to match." },4073      { "icon": "BookOpen", "title": "A lesson in every snippet", "description": "Each animation ships with a genuine \"How it works\" explanation, turning the bank into a hands-on classroom for 177 techniques." },4074      { "icon": "Sparkles", "title": "Cutting-edge CSS, safely", "description": "Modern features like @property, animation-timeline, :has(), and linear() sit behind @supports with static fallbacks and rendered browser-support notes." },4075      { "icon": "ShieldCheck", "title": "Validation that fails the build", "description": "A validation script enforces attribution headers, frontmatter, sg- class scoping, self-containment, and the 150-line cap on all 74 snippets before Astro builds." },4076      { "icon": "Zap", "title": "Zero runtime cost", "description": "Astro emits pure static pages with Shiki highlighting done at build time, hitting 100/100 Lighthouse performance and accessibility." },4077      { "icon": "Eye", "title": "Accessible by rule", "description": "Every SVG is either aria-hidden or given role=\"img\" with a title, and all snippets are dark/light safe by design." },4078      { "icon": "Rocket", "title": "One-command deploys", "description": "A deploy script syncs to the node, runs npm ci and the build, restarts pm2, and health-checks both the local server and the public domain." }4079    ],4080    "techStack": [4081      { "category": "Site & Build", "items": ["Astro 5 (static output)", "Shiki build-time syntax highlighting", "Vanilla CSS with custom properties", "Node.js ≥ 20"] },4082      { "category": "Search & Snippets", "items": ["Fuse.js (lazy-loaded, client-side)", "YAML-in-comment frontmatter", "CSS custom properties (--sg-*)", "validate-snippets.mjs quality gate"] },4083      { "category": "Serving & Ops", "items": ["Express with gzip/brotli and immutable caching", "pm2 (svgarden-web + svgarden-tunnel)", "ngrok reserved domain (www.svgarden.dev)", "/healthz build-info endpoint"] }4084    ],4085    "architecture": [4086      { "title": "One file per animation", "description": "Each snippet lives at snippets/<category>/<slug>.html with an attribution header, YAML frontmatter (title, tags, difficulty, techniques, how_it_works, customizable), and the raw self-contained markup and CSS." },4087      { "title": "Validation gate", "description": "validate-snippets.mjs runs before every build and fails it if any of the 74 snippets breaks the rules: headers, frontmatter, sg- scoping, self-containment, or the 150-line cap." },4088      { "title": "Static generation", "description": "A single parser (src/lib/snippets.mjs) feeds Astro, which regenerates the gallery, per-snippet detail pages, category pages, tag filters, and the Fuse.js search index — 84 pages per build, never edited by hand." },4089      { "title": "Interactive layer", "description": "Detail pages pair a sandboxed live preview with a customizer whose controls come straight from frontmatter; changes update the preview, the Shiki-highlighted code block, and the copy/download output with attribution attached." },4090      { "title": "Production serving", "description": "An Express server (server.mjs) serves dist/ with compression and cache headers, kept alive by pm2 alongside an ngrok tunnel exposing https://www.svgarden.dev, with /healthz checks wired into deploy.sh." }4091    ],4092    "highlights": [4093      "74 snippets teaching 177 distinct techniques across 14 categories — average snippet is just 57 lines",4094      "Perfect 100/100 Lighthouse scores for both performance and accessibility",4095      "90% of snippets (67/74) need zero JavaScript — and visitors need zero dependencies",4096      "Every copied snippet works pasted into a blank .html file, paste-tested per batch",4097      "Adding an animation is adding one file: 84 pages, search index, and filters regenerate at build time",4098      "The site eats its own dog food — vanilla CSS and custom properties, no Tailwind, no third-party trackers"4099    ]4100  }4101];4102