import Link from 'next/link' import { redirect } from 'next/navigation' import { createClient } from '@/lib/supabase/server' import { BrandMark } from '@/components/brand-mark' import { GithubIcon, ArrowIcon } from '@/components/landing/icons' import { ResourceShowcase } from '@/components/landing/resource-showcase' import { HeroPreviewCluster } from '@/components/landing/mini-previews' const MODULES = [ { num: '01', title: 'Members', desc: 'Tiers, dues status, contact info, custom roles. Know who is current and who is not, at a glance.' }, { num: '02', title: 'Tasks and chores', desc: 'One-off and recurring work with assignments, due dates, and area tags. Claim and complete from anywhere.' }, { num: '03', title: 'Projects', desc: 'A board for what the space is building. Progress, areas, and who is on it, visible to everyone.' }, { num: '04', title: 'Payments', desc: 'Import from PayPal, Venmo, or Zeffy. Reconcile transactions to members by hand or by email match.' }, { num: '05', title: 'Ops and knowledge', desc: 'Procedures, area leads, and an encrypted secrets vault. Role-gated, revealed on demand.' }, { num: '06', title: 'Governance', desc: 'Proposals with quorum and voting, incident reports, a versioned policy library, and a member forum.' }, ] const STEPS = [ { num: '01', title: 'Import your members', desc: 'Paste from a spreadsheet or add them one by one. Set tiers, statuses, and contact info.' }, { num: '02', title: 'Connect payments', desc: 'Link PayPal or Zeffy, import transactions, and match them to members.' }, { num: '03', title: 'Seed your ops docs', desc: 'Drop in SOPs, credentials, and area leads. The whole board has one place to look things up.' }, ] export default async function LandingPage() { // `/` resolves here (route group adds no path segment), so this page is // wrapped by (landing)/layout.tsx which supplies the .landing-root theme, // fonts, and landing.css. Logged-in visitors skip the marketing page. const supabase = await createClient() const { data: { user } } = await supabase.auth.getUser() if (user) redirect('/dashboard') return ( <>

Operating system for hackerspaces

Run your space, not a spreadsheet

Members, dues, tasks, projects, ops docs, and governance in one place. Built by people who have actually run these spaces, for the people who keep them running.

Get started Log in
What it does 06 modules
{MODULES.map(m => (
{m.num}

{m.title}

{m.desc}

))}
Setup under an hour
{STEPS.map(s => (

{s.num}

{s.title}

{s.desc}

))}

Stop running your space from memory.

Get started Log in

Not running a space? Read the{' '} hackerspace research and games.

) }