Site clean (#716)

* init next.js app

* add metadata for keyword selection

* minor heading changes

* updated title and keywords

* updating link to reach planoai.dev

---------

Co-authored-by: Musa <malikmusa1323@gmail.com>
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-342.local>
This commit is contained in:
Salman Paracha 2026-01-30 18:14:39 -08:00 committed by GitHub
parent d8b4c800e6
commit a278e67d9a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 416 additions and 0 deletions

41
apps/katanemo-www/.gitignore vendored Normal file
View file

@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

View file

@ -0,0 +1,37 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"ignoreUnknown": true,
"includes": ["**", "!node_modules", "!.next", "!dist", "!build"]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noUnknownAtRules": "off"
}
},
"domains": {
"next": "recommended",
"react": "recommended"
}
},
"assist": {
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}

View file

@ -0,0 +1,33 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
transpilePackages: [
"@katanemo/ui",
"@katanemo/shared-styles",
"@katanemo/tailwind-config",
"@katanemo/tsconfig",
],
experimental: {
externalDir: true,
},
webpack: (config, { isServer }) => {
config.resolve.modules = [
...(config.resolve.modules || []),
"node_modules",
"../../node_modules",
];
if (!isServer) {
config.resolve.fallback = {
...config.resolve.fallback,
fs: false,
};
}
return config;
},
turbopack: {
resolveAlias: {},
},
};
export default nextConfig;

View file

@ -0,0 +1,33 @@
{
"name": "@katanemo/katanemo-www",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "biome check",
"format": "biome format --write",
"typecheck": "tsc --noEmit",
"clean": "rm -rf .next"
},
"dependencies": {
"@katanemo/shared-styles": "*",
"@katanemo/ui": "*",
"next": "^16.1.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
"devDependencies": {
"@biomejs/biome": "2.2.0",
"@katanemo/tailwind-config": "*",
"@katanemo/tsconfig": "*",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"tailwindcss": "^4",
"tw-animate-css": "^1.4.0",
"typescript": "^5"
}
}

View file

@ -0,0 +1,7 @@
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
export default config;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 343 KiB

View file

@ -0,0 +1,19 @@
:root {
--katanemo-bg-start: #04171a;
--katanemo-bg-end: #0a292e;
--font-sans: var(--font-ibm-plex-sans);
}
html,
body {
background: linear-gradient(
to bottom,
var(--katanemo-bg-start),
var(--katanemo-bg-end)
);
min-height: 100%;
}
body {
font-family: var(--font-ibm-plex-sans, var(--font-sans));
}

View file

@ -0,0 +1,87 @@
import type { Metadata } from "next";
import Script from "next/script";
import localFont from "next/font/local";
import { siteConfig } from "../lib/metadata";
import "@katanemo/shared-styles/globals.css";
import "./globals.css";
const ibmPlexSans = localFont({
src: [
{
path: "../../../www/public/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf",
weight: "100 700",
style: "normal",
},
{
path: "../../../www/public/fonts/IBMPlexSans-Italic-VariableFont_wdth,wght.ttf",
weight: "100 700",
style: "italic",
},
],
display: "swap",
variable: "--font-ibm-plex-sans",
});
const baseUrl = new URL(siteConfig.url);
export const metadata: Metadata = {
title: `${siteConfig.name} - ${siteConfig.tagline}`,
description: siteConfig.description,
keywords: siteConfig.keywords,
metadataBase: baseUrl,
authors: siteConfig.authors,
creator: siteConfig.creator,
icons: {
icon: "/KatanemoLogo.svg",
},
openGraph: {
type: "website",
locale: "en_US",
url: siteConfig.url,
title: `${siteConfig.name} - ${siteConfig.tagline}`,
description: siteConfig.description,
siteName: siteConfig.name,
images: [
{
url: siteConfig.ogImage,
width: 1200,
height: 630,
alt: `${siteConfig.name} - ${siteConfig.tagline}`,
},
],
},
twitter: {
card: "summary_large_image",
title: `${siteConfig.name} - ${siteConfig.tagline}`,
description: siteConfig.description,
images: [siteConfig.ogImage],
creator: "@katanemo",
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body className={`${ibmPlexSans.variable} antialiased text-white`}>
{/* Google tag (gtag.js) */}
<Script
src="https://www.googletagmanager.com/gtag/js?id=G-RLD5BDNW5N"
strategy="afterInteractive"
/>
<Script strategy="afterInteractive">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-RLD5BDNW5N');
`}
</Script>
<div className="min-h-screen">{children}</div>
</body>
</html>
);
}

View file

@ -0,0 +1,72 @@
import Image from "next/image";
import Link from "next/link";
export default function HomePage() {
return (
<main className="relative flex min-h-screen items-center justify-center overflow-hidden px-6 pt-12 pb-16 font-sans sm:pt-20 lg:items-start lg:justify-start lg:pt-24">
<div className="relative mx-auto w-full max-w-6xl flex flex-col items-center justify-center text-left lg:items-start lg:justify-start">
<div className="pointer-events-none mb-6 w-full self-start lg:hidden">
<Image
src="/KatanemoLogo.svg"
alt="Katanemo Logo"
width={64}
height={64}
priority
className="h-auto w-10 sm:w-20"
/>
</div>
<div className="relative z-10 max-w-xl sm:max-w-2xl lg:max-w-2xl xl:max-w-8xl lg:pr-[26vw] xl:pr-[2vw] sm:right-0 md:right-0 lg:right-0 xl:right-20 2xl:right-50 sm:mt-36 mt-0">
<h1 className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-sans font-medium leading-tight tracking-tight text-white">
Forward-deployed AI infrastructure engineers.
</h1>
<p className="mt-4 font-light tracking-[-0.4px] max-w-2xl text-base sm:text-lg md:text-xl lg:text-2xl text-white/70">
Bringing industry-leading research and open-source technologies to
accelerate the development of AI agents.
</p>
<div className="mt-18 flex flex-col gap-3 text-lg sm:text-xl lg:text-3xl font-light tracking-wide sm:tracking-[-0.03em] leading-snug">
<Link
href="https://huggingface.co/katanemo"
className="flex items-center gap-2 text-[#31C887] hover:text-[#45e394] transition-colors"
>
<span>Models Research</span>
<span aria-hidden className="text-emerald-300"></span>
</Link>
<Link
href="https://planoai.dev"
className="flex items-center gap-2 text-[#31C887] hover:text-[#45e394] transition-colors"
>
<span>Plano - Open Source Agent Infrastructure</span>
<span aria-hidden className="text-emerald-300"></span>
</Link>
</div>
<div className="mt-24">
<div className="sm:max-w-7xl max-w-72 mb-4 text-sm sm:text-base lg:text-lg text-white/70 tracking-[-0.3px] sm:tracking-[0.8px]! font-light">
Move faster and more reliably by letting Katanemo do the heavy-lifting.
</div>
<a
href="mailto:interest@katanemo.com"
className="text-sm sm:text-sm text-white/50 hover:text-white transition-colors cursor-pointer"
>
Contact Us
</a>
<div className="mt-4 h-px w-52 bg-white/10" />
<div className="mt-3 text-sm text-white/50">
© 2026 Katanemo Labs, Inc.
</div>
</div>
</div>
<div className="pointer-events-none absolute top-50 right-[-20vw] sm:right-[-10vw] md:right-[-5vw] lg:right-[-20vw] xl:right-[-7vw] 2xl:right-[-17vw] hidden lg:block">
<Image
src="/KatanemoLogo.svg"
alt="Katanemo Logo"
width={900}
height={1000}
priority
className="h-[95vh] w-auto max-w-none opacity-90"
/>
</div>
</div>
</main>
);
}

View file

@ -0,0 +1,48 @@
const BASE_URL = process.env.NEXT_PUBLIC_APP_URL || "https://katanemo.com";
export const siteConfig = {
name: "Katanemo",
tagline: "Forward-deployed AI infrastructure engineers",
description:
"Forward-deployed AI infrastructure engineers delivering industry-leading research and open-source technologies for agentic AI development efforts.",
url: BASE_URL,
ogImage: `${BASE_URL}/KatanemoLogo.svg`,
links: {
docs: "https://docs.katanemo.com",
github: "https://github.com/katanemo/plano",
discord: "https://discord.gg/pGZf2gcwEc",
huggingface: "https://huggingface.co/katanemo",
},
keywords: [
"Katanemo AI",
"Katanemo",
"Katanemo Labs",
"forward-deployed AI engineers",
"forward deployed AI infrastructure",
"AI infrastructure engineers",
"embedded AI engineers",
"on-site AI engineers",
"model training",
"AI model research",
"LLM model training",
"machine learning model development",
"custom AI model training",
"open source agentic AI",
"agentic AI stack",
"AI agent infrastructure",
"open source agent framework",
"agentic AI development",
"AI agent platform",
"Plano agent infrastructure",
"LLM infrastructure",
"AI infrastructure platform",
"agentic AI tools",
"AI agent orchestration",
"open source AI stack",
"enterprise AI infrastructure",
"production AI systems",
"AI deployment infrastructure",
],
authors: [{ name: "Katanemo", url: "https://github.com/katanemo/plano" }],
creator: "Katanemo",
};

View file

@ -0,0 +1,20 @@
{
"extends": "@katanemo/tsconfig/nextjs.json",
"compilerOptions": {
"jsx": "react-jsx",
"esModuleInterop": true,
"paths": {
"@/*": ["./src/*"],
"@katanemo/ui": ["../../packages/ui/src"]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
],
"exclude": ["node_modules"]
}