create-audora-next 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/index.ts +81 -0
  4. package/package.json +34 -0
  5. package/templates/base/README.md +152 -0
  6. package/templates/base/eslint.config.mjs +18 -0
  7. package/templates/base/lint-staged.config.mjs +17 -0
  8. package/templates/base/next.config.ts +38 -0
  9. package/templates/base/package.json +52 -0
  10. package/templates/base/postcss.config.mjs +7 -0
  11. package/templates/base/public/favicon/apple-touch-icon.png +0 -0
  12. package/templates/base/public/favicon/favicon-96x96.png +0 -0
  13. package/templates/base/public/favicon/favicon.ico +0 -0
  14. package/templates/base/public/favicon/favicon.svg +1 -0
  15. package/templates/base/public/favicon/site.webmanifest +21 -0
  16. package/templates/base/public/favicon/web-app-manifest-192x192.png +0 -0
  17. package/templates/base/public/favicon/web-app-manifest-512x512.png +0 -0
  18. package/templates/base/public/images/screenshot-desktop-dark.webp +0 -0
  19. package/templates/base/public/images/screenshot-desktop-light.webp +0 -0
  20. package/templates/base/public/images/screenshot-mobile-dark.webp +0 -0
  21. package/templates/base/public/images/screenshot-mobile-light.webp +0 -0
  22. package/templates/base/src/app/layout.tsx +52 -0
  23. package/templates/base/src/app/llms-full.txt/route.ts +97 -0
  24. package/templates/base/src/app/llms.txt/route.ts +40 -0
  25. package/templates/base/src/app/manifest.ts +61 -0
  26. package/templates/base/src/app/page.tsx +63 -0
  27. package/templates/base/src/app/robots.ts +16 -0
  28. package/templates/base/src/app/sitemap.ts +41 -0
  29. package/templates/base/src/components/copyable-code.tsx +41 -0
  30. package/templates/base/src/components/icons.tsx +84 -0
  31. package/templates/base/src/components/theme-provider.tsx +11 -0
  32. package/templates/base/src/components/theme-toggle.tsx +20 -0
  33. package/templates/base/src/config/site.ts +18 -0
  34. package/templates/base/src/data/llms.ts +112 -0
  35. package/templates/base/src/data/site.ts +30 -0
  36. package/templates/base/src/lib/seo.ts +190 -0
  37. package/templates/base/src/styles/globals.css +27 -0
  38. package/templates/base/src/utils/cn.ts +7 -0
  39. package/templates/base/tsconfig.json +34 -0
@@ -0,0 +1,97 @@
1
+ import { SITE_CONFIG } from "@/config/site";
2
+ import LLMS_DATA from "@/data/llms";
3
+
4
+ export const dynamic = "force-static";
5
+
6
+ export function GET() {
7
+ const content = `# ${SITE_CONFIG.name}
8
+
9
+ > ${SITE_CONFIG.tagline}
10
+
11
+ ${SITE_CONFIG.description}
12
+
13
+ ## Quick Start
14
+
15
+ \`\`\`bash
16
+ ${LLMS_DATA.quickStart}
17
+ cd my-app
18
+ bun install
19
+ bun dev
20
+ \`\`\`
21
+
22
+ ## Resources
23
+
24
+ - Summary: ${SITE_CONFIG.url}/llms.txt
25
+ - Sitemap: ${SITE_CONFIG.url}/sitemap.xml
26
+ - Repository: ${LLMS_DATA.repository}
27
+
28
+ ## Tech Stack
29
+
30
+ ${LLMS_DATA.techStack.map((item) => `- ${item}`).join("\n")}
31
+
32
+ ## Features
33
+
34
+ ${LLMS_DATA.features.map((item) => `- ${item}`).join("\n")}
35
+
36
+ ## Folder Structure
37
+
38
+ \`\`\`
39
+ ${LLMS_DATA.folderStructure}
40
+ \`\`\`
41
+
42
+ ## Development Commands
43
+
44
+ | Command | Description |
45
+ |---------|-------------|
46
+ | \`${LLMS_DATA.commands.dev}\` | Start development server |
47
+ | \`${LLMS_DATA.commands.build}\` | Build for production |
48
+ | \`${LLMS_DATA.commands.start}\` | Start production server |
49
+ | \`${LLMS_DATA.commands.lint}\` | Lint code |
50
+ | \`${LLMS_DATA.commands.format}\` | Format code |
51
+
52
+ ${LLMS_DATA.seoDetails}
53
+
54
+ ${LLMS_DATA.conventions}
55
+
56
+ ## Environment Variables
57
+
58
+ | Variable | Description |
59
+ |----------|-------------|
60
+ | \`NEXT_PUBLIC_SITE_URL\` | Base URL for sitemap, robots.txt, and Open Graph |
61
+
62
+ ## Key Files
63
+
64
+ ### src/data/site.ts
65
+ Contains site configuration that powers SEO metadata:
66
+ - name, url, ogImage
67
+ - tagline, description, shortDescription
68
+ - twitterHandle, keywords
69
+
70
+ ### src/lib/seo.ts
71
+ SEO utility functions:
72
+ - getMetadata() - Root layout metadata
73
+ - getPageMetadata() - Per-page metadata
74
+ - getViewport() - Viewport with theme colors
75
+ - JSON-LD generators for structured data
76
+
77
+ ### src/app/layout.tsx
78
+ Root layout with:
79
+ - Metadata exports
80
+ - Theme provider
81
+ - Geist font configuration
82
+
83
+ ### src/components/theme-toggle.tsx
84
+ Dark/light mode toggle component using next-themes.
85
+
86
+ ## License
87
+
88
+ MIT
89
+ `;
90
+
91
+ return new Response(content, {
92
+ headers: {
93
+ "Content-Type": "text/plain; charset=utf-8",
94
+ "Cache-Control": "public, max-age=3600, s-maxage=86400",
95
+ },
96
+ });
97
+ }
@@ -0,0 +1,40 @@
1
+ import { SITE_CONFIG } from "@/config/site";
2
+ import LLMS_DATA from "@/data/llms";
3
+
4
+ export const dynamic = "force-static";
5
+
6
+ export function GET() {
7
+ const content = `# ${SITE_CONFIG.name}
8
+
9
+ > ${SITE_CONFIG.tagline}
10
+
11
+ ${SITE_CONFIG.description}
12
+
13
+ ## Quick Start
14
+
15
+ \`\`\`bash
16
+ ${LLMS_DATA.quickStart}
17
+ \`\`\`
18
+
19
+ ## Resources
20
+
21
+ - Full documentation: ${SITE_CONFIG.url}/llms-full.txt
22
+ - Sitemap: ${SITE_CONFIG.url}/sitemap.xml
23
+ - Repository: ${LLMS_DATA.repository}
24
+
25
+ ## Tech Stack
26
+
27
+ ${LLMS_DATA.techStack.map((item) => `- ${item}`).join("\n")}
28
+
29
+ ## Features
30
+
31
+ ${LLMS_DATA.features.map((item) => `- ${item}`).join("\n")}
32
+ `;
33
+
34
+ return new Response(content, {
35
+ headers: {
36
+ "Content-Type": "text/plain; charset=utf-8",
37
+ "Cache-Control": "public, max-age=3600, s-maxage=86400",
38
+ },
39
+ });
40
+ }
@@ -0,0 +1,61 @@
1
+ import type { MetadataRoute } from "next";
2
+
3
+ import { SITE_CONFIG } from "@/config/site";
4
+
5
+ export default function manifest(): MetadataRoute.Manifest {
6
+ return {
7
+ name: SITE_CONFIG.name,
8
+ short_name: SITE_CONFIG.name,
9
+ description: SITE_CONFIG.description,
10
+ icons: [
11
+ {
12
+ src: "/favicon/favicon.svg",
13
+ type: "image/svg+xml",
14
+ sizes: "any",
15
+ purpose: "any",
16
+ },
17
+ {
18
+ src: "/favicon/web-app-manifest-192x192.png",
19
+ type: "image/png",
20
+ sizes: "192x192",
21
+ purpose: "any",
22
+ },
23
+ {
24
+ src: "/favicon/web-app-manifest-512x512.png",
25
+ type: "image/png",
26
+ sizes: "512x512",
27
+ purpose: "maskable",
28
+ },
29
+ ],
30
+ id: "/?utm_source=pwa",
31
+ start_url: "/?utm_source=pwa",
32
+ display: "standalone",
33
+ scope: "/",
34
+ screenshots: [
35
+ {
36
+ src: "/images/screenshot-mobile-dark.webp",
37
+ type: "image/webp",
38
+ sizes: "440x956",
39
+ form_factor: "narrow",
40
+ },
41
+ {
42
+ src: "/images/screenshot-mobile-light.webp",
43
+ type: "image/webp",
44
+ sizes: "440x956",
45
+ form_factor: "narrow",
46
+ },
47
+ {
48
+ src: "/images/screenshot-desktop-dark.webp",
49
+ type: "image/webp",
50
+ sizes: "1920x1080",
51
+ form_factor: "wide",
52
+ },
53
+ {
54
+ src: "/images/screenshot-desktop-light.webp",
55
+ type: "image/webp",
56
+ sizes: "1920x1080",
57
+ form_factor: "wide",
58
+ },
59
+ ],
60
+ };
61
+ }
@@ -0,0 +1,63 @@
1
+ import Link from "next/link";
2
+ import { ThemeToggle } from "@/components/theme-toggle";
3
+ import { CopyableCode } from "@/components/copyable-code";
4
+
5
+ export default function Home() {
6
+ return (
7
+ <div className="relative flex min-h-screen items-center justify-center px-6">
8
+ <div className="absolute top-6 right-6">
9
+ <ThemeToggle />
10
+ </div>
11
+ <main className="max-w-xl text-center">
12
+ <p className="text-xs font-medium tracking-[0.2em] text-neutral-500 uppercase dark:text-neutral-500">
13
+ AudoraLabs
14
+ </p>
15
+
16
+ <h1 className="mt-6 text-4xl font-semibold tracking-tight text-neutral-950 sm:text-5xl dark:text-white">
17
+ next-starter
18
+ </h1>
19
+
20
+ <p className="mx-auto mt-6 max-w-md text-lg text-neutral-600 dark:text-neutral-400">
21
+ Production-ready Next.js starter with sane defaults.
22
+ </p>
23
+
24
+ <div className="mt-10 flex flex-col items-center gap-4 sm:flex-row sm:justify-center">
25
+ <Link
26
+ href="https://github.com/AudoraLabs/next-starter"
27
+ target="_blank"
28
+ rel="noopener noreferrer"
29
+ className="inline-flex h-11 items-center justify-center rounded-md bg-neutral-950 px-6 text-sm font-medium text-white transition-colors hover:bg-neutral-800 dark:bg-white dark:text-neutral-950 dark:hover:bg-neutral-200"
30
+ >
31
+ Get Started
32
+ </Link>
33
+ <Link
34
+ href="https://github.com/AudoraLabs"
35
+ target="_blank"
36
+ rel="noopener noreferrer"
37
+ className="text-sm text-neutral-600 transition-colors hover:text-neutral-950 dark:text-neutral-500 dark:hover:text-white"
38
+ >
39
+ View on GitHub
40
+ </Link>
41
+ </div>
42
+
43
+ <CopyableCode code="bun create audora-next my-app" />
44
+ </main>
45
+
46
+ <footer className="absolute right-0 bottom-6 left-0 flex justify-center gap-4">
47
+ <Link
48
+ href="/llms.txt"
49
+ className="text-xs text-neutral-500 transition-colors hover:text-neutral-950 dark:hover:text-white"
50
+ >
51
+ llms.txt
52
+ </Link>
53
+ <span className="text-neutral-300 dark:text-neutral-700">·</span>
54
+ <Link
55
+ href="/llms-full.txt"
56
+ className="text-xs text-neutral-500 transition-colors hover:text-neutral-950 dark:hover:text-white"
57
+ >
58
+ llms-full.txt
59
+ </Link>
60
+ </footer>
61
+ </div>
62
+ );
63
+ }
@@ -0,0 +1,16 @@
1
+ import type { MetadataRoute } from "next";
2
+
3
+ import { SITE_CONFIG } from "@/config/site";
4
+
5
+ export default function robots(): MetadataRoute.Robots {
6
+ return {
7
+ rules: [
8
+ {
9
+ userAgent: "*",
10
+ allow: "/",
11
+ disallow: ["/api/", "/_next/", "/private/"],
12
+ },
13
+ ],
14
+ sitemap: `${SITE_CONFIG.url}/sitemap.xml`,
15
+ };
16
+ }
@@ -0,0 +1,41 @@
1
+ import type { MetadataRoute } from "next";
2
+ import { SITE_CONFIG } from "@/config/site";
3
+
4
+ export const dynamic = "force-static";
5
+
6
+ /**
7
+ * Generates a comprehensive sitemap for the website
8
+ *
9
+ * Priority guidelines:
10
+ * - 1.0: Homepage (most important)
11
+ * - 0.8-0.9: Main pages (About, Blog listing, etc.)
12
+ * - 0.6-0.7: Blog posts, category pages
13
+ * - 0.4-0.5: Archive pages, tag pages
14
+ * - 0.3: Less important pages
15
+ *
16
+ * Change frequency guidelines:
17
+ * - always: Pages that change with every access
18
+ * - hourly: Pages that change hourly
19
+ * - daily: Pages that change daily
20
+ * - weekly: Pages that change weekly
21
+ * - monthly: Pages that change monthly
22
+ * - yearly: Pages that change yearly
23
+ * - never: Archived pages
24
+ */
25
+
26
+ export default function sitemap(): MetadataRoute.Sitemap {
27
+ const siteUrl = SITE_CONFIG.url;
28
+ const currentDate = new Date().toISOString();
29
+
30
+ // Static routes with priorities and change frequencies
31
+ const staticRoutes: MetadataRoute.Sitemap = [
32
+ {
33
+ url: siteUrl,
34
+ lastModified: currentDate,
35
+ changeFrequency: "weekly",
36
+ priority: 1.0,
37
+ },
38
+ ];
39
+
40
+ return staticRoutes;
41
+ }
@@ -0,0 +1,41 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { CopyIcon, CheckIcon } from "./icons";
5
+
6
+ interface CopyableCodeProps {
7
+ code: string;
8
+ }
9
+
10
+ export const CopyableCode = ({ code }: CopyableCodeProps) => {
11
+ const [copied, setCopied] = useState(false);
12
+
13
+ const handleCopy = async () => {
14
+ try {
15
+ await navigator.clipboard.writeText(code);
16
+ setCopied(true);
17
+ setTimeout(() => setCopied(false), 2000);
18
+ } catch (err) {
19
+ console.error("Failed to copy:", err);
20
+ }
21
+ };
22
+
23
+ return (
24
+ <div className="relative mx-auto mt-12 max-w-lg rounded-md border border-neutral-200 bg-neutral-200 p-4 pr-12 dark:border-neutral-800 dark:bg-neutral-900">
25
+ <button
26
+ onClick={handleCopy}
27
+ className="absolute top-3 right-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-neutral-600 transition-colors hover:bg-neutral-300 hover:text-neutral-950 dark:text-neutral-400 dark:hover:bg-neutral-800 dark:hover:text-neutral-200"
28
+ aria-label="Copy code"
29
+ >
30
+ {copied ? (
31
+ <CheckIcon className="h-4 w-4" />
32
+ ) : (
33
+ <CopyIcon className="h-4 w-4" />
34
+ )}
35
+ </button>
36
+ <code className="block text-xs text-neutral-700 md:text-sm dark:text-neutral-300">
37
+ <span className="text-neutral-400 dark:text-neutral-600">$</span> {code}
38
+ </code>
39
+ </div>
40
+ );
41
+ };
@@ -0,0 +1,84 @@
1
+ export const MoonIcon = ({ className }: { className?: string }) => {
2
+ return (
3
+ <svg
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="20"
6
+ height="20"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ strokeWidth="2"
11
+ strokeLinecap="round"
12
+ strokeLinejoin="round"
13
+ className={className}
14
+ >
15
+ <path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" />
16
+ </svg>
17
+ );
18
+ };
19
+
20
+ export const SunIcon = ({ className }: { className?: string }) => {
21
+ return (
22
+ <svg
23
+ xmlns="http://www.w3.org/2000/svg"
24
+ width="20"
25
+ height="20"
26
+ viewBox="0 0 24 24"
27
+ fill="none"
28
+ stroke="currentColor"
29
+ strokeWidth="2"
30
+ strokeLinecap="round"
31
+ strokeLinejoin="round"
32
+ className={className}
33
+ >
34
+ <circle cx="12" cy="12" r="4" />
35
+ <path d="M12 2v2" />
36
+ <path d="M12 20v2" />
37
+ <path d="m4.93 4.93 1.41 1.41" />
38
+ <path d="m17.66 17.66 1.41 1.41" />
39
+ <path d="M2 12h2" />
40
+ <path d="M20 12h2" />
41
+ <path d="m6.34 17.66-1.41 1.41" />
42
+ <path d="m19.07 4.93-1.41 1.41" />
43
+ </svg>
44
+ );
45
+ };
46
+
47
+ export const CopyIcon = ({ className }: { className?: string }) => {
48
+ return (
49
+ <svg
50
+ xmlns="http://www.w3.org/2000/svg"
51
+ width="16"
52
+ height="16"
53
+ viewBox="0 0 24 24"
54
+ fill="none"
55
+ stroke="currentColor"
56
+ strokeWidth="2"
57
+ strokeLinecap="round"
58
+ strokeLinejoin="round"
59
+ className={className}
60
+ >
61
+ <rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
62
+ <path d="M4 16c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2h8c1.1 0 2 .9 2 2" />
63
+ </svg>
64
+ );
65
+ };
66
+
67
+ export const CheckIcon = ({ className }: { className?: string }) => {
68
+ return (
69
+ <svg
70
+ xmlns="http://www.w3.org/2000/svg"
71
+ width="16"
72
+ height="16"
73
+ viewBox="0 0 24 24"
74
+ fill="none"
75
+ stroke="currentColor"
76
+ strokeWidth="2"
77
+ strokeLinecap="round"
78
+ strokeLinejoin="round"
79
+ className={className}
80
+ >
81
+ <path d="M20 6 9 17l-5-5" />
82
+ </svg>
83
+ );
84
+ };
@@ -0,0 +1,11 @@
1
+ "use client";
2
+
3
+ import { ThemeProvider as NextThemesProvider } from "next-themes";
4
+ import type { ComponentProps } from "react";
5
+
6
+ export function ThemeProvider({
7
+ children,
8
+ ...props
9
+ }: ComponentProps<typeof NextThemesProvider>) {
10
+ return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
11
+ }
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import { useTheme } from "next-themes";
4
+ import { MoonIcon, SunIcon } from "./icons";
5
+
6
+ export const ThemeToggle = () => {
7
+ const { setTheme, resolvedTheme } = useTheme();
8
+
9
+ return (
10
+ <button
11
+ onClick={() => setTheme(resolvedTheme === "dark" ? "light" : "dark")}
12
+ className="inline-flex h-9 w-9 items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-zinc-100 focus-visible:ring-1 focus-visible:ring-zinc-950 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 dark:hover:bg-zinc-800 dark:focus-visible:ring-zinc-300"
13
+ aria-label="Toggle theme"
14
+ >
15
+ <SunIcon className="hidden text-white dark:block" />
16
+ <MoonIcon className="block text-zinc-950 dark:hidden" />
17
+ <span className="sr-only">Toggle theme</span>
18
+ </button>
19
+ );
20
+ };
@@ -0,0 +1,18 @@
1
+ import SITE_DATA from "@/data/site";
2
+
3
+ export const SITE_CONFIG = {
4
+ name: SITE_DATA.name,
5
+ url: SITE_DATA.url,
6
+ ogImage: SITE_DATA.ogImage,
7
+ tagline: SITE_DATA.tagline,
8
+ description: SITE_DATA.description,
9
+ shortDescription: SITE_DATA.shortDescription,
10
+ alternateNames: SITE_DATA.alternateNames,
11
+ twitterHandle: SITE_DATA.twitterHandle,
12
+ keywords: SITE_DATA.keywords,
13
+ };
14
+
15
+ export const META_THEME_COLORS = {
16
+ light: "#ededed",
17
+ dark: "#09090b",
18
+ };
@@ -0,0 +1,112 @@
1
+ const LLMS_DATA = {
2
+ // Quick start command for cloning the starter
3
+ quickStart: "bunx degit AudoraLabs/next-starter my-app",
4
+
5
+ // GitHub repository URL
6
+ repository: "https://github.com/AudoraLabs/next-starter",
7
+
8
+ // Tech stack summary
9
+ techStack: [
10
+ "Next.js 16 with App Router",
11
+ "React 19",
12
+ "TypeScript (strict mode)",
13
+ "Tailwind CSS 4",
14
+ "Bun (package manager)",
15
+ "ESLint 9 (flat config)",
16
+ "Prettier",
17
+ "React Compiler",
18
+ ],
19
+
20
+ // Key features for the summary
21
+ features: [
22
+ "SEO-ready with robots.ts, sitemap.ts, and Open Graph metadata",
23
+ "Title templates and metadataBase configured",
24
+ "Path alias @/* mapped to ./src/*",
25
+ "Dark mode support via CSS custom properties",
26
+ "Geist font family pre-configured",
27
+ "Pre-commit hooks with Husky and lint-staged",
28
+ ],
29
+
30
+ // Folder structure for llms-full.txt
31
+ folderStructure: `src/
32
+ ├── app/
33
+ │ ├── layout.tsx # Root layout with metadata
34
+ │ ├── page.tsx # Home page
35
+ │ ├── manifest.ts # PWA manifest
36
+ │ ├── robots.ts # robots.txt generation
37
+ │ ├── sitemap.ts # Sitemap generation
38
+ │ ├── llms.txt/ # AI-friendly summary (this file)
39
+ │ └── llms-full.txt/ # AI-friendly full documentation
40
+ ├── components/
41
+ │ ├── icons.tsx # Icon components
42
+ │ ├── theme-provider.tsx # Theme context provider
43
+ │ └── theme-toggle.tsx # Dark/light mode toggle
44
+ ├── config/
45
+ │ └── site.ts # Site configuration exports
46
+ ├── data/
47
+ │ ├── site.ts # Site data (name, URL, description)
48
+ │ └── llms.ts # LLMs.txt content configuration
49
+ ├── lib/
50
+ │ └── seo.ts # SEO utilities and JSON-LD generators
51
+ ├── styles/
52
+ │ └── globals.css # Global styles and Tailwind imports
53
+ └── utils/
54
+ └── cn.ts # Class name utility`,
55
+
56
+ // Development commands
57
+ commands: {
58
+ dev: "bun dev",
59
+ build: "bun run build",
60
+ start: "bun start",
61
+ lint: "bun lint",
62
+ format: "bun format",
63
+ },
64
+
65
+ // SEO documentation for llms-full.txt
66
+ seoDetails: `## SEO Configuration
67
+
68
+ This starter includes production-ready SEO defaults:
69
+
70
+ ### Metadata (src/lib/seo.ts)
71
+ - getMetadata(): Default site metadata with Open Graph and Twitter cards
72
+ - getPageMetadata(): Page-specific metadata generator
73
+ - getViewport(): Viewport configuration with theme colors
74
+
75
+ ### Structured Data (JSON-LD)
76
+ - getWebSiteJsonLd(): WebSite schema
77
+ - getOrganizationJsonLd(): Organization schema
78
+ - getBreadcrumbJsonLd(): Breadcrumb navigation schema
79
+
80
+ ### Configuration (src/data/site.ts)
81
+ Customize these values for your project:
82
+ - name: Site name
83
+ - url: Base URL for canonical links
84
+ - ogImage: Default Open Graph image
85
+ - tagline: Short tagline
86
+ - description: Full description
87
+ - twitterHandle: Twitter/X handle
88
+
89
+ ### Files
90
+ - robots.ts: Generates robots.txt with sitemap reference
91
+ - sitemap.ts: Dynamic sitemap generation
92
+ - manifest.ts: PWA web app manifest`,
93
+
94
+ // Conventions documentation
95
+ conventions: `## Conventions
96
+
97
+ ### Path Aliases
98
+ Use @/* to import from src/*:
99
+ - import { cn } from "@/utils/cn"
100
+ - import { SITE_CONFIG } from "@/config/site"
101
+
102
+ ### Theme
103
+ Dark mode uses CSS custom properties. Toggle with ThemeProvider and ThemeToggle components.
104
+
105
+ ### Components
106
+ No component library included by default. Add shadcn/ui or Radix as needed.
107
+
108
+ ### Styling
109
+ Tailwind CSS 4 with PostCSS. Global styles in src/styles/globals.css.`,
110
+ };
111
+
112
+ export default LLMS_DATA;
@@ -0,0 +1,30 @@
1
+ const SITE_DATA = {
2
+ name: "next-starter",
3
+ url: process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000",
4
+ ogImage: process.env.NEXT_PUBLIC_OG_IMAGE ?? "http://localhost:3000/images/screenshot-desktop-dark.webp",
5
+
6
+ tagline: "Kickstart your Next.js projects effortlessly",
7
+ description:
8
+ "next-starter is a powerful, boilerplate project designed to accelerate the development of high-quality Next.js applications with best practices built-in.",
9
+ shortDescription:
10
+ "A boilerplate to quickly launch robust Next.js apps with best practices.",
11
+
12
+ alternateNames: ["next-starter", "Next Starter", "NextJS Starter"],
13
+
14
+ twitterHandle: "@nextstarter",
15
+
16
+ keywords: [
17
+ "next-starter",
18
+ "next.js starter",
19
+ "react boilerplate",
20
+ "next.js boilerplate",
21
+ "nextjs template",
22
+ "starter project",
23
+ "next.js template",
24
+ "typescript nextjs starter",
25
+ "boilerplate for next.js",
26
+ "web app starter",
27
+ ],
28
+ };
29
+
30
+ export default SITE_DATA;