import { A, useNavigate } from "@solidjs/router" import { createSignal } from "solid-js" import CheckIcon from "@/components/CheckIcon" import ExternalLinkIcon from "@/components/ExternalLinkIcon" import PricingTable from "@/components/PricingTable" import RelayForm, { type RelayFormValues } from "@/components/RelayForm" import Modal from "@/components/Modal" import Login from "@/views/Login" import { createRelayForActiveTenant } from "@/lib/hooks" import { account } from "@/lib/state" import { slugify } from "@/lib/slugify" export default function Home() { const navigate = useNavigate() const [showRelayModal, setShowRelayModal] = createSignal(false) const [showLoginModal, setShowLoginModal] = createSignal(false) const [name, setName] = createSignal("") const [subdomain, setSubdomain] = createSignal("") const [icon, setIcon] = createSignal("") const [description, setDescription] = createSignal("") const [pendingRelay, setPendingRelay] = createSignal(false) const [error, setError] = createSignal("") function resetForm() { setName("") setSubdomain("") setIcon("") setDescription("") setError("") setPendingRelay(false) } function openRelayFlow() { setError("") setShowRelayModal(true) } async function createRelayAndRedirect() { setError("") setPendingRelay(true) try { const relay = await createRelayForActiveTenant({ subdomain: slugify(subdomain()), plan: "free", info_name: name().trim(), info_icon: icon().trim(), info_description: description().trim(), policy_public_join: 0, policy_strip_signatures: 0, groups_enabled: 1, management_enabled: 1, blossom_enabled: 0, livekit_enabled: 0, push_enabled: 1, }) setShowLoginModal(false) setShowRelayModal(false) resetForm() navigate(`/relays/${relay.id}`) } catch (e) { setError(e instanceof Error ? e.message : "Failed to create relay") setShowLoginModal(false) setShowRelayModal(true) } finally { setPendingRelay(false) } } async function handleRelaySubmit(values: RelayFormValues, e: Event) { e.preventDefault() setError("") setName(values.info_name) setSubdomain(values.subdomain) setIcon(values.info_icon) setDescription(values.info_description) if (account()) { await createRelayAndRedirect() return } setShowRelayModal(false) setShowLoginModal(true) } return (
Spin up a private, managed Nostr relay for your community in minutes. Full control over membership, access, and policies — no DevOps required.
Caravel takes care of the infrastructure so you can focus on building your community.
{body}
Once your relay is live, these Nostr-native platforms let your members connect, chat, and collaborate — all powered by your relay.
flotilla.social
A community platform built on Nostr. Flotilla gives your members channels, threads, and a rich social experience — all connected to your relay.
chachi.chat
A group chat app built on top of Nostr. Chachi makes it easy for your community to have real-time conversations, all flowing through your own relay.
Pay in sats. Upgrade or cancel any time.
Join communities already running on Caravel. Set up in minutes, pay in sats.
Start with a free relay. You can upgrade later.