Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ jobs:
pnpm --filter @learnkit-ai/schemas typecheck
pnpm --filter @learnkit-ai/core typecheck
pnpm --filter @learnkit-ai/react typecheck
pnpm --filter @learnkit-ai/cli typecheck

- name: Typecheck apps/web
run: pnpm --filter @learnkit-ai/web typecheck
Expand All @@ -48,6 +49,7 @@ jobs:
pnpm --filter @learnkit-ai/schemas test
pnpm --filter @learnkit-ai/core test
pnpm --filter @learnkit-ai/react test
pnpm --filter @learnkit-ai/cli test

build:
name: Build packages + apps/web
Expand All @@ -69,6 +71,7 @@ jobs:
pnpm --filter @learnkit-ai/schemas build
pnpm --filter @learnkit-ai/core build
pnpm --filter @learnkit-ai/react build
pnpm --filter @learnkit-ai/cli build

- name: Build apps/web
run: pnpm --filter @learnkit-ai/web build
Expand Down
174 changes: 174 additions & 0 deletions apps/web/src/app/changelog/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
import type { Metadata } from 'next';
import { Nav } from '@/components/layout/Nav';
import { Footer } from '@/components/layout/Footer';
import { Eyebrow } from '@/components/ui/primitives';
import { CHANGELOG, KIND_COLORS } from '@/lib/changelog-data';
import { SITE_URL } from '@/lib/seo-data';

export const metadata: Metadata = {
title: 'Changelog · LearnKit AI',
description:
'What shipped and when. Every notable change to @learnkit-ai/core, @learnkit-ai/react, and the LearnKit AI web app.',
alternates: { canonical: '/changelog' },
openGraph: {
type: 'website',
url: `${SITE_URL}/changelog`,
title: 'Changelog · LearnKit AI',
description: 'What shipped and when. Every notable change to the LearnKit AI packages.',
siteName: 'LearnKit AI',
},
};

export default function ChangelogPage() {
return (
<main
className="paper-grain"
style={{ background: 'var(--paper)', minHeight: '100vh', display: 'flex', flexDirection: 'column' }}
>
<Nav />

<div
className="lk-section-pad"
style={{ flex: 1, maxWidth: 860, margin: '0 auto', width: '100%', padding: '72px 56px 96px' }}
>
<Eyebrow>Changelog</Eyebrow>
<h1
className="serif"
style={{
fontSize: 52,
lineHeight: 1.05,
letterSpacing: '-0.03em',
fontWeight: 400,
margin: '18px 0 12px',
}}
>
What shipped.
</h1>
<p style={{ fontSize: 16, color: 'var(--ink-soft)', lineHeight: 1.6, marginBottom: 56, maxWidth: 520 }}>
Every notable change to{' '}
<code style={{ fontFamily: 'var(--mono)', fontSize: 13, background: 'var(--paper-2)', padding: '1px 5px', borderRadius: 4 }}>
@learnkit-ai/core
</code>
,{' '}
<code style={{ fontFamily: 'var(--mono)', fontSize: 13, background: 'var(--paper-2)', padding: '1px 5px', borderRadius: 4 }}>
@learnkit-ai/react
</code>
, and the web app.{' '}
<a
href="https://github.com/learnkit-ai/learnkit/blob/main/CHANGELOG.md"
target="_blank"
rel="noopener noreferrer"
style={{ color: 'var(--accent)', textDecoration: 'none' }}
>
View on GitHub →
</a>
</p>

<div style={{ display: 'flex', flexDirection: 'column', gap: 48 }}>
{CHANGELOG.map((version) => (
<section key={version.version}>
{/* Version header */}
<div
style={{
display: 'flex',
alignItems: 'baseline',
gap: 16,
marginBottom: 20,
paddingBottom: 14,
borderBottom: '1px solid var(--rule)',
}}
>
<h2
className="serif"
style={{
fontSize: 26,
fontWeight: 500,
letterSpacing: '-0.02em',
margin: 0,
}}
>
{version.version === 'Unreleased' ? 'Unreleased' : `v${version.version}`}
</h2>
{version.date && (
<time
dateTime={version.date}
style={{
fontSize: 12,
fontFamily: 'var(--mono)',
color: 'var(--muted)',
textTransform: 'uppercase',
letterSpacing: '0.08em',
}}
>
{new Date(version.date).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric',
})}
</time>
)}
{version.version === 'Unreleased' && (
<span
style={{
fontSize: 11,
fontFamily: 'var(--mono)',
background: 'rgba(200,71,42,0.1)',
color: 'var(--accent)',
padding: '2px 8px',
borderRadius: 999,
letterSpacing: '0.06em',
}}
>
in progress
</span>
)}
</div>

{/* Change entries */}
<ul style={{ listStyle: 'none', padding: 0, margin: 0, display: 'flex', flexDirection: 'column', gap: 8 }}>
{version.entries.map((entry, i) => {
const style = KIND_COLORS[entry.kind];
return (
<li
key={i}
style={{
display: 'flex',
gap: 12,
alignItems: 'flex-start',
fontSize: 14.5,
lineHeight: 1.55,
color: 'var(--ink)',
}}
>
<span
style={{
flexShrink: 0,
marginTop: 2,
fontSize: 11,
fontFamily: 'var(--mono)',
background: style.bg,
color: style.color,
padding: '2px 7px',
borderRadius: 5,
letterSpacing: '0.04em',
fontWeight: 500,
minWidth: 56,
textAlign: 'center',
}}
>
{entry.kind}
</span>
<span style={{ color: 'var(--ink-soft)' }}>{entry.text}</span>
</li>
);
})}
</ul>
</section>
))}
</div>
</div>

<Footer />
</main>
);
}
2 changes: 1 addition & 1 deletion apps/web/src/app/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export default function manifest(): MetadataRoute.Manifest {
name: 'LearnKit AI',
short_name: 'LearnKit',
description:
'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 personalized, role-aware AI learning paths in any product. Apache-2.0.',
start_url: '/',
display: 'standalone',
background_color: '#FAF7F0',
Expand Down
9 changes: 5 additions & 4 deletions apps/web/src/app/responsive.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
.lk-workbench-grid { grid-template-columns: 200px 1fr !important; }
.lk-workbench-chat { display: none !important; }

/* Nav: hide some links */
.lk-nav-links a:nth-child(n+5) { display: none !important; }
/* Nav: hide last two links on tablet */
.lk-nav-links a:nth-child(n+4) { display: none !important; }

/* Hero typography */
.lk-hero-title { font-size: 56px !important; }
Expand Down Expand Up @@ -65,8 +65,9 @@
/* Mobile nav */
.lk-nav { padding: 14px 20px !important; }
.lk-nav-links { display: none !important; }
.lk-nav-cta { gap: 6px !important; }
.lk-nav-cta .lk-nav-cta-secondary { display: none !important; }
.lk-nav-cta { display: none !important; }
.lk-nav-hamburger { display: flex !important; }
.lk-nav-mobile-menu { display: flex !important; }

.lk-subnav { flex-wrap: wrap !important; gap: 12px !important; padding: 14px 20px !important; }
.lk-subnav-links { display: none !important; }
Expand Down
1 change: 1 addition & 0 deletions apps/web/src/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
{ url: `${SITE_URL}/tools`, lastModified: now, changeFrequency: 'weekly', priority: 0.8 },
{ url: `${SITE_URL}/roles`, lastModified: now, changeFrequency: 'weekly', priority: 0.75 },
{ url: `${SITE_URL}/blog`, lastModified: now, changeFrequency: 'weekly', priority: 0.7 },
{ url: `${SITE_URL}/changelog`, lastModified: now, changeFrequency: 'weekly', priority: 0.65 },
];

const toolPages: MetadataRoute.Sitemap = TOOLS.map((t) => ({
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/layout/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ const LINKS: FooterCol[] = [
l: [
{ label: 'Docs', href: '/docs' },
{ label: 'API reference', href: '/developers' },
{ label: 'Changelog', href: '/changelog' },
{ label: 'GitHub', href: 'https://github.com/learnkit-ai/learnkit' },
{ label: 'Blog', href: '/blog' },
],
},
];
Expand Down
Loading
Loading