import Link from "next/link"; import TerminalTyper from "./components/TerminalTyper"; import AnimateIn from "./components/AnimateIn"; import CountUp from "./components/CountUp"; import SpotlightCard from "./components/SpotlightCard"; import { LINKS } from "@/lib/links"; import { getLinks } from "@/lib/links-db"; /* ── SVG Icons ─────────────────────────────────────────────── */ const CubeIcon = () => ( ); const FileIcon = () => ( ); const RefreshIcon = () => ( ); const ClockIcon = () => ( ); const ShareIcon = () => ( ); const ShieldIcon = () => ( ); const DownloadIcon = () => ( ); const CogIcon = () => ( ); const ArchiveIcon = () => ( ); const PlayIcon = () => ( ); const GitHubIcon = () => ( ); /* ── Data ───────────────────────────────────────────────────── */ const features = [ { icon: , gradient: "from-cyan-500/15 to-blue-600/15", border: "border-cyan-500/20", iconBg: "bg-cyan-500/10", iconColor: "text-cyan-400", title: "Full container backups", body: "Archive volumes, bind mounts, and Docker inspect metadata into a single .backerup bundle — everything needed to fully restore or clone a container.", }, { icon: , gradient: "from-violet-500/15 to-purple-600/15", border: "border-violet-500/20", iconBg: "bg-violet-500/10", iconColor: "text-violet-400", title: "Config-only export", body: "Export a lightweight config.json (raw docker inspect output) to recreate a container on any host — no volume data needed.", }, { icon: , gradient: "from-emerald-500/15 to-teal-600/15", border: "border-emerald-500/20", iconBg: "bg-emerald-500/10", iconColor: "text-emerald-400", title: "One-click restore", body: "Restore volumes in-place, rebuild config without touching data, or spin up a brand-new container from any backup — your choice.", }, { icon: , gradient: "from-amber-500/15 to-orange-600/15", border: "border-amber-500/20", iconBg: "bg-amber-500/10", iconColor: "text-amber-400", title: "Scheduled backups", body: "Define cron-based backup jobs per container with configurable retention: keep latest N, keep every N-th, or purge older than N days.", }, ]; const steps = [ { n: "01", icon: , color: "bg-cyan-500/20 text-cyan-400", title: "Install", body: "Run Backerup as a Docker container with access to your Docker socket. Up and running in under 30 seconds.", }, { n: "02", icon: , color: "bg-violet-500/20 text-violet-400", title: "Configure", body: "Add containers, choose a backup strategy (full archive or config-only), and set a cron schedule.", }, { n: "03", icon: , color: "bg-amber-500/20 text-amber-400", title: "Backup", body: "Backerup archives your volumes and metadata into a portable .backerup file on your schedule.", }, { n: "04", icon: , color: "bg-emerald-500/20 text-emerald-400", title: "Restore", body: "One click to restore in-place, rebuild config, or spin up a fresh container from any backup.", }, ]; const pills = [ { label: "Open source", color: "text-emerald-400 bg-emerald-500/10 border-emerald-500/20" }, { label: "Zero cloud deps", color: "text-cyan-400 bg-cyan-500/10 border-cyan-500/20" }, { label: "Self-hosted", color: "text-violet-400 bg-violet-500/10 border-violet-500/20" }, { label: "Docker native", color: "text-blue-400 bg-blue-500/10 border-blue-500/20" }, ]; const stats = [ { num: 100, suffix: "%", label: "Open source", sub: "source available" }, { num: 500, suffix: " MB", label: "Max file size", sub: "per upload" }, { num: 4, suffix: "", label: "Backup strategies", sub: "fully configurable" }, { num: 0, suffix: "", label: "Cloud dependencies", sub: "runs on your infra" }, ]; /* ── Page ───────────────────────────────────────────────────── */ export default async function LandingPage() { const links = await getLinks(); return ( <> {/* ═══ Hero ═══════════════════════════════════════════════ */}
{/* ── Animated aurora blobs ── */}
{/* ── Hero text — above the fold, animate on page load ── */}
{/* Pills */}
{pills.map((p) => ( {p.label} ))}
{/* Headline */}

Docker backups,
done right.

{/* Subtitle */}

Backerup bundles your container volumes, bind mounts, and config into a single portable file. Restore in seconds, share configs with your team, or migrate containers between hosts — all from a self-hosted UI.

{/* CTA buttons */}
Share a config Browse configs Gitea
{/* ── Terminal card ── */}
{/* Glow behind terminal */}
backerup · quick start
live
{/* ═══ Stats bar ══════════════════════════════════════════ */}
{stats.map((s, i) => (
{s.label}
{s.sub}
))}
{/* ═══ Features ═══════════════════════════════════════════ */}
Features

Everything you need

A complete Docker backup lifecycle — from scheduled snapshots to one-click restores, all from a single self-hosted UI.

{features.map((f, i) => (
{f.icon}

{f.title}

{f.body}

))}
{/* ═══ How it works ════════════════════════════════════════ */}
How it works

Up and running in minutes

{/* Connector line between steps */}
{steps.map((s, i) => (
{s.icon}
{s.n}

{s.title}

{s.body}

))}
{/* ═══ .backerup format ════════════════════════════════════ */}
{/* Left: text */}
File format

The{" "} .backerup{" "} format

A single gzipped-tar file containing everything needed to restore or clone a container. Portable, transparent, and restorable{" "} without Backerup itself.

    {[ { name: "config.json", desc: "Raw docker inspect output" }, { name: "manifest.json", desc: "Backup metadata & checksums" }, { name: "volumes/*.tar.gz", desc: "One archive per volume" }, ].map((item) => (
  • {item.name} — {item.desc}
  • ))}
Upload a backup → Browse shared files
{/* Right: file tree */}
📦 my-postgres.backerup 142 MB
├── 📄 config.json 8 KB
├── 📄 manifest.json 2 KB
└── 📁 volumes/
├── 🗜️ postgres-data.tar.gz 139 MB
└── 🗜️ postgres-config.tar.gz 512 B
{/* ═══ Quick start ════════════════════════════════════════ */}
Quick start

Setup with docker-compose

The easiest way to get Backerup running is with docker-compose for declarative, reproducible deployments.

docker-compose setup
{/* ═══ More tools ═════════════════════════════════════════ */}
More tools

Built for Docker operators

Backerup is part of a growing suite of self-hosted Docker management tools — all open-source, dark-mode-first, and designed to run alongside your containers.

{/* Backerup card */}
Current

Backerup

Full Docker container backup manager. Archive volumes, bind mounts, and config into a single portable .backerup bundle. Restore, migrate, or share — all from a self-hosted UI.

    {[ "Full volume + config archives", "Config-only export for fast migrations", "One-click restore or container recreation", "Cron-based schedules with retention policies", ].map((f) => (
  • {f}
  • ))}
{/* Daterup card */}
New

Daterup

Docker container update manager. Continuously checks your running containers for new image versions and lets you update them with a single click — or automatically on a cron schedule.

    {[ "Digest-based update detection", "One-click update — preserves all original config", "Batch check & update all containers", "Named cron schedules with full audit history", "Live log viewer with level filtering", ].map((f) => (
  • {f}
  • ))}
Explore Daterup → Gitea
{/* ═══ Final CTA ══════════════════════════════════════════ */}
{/* Glow */}

Start backing up today.

Open source, self-hosted, and free forever. Share your container configs with the community or keep everything private on your own infrastructure.

Star on Gitea Share a config → Browse configs
); }