diff --git a/personal-site/src/app/page.tsx b/personal-site/src/app/page.tsx
index 022fe1d..baa3c5e 100644
--- a/personal-site/src/app/page.tsx
+++ b/personal-site/src/app/page.tsx
@@ -2,6 +2,7 @@ import Link from 'next/link'
import { Button } from '@/components/Button'
import { Card } from '@/components/Card'
import { Container } from '@/components/Container'
+import { ProjectOutboundLinks } from '@/components/ProjectOutboundLinks'
import {
GitHubIcon,
LinkedInIcon,
@@ -120,21 +121,14 @@ function FeaturedProjectCard({ project }: { project: FeaturedProject }) {
return (
Project
- {project.name}
+ {project.name}
{project.description}
-
-
{project.label}
- {project.extraLink ? (
-
- {project.extraLink.label}
-
- ) : null}
-
+
)
}
@@ -330,10 +324,11 @@ export default async function Home() {
Featured projects
- ClawQL, CoachellaPlus, and gRPC MCP Transport.
+ MCP stack, libraries, gateways, and product PWAs — use the icons for
+ GitHub, npm, or the live site when each exists.
-
+
{featuredProjects.map((project) => (
))}
diff --git a/personal-site/src/app/projects/page.tsx b/personal-site/src/app/projects/page.tsx
index bb7d041..5a183c3 100644
--- a/personal-site/src/app/projects/page.tsx
+++ b/personal-site/src/app/projects/page.tsx
@@ -1,21 +1,10 @@
import { type Metadata } from 'next'
import { Card } from '@/components/Card'
+import { ProjectOutboundLinks } from '@/components/ProjectOutboundLinks'
import { SimpleLayout } from '@/components/SimpleLayout'
-import { GitHubIcon } from '@/components/SocialIcons'
import { featuredRepos } from '@/lib/site'
-function LinkIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
- return (
-
-
-
- )
-}
-
export const metadata: Metadata = {
title: 'Projects',
description:
@@ -25,8 +14,8 @@ export const metadata: Metadata = {
export default function Projects() {
return (
{featuredRepos.map((project) => (
-
-
-
{project.highlight ? (
-
+
AI / agents
) : null}
-
- {project.name}
+
+ {project.name}
{project.description}
-
-
- {project.label}
-
+
))}
diff --git a/personal-site/src/components/ProjectOutboundLinks.tsx b/personal-site/src/components/ProjectOutboundLinks.tsx
new file mode 100644
index 0000000..61abda3
--- /dev/null
+++ b/personal-site/src/components/ProjectOutboundLinks.tsx
@@ -0,0 +1,72 @@
+import Link from 'next/link'
+import clsx from 'clsx'
+
+import { GitHubIcon, GlobeIcon, NpmIcon } from '@/components/SocialIcons'
+
+export type ProjectOutbound = {
+ github: string | null
+ npm: string | null
+ live: string | null
+}
+
+const base =
+ 'relative z-10 flex h-10 w-10 items-center justify-center rounded-full border border-zinc-200/80 bg-white shadow-sm transition dark:border-zinc-600 dark:bg-zinc-800'
+
+const hoverTeal =
+ 'hover:border-teal-500/50 hover:text-teal-600 dark:hover:border-teal-500/50 dark:hover:text-teal-400'
+
+/**
+ * Up to three outbound links (GitHub, npm, live site) with icons — only renders anchors that are set.
+ */
+export function ProjectOutboundLinks({
+ github,
+ npm,
+ live,
+ className,
+}: ProjectOutbound & { className?: string }) {
+ return (
+
+ {github ? (
+
+
+
+ ) : null}
+ {npm ? (
+
+
+
+ ) : null}
+ {live ? (
+
+
+
+ ) : null}
+
+ )
+}
diff --git a/personal-site/src/components/SocialIcons.tsx b/personal-site/src/components/SocialIcons.tsx
index 251913d..ff6d0c4 100644
--- a/personal-site/src/components/SocialIcons.tsx
+++ b/personal-site/src/components/SocialIcons.tsx
@@ -27,6 +27,36 @@ export function GitHubIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
)
}
+/** npm registry mark (simplified logo) */
+export function NpmIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+ )
+}
+
+/** Live site / docs (globe) */
+export function GlobeIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+ )
+}
+
export function LinkedInIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
return (
diff --git a/personal-site/src/lib/site.ts b/personal-site/src/lib/site.ts
index 44d8ecb..4e5336d 100644
--- a/personal-site/src/lib/site.ts
+++ b/personal-site/src/lib/site.ts
@@ -95,18 +95,22 @@ export const workRoles: WorkRole[] = [
export type FeaturedRepo = {
name: string
description: string
- href: string
- label: string
/** Highlight for recruiters (AI / agents / platform) */
highlight: boolean
+ /** Repository or path on GitHub — omit if none */
+ github: string | null
+ /** npm package page — omit if not published */
+ npm: string | null
+ /** Production app, marketing site, or public docs — omit if none */
+ live: string | null
}
export type FeaturedProject = {
name: string
description: string
- href: string
- label: string
- extraLink?: { label: string; href: string }
+ github: string | null
+ npm: string | null
+ live: string | null
}
export type FeaturedLinkedInPost = {
@@ -175,68 +179,122 @@ export const featuredLinkedInPosts: FeaturedLinkedInPost[] = [
},
]
-/** Home page spotlight projects */
+/** Home page spotlight projects (aligned with resume “Open Source and Projects”) */
export const featuredProjects: FeaturedProject[] = [
{
name: 'ClawQL',
description:
'Open-source MCP server: multi-protocol API supergraph (OpenAPI/Swagger/Discovery, optional GraphQL/gRPC), vault memory and bulk ingest, audit/cache, and optional sandbox, scheduling, Slack, HITL, and enterprise search — https://docs.clawql.com.',
- href: 'https://github.com/danielsmithdevelopment/ClawQL',
- label: 'GitHub',
- extraLink: { label: 'Docs', href: 'https://docs.clawql.com' },
+ github: 'https://github.com/danielsmithdevelopment/ClawQL',
+ npm: 'https://www.npmjs.com/package/clawql-mcp',
+ live: 'https://docs.clawql.com',
},
{
name: 'CoachellaPlus',
description:
- 'Full-stack TypeScript product work focused on shipping end-to-end web experiences.',
- href: 'https://github.com/danielsmithdevelopment/CoachellaPlus',
- label: 'GitHub',
+ 'Full-stack festival-planning PWA with hybrid retrieval (SQLite + embeddings + reranking), OpenRouter LLM integration, Tavily fallback, and group coordination — Lighthouse 90+ and deployed via ClawQL to Cloudflare and GitHub APIs.',
+ github: 'https://github.com/danielsmithdevelopment/CoachellaPlus',
+ npm: null,
+ live: 'https://coachellaplus.com',
},
{
- name: 'gRPC MCP Transport',
+ name: 'mcp-grpc-transport',
description:
- 'Production-ready gRPC transport for MCP with streaming, health checks, and enterprise-friendly deployment support.',
- href: 'https://www.npmjs.com/package/mcp-grpc-transport',
- label: 'npm',
- extraLink: {
- label: 'GitHub repo',
- href: 'https://github.com/danielsmithdevelopment/ClawQL',
- },
+ 'TypeScript gRPC transport for MCP: protobuf payloads, unary and bidirectional streaming, grpc.health.v1 probes, mTLS, and Kubernetes-friendly deployment — extends the official MCP SDK beyond stdio and Streamable HTTP.',
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/mcp-grpc-transport',
+ npm: 'https://www.npmjs.com/package/mcp-grpc-transport',
+ live: null,
+ },
+ {
+ name: 'clawql-ouroboros',
+ description:
+ 'Pluggable evolutionary-loop library: typed Executor / Evaluator / Wonder / Reflect phases, ontology convergence gates, Postgres-backed lineage, MCP-shaped hooks, and an optional background seed poller.',
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/clawql-ouroboros',
+ npm: 'https://www.npmjs.com/package/clawql-ouroboros',
+ live: null,
+ },
+ {
+ name: 'panguard-mcp-bridge',
+ description:
+ 'Streamable HTTP MCP gateway (optional gRPC) for /mcp at the edge: Panguard on stdio, upstream clawql-mcp-http, optional JWT (JWKS / Bearer on HTTP and gRPC), Helm mcpProxy integration.',
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/panguard-mcp-bridge',
+ npm: null,
+ live: null,
},
]
-/** Curated from github.com/danielsmithdevelopment — edit to reorder or swap */
+/**
+ * /projects — resume “Open Source and Projects” plus other public repos you still want featured.
+ * Reorder here; `highlight` drives the “AI / agents” eyebrow on the projects page.
+ */
export const featuredRepos: FeaturedRepo[] = [
{
name: 'ClawQL',
description:
'MCP server: search/execute across OpenAPI 3, Swagger 2, and Google Discovery, with optional GraphQL/gRPC upstreams and bundled multi-provider merges (GCP, Cloudflare, GitHub, Slack, document APIs, Onyx, and more). Core tools include vault memory_ingest / memory_recall, audit, cache, and bulk markdown ingest; optional sandbox_exec, schedule, notify (Slack), HITL (Label Studio), Onyx knowledge search, and Ouroboros lineage. stdio, Streamable HTTP, and MCP over gRPC.',
- href: 'https://github.com/danielsmithdevelopment/ClawQL',
- label: 'github.com · TypeScript',
highlight: true,
+ github: 'https://github.com/danielsmithdevelopment/ClawQL',
+ npm: 'https://www.npmjs.com/package/clawql-mcp',
+ live: 'https://docs.clawql.com',
},
{
- name: 'gallery (fork)',
+ name: 'CoachellaPlus',
description:
- 'Exploring on-device ML and GenAI use cases — a gallery to try models locally. Forked to experiment with device-side inference and UX.',
- href: 'https://github.com/danielsmithdevelopment/gallery',
- label: 'github.com · Kotlin',
+ 'Full-stack festival-planning PWA: hybrid retrieval (structured JSON + SQLite embeddings + reranking), OpenRouter LLM, Tavily agentic search with a quality-gated self-improving knowledge base, group chat and live location, set builder with conflict detection, PWA with Lighthouse 90+ including WCAG — deployed via ClawQL to Cloudflare and GitHub APIs.',
highlight: true,
+ github: 'https://github.com/danielsmithdevelopment/CoachellaPlus',
+ npm: null,
+ live: 'https://coachellaplus.com',
},
{
- name: 'CoachellaPlus',
+ name: 'mcp-grpc-transport',
description:
- 'Full-stack TypeScript site and product work — example of shipping end-to-end web experiences alongside infrastructure work.',
- href: 'https://github.com/danielsmithdevelopment/CoachellaPlus',
- label: 'github.com',
- highlight: false,
+ 'First TypeScript/Node.js gRPC transport for the Model Context Protocol: protobuf payloads, unary and bidirectional streaming, grpc.health.v1 probes, mTLS, and enterprise Kubernetes deployment patterns — alongside the official SDK’s stdio and Streamable HTTP.',
+ highlight: true,
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/mcp-grpc-transport',
+ npm: 'https://www.npmjs.com/package/mcp-grpc-transport',
+ live: null,
+ },
+ {
+ name: 'clawql-ouroboros',
+ description:
+ 'Evolutionary loop library: typed Executor, Evaluator, Wonder, and Reflect phases; ontology convergence with stagnation, oscillation, and regression gates; Postgres-backed append-only lineage; InMemoryEventStore for tests; MCP-shaped hooks (createSeedFromDocument, runEvolutionaryLoop, getLineageStatus); optional background seed poller.',
+ highlight: true,
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/clawql-ouroboros',
+ npm: 'https://www.npmjs.com/package/clawql-ouroboros',
+ live: null,
+ },
+ {
+ name: 'panguard-mcp-bridge',
+ description:
+ 'Streamable HTTP MCP gateway (optional gRPC via mcp-grpc-transport): /mcp for clients or a service mesh while Panguard stays on stdio and terminates on remote clawql-mcp-http. Optional JWT (JWKS RS256, Bearer on HTTP and gRPC) and Helm mcpProxy.mode: custom on the clawql-mcp chart.',
+ highlight: true,
+ github:
+ 'https://github.com/danielsmithdevelopment/ClawQL/tree/main/packages/panguard-mcp-bridge',
+ npm: null,
+ live: null,
+ },
+ {
+ name: 'gallery (fork)',
+ description:
+ 'Exploring on-device ML and GenAI use cases — a gallery to try models locally. Forked to experiment with device-side inference and UX.',
+ highlight: true,
+ github: 'https://github.com/danielsmithdevelopment/gallery',
+ npm: null,
+ live: null,
},
{
name: 'DevSecOps-boilerplate',
description:
'Golden images, Ansible, Terraform, and GitHub Actions patterns for secure, repeatable infrastructure automation.',
- href: 'https://github.com/danielsmithdevelopment/DevSecOps-boilerplate',
- label: 'github.com · Go',
highlight: false,
+ github: 'https://github.com/danielsmithdevelopment/DevSecOps-boilerplate',
+ npm: null,
+ live: null,
},
]