Skip to content
Open
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
Binary file added src/assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 24 additions & 4 deletions src/components/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { Link } from "@tanstack/react-router";

export const Footer = () => {
return (
<footer className="py-12">
Expand All @@ -8,10 +10,28 @@ export const Footer = () => {
<span className="text-xs text-foreground/50">© 2026 KDM Labs</span>
</div>
<div className="flex gap-6 font-mono text-xs uppercase tracking-[1px] text-foreground/70">
<a href="#" className="hover:text-foreground/40 transition-colors">Privacy</a>
<a href="#" className="hover:text-foreground/40 transition-colors">Terms</a>
<a href="#" className="hover:text-foreground/40 transition-colors">Status</a>
<a href="#" className="hover:text-foreground/40 transition-colors">GitHub</a>
<Link to="/privacy" className="hover:text-foreground/40 transition-colors">
Privacy
</Link>
<Link to="/terms" className="hover:text-foreground/40 transition-colors">
Terms
</Link>
<a
href="https://github.com/KDM-cli/kdm-cli"
target="_blank"
rel="noreferrer"
className="hover:text-foreground/40 transition-colors"
>
Status
</a>
Comment thread
Yuvraj-Sarathe marked this conversation as resolved.
<a
href="https://github.com/KDM-cli/kdm-cli"
target="_blank"
rel="noreferrer"
className="hover:text-foreground/40 transition-colors"
>
GitHub
</a>
</div>
</div>
</div>
Expand Down
49 changes: 46 additions & 3 deletions src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,23 @@
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.

import { Route as rootRouteImport } from './routes/__root'
import { Route as TermsRouteImport } from './routes/terms'
import { Route as PrivacyRouteImport } from './routes/privacy'
import { Route as DocsRouteImport } from './routes/docs'
import { Route as IndexRouteImport } from './routes/index'
import { Route as DocsIndexRouteImport } from './routes/docs.index'
import { Route as DocsSlugRouteImport } from './routes/docs.$slug'

const TermsRoute = TermsRouteImport.update({
id: '/terms',
path: '/terms',
getParentRoute: () => rootRouteImport,
} as any)
const PrivacyRoute = PrivacyRouteImport.update({
id: '/privacy',
path: '/privacy',
getParentRoute: () => rootRouteImport,
} as any)
const DocsRoute = DocsRouteImport.update({
id: '/docs',
path: '/docs',
Expand All @@ -38,36 +50,65 @@ const DocsSlugRoute = DocsSlugRouteImport.update({
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/docs': typeof DocsRouteWithChildren
'/privacy': typeof PrivacyRoute
'/terms': typeof TermsRoute
'/docs/$slug': typeof DocsSlugRoute
'/docs/': typeof DocsIndexRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
'/privacy': typeof PrivacyRoute
'/terms': typeof TermsRoute
'/docs/$slug': typeof DocsSlugRoute
'/docs': typeof DocsIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/docs': typeof DocsRouteWithChildren
'/privacy': typeof PrivacyRoute
'/terms': typeof TermsRoute
'/docs/$slug': typeof DocsSlugRoute
'/docs/': typeof DocsIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
fullPaths: '/' | '/docs' | '/docs/$slug' | '/docs/'
fullPaths: '/' | '/docs' | '/privacy' | '/terms' | '/docs/$slug' | '/docs/'
fileRoutesByTo: FileRoutesByTo
to: '/' | '/docs/$slug' | '/docs'
id: '__root__' | '/' | '/docs' | '/docs/$slug' | '/docs/'
to: '/' | '/privacy' | '/terms' | '/docs/$slug' | '/docs'
id:
| '__root__'
| '/'
| '/docs'
| '/privacy'
| '/terms'
| '/docs/$slug'
| '/docs/'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
DocsRoute: typeof DocsRouteWithChildren
PrivacyRoute: typeof PrivacyRoute
TermsRoute: typeof TermsRoute
}

declare module '@tanstack/react-router' {
interface FileRoutesByPath {
'/terms': {
id: '/terms'
path: '/terms'
fullPath: '/terms'
preLoaderRoute: typeof TermsRouteImport
parentRoute: typeof rootRouteImport
}
'/privacy': {
id: '/privacy'
path: '/privacy'
fullPath: '/privacy'
preLoaderRoute: typeof PrivacyRouteImport
parentRoute: typeof rootRouteImport
}
'/docs': {
id: '/docs'
path: '/docs'
Expand Down Expand Up @@ -114,6 +155,8 @@ const DocsRouteWithChildren = DocsRoute._addFileChildren(DocsRouteChildren)
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
DocsRoute: DocsRouteWithChildren,
PrivacyRoute: PrivacyRoute,
TermsRoute: TermsRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
Expand Down
2 changes: 2 additions & 0 deletions src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
} from "@tanstack/react-router";

import appCss from "../styles.css?url";
import logoUrl from "@/assets/logo.png";

function NotFoundComponent() {
return (
Expand Down Expand Up @@ -82,6 +83,7 @@ export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()(
{ name: "twitter:site", content: "@Lovable" },
],
links: [
{ rel: "icon", type: "image/png", href: logoUrl },
{
rel: "stylesheet",
href: appCss,
Expand Down
38 changes: 38 additions & 0 deletions src/routes/privacy.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { createFileRoute } from "@tanstack/react-router";
import { Navbar } from "@/components/Navbar";
import { Footer } from "@/components/Footer";

export const Route = createFileRoute("/privacy")({
component: PrivacyPage,
head: () => ({
meta: [
{ title: "Privacy Policy — KDM" },
{ name: "description", content: "Privacy Policy for KDM CLI." },
],
}),
});

function PrivacyPage() {
return (
<div className="min-h-screen">
<Navbar />
<main className="container mx-auto px-6 py-24 max-w-3xl">
<h1 className="font-mono text-2xl uppercase tracking-[1.4px] mb-8">Privacy Policy</h1>
<div className="doc-prose text-sm text-foreground/70 space-y-4">
<p>KDM CLI does not collect, store, or transmit any personal data.</p>
<p>
The tool runs entirely in your terminal and communicates only with your local Docker
daemon and Kubernetes API server. No telemetry, analytics, or usage data is sent to
external servers.
</p>
<p>
If you choose to install KDM via a package manager (Homebrew, npm, etc.), your
interaction is governed by that package manager's privacy policy, not by KDM's.
</p>
<p>For questions, open an issue on GitHub.</p>
</div>
</main>
<Footer />
</div>
);
}
37 changes: 37 additions & 0 deletions src/routes/terms.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { createFileRoute } from "@tanstack/react-router";
import { Navbar } from "@/components/Navbar";
import { Footer } from "@/components/Footer";

export const Route = createFileRoute("/terms")({
component: TermsPage,
head: () => ({
meta: [
{ title: "Terms of Service — KDM" },
{ name: "description", content: "Terms of Service for KDM CLI." },
],
}),
});

function TermsPage() {
return (
<div className="min-h-screen">
<Navbar />
<main className="container mx-auto px-6 py-24 max-w-3xl">
<h1 className="font-mono text-2xl uppercase tracking-[1.4px] mb-8">Terms of Service</h1>
<div className="doc-prose text-sm text-foreground/70 space-y-4">
<p>KDM CLI is provided "as is" without warranty of any kind, express or implied.</p>
<p>
You may use, modify, and distribute this software in accordance with the terms of the
MIT License.
</p>
<p>
The authors and contributors are not liable for any damages arising from the use of this
software.
</p>
<p>By using KDM, you accept these terms.</p>
</div>
</main>
<Footer />
</div>
);
}
Loading