Spaces:
Runtime error
Runtime error
Hanzo Dev commited on
Commit ·
66f6f76
0
Parent(s):
Initial commit for changelog template
Browse files- .gitignore +10 -0
- Dockerfile +21 -0
- README.md +41 -0
- app/favicon.ico +0 -0
- app/globals.css +155 -0
- app/layout.tsx +47 -0
- app/metadata.ts +40 -0
- app/opengraph-image.tsx +48 -0
- app/page.tsx +115 -0
- changelog/content/2025-05-23.mdx +48 -0
- changelog/content/2025-06-15.mdx +44 -0
- changelog/content/2025-06-30.mdx +53 -0
- pnpm-lock.yaml +0 -0
- postcss.config.mjs +5 -0
.gitignore
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
node_modules
|
| 2 |
+
.next
|
| 3 |
+
.cache
|
| 4 |
+
dist
|
| 5 |
+
build
|
| 6 |
+
.DS_Store
|
| 7 |
+
*.log
|
| 8 |
+
.env.local
|
| 9 |
+
.env.*.local
|
| 10 |
+
*.tsbuildinfo
|
Dockerfile
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM node:20-slim
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
# Copy package files
|
| 6 |
+
COPY package*.json ./
|
| 7 |
+
|
| 8 |
+
# Install dependencies
|
| 9 |
+
RUN npm ci --only=production
|
| 10 |
+
|
| 11 |
+
# Copy application files
|
| 12 |
+
COPY . .
|
| 13 |
+
|
| 14 |
+
# Build the application
|
| 15 |
+
RUN npm run build
|
| 16 |
+
|
| 17 |
+
# Expose port
|
| 18 |
+
EXPOSE 3000
|
| 19 |
+
|
| 20 |
+
# Start the application
|
| 21 |
+
CMD ["npm", "start"]
|
README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: changelog Template
|
| 3 |
+
emoji: 🚀
|
| 4 |
+
colorFrom: gray
|
| 5 |
+
colorTo: black
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 3000
|
| 8 |
+
pinned: true
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# changelog Template
|
| 12 |
+
|
| 13 |
+
A Hanzo template for building modern applications.
|
| 14 |
+
|
| 15 |
+
## Features
|
| 16 |
+
- Built with @hanzo/ui
|
| 17 |
+
- Fully responsive
|
| 18 |
+
- TypeScript support
|
| 19 |
+
- Tailwind CSS styling
|
| 20 |
+
- shadcn/ui components
|
| 21 |
+
|
| 22 |
+
## Installation
|
| 23 |
+
|
| 24 |
+
```bash
|
| 25 |
+
npx create-hanzo-app --template changelog
|
| 26 |
+
```
|
| 27 |
+
|
| 28 |
+
## Development
|
| 29 |
+
|
| 30 |
+
```bash
|
| 31 |
+
npm install
|
| 32 |
+
npm run dev
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
## Build
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
npm run build
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
Check out the [Hanzo Template Gallery](https://huggingface.co/spaces/hanzoai/gallery) for more templates.
|
app/favicon.ico
ADDED
|
|
app/globals.css
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import "tailwindcss";
|
| 2 |
+
@import "tw-animate-css";
|
| 3 |
+
@import 'fumadocs-ui/css/neutral.css';
|
| 4 |
+
@import 'fumadocs-ui/css/preset.css';
|
| 5 |
+
|
| 6 |
+
@custom-variant dark (&:is(.dark *));
|
| 7 |
+
|
| 8 |
+
@theme inline {
|
| 9 |
+
--color-background: var(--background);
|
| 10 |
+
--color-foreground: var(--foreground);
|
| 11 |
+
--color-sidebar-ring: var(--sidebar-ring);
|
| 12 |
+
--color-sidebar-border: var(--sidebar-border);
|
| 13 |
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
| 14 |
+
--color-sidebar-accent: var(--sidebar-accent);
|
| 15 |
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
| 16 |
+
--color-sidebar-primary: var(--sidebar-primary);
|
| 17 |
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
| 18 |
+
--color-sidebar: var(--sidebar);
|
| 19 |
+
--color-chart-5: var(--chart-5);
|
| 20 |
+
--color-chart-4: var(--chart-4);
|
| 21 |
+
--color-chart-3: var(--chart-3);
|
| 22 |
+
--color-chart-2: var(--chart-2);
|
| 23 |
+
--color-chart-1: var(--chart-1);
|
| 24 |
+
--color-ring: var(--ring);
|
| 25 |
+
--color-input: var(--input);
|
| 26 |
+
--color-border: var(--border);
|
| 27 |
+
--color-destructive: var(--destructive);
|
| 28 |
+
--color-accent-foreground: var(--accent-foreground);
|
| 29 |
+
--color-accent: var(--accent);
|
| 30 |
+
--color-muted-foreground: var(--muted-foreground);
|
| 31 |
+
--color-muted: var(--muted);
|
| 32 |
+
--color-secondary-foreground: var(--secondary-foreground);
|
| 33 |
+
--color-secondary: var(--secondary);
|
| 34 |
+
--color-primary-foreground: var(--primary-foreground);
|
| 35 |
+
--color-primary: var(--primary);
|
| 36 |
+
--color-popover-foreground: var(--popover-foreground);
|
| 37 |
+
--color-popover: var(--popover);
|
| 38 |
+
--color-card-foreground: var(--card-foreground);
|
| 39 |
+
--color-card: var(--card);
|
| 40 |
+
--radius-sm: calc(var(--radius) - 4px);
|
| 41 |
+
--radius-md: calc(var(--radius) - 2px);
|
| 42 |
+
--radius-lg: var(--radius);
|
| 43 |
+
--radius-xl: calc(var(--radius) + 4px);
|
| 44 |
+
--animate-accordion-down: accordion-down 0.2s ease-out;
|
| 45 |
+
--animate-accordion-up: accordion-up 0.2s ease-out;
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
@keyframes accordion-down {
|
| 49 |
+
from {
|
| 50 |
+
height: 0;
|
| 51 |
+
}
|
| 52 |
+
to {
|
| 53 |
+
height: var(--radix-accordion-content-height);
|
| 54 |
+
}
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
@keyframes accordion-up {
|
| 58 |
+
from {
|
| 59 |
+
height: var(--radix-accordion-content-height);
|
| 60 |
+
}
|
| 61 |
+
to {
|
| 62 |
+
height: 0;
|
| 63 |
+
}
|
| 64 |
+
}
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
:root {
|
| 68 |
+
--font-sans: var(--font-geist-sans);
|
| 69 |
+
--font-mono: var(--font-geist-mono);
|
| 70 |
+
--radius: 0.625rem;
|
| 71 |
+
--background: oklch(1 0 0);
|
| 72 |
+
--foreground: oklch(0.145 0 0);
|
| 73 |
+
--card: oklch(1 0 0);
|
| 74 |
+
--card-foreground: oklch(0.145 0 0);
|
| 75 |
+
--popover: oklch(1 0 0);
|
| 76 |
+
--popover-foreground: oklch(0.145 0 0);
|
| 77 |
+
--primary: oklch(0.205 0 0);
|
| 78 |
+
--primary-foreground: oklch(0.985 0 0);
|
| 79 |
+
--secondary: oklch(0.97 0 0);
|
| 80 |
+
--secondary-foreground: oklch(0.205 0 0);
|
| 81 |
+
--muted: oklch(0.97 0 0);
|
| 82 |
+
--muted-foreground: oklch(0.556 0 0);
|
| 83 |
+
--accent: oklch(0.97 0 0);
|
| 84 |
+
--accent-foreground: oklch(0.205 0 0);
|
| 85 |
+
--destructive: oklch(0.577 0.245 27.325);
|
| 86 |
+
--border: oklch(0.922 0 0);
|
| 87 |
+
--input: oklch(0.922 0 0);
|
| 88 |
+
--ring: oklch(0.708 0 0);
|
| 89 |
+
--chart-1: oklch(0.646 0.222 41.116);
|
| 90 |
+
--chart-2: oklch(0.6 0.118 184.704);
|
| 91 |
+
--chart-3: oklch(0.398 0.07 227.392);
|
| 92 |
+
--chart-4: oklch(0.828 0.189 84.429);
|
| 93 |
+
--chart-5: oklch(0.769 0.188 70.08);
|
| 94 |
+
--sidebar: oklch(0.985 0 0);
|
| 95 |
+
--sidebar-foreground: oklch(0.145 0 0);
|
| 96 |
+
--sidebar-primary: oklch(0.205 0 0);
|
| 97 |
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
| 98 |
+
--sidebar-accent: oklch(0.97 0 0);
|
| 99 |
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
| 100 |
+
--sidebar-border: oklch(0.922 0 0);
|
| 101 |
+
--sidebar-ring: oklch(0.708 0 0);
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
.dark {
|
| 105 |
+
--background: oklch(0.145 0 0);
|
| 106 |
+
--foreground: oklch(0.985 0 0);
|
| 107 |
+
--card: oklch(0.205 0 0);
|
| 108 |
+
--card-foreground: oklch(0.985 0 0);
|
| 109 |
+
--popover: oklch(0.205 0 0);
|
| 110 |
+
--popover-foreground: oklch(0.985 0 0);
|
| 111 |
+
--primary: oklch(0.922 0 0);
|
| 112 |
+
--primary-foreground: oklch(0.205 0 0);
|
| 113 |
+
--secondary: oklch(0.269 0 0);
|
| 114 |
+
--secondary-foreground: oklch(0.985 0 0);
|
| 115 |
+
--muted: oklch(0.269 0 0);
|
| 116 |
+
--muted-foreground: oklch(0.708 0 0);
|
| 117 |
+
--accent: oklch(0.269 0 0);
|
| 118 |
+
--accent-foreground: oklch(0.985 0 0);
|
| 119 |
+
--destructive: oklch(0.704 0.191 22.216);
|
| 120 |
+
--border: oklch(1 0 0 / 10%);
|
| 121 |
+
--input: oklch(1 0 0 / 15%);
|
| 122 |
+
--ring: oklch(0.556 0 0);
|
| 123 |
+
--chart-1: oklch(0.488 0.243 264.376);
|
| 124 |
+
--chart-2: oklch(0.696 0.17 162.48);
|
| 125 |
+
--chart-3: oklch(0.769 0.188 70.08);
|
| 126 |
+
--chart-4: oklch(0.627 0.265 303.9);
|
| 127 |
+
--chart-5: oklch(0.645 0.246 16.439);
|
| 128 |
+
--sidebar: oklch(0.205 0 0);
|
| 129 |
+
--sidebar-foreground: oklch(0.985 0 0);
|
| 130 |
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
| 131 |
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
| 132 |
+
--sidebar-accent: oklch(0.269 0 0);
|
| 133 |
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
| 134 |
+
--sidebar-border: oklch(1 0 0 / 10%);
|
| 135 |
+
--sidebar-ring: oklch(0.556 0 0);
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
@layer base {
|
| 139 |
+
* {
|
| 140 |
+
@apply border-border outline-ring/50;
|
| 141 |
+
}
|
| 142 |
+
html {
|
| 143 |
+
scroll-behavior: smooth;
|
| 144 |
+
}
|
| 145 |
+
body {
|
| 146 |
+
@apply bg-background text-foreground;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
.shiki > div > button {
|
| 150 |
+
border-top-left-radius: 0 !important;
|
| 151 |
+
border-bottom-right-radius: 0 !important;
|
| 152 |
+
}
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
|
app/layout.tsx
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { Metadata, Viewport } from "next"
|
| 2 |
+
import { GeistSans } from "geist/font/sans"
|
| 3 |
+
import { GeistMono } from "geist/font/mono"
|
| 4 |
+
import { ThemeProvider } from "@/components/theme-provider"
|
| 5 |
+
import { siteConfig } from "@/lib/site"
|
| 6 |
+
import "./globals.css"
|
| 7 |
+
|
| 8 |
+
export const viewport: Viewport = {
|
| 9 |
+
themeColor: [
|
| 10 |
+
{ media: "(prefers-color-scheme: dark)", color: "#000000" },
|
| 11 |
+
{ media: "(prefers-color-scheme: light)", color: "#ffffff" },
|
| 12 |
+
],
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
export const metadata: Metadata = {
|
| 16 |
+
metadataBase: new URL(siteConfig.url),
|
| 17 |
+
title: {
|
| 18 |
+
default: siteConfig.name,
|
| 19 |
+
template: `%s - ${siteConfig.name}`,
|
| 20 |
+
},
|
| 21 |
+
description: siteConfig.description,
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
export default function RootLayout({
|
| 25 |
+
children,
|
| 26 |
+
}: Readonly<{
|
| 27 |
+
children: React.ReactNode
|
| 28 |
+
}>) {
|
| 29 |
+
return (
|
| 30 |
+
<html
|
| 31 |
+
lang="en"
|
| 32 |
+
className={`${GeistSans.variable} ${GeistMono.variable} antialiased`}
|
| 33 |
+
suppressHydrationWarning
|
| 34 |
+
>
|
| 35 |
+
<body>
|
| 36 |
+
<ThemeProvider
|
| 37 |
+
attribute="class"
|
| 38 |
+
defaultTheme="system"
|
| 39 |
+
enableSystem
|
| 40 |
+
disableTransitionOnChange
|
| 41 |
+
>
|
| 42 |
+
{children}
|
| 43 |
+
</ThemeProvider>
|
| 44 |
+
</body>
|
| 45 |
+
</html>
|
| 46 |
+
)
|
| 47 |
+
}
|
app/metadata.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { Metadata } from "next"
|
| 2 |
+
import { siteConfig } from "@/lib/site"
|
| 3 |
+
|
| 4 |
+
export const metadata: Metadata = {
|
| 5 |
+
title: siteConfig.name,
|
| 6 |
+
description: siteConfig.description,
|
| 7 |
+
keywords: siteConfig.keywords,
|
| 8 |
+
authors: [
|
| 9 |
+
{
|
| 10 |
+
name: "Hanzo AI",
|
| 11 |
+
url: "https://hanzo.ai",
|
| 12 |
+
},
|
| 13 |
+
],
|
| 14 |
+
creator: "Hanzo AI",
|
| 15 |
+
openGraph: {
|
| 16 |
+
type: "website",
|
| 17 |
+
locale: "en_US",
|
| 18 |
+
url: siteConfig.url,
|
| 19 |
+
title: siteConfig.name,
|
| 20 |
+
description: siteConfig.description,
|
| 21 |
+
siteName: siteConfig.name,
|
| 22 |
+
},
|
| 23 |
+
twitter: {
|
| 24 |
+
card: "summary_large_image",
|
| 25 |
+
title: siteConfig.name,
|
| 26 |
+
description: siteConfig.description,
|
| 27 |
+
creator: "@hanzoai",
|
| 28 |
+
},
|
| 29 |
+
robots: {
|
| 30 |
+
index: true,
|
| 31 |
+
follow: true,
|
| 32 |
+
googleBot: {
|
| 33 |
+
index: true,
|
| 34 |
+
follow: true,
|
| 35 |
+
"max-video-preview": -1,
|
| 36 |
+
"max-image-preview": "large",
|
| 37 |
+
"max-snippet": -1,
|
| 38 |
+
},
|
| 39 |
+
},
|
| 40 |
+
}
|
app/opengraph-image.tsx
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { headers } from "next/headers"
|
| 2 |
+
import { ImageResponse } from "next/og"
|
| 3 |
+
|
| 4 |
+
export const runtime = "edge"
|
| 5 |
+
export const alt = "Changelog Template"
|
| 6 |
+
export const size = {
|
| 7 |
+
width: 1200,
|
| 8 |
+
height: 630,
|
| 9 |
+
}
|
| 10 |
+
export const contentType = "image/png"
|
| 11 |
+
|
| 12 |
+
export default async function Image() {
|
| 13 |
+
try {
|
| 14 |
+
const headersList = await headers()
|
| 15 |
+
const host = headersList.get("host") || ""
|
| 16 |
+
const protocol = process.env.NODE_ENV === "development" ? "http" : "https"
|
| 17 |
+
const baseUrl = `${protocol}://${host}`
|
| 18 |
+
|
| 19 |
+
return new ImageResponse(
|
| 20 |
+
(
|
| 21 |
+
<div
|
| 22 |
+
style={{
|
| 23 |
+
height: "100%",
|
| 24 |
+
width: "100%",
|
| 25 |
+
display: "flex",
|
| 26 |
+
alignItems: "center",
|
| 27 |
+
justifyContent: "center",
|
| 28 |
+
background: "black",
|
| 29 |
+
}}
|
| 30 |
+
>
|
| 31 |
+
<img
|
| 32 |
+
src={`${baseUrl}/og.png`}
|
| 33 |
+
alt={alt}
|
| 34 |
+
style={{
|
| 35 |
+
width: "100%",
|
| 36 |
+
height: "100%",
|
| 37 |
+
objectFit: "cover",
|
| 38 |
+
}}
|
| 39 |
+
/>
|
| 40 |
+
</div>
|
| 41 |
+
),
|
| 42 |
+
{ ...size }
|
| 43 |
+
)
|
| 44 |
+
} catch (error) {
|
| 45 |
+
console.error("Error generating OpenGraph image:", error)
|
| 46 |
+
return new Response(`Failed to generate image`, { status: 500 })
|
| 47 |
+
}
|
| 48 |
+
}
|
app/page.tsx
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { docs, meta } from "@/.source"
|
| 2 |
+
import { loader } from "fumadocs-core/source"
|
| 3 |
+
import { createMDXSource } from "fumadocs-mdx"
|
| 4 |
+
import { ThemeToggle } from "@/components/theme-toggle"
|
| 5 |
+
import { useMemo } from "react"
|
| 6 |
+
import { formatDate } from "@/lib/utils"
|
| 7 |
+
|
| 8 |
+
const source = loader({
|
| 9 |
+
baseUrl: "/docs",
|
| 10 |
+
source: createMDXSource(docs, meta),
|
| 11 |
+
})
|
| 12 |
+
|
| 13 |
+
interface ChangelogData {
|
| 14 |
+
title: string
|
| 15 |
+
date: string
|
| 16 |
+
version?: string
|
| 17 |
+
tags?: string[]
|
| 18 |
+
body: React.ComponentType
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
interface ChangelogPage {
|
| 22 |
+
url: string
|
| 23 |
+
data: ChangelogData
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
export default function HomePage() {
|
| 27 |
+
const sortedChangelogs = useMemo(() => {
|
| 28 |
+
const allPages = source.getPages() as ChangelogPage[]
|
| 29 |
+
return allPages.sort((a, b) => {
|
| 30 |
+
const dateA = new Date(a.data.date).getTime()
|
| 31 |
+
const dateB = new Date(b.data.date).getTime()
|
| 32 |
+
return dateB - dateA
|
| 33 |
+
})
|
| 34 |
+
}, [])
|
| 35 |
+
|
| 36 |
+
return (
|
| 37 |
+
<div className="min-h-screen bg-background relative">
|
| 38 |
+
{/* Header */}
|
| 39 |
+
<div className="border-b border-border/50">
|
| 40 |
+
<div className="max-w-5xl mx-auto relative">
|
| 41 |
+
<div className="p-3 flex items-center justify-between">
|
| 42 |
+
<h1 className="text-3xl font-semibold tracking-tight">Changelog</h1>
|
| 43 |
+
<ThemeToggle />
|
| 44 |
+
</div>
|
| 45 |
+
</div>
|
| 46 |
+
</div>
|
| 47 |
+
|
| 48 |
+
{/* Timeline */}
|
| 49 |
+
<div className="max-w-5xl mx-auto px-6 lg:px-10 pt-10">
|
| 50 |
+
<div className="relative">
|
| 51 |
+
{sortedChangelogs.map((changelog) => {
|
| 52 |
+
const MDX = changelog.data.body
|
| 53 |
+
const date = new Date(changelog.data.date)
|
| 54 |
+
const formattedDate = formatDate(date)
|
| 55 |
+
|
| 56 |
+
return (
|
| 57 |
+
<div key={changelog.url} className="relative">
|
| 58 |
+
<div className="flex flex-col md:flex-row gap-y-6">
|
| 59 |
+
<div className="md:w-48 flex-shrink-0">
|
| 60 |
+
<div className="md:sticky md:top-8 pb-10">
|
| 61 |
+
<time className="text-sm font-medium text-muted-foreground block mb-3">
|
| 62 |
+
{formattedDate}
|
| 63 |
+
</time>
|
| 64 |
+
|
| 65 |
+
{changelog.data.version && (
|
| 66 |
+
<div className="inline-flex relative z-10 items-center justify-center w-10 h-10 text-foreground border border-border rounded-lg text-sm font-bold">
|
| 67 |
+
{changelog.data.version}
|
| 68 |
+
</div>
|
| 69 |
+
)}
|
| 70 |
+
</div>
|
| 71 |
+
</div>
|
| 72 |
+
|
| 73 |
+
{/* Right side - Content */}
|
| 74 |
+
<div className="flex-1 md:pl-8 relative pb-10">
|
| 75 |
+
{/* Vertical timeline line */}
|
| 76 |
+
<div className="hidden md:block absolute top-2 left-0 w-px h-full bg-border">
|
| 77 |
+
{/* Timeline dot */}
|
| 78 |
+
<div className="hidden md:block absolute -translate-x-1/2 size-3 bg-primary rounded-full z-10" />
|
| 79 |
+
</div>
|
| 80 |
+
|
| 81 |
+
<div className="space-y-6">
|
| 82 |
+
<div className="relative z-10 flex flex-col gap-2">
|
| 83 |
+
<h2 className="text-2xl font-semibold tracking-tight text-balance">
|
| 84 |
+
{changelog.data.title}
|
| 85 |
+
</h2>
|
| 86 |
+
|
| 87 |
+
{/* Tags */}
|
| 88 |
+
{changelog.data.tags &&
|
| 89 |
+
changelog.data.tags.length > 0 && (
|
| 90 |
+
<div className="flex flex-wrap gap-2">
|
| 91 |
+
{changelog.data.tags.map((tag: string) => (
|
| 92 |
+
<span
|
| 93 |
+
key={tag}
|
| 94 |
+
className="h-6 w-fit px-2 text-xs font-medium bg-muted text-muted-foreground rounded-full border flex items-center justify-center"
|
| 95 |
+
>
|
| 96 |
+
{tag}
|
| 97 |
+
</span>
|
| 98 |
+
))}
|
| 99 |
+
</div>
|
| 100 |
+
)}
|
| 101 |
+
</div>
|
| 102 |
+
<div className="prose dark:prose-invert max-w-none prose-headings:scroll-mt-8 prose-headings:font-semibold prose-a:no-underline prose-headings:tracking-tight prose-headings:text-balance prose-p:tracking-tight prose-p:text-balance">
|
| 103 |
+
<MDX />
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
)
|
| 110 |
+
})}
|
| 111 |
+
</div>
|
| 112 |
+
</div>
|
| 113 |
+
</div>
|
| 114 |
+
)
|
| 115 |
+
}
|
changelog/content/2025-05-23.mdx
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: "UX Improvements"
|
| 3 |
+
description: "Major improvements to UI/UX"
|
| 4 |
+
date: "2025-05-23"
|
| 5 |
+
tags: ["UI", "UX"]
|
| 6 |
+
version: "0.9"
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+

|
| 10 |
+
|
| 11 |
+
- **Redesigned interface** with cleaner, more intuitive navigation
|
| 12 |
+
- **Enhanced accessibility** with improved keyboard navigation and screen reader support
|
| 13 |
+
- **Streamlined workflows** for faster task completion
|
| 14 |
+
- **Responsive design** optimized for all device sizes
|
| 15 |
+
|
| 16 |
+
<Accordion type="multiple" collapsible className="w-full not-prose">
|
| 17 |
+
<AccordionItem value="item-1">
|
| 18 |
+
<AccordionTrigger>Features</AccordionTrigger>
|
| 19 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 20 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 21 |
+
<li>
|
| 22 |
+
<strong>Redesigned navigation menu</strong> with improved organization
|
| 23 |
+
and visual hierarchy
|
| 24 |
+
</li>
|
| 25 |
+
<li>
|
| 26 |
+
Enhanced accessibility features with full keyboard navigation support
|
| 27 |
+
</li>
|
| 28 |
+
<li>High contrast mode for users with visual impairments</li>
|
| 29 |
+
<li>Optimized touch targets for better mobile interaction</li>
|
| 30 |
+
<li>Enhanced swipe gestures and mobile-specific navigation</li>
|
| 31 |
+
</ul>
|
| 32 |
+
</AccordionContent>
|
| 33 |
+
</AccordionItem>
|
| 34 |
+
<AccordionItem value="item-2">
|
| 35 |
+
<AccordionTrigger>Bug Fixes</AccordionTrigger>
|
| 36 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 37 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 38 |
+
<li>
|
| 39 |
+
Fixed inconsistent button placement across different screen sizes
|
| 40 |
+
</li>
|
| 41 |
+
<li>Resolved color contrast issues affecting readability</li>
|
| 42 |
+
<li>Corrected tab order problems in form navigation</li>
|
| 43 |
+
<li>Fixed device orientation change handling on mobile devices</li>
|
| 44 |
+
<li>Improved ARIA label compatibility with screen readers</li>
|
| 45 |
+
</ul>
|
| 46 |
+
</AccordionContent>
|
| 47 |
+
</AccordionItem>
|
| 48 |
+
</Accordion>
|
changelog/content/2025-06-15.mdx
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: "Enhanced AI Agent Interface and Reasoning Capabilities"
|
| 3 |
+
description: "Major improvements to AI agent performance, conversation interface, and reasoning abilities."
|
| 4 |
+
date: "2025-06-15"
|
| 5 |
+
tags: ["AI", "Performance", "Interface", "Reasoning"]
|
| 6 |
+
version: "1.2"
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+

|
| 10 |
+
|
| 11 |
+
- **Enhanced Reasoning**: Improved logical thinking and problem-solving
|
| 12 |
+
- **Context Awareness**: Better understanding of conversation history
|
| 13 |
+
- **Multi-modal Support**: Process text, images, and code simultaneously
|
| 14 |
+
- **Adaptive Responses**: Tailored communication style based on user preferences
|
| 15 |
+
- **Real-time Learning**: Dynamic adaptation during conversations
|
| 16 |
+
|
| 17 |
+
<Accordion type="multiple" collapsible className="w-full not-prose">
|
| 18 |
+
<AccordionItem value="item-1">
|
| 19 |
+
<AccordionTrigger>Features</AccordionTrigger>
|
| 20 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 21 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 22 |
+
<li>
|
| 23 |
+
<strong>60% faster response generation</strong>
|
| 24 |
+
</li>
|
| 25 |
+
<li>Optimized model inference with reduced latency</li>
|
| 26 |
+
<li>Improved memory management for long conversations</li>
|
| 27 |
+
<li>Enhanced token efficiency and cost optimization</li>
|
| 28 |
+
<li>Better handling of complex multi-step tasks</li>
|
| 29 |
+
</ul>
|
| 30 |
+
</AccordionContent>
|
| 31 |
+
</AccordionItem>
|
| 32 |
+
<AccordionItem value="item-2">
|
| 33 |
+
<AccordionTrigger>Bug Fixes</AccordionTrigger>
|
| 34 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 35 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 36 |
+
<li>Fixed conversation context loss in long sessions</li>
|
| 37 |
+
<li>Resolved inconsistent response formatting</li>
|
| 38 |
+
<li>Corrected memory retention issues</li>
|
| 39 |
+
<li>Fixed edge cases in code generation</li>
|
| 40 |
+
<li>Improved error handling and recovery</li>
|
| 41 |
+
</ul>
|
| 42 |
+
</AccordionContent>
|
| 43 |
+
</AccordionItem>
|
| 44 |
+
</Accordion>
|
changelog/content/2025-06-30.mdx
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: "Release 2.1 - Kimi K2 Support"
|
| 3 |
+
description: "Major improvements to AI agent reasoning, conversation handling, and multi-modal processing"
|
| 4 |
+
date: "2025-06-30"
|
| 5 |
+
tags: ["AI", "Performance", "Reasoning", "Multi-modal"]
|
| 6 |
+
version: "2.1"
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
<Video src="/demo.mp4" />
|
| 10 |
+
|
| 11 |
+
- **Advanced reasoning engine** with improved logical thinking
|
| 12 |
+
- **Multi-modal processing** for text, images, and code analysis
|
| 13 |
+
- **Context-aware responses** with better conversation memory
|
| 14 |
+
- **Adaptive communication** that matches user preferences
|
| 15 |
+
|
| 16 |
+
```tsx
|
| 17 |
+
// Example of updated API usage
|
| 18 |
+
const agent = new AIAgent({
|
| 19 |
+
model: "kimi-k2",
|
| 20 |
+
reasoning: "enhanced",
|
| 21 |
+
multiModal: true,
|
| 22 |
+
})
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
<Accordion type="multiple" collapsible className="w-full not-prose">
|
| 26 |
+
<AccordionItem value="item-1">
|
| 27 |
+
<AccordionTrigger>Features</AccordionTrigger>
|
| 28 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 29 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 30 |
+
<li>
|
| 31 |
+
<strong>45% faster response generation</strong> across all model types
|
| 32 |
+
</li>
|
| 33 |
+
<li>New API endpoints for custom AI agent implementations</li>
|
| 34 |
+
<li>Enhanced webhook support for real-time notifications</li>
|
| 35 |
+
<li>Improved SDK with TypeScript definitions</li>
|
| 36 |
+
<li>Updated knowledge base with latest information</li>
|
| 37 |
+
<li>Enhanced creative writing and brainstorming capabilities</li>
|
| 38 |
+
</ul>
|
| 39 |
+
</AccordionContent>
|
| 40 |
+
</AccordionItem>
|
| 41 |
+
<AccordionItem value="item-2">
|
| 42 |
+
<AccordionTrigger>Bug Fixes</AccordionTrigger>
|
| 43 |
+
<AccordionContent className="flex flex-col gap-4 text-balance">
|
| 44 |
+
<ul className="list-disc space-y-2 pl-4">
|
| 45 |
+
<li>Fixed conversation context loss during long sessions</li>
|
| 46 |
+
<li>Resolved inconsistent response formatting issues</li>
|
| 47 |
+
<li>Improved error handling for complex queries</li>
|
| 48 |
+
<li>Fixed memory retention problems in extended conversations</li>
|
| 49 |
+
<li>Better error reporting and debugging tools</li>
|
| 50 |
+
</ul>
|
| 51 |
+
</AccordionContent>
|
| 52 |
+
</AccordionItem>
|
| 53 |
+
</Accordion>
|
pnpm-lock.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
postcss.config.mjs
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const config = {
|
| 2 |
+
plugins: ["@tailwindcss/postcss"],
|
| 3 |
+
};
|
| 4 |
+
|
| 5 |
+
export default config;
|