diff --git a/apps/web/src/app/example/layout.tsx b/apps/web/src/app/example/layout.tsx new file mode 100644 index 0000000..89088e1 --- /dev/null +++ b/apps/web/src/app/example/layout.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Live example · LearnKit AI', + description: + 'See render a real AI learning path in your browser — no backend, no LLM, fully deterministic.', +}; + +export default function ExampleLayout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/apps/web/src/app/not-found.tsx b/apps/web/src/app/not-found.tsx new file mode 100644 index 0000000..5693dea --- /dev/null +++ b/apps/web/src/app/not-found.tsx @@ -0,0 +1,112 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { Nav } from '@/components/layout/Nav'; +import { Footer } from '@/components/layout/Footer'; + +export const metadata: Metadata = { + title: '404 — Page not found · LearnKit AI', +}; + +export default function NotFound() { + return ( +
+
+ ); +} diff --git a/apps/web/src/app/opengraph-image.tsx b/apps/web/src/app/opengraph-image.tsx index 25b801b..c0d5570 100644 --- a/apps/web/src/app/opengraph-image.tsx +++ b/apps/web/src/app/opengraph-image.tsx @@ -1,7 +1,7 @@ import { ImageResponse } from 'next/og'; export const runtime = 'edge'; -export const alt = 'LearnKit AI — The AI workbench for teams that ship'; +export const alt = 'LearnKit AI — Open-source AI learning paths for every role'; export const size = { width: 1200, height: 630 }; export const contentType = 'image/png'; @@ -35,16 +35,15 @@ export default function OGImage() {
- Make your team + Personalized AI paths
- good at AI by{' '} - Friday. + for every role.
- The AI workbench for teams that ship. Learn Claude, Cursor, ChatGPT and 40+ tools by - building real things at work. + Open-source TypeScript engine for embedding role-aware AI learning paths in any product. + No API key. No backend. No paid tier.
@@ -70,11 +69,11 @@ export default function OGImage() { >
learnkit-ai.com
- Open source - · Apache-2.0 · - TypeScript + Next.js + @learnkit-ai/core + · + @learnkit-ai/react
diff --git a/apps/web/src/components/developers/CodeBlock.tsx b/apps/web/src/components/developers/CodeBlock.tsx index bbc7eeb..d5b5f5d 100644 --- a/apps/web/src/components/developers/CodeBlock.tsx +++ b/apps/web/src/components/developers/CodeBlock.tsx @@ -60,12 +60,20 @@ function highlight(line: string) { export function CodeBlock() { const [tab, setTab] = useState('install'); const [step, setStep] = useState(0); + const [copied, setCopied] = useState(false); useEffect(() => { const id = setInterval(() => setStep((s) => (s + 1) % 4), 2200); return () => clearInterval(id); }, []); + function handleCopy() { + navigator.clipboard.writeText(SNIPPETS[tab]).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 1800); + }).catch(() => undefined); + } + return (
diff --git a/apps/web/src/components/layout/Footer.tsx b/apps/web/src/components/layout/Footer.tsx index b13cee7..f9b6de1 100644 --- a/apps/web/src/components/layout/Footer.tsx +++ b/apps/web/src/components/layout/Footer.tsx @@ -34,9 +34,9 @@ const LINKS: FooterCol[] = [ { h: 'Developers', l: [ - { label: 'Docs', href: '/developers' }, - { label: 'API reference', href: '/developers#endpoints' }, - { label: 'SDKs · GitHub', href: 'https://github.com/learnkit-ai/learnkit' }, + { label: 'Docs', href: '/docs' }, + { label: 'API reference', href: '/developers' }, + { label: 'GitHub', href: 'https://github.com/learnkit-ai/learnkit' }, { label: 'Blog', href: '/blog' }, ], }, @@ -69,7 +69,7 @@ export function Footer() { maxWidth: 280, }} > - The AI workbench for teams that ship. + Open-source TypeScript engine for embedding personalized AI learning paths. Apache-2.0.

{LINKS.map((col) => ( @@ -113,9 +113,9 @@ export function Footer() { © 2026 LearnKit AI, Inc. · learnkit-ai.com
- {['Privacy', 'Terms', 'Security', 'Apache-2.0'].map((item) => ( - {item} - ))} + Security + Apache-2.0 + Contributing