diff --git a/Dockerfile b/Dockerfile index e34463b..b72c44b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,6 +55,7 @@ COPY package.json pnpm-lock.yaml .npmrc ./ COPY --from=builder /app/node_modules /app/node_modules COPY --from=builder /app/.next /app/.next +COPY --from=builder /app/public /app/public #USER nextjs diff --git a/app/comparison/[...slug]/page.tsx b/app/comparison/[...slug]/page.tsx new file mode 100644 index 0000000..ee8b1b1 --- /dev/null +++ b/app/comparison/[...slug]/page.tsx @@ -0,0 +1,42 @@ +import { redirect } from 'next/navigation' +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { gitlabFeatures } from '../gitlab/features' +import { signadotFeatures } from '../signadot/features' +import { bunnyshellFeatures } from '../bunnyshell/features' +import { qoveryFeatures } from '../qovery/features' +import { shipyardFeatures } from '../shipyard/features' + +type CompetitorData = { + name: string; + features: { + name: string; + release: boolean; + competitor: boolean; + description: string; + }[]; +}; + +const competitorMap: Record = { + gitlab: { name: 'GitLab', features: gitlabFeatures }, + signadot: { name: 'Signadot', features: signadotFeatures }, + bunnyshell: { name: 'Bunnyshell', features: bunnyshellFeatures }, + qovery: { name: 'Qovery', features: qoveryFeatures }, + quovery: { name: 'Qovery', features: qoveryFeatures }, + shipyard: { name: 'Shipyard', features: shipyardFeatures }, +} + +export default function ComparisonPage({ params }: { params: { slug: string[] } }) { + const competitor = params.slug[0]?.split('.')[0].toLowerCase() + const competitorData = competitorMap[competitor as keyof typeof competitorMap] + + if (!competitorData) { + redirect('/comparison') + } + + return ( + + ) +} diff --git a/app/comparison/bunnyshell/features.ts b/app/comparison/bunnyshell/features.ts new file mode 100644 index 0000000..ff338a8 --- /dev/null +++ b/app/comparison/bunnyshell/features.ts @@ -0,0 +1,38 @@ +export const bunnyshellFeatures = [ + { + name: "Ephemeral Environments", + release: true, + competitor: true, + description: "While Bunnyshell offers ephemeral environments, Release provides more advanced isolation and disposability for every pull request, offering superior testing and development capabilities." + }, + { + name: "Complex Environment Support", + release: true, + competitor: false, + description: "Release excels in supporting complex, multi-service architectures and microservices across various cloud providers. Bunnyshell's support for intricate setups is more limited." + }, + { + name: "Environment-based CI/CD", + release: true, + competitor: true, + description: "Both Release and Bunnyshell offer environment-based CI/CD, but Release provides more granular control and flexibility for complex workflows, especially in multi-cloud scenarios." + }, + { + name: "Infrastructure as Code", + release: true, + competitor: true, + description: "Release supports a wider range of IaC tools including Terraform, Helm, and Docker Compose. While Bunnyshell has IaC capabilities, Release offers more flexibility and integration options." + }, + { + name: "Cost-Effectiveness", + release: true, + competitor: false, + description: "Release's efficient resource allocation and management typically result in 40-60% cost savings on DevOps compared to Bunnyshell, especially for complex, multi-environment setups." + }, + { + name: "Developer Productivity", + release: true, + competitor: true, + description: "Both platforms enhance developer productivity, but Release's deeper integration with ephemeral environments and more comprehensive automation tools often lead to greater efficiency gains." + } +] diff --git a/app/comparison/bunnyshell/page.tsx b/app/comparison/bunnyshell/page.tsx new file mode 100644 index 0000000..5044180 --- /dev/null +++ b/app/comparison/bunnyshell/page.tsx @@ -0,0 +1,6 @@ +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { bunnyshellFeatures } from './features' + +export default function BunnyshellComparison() { + return +} diff --git a/app/comparison/gitlab/features.ts b/app/comparison/gitlab/features.ts new file mode 100644 index 0000000..0cba957 --- /dev/null +++ b/app/comparison/gitlab/features.ts @@ -0,0 +1,38 @@ +export const gitlabFeatures = [ + { + name: "Ephemeral Environments", + release: true, + competitor: false, + description: "Release is built around the concept of Ephemeral Environments, providing fully isolated, disposable environments for every pull request. GitLab's review apps offer limited environment isolation and are not as comprehensive." + }, + { + name: "Complex Environment Support", + release: true, + competitor: false, + description: "Release excels in supporting complex, multi-service architectures and microservices across various cloud providers. GitLab's environment support is more limited and less flexible for intricate setups." + }, + { + name: "Environment-based CI/CD", + release: true, + competitor: true, + description: "Release offers a full set of integrations focused on Environment-based CI/CD and automation. While GitLab has CI/CD capabilities, Release's approach provides more granular control and flexibility for complex workflows." + }, + { + name: "Infrastructure as Code", + release: true, + competitor: true, + description: "Release supports multiple IaC tools like Terraform, Helm, and Docker Compose, offering greater flexibility. GitLab's IaC support is more limited and less integrated with ephemeral environments." + }, + { + name: "Cost-Effectiveness", + release: true, + competitor: false, + description: "Release's Ephemeral Environment approach and efficient resource allocation lead to significant cost savings, especially for complex setups. Users typically save 40-60% on DevOps costs compared to GitLab's fixed pricing, which can lead to overprovisioning and wasted resources." + }, + { + name: "Developer Productivity", + release: true, + competitor: true, + description: "Release's focus on Ephemeral Environments and automated workflows significantly boosts developer productivity, especially for complex projects. GitLab offers good productivity tools but lacks the deep integration with ephemeral environments." + } +] diff --git a/app/comparison/gitlab/page.tsx b/app/comparison/gitlab/page.tsx new file mode 100644 index 0000000..968c60d --- /dev/null +++ b/app/comparison/gitlab/page.tsx @@ -0,0 +1,6 @@ +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { gitlabFeatures } from './features' + +export default function GitLabComparison() { + return +} diff --git a/app/comparison/page.tsx b/app/comparison/page.tsx new file mode 100644 index 0000000..1395233 --- /dev/null +++ b/app/comparison/page.tsx @@ -0,0 +1,109 @@ +'use client' + +import Link from 'next/link' +import { Button } from "@/components/ui/button" +import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card" +import { CheckIcon, XIcon, ArrowRightIcon } from 'lucide-react' +import Header from '@/components/Header' +import Footer from '@/components/Footer' +import { gitlabFeatures } from './gitlab/features' +import { signadotFeatures } from './signadot/features' +import { bunnyshellFeatures } from './bunnyshell/features' +import { qoveryFeatures } from './qovery/features' +import { shipyardFeatures } from './shipyard/features' + +const competitors = [ + { name: 'GitLab', features: gitlabFeatures, path: '/comparison/gitlab' }, + { name: 'Signadot', features: signadotFeatures, path: '/comparison/signadot' }, + { name: 'Bunnyshell', features: bunnyshellFeatures, path: '/comparison/bunnyshell' }, + { name: 'Qovery', features: qoveryFeatures, path: '/comparison/qovery' }, + { name: 'Shipyard', features: shipyardFeatures, path: '/comparison/shipyard' } +] + +export default function ComparisonPage() { + return ( +
+
+
+
+
+

Release vs. Competitors

+

Discover how Release outperforms other DevOps platforms across key features.

+
+ + + + + + +
+
+
+ +
+ {competitors.map((competitor) => ( + + + Release vs. {competitor.name} + + +
+ {competitor.features.slice(0, 3).map((feature) => ( +
+

{feature.name}

+
+
+ + Release +
+
+ {feature.competitor ? ( + + ) : ( + + )} + {competitor.name} +
+
+

{feature.description}

+
+ ))} +
+
+ + + +
+
+
+ ))} + +
+

Ready to Experience the Release Difference?

+

Join the companies that have accelerated their development and reduced costs with Release.

+
+ + + + + + +
+
+
+
+
+
+ ) +} diff --git a/app/comparison/qovery/features.ts b/app/comparison/qovery/features.ts new file mode 100644 index 0000000..22de8d5 --- /dev/null +++ b/app/comparison/qovery/features.ts @@ -0,0 +1,38 @@ +export const qoveryFeatures = [ + { + name: "Ephemeral Environments", + release: true, + competitor: true, + description: "Both Release and Qovery offer ephemeral environments, but Release provides more advanced isolation and disposability for every pull request, offering superior testing and development capabilities." + }, + { + name: "Complex Environment Support", + release: true, + competitor: false, + description: "Release excels in supporting complex, multi-service architectures and microservices across various cloud providers. Qovery's support for intricate setups is more limited, especially for multi-cloud scenarios." + }, + { + name: "Environment-based CI/CD", + release: true, + competitor: true, + description: "While both platforms offer environment-based CI/CD, Release provides more granular control and flexibility for complex workflows, especially in multi-cloud scenarios." + }, + { + name: "Infrastructure as Code", + release: true, + competitor: true, + description: "Release supports a wider range of IaC tools including Terraform, Helm, and Docker Compose. Qovery has IaC capabilities, but Release offers more flexibility and integration options." + }, + { + name: "Cost-Effectiveness", + release: true, + competitor: false, + description: "Release's efficient resource allocation and management typically result in 40-60% cost savings on DevOps compared to Qovery, especially for complex, multi-environment setups." + }, + { + name: "Developer Productivity", + release: true, + competitor: true, + description: "Both platforms enhance developer productivity, but Release's deeper integration with ephemeral environments and more comprehensive automation tools often lead to greater efficiency gains." + } +] diff --git a/app/comparison/qovery/page.tsx b/app/comparison/qovery/page.tsx new file mode 100644 index 0000000..0cc1f3e --- /dev/null +++ b/app/comparison/qovery/page.tsx @@ -0,0 +1,6 @@ +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { qoveryFeatures } from './features' + +export default function QoveryComparison() { + return +} diff --git a/app/comparison/shipyard/features.ts b/app/comparison/shipyard/features.ts new file mode 100644 index 0000000..4b3dc06 --- /dev/null +++ b/app/comparison/shipyard/features.ts @@ -0,0 +1,38 @@ +export const shipyardFeatures = [ + { + name: "Ephemeral Environments", + release: true, + competitor: true, + description: "Both Release and Shipyard offer ephemeral environments, but Release provides more advanced isolation and disposability for every pull request, offering superior testing and development capabilities." + }, + { + name: "Complex Environment Support", + release: true, + competitor: false, + description: "Release excels in supporting complex, multi-service architectures and microservices across various cloud providers. Shipyard's support for intricate setups is more limited, especially for multi-cloud scenarios." + }, + { + name: "Environment-based CI/CD", + release: true, + competitor: true, + description: "While both platforms offer environment-based CI/CD, Release provides more granular control and flexibility for complex workflows, especially in multi-cloud scenarios." + }, + { + name: "Infrastructure as Code", + release: true, + competitor: true, + description: "Release supports a wider range of IaC tools including Terraform, Helm, and Docker Compose. Shipyard has IaC capabilities, but Release offers more flexibility and integration options." + }, + { + name: "Cost-Effectiveness", + release: true, + competitor: false, + description: "Release's efficient resource allocation and management typically result in significant cost savings, especially for complex, multi-environment setups. Users often report 40-60% savings on DevOps costs compared to Shipyard." + }, + { + name: "Developer Productivity", + release: true, + competitor: true, + description: "Both platforms enhance developer productivity, but Release's deeper integration with ephemeral environments and more comprehensive automation tools often lead to greater efficiency gains." + } +] diff --git a/app/comparison/shipyard/page.tsx b/app/comparison/shipyard/page.tsx new file mode 100644 index 0000000..3bbcc3a --- /dev/null +++ b/app/comparison/shipyard/page.tsx @@ -0,0 +1,6 @@ +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { shipyardFeatures } from './features' + +export default function ShipyardComparison() { + return +} diff --git a/app/comparison/signadot/features.ts b/app/comparison/signadot/features.ts new file mode 100644 index 0000000..82f49f3 --- /dev/null +++ b/app/comparison/signadot/features.ts @@ -0,0 +1,38 @@ +export const signadotFeatures = [ + { + name: "Ephemeral Environments", + release: true, + competitor: true, + description: "Both Release and Signadot offer ephemeral environments, but Release provides more comprehensive isolation and integration capabilities across a wider range of cloud providers and services." + }, + { + name: "Complex Environment Support", + release: true, + competitor: false, + description: "Release excels in supporting complex, multi-service architectures and microservices across various cloud providers. Signadot's support for intricate setups is more limited, especially for multi-cloud scenarios." + }, + { + name: "Environment-based CI/CD", + release: true, + competitor: true, + description: "While both platforms offer environment-based CI/CD, Release provides more extensive integrations and flexibility, especially for complex workflows involving multiple services and cloud providers." + }, + { + name: "Infrastructure as Code", + release: true, + competitor: true, + description: "Release supports a wider range of IaC tools including Terraform, Helm, and Docker Compose. Signadot has IaC capabilities, but Release offers more flexibility and integration options." + }, + { + name: "Cost-Effectiveness", + release: true, + competitor: false, + description: "Release's efficient resource allocation and management typically result in significant cost savings, especially for complex, multi-environment setups. Users often report 40-60% savings on DevOps costs compared to Signadot." + }, + { + name: "Developer Productivity", + release: true, + competitor: true, + description: "Both platforms enhance developer productivity, but Release's deeper integration with a wider range of tools and services, along with more comprehensive automation capabilities, often leads to greater efficiency gains." + } +] diff --git a/app/comparison/signadot/page.tsx b/app/comparison/signadot/page.tsx new file mode 100644 index 0000000..619a1bc --- /dev/null +++ b/app/comparison/signadot/page.tsx @@ -0,0 +1,6 @@ +import { EnhancedComparisonPage } from '@/components/EnhancedComparisonPage' +import { signadotFeatures } from './features' + +export default function SignadotComparison() { + return +} diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fe..2cfe6b1 100644 Binary files a/app/favicon.ico and b/app/favicon.ico differ diff --git a/app/globals.css b/app/globals.css index a5cc41b..943afd9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,73 +1,44 @@ @tailwind base; @tailwind components; @tailwind utilities; - -body { - font-family: Arial, Helvetica, sans-serif; -} - -@layer utilities { - .text-balance { - text-wrap: balance; - } -} - + @layer base { :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - --radius: 0.5rem; - } - .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; --popover-foreground: 210 40% 98%; + --primary: 210 40% 98%; --primary-foreground: 222.2 47.4% 11.2%; + --primary-light: 210 40% 90%; + --secondary: 217.2 32.6% 17.5%; --secondary-foreground: 210 40% 98%; + --secondary-light: 217.2 32.6% 25%; + --muted: 217.2 32.6% 17.5%; --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; --destructive-foreground: 210 40% 98%; + --destructive-light: 0 62.8% 40%; + --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 212.7 26.8% 83.9%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; + + --radius: 0.5rem; } } - + @layer base { * { @apply border-border; diff --git a/app/layout.tsx b/app/layout.tsx index a36cde0..4078828 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,35 +1,86 @@ -import type { Metadata } from "next"; -import localFont from "next/font/local"; -import "./globals.css"; +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' +import './globals.css' +import Script from 'next/script' -const geistSans = localFont({ - src: "./fonts/GeistVF.woff", - variable: "--font-geist-sans", - weight: "100 900", -}); -const geistMono = localFont({ - src: "./fonts/GeistMonoVF.woff", - variable: "--font-geist-mono", - weight: "100 900", -}); +const inter = Inter({ subsets: ['latin'] }) export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'Release - Faster, Cheaper DevOps. Ephemeral Environments', + description: 'Create, manage, and scale on-demand environments in minutes. Empower developers, reduce DevOps costs, and accelerate your development workflow with Release.com.', + keywords: 'ephemeral environments, development workflow, DevOps, cloud infrastructure, CI/CD, developer productivity, on-demand environments', + openGraph: { + title: 'Release - Faster, Cheaper DevOps. Ephemeral Environments', + description: 'Create on-demand environments in minutes. Empower developers, reduce costs with Release.com.', + url: 'https://release.com', + siteName: 'Release.com', + images: [ + { + url: 'https://release.com/og-image.jpg', + width: 1200, + height: 630, + alt: 'Release.com - Ephemeral Environments', + }, + ], + locale: 'en_US', + type: 'website', + }, + twitter: { + card: 'summary_large_image', + title: 'Release - Faster, Cheaper DevOps. Ephemeral Environments', + description: 'Create on-demand environments in minutes. Empower developers, reduce costs with Release.com.', + images: ['https://release.com/twitter-image.jpg'], + }, + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + 'max-video-preview': -1, + 'max-image-preview': 'large', + 'max-snippet': -1, + }, + }, + verification: { + google: 'your-google-site-verification-code', + yandex: 'your-yandex-verification-code', + }, +} + +export const viewport = { + width: 'device-width', + initialScale: 1, +} export default function RootLayout({ children, -}: Readonly<{ - children: React.ReactNode; -}>) { +}: { + children: React.ReactNode +}) { return ( - - {children} - + + +