"use client"; import { useRef } from "react"; import { ScrollReveal } from "@/components/ScrollReveal"; import { SectionScrollTitle } from "@/components/SectionScrollTitle"; import { DOCKER_HUB_URL, GITEA_URL } from "@/lib/plans"; function DockerIcon({ className }: { className?: string }) { return ( ); } function GiteaIcon({ className }: { className?: string }) { return ( ); } const DEPLOY_CARDS = [ { name: "Docker Hub", desc: "Pull the image and run Songs2YT on your own server with Docker Compose.", Icon: DockerIcon, cta: "View on Docker Hub", href: DOCKER_HUB_URL, accent: "text-[#2496ED]", hover: "hover:border-[#2496ED]/45 hover:bg-[#2496ED]/[0.06] hover:shadow-lg hover:shadow-[#2496ED]/20", titleHover: "group-hover:text-[#2496ED]", }, { name: "Gitea", desc: "Clone the open-source repository and deploy from source on your infrastructure.", Icon: GiteaIcon, cta: "View on Gitea", href: GITEA_URL, accent: "text-[#609926]", hover: "hover:border-[#609926]/45 hover:bg-[#609926]/[0.06] hover:shadow-lg hover:shadow-[#609926]/20", titleHover: "group-hover:text-[#609926]", }, ] as const; function DeployCard({ name, desc, Icon, cta, href, accent, hover, titleHover, }: (typeof DEPLOY_CARDS)[number]) { return (
Open Source

{name}

{desc}

{cta}

); } export function DownloadSection() { const sectionRef = useRef(null); return (

Download

Songs2YT is open source. Self-host on your own server with Docker or deploy from source.

Run it yourself

Host Songs2YT on your infrastructure with full control over data, queues, and storage. Ideal for teams and creators who want a private deployment.

  • Docker image published to Docker Hub
  • Source code available on Gitea
  • Gitea Issues community support
  • PostgreSQL, Redis, FFmpeg, and worker included

Quick start

                  {`docker pull atakanozban/songs2yt:latest\ndocker compose up -d`}
                
{DEPLOY_CARDS.map((card, index) => ( ))}
); }