@@ -3,21 +3,37 @@ import Link from "next/link";
33import { Button } from "@rivet-gg/components" ;
44import {
55 Icon ,
6+ faCode ,
7+ faLayerGroup ,
8+ faTerminal ,
9+ faDesktop ,
10+ faListCheck ,
11+ faArrowsToCircle ,
12+ faReact ,
13+ faVuejs ,
14+ faAngular ,
15+ faNodeJs ,
16+ faPython ,
17+ faPhp ,
18+ faJava ,
19+ faCss3Alt ,
20+ faHtml5 ,
21+ faRust ,
22+ faSwift ,
23+ faJsSquare ,
24+ faGolang ,
25+ faDatabase ,
26+ faDocker ,
627 faArrowRight ,
28+ faRobot ,
29+ faServer ,
30+ faVectorSquare ,
731} from "@rivet-gg/icons" ;
832import { CopyCommand } from "./CopyCommand" ;
933import { TutorialsSection } from "./TutorialsSection" ;
1034import { CommandCenterSection } from "./CommandCenterSection" ;
1135import { CommunitySection } from "./CommunitySection" ;
1236import { CtaSection } from "./CtaSection" ;
13- import { MarketingButton } from "./MarketingButton" ;
14- import { CtaButtons } from "./CtaButtons" ;
15- import { PowerfulPrimitivesSection } from "./PowerfulPrimitivesSection" ;
16- import { ServerlessLimitationsSection } from "./ServerlessLimitationsSection" ;
17- import { RivetCloudSection } from "./RivetCloudSection" ;
18- import { PerformanceSection } from "./PerformanceSection" ;
19- import { FeaturesGrid } from "./FeaturesGrid" ;
20- import { FrameworksSection } from "./FrameworksSection" ;
2137
2238export const metadata : Metadata = {
2339 title : "Rivet - The Open-Source Serverless Platform" ,
@@ -31,37 +47,92 @@ export default function IndexPage() {
3147 return (
3248 < >
3349 < div />
34-
35- { /* BG gradient */ }
36- { /*<div className="absolute inset-0 h-[800px] w-full bg-gradient-to-bl from-[rgba(255,255,255,0.03)] via-[rgba(255,255,255,0.01)] to-transparent z-[-1]"></div>*/ }
37-
38- { /* Content */ }
39- < main className = "min-h-screen w-full max-w-[1500px] mx-auto px-4 md:px-8" >
50+ < main className = "min-h-screen w-full max-w-[1500px] mx-auto md:px-8" >
4051 < Hero />
4152 < FeaturesGrid />
42- < PowerfulPrimitivesSection />
43- < ServerlessLimitationsSection />
44- < PerformanceSection />
45- { /*<FrameworksSection />*/ }
46- { /*<TutorialsSection />*/ }
53+ < FrameworksSection />
54+ < TutorialsSection />
4755 < CommandCenterSection />
48- < RivetCloudSection />
4956 < CommunitySection />
5057 < CtaSection />
5158 </ main >
5259 </ >
5360 ) ;
5461}
62+
5563// Hero component with title, subtitle, and CTA buttons
5664const Hero = ( ) => {
5765 return (
58- < div className = "relative isolate overflow-hidden pb-8 sm:pb-10 pt-40" >
59- < div className = "mx-auto max-w-[1200px] md:px-8" > { /* Width/padding ocpied from FancyHeader */ }
60- < div className = "max-w-2xl mx-auto sm:mx-0" >
61- { /* On-Prem CF Workers */ }
62- { /*<div>
66+ < div className = "relative isolate overflow-hidden pt-14" >
67+ < div className = "mx-auto max-w-7xl px-6 pt-24 pb-12 sm:pt-32 sm:pb-16 lg:px-8" >
68+ < div className = "mx-auto max-w-4xl text-center" >
69+ < h1 className = "text-4xl font-bold tracking-tight text-white sm:text-6xl md:text-6xl" >
70+ The Open-Source
71+ < br className = "hidden sm:block" />
72+ Serverless Platform
73+ </ h1 >
74+ < p className = "mt-8 text-lg leading-8 text-white/70 max-w-2xl mx-auto" >
75+ Easily build & scale { " " }
76+ < span className = "text-white font-medium" >
77+ AI agents
78+ </ span >
79+ ,{ " " }
80+ < span className = "text-white font-medium" >
81+ functions
82+ </ span >
83+ ,{ " " }
84+ < span className = "text-white font-medium" >
85+ stateful services
86+ </ span >
87+ , and more.
88+ < br />
89+ < span className = "text-white/60 font-light" >
90+ Open-source & self - hostable .
91+ </ span >
92+ </ p >
93+ < div className = "mt-10 flex items-center justify-center gap-x-6" >
94+ < Button
95+ size = "lg"
96+ asChild
97+ className = "px-4 pr-6 py-3 text-base bg-gradient-to-b from-[#FF5C00] to-[#FF5C00]/90 border border-[#FF5C00]/30 hover:border-[#FF5C00]/60 transition-all duration-200 group"
98+ >
99+ < Link
100+ href = "#deploy"
101+ className = "flex items-center justify-center relative"
102+ >
103+ < span > Deploy in 1 Minute</ span >
104+ < Icon
105+ icon = { faArrowRight }
106+ className = "absolute right-2 text-sm opacity-0 group-hover:opacity-100 group-hover:translate-x-1 transition-all duration-200"
107+ />
108+ </ Link >
109+ </ Button >
110+ < Button
111+ variant = "outline"
112+ size = "lg"
113+ asChild
114+ className = "px-4 pr-6 py-3 text-base border-white/10 hover:border-white/30 transition-all duration-200 group"
115+ >
116+ < Link
117+ href = "#demo"
118+ className = "flex items-center justify-center relative"
119+ >
120+ < span > Book Demo</ span >
121+ < Icon
122+ icon = { faArrowRight }
123+ className = "absolute right-2 text-sm opacity-0 group-hover:opacity-100 group-hover:translate-x-1 transition-all duration-200"
124+ />
125+ </ Link >
126+ </ Button >
127+ </ div >
128+
129+ < div className = "mt-6 text-center" >
130+ < p className = "text-white/40 mb-6" > or run locally</ p >
131+ < CopyCommand command = "docker run rivetgg/rivet:latest" />
132+ </ div >
133+ < div className = "mt-8 inline-flex" >
63134 < Link
64- href="/docs/rivet-vs- cloudflare-workers "
135+ href = "/docs/cloudflare-compatibility "
65136 className = "group"
66137 >
67138 < div className = "text-sm px-4 py-2 bg-[#FF5C00]/5 border border-[#FF5C00]/10 rounded-full inline-flex items-center group-hover:bg-[#FF5C00]/10 group-hover:border-[#FF5C00]/20 transition-all" >
@@ -83,44 +154,190 @@ const Hero = () => {
83154 </ div >
84155 </ Link >
85156 </ div >
157+ </ div >
158+ </ div >
159+ </ div >
160+ ) ;
161+ } ;
86162
87- <div className="h-8" />*/ }
163+ // Feature component for individual features
164+ const Feature = ( {
165+ title,
166+ description,
167+ faIcon,
168+ href,
169+ useCases,
170+ } : {
171+ title : string ;
172+ description : string ;
173+ faIcon : any ;
174+ href : string ;
175+ useCases ?: string [ ] ;
176+ } ) => {
177+ return (
178+ < Link href = { href } className = "block group" >
179+ < div className = "rounded-xl bg-[#121212] group-hover:bg-zinc-800/90 border border-white/5 group-hover:border-[white]/20 shadow-sm transition-all duration-200 relative overflow-hidden h-[280px] flex flex-col" >
180+ { /* Simple icon that lights up on hover */ }
181+ < div className = "h-32 w-full flex items-center justify-center mt-6" >
182+ < Icon
183+ icon = { faIcon }
184+ className = "text-6xl text-white/10 group-hover:text-[#FF5C00]/90 transition-colors duration-300"
185+ />
186+ </ div >
88187
89- { /* Title */ }
90- < div className = "space-y-6 text-center sm:text-left" >
91- < h1 className = "text-4xl sm:text-5xl md:text-6xl font-700 text-white leading-[1.3] sm:leading-[1.1] tracking-normal" >
92- The open-source serverless platform
93- </ h1 >
94- < p className = "text-lg sm:text-xl leading-[1.2] tracking-tight font-500 text-white/40 max-w-lg mx-auto sm:mx-0" >
95- Easily deploy & scale { " " }
96- < span className = "text-white/90" > AI agents</ span > ,{ " " }
97- < span className = "text-white/90" >
98- complex workloads
99- </ span > , and{ " " }
100- < span className = "text-white/90" > backends</ span > { " " }
101- — all on a frictionless platform that runs anywhere.
102- { /*<span className="text-white/80">
103- Open-source
104- </span> &{" "}
105- <span className="text-white/80">
106- self-hostable
107- </span>.*/ }
108- </ p >
188+ { /* Text content */ }
189+ < div className = "px-8 pb-8 flex-1 mt-4" >
190+ < h3 className = "text-xl font-semibold text-white mb-2" >
191+ { title }
192+ </ h3 >
193+ < p className = "text-white/60 text-sm" > { description } </ p >
194+
195+ { useCases && useCases . length > 0 && (
196+ < div className = "mt-2 flex flex-wrap gap-x-2 text-xs text-white/50" >
197+ < span className = "text-white/40" > Good for:</ span >
198+ { useCases . map ( ( useCase , index ) => (
199+ < span key = { index } className = "text-white/70" >
200+ { useCase } { index < useCases . length - 1 ? "," : "" }
201+ </ span >
202+ ) ) }
203+ </ div >
204+ ) }
205+
206+ < div className = "flex items-center mt-4 text-[#FF5C00] opacity-0 group-hover:opacity-100 transition-opacity" >
207+ < span className = "text-sm font-medium" > Learn more</ span >
208+ < Icon
209+ icon = { faArrowRight }
210+ className = "ml-2 text-xs group-hover:translate-x-0.5 transition-all"
211+ />
109212 </ div >
213+ </ div >
214+ </ div >
215+ </ Link >
216+ ) ;
217+ } ;
110218
111- < div className = "h-10" />
219+ // Features grid component
220+ const FeaturesGrid = ( ) => {
221+ const features = [
222+ {
223+ title : "Functions" ,
224+ description : "Deploy serverless functions that scale automatically" ,
225+ faIcon : faCode ,
226+ href : "/docs/functions" ,
227+ useCases : [ "APIs" , "Edge computing" , "Microservices" ]
228+ } ,
229+ {
230+ title : "Stateful Actors" ,
231+ description : "Long-running tasks with built-in state persistence & hibernation" ,
232+ faIcon : faLayerGroup ,
233+ href : "/docs/stateful-jobs" ,
234+ useCases : [ "AI agents" , "Realtime apps" , "Rate limiting" ]
235+ } ,
236+ {
237+ title : "Sandboxed Containers" ,
238+ description : "Run long-running tasks in isolated environments" ,
239+ faIcon : faServer ,
240+ href : "/docs/stateful-jobs" ,
241+ useCases : [ "Code interpreters" , "Remote desktop" , "UGC games" ]
242+ } ,
243+ {
244+ title : "Workflows" ,
245+ description : "Orchestrate complex, multi-step processes" ,
246+ faIcon : faArrowsToCircle ,
247+ href : "/docs/workflows" ,
248+ useCases : [ "AI agents" , "Business logic" , "Data pipelines" ]
249+ } ,
250+ {
251+ title : "SQLite Databases" ,
252+ description : "On-demand SQL databases 10x faster than Postgres with vector stores & full text search" ,
253+ faIcon : faDatabase ,
254+ href : "/docs/sqlite-databases" ,
255+ useCases : [ "Agent memory" , "Per-tenant databases" , "Local-first apps" ]
256+ } ,
257+ ] ;
112258
113- { /* CTA */ }
114- < div className = "flex justify-center sm:justify-start" >
115- < CtaButtons />
116- </ div >
259+ return (
260+ < div className = "mx-auto w-full px-6 pt-0 pb-16 -mt-8" >
261+ < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mt-16 md:mt-20" >
262+ { features . map ( ( feature , index ) => (
263+ < Feature
264+ key = { index }
265+ title = { feature . title }
266+ description = { feature . description }
267+ faIcon = { feature . faIcon }
268+ href = { feature . href }
269+ useCases = { feature . useCases }
270+ />
271+ ) ) }
272+ </ div >
273+ < div className = "text-center mt-16" >
274+ < p className = "text-white/80 text-lg" >
275+ < span className = "font-medium text-white" >
276+ Use one or use them all.
277+ </ span > { " " }
278+ Best-in-class products integrated into a single platform.
279+ </ p >
280+ </ div >
281+ </ div >
282+ ) ;
283+ } ;
117284
118- { /*<div className="mt-4">
119- <p className="text-sm text-white/40 mb-3">or run locally with Docker</p>
120- <CopyCommand command="docker run rivetgg/rivet:latest" />
121- </div>*/ }
285+ // Frameworks section
286+ const FrameworksSection = ( ) => {
287+ const frameworks = [
288+ { icon : faReact , name : "React" , href : "/docs/frameworks/react" } ,
289+ { icon : faVuejs , name : "Vue" , href : "/docs/frameworks/vue" } ,
290+ { icon : faAngular , name : "Angular" , href : "/docs/frameworks/angular" } ,
291+ { icon : faNodeJs , name : "Node.js" , href : "/docs/frameworks/nodejs" } ,
292+ { icon : faPython , name : "Python" , href : "/docs/frameworks/python" } ,
293+ { icon : faPhp , name : "PHP" , href : "/docs/frameworks/php" } ,
294+ { icon : faJava , name : "Java" , href : "/docs/frameworks/java" } ,
295+ { icon : faRust , name : "Rust" , href : "/docs/frameworks/rust" } ,
296+ { icon : faSwift , name : "Swift" , href : "/docs/frameworks/swift" } ,
297+ {
298+ icon : faJsSquare ,
299+ name : "JavaScript" ,
300+ href : "/docs/frameworks/javascript" ,
301+ } ,
302+ { icon : faHtml5 , name : "HTML5" , href : "/docs/frameworks/html5" } ,
303+ { icon : faCss3Alt , name : "CSS3" , href : "/docs/frameworks/css3" } ,
304+ { icon : faGolang , name : "Go" , href : "/docs/frameworks/go" } ,
305+ { icon : faDatabase , name : "SQL" , href : "/docs/frameworks/sql" } ,
306+ { icon : faDocker , name : "Docker" , href : "/docs/frameworks/docker" } ,
307+ ] ;
308+
309+ return (
310+ < div className = "mx-auto max-w-7xl px-6 py-28 lg:py-44 lg:px-8 mt-16" >
311+ < div className = "flex flex-col md:flex-row md:items-start" >
312+ < div className = "md:w-1/3 mb-8 md:mb-0 md:pr-8" >
313+ < h2 className = "text-3xl font-bold tracking-tight text-white text-left" >
314+ Rivet works with any framework
315+ </ h2 >
316+ < p className = "mt-4 text-lg text-white/70 text-left" >
317+ Integrate with your existing tech stack or start fresh
318+ with your preferred tools and languages.
319+ </ p >
320+ </ div >
321+ < div className = "md:w-2/3" >
322+ < div className = "grid grid-cols-4 md:grid-cols-5 lg:grid-cols-6 gap-x-6 gap-y-6" >
323+ { frameworks . map ( ( framework , index ) => (
324+ < Link
325+ key = { index }
326+ href = { framework . href }
327+ className = "group"
328+ >
329+ < div className = "h-16 w-16 mx-auto flex items-center justify-center" >
330+ < Icon
331+ icon = { framework . icon }
332+ className = "text-5xl text-white/30 group-hover:text-white/90 transition-colors duration-200"
333+ title = { framework . name }
334+ />
335+ </ div >
336+ </ Link >
337+ ) ) }
338+ </ div >
122339 </ div >
123340 </ div >
124341 </ div >
125342 ) ;
126- } ;
343+ } ;
0 commit comments