shipd 0.1.0

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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1366 -0
  5. package/docs-template/README.md +255 -0
  6. package/docs-template/[slug]/[subslug]/page.tsx +1242 -0
  7. package/docs-template/[slug]/page.tsx +422 -0
  8. package/docs-template/api/page.tsx +47 -0
  9. package/docs-template/components/docs/docs-category-page.tsx +162 -0
  10. package/docs-template/components/docs/docs-code-card.tsx +135 -0
  11. package/docs-template/components/docs/docs-header.tsx +69 -0
  12. package/docs-template/components/docs/docs-nav.ts +95 -0
  13. package/docs-template/components/docs/docs-sidebar.tsx +112 -0
  14. package/docs-template/components/docs/docs-toc.tsx +38 -0
  15. package/docs-template/components/ui/badge.tsx +47 -0
  16. package/docs-template/components/ui/button.tsx +60 -0
  17. package/docs-template/components/ui/card.tsx +93 -0
  18. package/docs-template/components/ui/sheet.tsx +140 -0
  19. package/docs-template/documentation/page.tsx +80 -0
  20. package/docs-template/layout.tsx +27 -0
  21. package/docs-template/lib/utils.ts +7 -0
  22. package/docs-template/page.tsx +360 -0
  23. package/package.json +66 -0
  24. package/template/.env.example +45 -0
  25. package/template/README.md +239 -0
  26. package/template/app/api/auth/[...all]/route.ts +4 -0
  27. package/template/app/api/chat/route.ts +16 -0
  28. package/template/app/api/subscription/route.ts +25 -0
  29. package/template/app/api/upload-image/route.ts +64 -0
  30. package/template/app/blog/[slug]/page.tsx +314 -0
  31. package/template/app/blog/page.tsx +107 -0
  32. package/template/app/dashboard/_components/chart-interactive.tsx +289 -0
  33. package/template/app/dashboard/_components/chatbot.tsx +39 -0
  34. package/template/app/dashboard/_components/mode-toggle.tsx +46 -0
  35. package/template/app/dashboard/_components/navbar.tsx +84 -0
  36. package/template/app/dashboard/_components/section-cards.tsx +102 -0
  37. package/template/app/dashboard/_components/sidebar.tsx +90 -0
  38. package/template/app/dashboard/_components/subscribe-button.tsx +49 -0
  39. package/template/app/dashboard/billing/page.tsx +277 -0
  40. package/template/app/dashboard/chat/page.tsx +73 -0
  41. package/template/app/dashboard/cli/page.tsx +260 -0
  42. package/template/app/dashboard/layout.tsx +24 -0
  43. package/template/app/dashboard/page.tsx +216 -0
  44. package/template/app/dashboard/payment/_components/manage-subscription.tsx +22 -0
  45. package/template/app/dashboard/payment/page.tsx +126 -0
  46. package/template/app/dashboard/settings/page.tsx +613 -0
  47. package/template/app/dashboard/upload/page.tsx +324 -0
  48. package/template/app/error.tsx +78 -0
  49. package/template/app/favicon.ico +0 -0
  50. package/template/app/globals.css +126 -0
  51. package/template/app/layout.tsx +135 -0
  52. package/template/app/not-found.tsx +45 -0
  53. package/template/app/page.tsx +28 -0
  54. package/template/app/pricing/_component/pricing-table.tsx +276 -0
  55. package/template/app/pricing/page.tsx +23 -0
  56. package/template/app/privacy-policy/page.tsx +280 -0
  57. package/template/app/robots.txt +12 -0
  58. package/template/app/sign-in/page.tsx +228 -0
  59. package/template/app/sign-up/page.tsx +243 -0
  60. package/template/app/sitemap.ts +62 -0
  61. package/template/app/success/page.tsx +123 -0
  62. package/template/app/terms-of-service/page.tsx +212 -0
  63. package/template/auth-schema.ts +47 -0
  64. package/template/components/homepage/cli-workflow-section.tsx +138 -0
  65. package/template/components/homepage/features-section.tsx +150 -0
  66. package/template/components/homepage/footer.tsx +53 -0
  67. package/template/components/homepage/hero-section.tsx +112 -0
  68. package/template/components/homepage/integrations.tsx +124 -0
  69. package/template/components/homepage/navigation.tsx +116 -0
  70. package/template/components/homepage/news-section.tsx +82 -0
  71. package/template/components/homepage/testimonials-section.tsx +34 -0
  72. package/template/components/logos/BetterAuth.tsx +21 -0
  73. package/template/components/logos/NeonPostgres.tsx +41 -0
  74. package/template/components/logos/Nextjs.tsx +72 -0
  75. package/template/components/logos/Polar.tsx +7 -0
  76. package/template/components/logos/TailwindCSS.tsx +27 -0
  77. package/template/components/logos/index.ts +6 -0
  78. package/template/components/logos/shadcnui.tsx +8 -0
  79. package/template/components/provider.tsx +8 -0
  80. package/template/components/ui/avatar.tsx +53 -0
  81. package/template/components/ui/badge.tsx +46 -0
  82. package/template/components/ui/button.tsx +59 -0
  83. package/template/components/ui/card.tsx +92 -0
  84. package/template/components/ui/chart.tsx +353 -0
  85. package/template/components/ui/checkbox.tsx +32 -0
  86. package/template/components/ui/dialog.tsx +135 -0
  87. package/template/components/ui/dropdown-menu.tsx +257 -0
  88. package/template/components/ui/form.tsx +167 -0
  89. package/template/components/ui/input.tsx +21 -0
  90. package/template/components/ui/label.tsx +24 -0
  91. package/template/components/ui/progress.tsx +31 -0
  92. package/template/components/ui/resizable.tsx +56 -0
  93. package/template/components/ui/select.tsx +185 -0
  94. package/template/components/ui/separator.tsx +28 -0
  95. package/template/components/ui/sheet.tsx +139 -0
  96. package/template/components/ui/skeleton.tsx +13 -0
  97. package/template/components/ui/sonner.tsx +25 -0
  98. package/template/components/ui/switch.tsx +31 -0
  99. package/template/components/ui/tabs.tsx +66 -0
  100. package/template/components/ui/textarea.tsx +18 -0
  101. package/template/components/ui/toggle-group.tsx +73 -0
  102. package/template/components/ui/toggle.tsx +47 -0
  103. package/template/components/ui/tooltip.tsx +61 -0
  104. package/template/components/user-profile.tsx +139 -0
  105. package/template/components.json +21 -0
  106. package/template/db/drizzle.ts +14 -0
  107. package/template/db/migrations/0000_worried_rawhide_kid.sql +77 -0
  108. package/template/db/migrations/meta/0000_snapshot.json +494 -0
  109. package/template/db/migrations/meta/_journal.json +13 -0
  110. package/template/db/schema.ts +85 -0
  111. package/template/drizzle.config.ts +13 -0
  112. package/template/emails/components/layout.tsx +181 -0
  113. package/template/emails/password-reset.tsx +67 -0
  114. package/template/emails/payment-failed.tsx +167 -0
  115. package/template/emails/subscription-confirmation.tsx +129 -0
  116. package/template/emails/welcome.tsx +100 -0
  117. package/template/eslint.config.mjs +16 -0
  118. package/template/hooks/use-mobile.ts +21 -0
  119. package/template/lib/auth-client.ts +8 -0
  120. package/template/lib/auth.ts +276 -0
  121. package/template/lib/email.ts +118 -0
  122. package/template/lib/polar-products.ts +49 -0
  123. package/template/lib/subscription.ts +148 -0
  124. package/template/lib/upload-image.ts +28 -0
  125. package/template/lib/utils.ts +6 -0
  126. package/template/middleware.ts +30 -0
  127. package/template/next-env.d.ts +5 -0
  128. package/template/next.config.ts +27 -0
  129. package/template/package.json +99 -0
  130. package/template/postcss.config.mjs +5 -0
  131. package/template/public/add.png +0 -0
  132. package/template/public/favicon.svg +4 -0
  133. package/template/public/file.svg +1 -0
  134. package/template/public/globe.svg +1 -0
  135. package/template/public/iphone.png +0 -0
  136. package/template/public/logo.png +0 -0
  137. package/template/public/next.svg +1 -0
  138. package/template/public/polar-sh.svg +1 -0
  139. package/template/public/shadcn-ui.svg +1 -0
  140. package/template/public/site.webmanifest +21 -0
  141. package/template/public/vercel.svg +1 -0
  142. package/template/public/window.svg +1 -0
  143. package/template/tailwind.config.ts +89 -0
  144. package/template/template.config.json +138 -0
  145. package/template/tsconfig.json +27 -0
@@ -0,0 +1,140 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SheetPrimitive from "@radix-ui/react-dialog"
5
+ import { XIcon } from "lucide-react"
6
+
7
+ import { cn } from "@/lib/utils"
8
+
9
+ function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
10
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />
11
+ }
12
+
13
+ function SheetTrigger({
14
+ ...props
15
+ }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
16
+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
17
+ }
18
+
19
+ function SheetClose({
20
+ ...props
21
+ }: React.ComponentProps<typeof SheetPrimitive.Close>) {
22
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
23
+ }
24
+
25
+ function SheetPortal({
26
+ ...props
27
+ }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
28
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
29
+ }
30
+
31
+ function SheetOverlay({
32
+ className,
33
+ ...props
34
+ }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
35
+ return (
36
+ <SheetPrimitive.Overlay
37
+ data-slot="sheet-overlay"
38
+ className={cn(
39
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
40
+ className
41
+ )}
42
+ {...props}
43
+ />
44
+ )
45
+ }
46
+
47
+ function SheetContent({
48
+ className,
49
+ children,
50
+ side = "right",
51
+ ...props
52
+ }: React.ComponentProps<typeof SheetPrimitive.Content> & {
53
+ side?: "top" | "right" | "bottom" | "left"
54
+ }) {
55
+ return (
56
+ <SheetPortal>
57
+ <SheetOverlay />
58
+ <SheetPrimitive.Content
59
+ data-slot="sheet-content"
60
+ className={cn(
61
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
62
+ side === "right" &&
63
+ "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
64
+ side === "left" &&
65
+ "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
66
+ side === "top" &&
67
+ "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
68
+ side === "bottom" &&
69
+ "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
70
+ className
71
+ )}
72
+ {...props}
73
+ >
74
+ {children}
75
+ <SheetPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none">
76
+ <XIcon className="size-4" />
77
+ <span className="sr-only">Close</span>
78
+ </SheetPrimitive.Close>
79
+ </SheetPrimitive.Content>
80
+ </SheetPortal>
81
+ )
82
+ }
83
+
84
+ function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
85
+ return (
86
+ <div
87
+ data-slot="sheet-header"
88
+ className={cn("flex flex-col gap-1.5 p-4", className)}
89
+ {...props}
90
+ />
91
+ )
92
+ }
93
+
94
+ function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
95
+ return (
96
+ <div
97
+ data-slot="sheet-footer"
98
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
99
+ {...props}
100
+ />
101
+ )
102
+ }
103
+
104
+ function SheetTitle({
105
+ className,
106
+ ...props
107
+ }: React.ComponentProps<typeof SheetPrimitive.Title>) {
108
+ return (
109
+ <SheetPrimitive.Title
110
+ data-slot="sheet-title"
111
+ className={cn("text-foreground font-semibold", className)}
112
+ {...props}
113
+ />
114
+ )
115
+ }
116
+
117
+ function SheetDescription({
118
+ className,
119
+ ...props
120
+ }: React.ComponentProps<typeof SheetPrimitive.Description>) {
121
+ return (
122
+ <SheetPrimitive.Description
123
+ data-slot="sheet-description"
124
+ className={cn("text-muted-foreground text-sm", className)}
125
+ {...props}
126
+ />
127
+ )
128
+ }
129
+
130
+ export {
131
+ Sheet,
132
+ SheetTrigger,
133
+ SheetClose,
134
+ SheetContent,
135
+ SheetHeader,
136
+ SheetFooter,
137
+ SheetTitle,
138
+ SheetDescription,
139
+ }
140
+
@@ -0,0 +1,80 @@
1
+ import DocsToc from "@/components/docs/docs-toc";
2
+
3
+ const toc = [
4
+ { id: "get-started-with-shipd", title: "Get started with shipd" },
5
+ { id: "quick-references", title: "Quick references" },
6
+ { id: "build-your-applications", title: "Build your applications" },
7
+ { id: "use-ai-infrastructure", title: "Use AI infrastructure" },
8
+ { id: "collaborate-with-your-team", title: "Collaborate with your team" },
9
+ { id: "secure-your-applications", title: "Secure your applications" },
10
+ { id: "deploy-and-scale", title: "Deploy and scale" },
11
+ ];
12
+
13
+ export default function DocsDocumentationPage() {
14
+ return (
15
+ <div className="grid grid-cols-1 xl:grid-cols-[minmax(0,1fr)_240px] gap-10">
16
+ <article className="py-10">
17
+ <div className="text-[56px] leading-[1.05] font-semibold tracking-tight">shipd Documentation</div>
18
+ <div className="mt-4 text-sm text-white/60">Last updated December 18, 2025</div>
19
+
20
+ <div className="mt-10 border-t border-white/10 pt-10 space-y-10">
21
+ <section id="get-started-with-shipd" className="space-y-4">
22
+ <h2 className="text-4xl font-semibold tracking-tight">Get started with shipd</h2>
23
+ <p className="text-white/70 text-lg leading-relaxed">
24
+ shipd helps you bootstrap and configure a production-ready SaaS in minutes — auth, payments,
25
+ dashboard, and more.
26
+ </p>
27
+ </section>
28
+
29
+ <section id="quick-references" className="space-y-3">
30
+ <h3 className="text-2xl font-semibold tracking-tight">Quick references</h3>
31
+ <p className="text-white/70 leading-relaxed">
32
+ Find common setup flows, environment variables, and deployment steps.
33
+ </p>
34
+ </section>
35
+
36
+ <section id="build-your-applications" className="space-y-3">
37
+ <h3 className="text-2xl font-semibold tracking-tight">Build your applications</h3>
38
+ <p className="text-white/70 leading-relaxed">
39
+ Learn the project structure, feature modules, and how to extend the scaffold safely.
40
+ </p>
41
+ </section>
42
+
43
+ <section id="use-ai-infrastructure" className="space-y-3">
44
+ <h3 className="text-2xl font-semibold tracking-tight">Use AI infrastructure</h3>
45
+ <p className="text-white/70 leading-relaxed">
46
+ Add AI features (chat, assistants) and keep secrets secure in server-side routes.
47
+ </p>
48
+ </section>
49
+
50
+ <section id="collaborate-with-your-team" className="space-y-3">
51
+ <h3 className="text-2xl font-semibold tracking-tight">Collaborate with your team</h3>
52
+ <p className="text-white/70 leading-relaxed">
53
+ Use preview deployments and keep configuration consistent across environments.
54
+ </p>
55
+ </section>
56
+
57
+ <section id="secure-your-applications" className="space-y-3">
58
+ <h3 className="text-2xl font-semibold tracking-tight">Secure your applications</h3>
59
+ <p className="text-white/70 leading-relaxed">
60
+ Harden auth flows, protect API routes, and validate all webhook inputs.
61
+ </p>
62
+ </section>
63
+
64
+ <section id="deploy-and-scale" className="space-y-3">
65
+ <h3 className="text-2xl font-semibold tracking-tight">Deploy and scale</h3>
66
+ <p className="text-white/70 leading-relaxed">
67
+ Deploy to Vercel, configure environment variables, and monitor key health signals.
68
+ </p>
69
+ </section>
70
+ </div>
71
+ </article>
72
+
73
+ <aside className="hidden xl:block">
74
+ <DocsToc items={toc} />
75
+ </aside>
76
+ </div>
77
+ );
78
+ }
79
+
80
+
@@ -0,0 +1,27 @@
1
+ import type { Metadata } from "next";
2
+ import DocsHeader from "@/components/docs/docs-header";
3
+ import DocsSidebar from "@/components/docs/docs-sidebar";
4
+
5
+ export const metadata: Metadata = {
6
+ title: "Docs",
7
+ };
8
+
9
+ export default function DocsLayout({ children }: { children: React.ReactNode }) {
10
+ return (
11
+ <div className="min-h-screen bg-black text-white">
12
+ <DocsHeader />
13
+
14
+ <div className="mx-auto max-w-[1400px] px-4 sm:px-6">
15
+ <div className="grid grid-cols-1 md:grid-cols-[260px_minmax(0,1fr)] gap-8">
16
+ <aside className="hidden md:block sticky top-14 h-[calc(100vh-3.5rem)] border-r border-white/10">
17
+ <DocsSidebar />
18
+ </aside>
19
+
20
+ <main className="min-w-0">{children}</main>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ );
25
+ }
26
+
27
+
@@ -0,0 +1,7 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
7
+
@@ -0,0 +1,360 @@
1
+ import Link from "next/link";
2
+ import {
3
+ ArrowRight,
4
+ Database,
5
+ Lock,
6
+ CreditCard,
7
+ Sparkles,
8
+ BarChart3,
9
+ Play,
10
+ Webhook,
11
+ Mail,
12
+ LayoutGrid,
13
+ } from "lucide-react";
14
+ import { Card, CardContent } from "@/components/ui/card";
15
+ import { BetterAuth, NeonPostgres, Nextjs, Polar, Shadcnui, TailwindCSS } from "@/components/logos";
16
+
17
+ function LogoTile({ children }: { children: React.ReactNode }) {
18
+ return (
19
+ <div className="h-12 w-12 rounded-xl border border-white/10 bg-white/5 flex items-center justify-center">
20
+ {children}
21
+ </div>
22
+ );
23
+ }
24
+
25
+ function TerminalBlock({ lines }: { lines: string[] }) {
26
+ return (
27
+ <div className="rounded-lg border border-white/10 bg-black/40 p-3 font-mono text-[13px] leading-6">
28
+ {lines.map((line, i) => (
29
+ <div key={i} className="whitespace-pre">
30
+ {line.startsWith("$") ? (
31
+ <>
32
+ <span className="text-emerald-400">$</span>
33
+ <span className="text-white/80"> </span>
34
+ <span className="text-[#ff7043]">{line.replace(/^\$\s?/, "").split(" ")[0]}</span>
35
+ <span className="text-white/80">
36
+ {" "}
37
+ {line.replace(/^\$\s?/, "").split(" ").slice(1).join(" ")}
38
+ </span>
39
+ </>
40
+ ) : (
41
+ <span className="text-white/70">{line}</span>
42
+ )}
43
+ </div>
44
+ ))}
45
+ </div>
46
+ );
47
+ }
48
+
49
+ function QuickStartStep({
50
+ index,
51
+ title,
52
+ description,
53
+ children,
54
+ showConnector,
55
+ }: {
56
+ index: number;
57
+ title: string;
58
+ description: string;
59
+ children?: React.ReactNode;
60
+ showConnector?: boolean;
61
+ }) {
62
+ return (
63
+ <div className="relative">
64
+ {showConnector ? <div className="absolute left-8 top-14 bottom-0 w-px bg-white/10" /> : null}
65
+ <Card className="bg-white/5 border-white/10 shadow-none">
66
+ <CardContent className="px-6">
67
+ <div className="pt-4 flex items-start gap-3">
68
+ <div className="mt-0.5 h-9 w-9 rounded-full border border-white/10 bg-black/30 flex items-center justify-center text-sm font-semibold text-white/80">
69
+ {index}
70
+ </div>
71
+ <div className="min-w-0 w-full">
72
+ <div className="text-base font-semibold text-white">{title}</div>
73
+ <p className="mt-1 text-sm text-white/60 leading-relaxed">{description}</p>
74
+ {children ? <div className="mt-4">{children}</div> : null}
75
+ </div>
76
+ </div>
77
+ <div className="pb-4" />
78
+ </CardContent>
79
+ </Card>
80
+ </div>
81
+ );
82
+ }
83
+
84
+ type RowItem = {
85
+ title: string;
86
+ href: string;
87
+ icon: React.ReactNode;
88
+ };
89
+
90
+ function RowLink({ item }: { item: RowItem }) {
91
+ return (
92
+ <Link href={item.href} className="group flex items-center gap-4 rounded-lg py-2">
93
+ <div className="h-10 w-10 rounded-xl border border-white/10 bg-white/5 flex items-center justify-center text-white/75 group-hover:bg-white/10 transition-colors">
94
+ {item.icon}
95
+ </div>
96
+ <div className="text-sm font-medium text-white/80 group-hover:text-white transition-colors">{item.title}</div>
97
+ </Link>
98
+ );
99
+ }
100
+
101
+ function SectionRow({
102
+ title,
103
+ description,
104
+ items,
105
+ }: {
106
+ title: string;
107
+ description?: string;
108
+ items: RowItem[];
109
+ }) {
110
+ return (
111
+ <div className="grid gap-8 md:grid-cols-[320px_minmax(0,1fr)] md:gap-12 py-12">
112
+ <div>
113
+ <div className="text-3xl font-semibold tracking-tight">{title}</div>
114
+ {description ? <p className="mt-3 text-sm leading-relaxed text-white/60">{description}</p> : null}
115
+ </div>
116
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-14 gap-y-4">
117
+ {items.map((item) => (
118
+ <RowLink key={item.href} item={item} />
119
+ ))}
120
+ </div>
121
+ </div>
122
+ );
123
+ }
124
+
125
+ export default function DocsIntroPage() {
126
+ return (
127
+ <div className="py-10">
128
+ {/* Hero */}
129
+ <section className="relative overflow-hidden rounded-2xl border border-white/10 bg-gradient-to-b from-white/[0.04] to-transparent">
130
+ <div className="absolute inset-0 pointer-events-none">
131
+ <div className="absolute -top-40 -left-40 h-96 w-96 rounded-full bg-white/[0.06] blur-3xl" />
132
+ <div className="absolute -bottom-40 -right-40 h-96 w-96 rounded-full bg-white/[0.05] blur-3xl" />
133
+ <div className="absolute inset-0 bg-[radial-gradient(circle_at_1px_1px,rgba(255,255,255,0.06)_1px,transparent_0)] [background-size:40px_40px] opacity-20" />
134
+ </div>
135
+
136
+ <div className="relative px-6 sm:px-10 py-14">
137
+ <div className="grid gap-10 lg:grid-cols-[1fr_420px] items-start">
138
+ <div>
139
+ <div className="text-[54px] leading-[1.05] font-semibold tracking-tight">
140
+ shipd Documentation
141
+ </div>
142
+ <p className="mt-4 max-w-2xl text-lg leading-relaxed text-white/70">
143
+ Learn how to get up and running with shipd through guides, setup checklists, and platform
144
+ resources.
145
+ </p>
146
+ <div className="mt-8 flex items-center gap-3">
147
+ <Link
148
+ href="/docs/documentation"
149
+ className="inline-flex items-center gap-2 rounded-md bg-white text-black px-4 py-2 text-sm font-medium hover:bg-white/90 transition-colors"
150
+ >
151
+ Read the docs <ArrowRight className="h-4 w-4" />
152
+ </Link>
153
+ <Link
154
+ href="/docs/production-checklist"
155
+ className="inline-flex items-center gap-2 rounded-md border border-white/10 bg-white/5 px-4 py-2 text-sm font-medium text-white/80 hover:text-white hover:bg-white/10 transition-colors"
156
+ >
157
+ Production checklist
158
+ </Link>
159
+ </div>
160
+ </div>
161
+
162
+ {/* Right “Getting Started” card (Supabase-style) */}
163
+ <div className="lg:pt-1">
164
+ <Card className="bg-black/40 border-white/10 shadow-none">
165
+ <CardContent className="px-6">
166
+ <div className="flex items-center gap-3 pt-6">
167
+ <div className="h-10 w-10 rounded-xl border border-white/10 bg-white/5 flex items-center justify-center">
168
+ <Play className="h-5 w-5 text-white/80" />
169
+ </div>
170
+ <div className="min-w-0">
171
+ <div className="text-base font-semibold text-white">Getting Started</div>
172
+ <div className="text-sm text-white/60">
173
+ Set up and launch a SaaS in minutes.
174
+ </div>
175
+ </div>
176
+ <div className="ml-auto text-xs text-white/50">Next.js</div>
177
+ </div>
178
+
179
+ <div className="mt-6 grid grid-cols-5 gap-3">
180
+ <LogoTile>
181
+ <Nextjs className="h-6 w-6" />
182
+ </LogoTile>
183
+ <LogoTile>
184
+ <TailwindCSS className="h-6 w-6" />
185
+ </LogoTile>
186
+ <LogoTile>
187
+ <Shadcnui className="h-6 w-6" />
188
+ </LogoTile>
189
+ <LogoTile>
190
+ <BetterAuth className="h-6 w-6" />
191
+ </LogoTile>
192
+ <LogoTile>
193
+ <Polar className="h-6 w-6" />
194
+ </LogoTile>
195
+ <LogoTile>
196
+ <NeonPostgres className="h-6 w-6" />
197
+ </LogoTile>
198
+ <LogoTile>
199
+ <Sparkles className="h-5 w-5 text-white/80" />
200
+ </LogoTile>
201
+ <LogoTile>
202
+ <Lock className="h-5 w-5 text-white/80" />
203
+ </LogoTile>
204
+ <LogoTile>
205
+ <CreditCard className="h-5 w-5 text-white/80" />
206
+ </LogoTile>
207
+ <LogoTile>
208
+ <BarChart3 className="h-5 w-5 text-white/80" />
209
+ </LogoTile>
210
+ </div>
211
+
212
+ <div className="mt-6 pb-6">
213
+ <Link
214
+ href="/docs/documentation#get-started-with-shipd"
215
+ className="inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-4 py-2 text-sm text-white/80 hover:text-white hover:bg-white/10 transition-colors"
216
+ >
217
+ Start with shipd prompts <ArrowRight className="h-4 w-4" />
218
+ </Link>
219
+ </div>
220
+ </CardContent>
221
+ </Card>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ <div className="border-t border-white/10" />
226
+ </section>
227
+
228
+ {/* Quickstart */}
229
+ <section className="mt-14">
230
+ <h2 className="text-2xl font-semibold tracking-tight">How it works</h2>
231
+ <p className="mt-3 text-sm text-white/60 max-w-3xl leading-relaxed">
232
+ Start with an empty folder, run the CLI, select your packages, and get a complete SaaS app with a landing page and all your selected features.
233
+ </p>
234
+
235
+ <div className="mt-6 space-y-3">
236
+ <QuickStartStep
237
+ index={1}
238
+ title="Start with an empty folder"
239
+ description="Create a new directory or navigate to where you want your project."
240
+ showConnector
241
+ >
242
+ <TerminalBlock lines={["$ mkdir my-saas && cd my-saas", "$ # or cd into existing empty folder"]} />
243
+ </QuickStartStep>
244
+
245
+ <QuickStartStep
246
+ index={2}
247
+ title="Run the CLI and select your packages"
248
+ description="The CLI prompts you to choose authentication (Better Auth, Supabase, NextAuth), database (Neon, Supabase, MongoDB), payments (Stripe, Polar, Lemon Squeezy), and more."
249
+ showConnector
250
+ >
251
+ <TerminalBlock lines={["$ npx shipd init my-app", "$ # Select: Auth → Better Auth", "$ # Select: Database → Neon Postgres", "$ # Select: Payments → Polar"]} />
252
+ </QuickStartStep>
253
+
254
+ <QuickStartStep
255
+ index={3}
256
+ title="CLI generates your project"
257
+ description="The CLI creates a complete Next.js app with a landing page, dashboard, authentication flows, billing pages, and all the code for your selected packages."
258
+ showConnector
259
+ >
260
+ <TerminalBlock lines={["✓ Template files copied", "✓ Dependencies installed", "✓ Git repository initialized", "$ # Your project is ready!"]} />
261
+ </QuickStartStep>
262
+
263
+ <QuickStartStep
264
+ index={4}
265
+ title="Configure environment variables"
266
+ description="Copy .env.example to .env.local and add your provider keys (auth secrets, database URLs, API tokens)."
267
+ showConnector
268
+ >
269
+ <TerminalBlock lines={["$ cp .env.example .env.local", "$ # Edit .env.local with your keys", "$ # DATABASE_URL, BETTER_AUTH_SECRET, etc."]} />
270
+ </QuickStartStep>
271
+
272
+ <QuickStartStep
273
+ index={5}
274
+ title="Run the dev server"
275
+ description="Start your app and visit the landing page. Sign up, access the dashboard, and test your selected features."
276
+ >
277
+ <TerminalBlock lines={["$ npm run dev", "$ # Open http://localhost:3000", "$ # Landing page → Sign up → Dashboard"]} />
278
+ </QuickStartStep>
279
+ </div>
280
+ </section>
281
+
282
+ {/* Rows layout (Supabase-style) for packages/features */}
283
+ <div className="mt-14 border-t border-white/10" />
284
+
285
+ <SectionRow
286
+ title="Authentication"
287
+ description="Choose how users sign in (magic links, Google OAuth) and how sessions are stored."
288
+ items={[
289
+ { title: "Better Auth", href: "/docs/authentication/better-auth", icon: <Lock className="h-5 w-5" /> },
290
+ { title: "Supabase Auth", href: "/docs/authentication/supabase-auth", icon: <Lock className="h-5 w-5" /> },
291
+ { title: "NextAuth", href: "/docs/authentication/nextauth", icon: <Lock className="h-5 w-5" /> },
292
+ ]}
293
+ />
294
+
295
+ <div className="border-t border-white/10" />
296
+
297
+ <SectionRow
298
+ title="Payments"
299
+ description="Create checkout sessions, handle webhooks, and update subscription state."
300
+ items={[
301
+ { title: "Stripe", href: "/docs/payments/stripe", icon: <CreditCard className="h-5 w-5" /> },
302
+ { title: "Lemon Squeezy", href: "/docs/payments/lemon-squeezy", icon: <CreditCard className="h-5 w-5" /> },
303
+ { title: "Polar", href: "/docs/payments/polar", icon: <CreditCard className="h-5 w-5" /> },
304
+ ]}
305
+ />
306
+
307
+ <div className="border-t border-white/10" />
308
+
309
+ <SectionRow
310
+ title="Emails"
311
+ description="Send transactional email and set up DNS (DKIM/DMARC/SPF) to avoid spam folders."
312
+ items={[
313
+ { title: "Resend", href: "/docs/emails/resend", icon: <Mail className="h-5 w-5" /> },
314
+ { title: "Mailgun", href: "/docs/emails/mailgun", icon: <Mail className="h-5 w-5" /> },
315
+ { title: "Inbound webhook forwarding", href: "/docs/emails/inbound-webhooks", icon: <Webhook className="h-5 w-5" /> },
316
+ ]}
317
+ />
318
+
319
+ <div className="border-t border-white/10" />
320
+
321
+ <SectionRow
322
+ title="Database"
323
+ description="Pick your persistence layer and get schemas/tables plus starter queries."
324
+ items={[
325
+ { title: "Supabase Postgres", href: "/docs/database/supabase-postgres", icon: <Database className="h-5 w-5" /> },
326
+ { title: "Neon Postgres", href: "/docs/database/neon-postgres", icon: <Database className="h-5 w-5" /> },
327
+ { title: "MongoDB", href: "/docs/database/mongodb", icon: <Database className="h-5 w-5" /> },
328
+ ]}
329
+ />
330
+
331
+ <div className="border-t border-white/10" />
332
+
333
+ <SectionRow
334
+ title="SEO"
335
+ description="Ship a blog + metadata defaults that help you rank and share."
336
+ items={[
337
+ { title: "Blog starter", href: "/docs/seo/blog", icon: <LayoutGrid className="h-5 w-5" /> },
338
+ { title: "OpenGraph tags", href: "/docs/seo/opengraph", icon: <LayoutGrid className="h-5 w-5" /> },
339
+ { title: "Sitemap generation", href: "/docs/seo/sitemap", icon: <LayoutGrid className="h-5 w-5" /> },
340
+ ]}
341
+ />
342
+
343
+ <div className="border-t border-white/10" />
344
+
345
+ <SectionRow
346
+ title="Style"
347
+ description="A polished UI starter with components, themes, and dark mode."
348
+ items={[
349
+ { title: "Tailwind CSS", href: "/docs/style/tailwind", icon: <Sparkles className="h-5 w-5" /> },
350
+ { title: "daisyUI themes", href: "/docs/style/daisyui", icon: <Sparkles className="h-5 w-5" /> },
351
+ { title: "Automatic dark mode", href: "/docs/style/dark-mode", icon: <Sparkles className="h-5 w-5" /> },
352
+ ]}
353
+ />
354
+
355
+ <div className="border-t border-white/10" />
356
+ </div>
357
+ );
358
+ }
359
+
360
+
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "shipd",
3
+ "version": "0.1.0",
4
+ "description": "Generate production-ready SaaS applications with authentication, billing, and more",
5
+ "type": "module",
6
+ "bin": {
7
+ "shipd": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist",
12
+ "template",
13
+ "docs-template",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup src/index.ts --format esm --dts",
19
+ "dev": "tsup src/index.ts --format esm --watch",
20
+ "typecheck": "tsc --noEmit",
21
+ "prepublishOnly": "node prepublish.js && npm run build"
22
+ },
23
+ "keywords": [
24
+ "saas",
25
+ "scaffold",
26
+ "nextjs",
27
+ "cli",
28
+ "template",
29
+ "boilerplate",
30
+ "starter",
31
+ "authentication",
32
+ "billing",
33
+ "polar",
34
+ "better-auth"
35
+ ],
36
+ "author": "Anton",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/kedbrant/Saas-scaffold.git",
41
+ "directory": "packages/cli"
42
+ },
43
+ "homepage": "https://www.shipd.dev",
44
+ "bugs": {
45
+ "url": "https://github.com/kedbrant/Saas-scaffold/issues"
46
+ },
47
+ "dependencies": {
48
+ "commander": "^12.0.0",
49
+ "inquirer": "^9.2.0",
50
+ "chalk": "^5.3.0",
51
+ "ora": "^8.0.0",
52
+ "fs-extra": "^11.2.0",
53
+ "execa": "^8.0.0",
54
+ "validate-npm-package-name": "^5.0.0",
55
+ "globby": "^14.0.0",
56
+ "nanoid": "^5.0.0",
57
+ "open": "^10.0.0"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^20.0.0",
61
+ "@types/inquirer": "^9.0.0",
62
+ "@types/fs-extra": "^11.0.0",
63
+ "tsup": "^8.0.0",
64
+ "typescript": "^5.3.0"
65
+ }
66
+ }