import Layout from "@/components/Layout"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { useAethexToast } from "@/hooks/use-aethex-toast"; import { useAuth } from "@/contexts/AuthContext"; import { aethexApplicationService, type AethexApplicationSubmission, } from "@/lib/aethex-database-adapter"; import { ArrowRight, Briefcase, CheckCircle2, Clock, Sparkles, Loader2, Rocket, ShieldCheck, Users, } from "lucide-react"; import { useEffect, useState } from "react"; interface ContributorFormState { fullName: string; email: string; location: string; primarySkill: string; availability: string; portfolioUrl: string; interests: string[]; message: string; } interface CareerFormState { fullName: string; email: string; location: string; roleInterest: string; experienceLevel: string; portfolioUrl: string; resumeUrl: string; message: string; } const contributorInterestOptions = [ "Open Source Systems", "Education & Curriculum", "Community Programs", "Design Systems", "Docs & Technical Writing", "Research & Experiments", "Developer Tooling", ]; const contributorAvailabilityOptions = [ "1-5 hours / week", "5-10 hours / week", "10-20 hours / week", "Full-time contributor", ]; const contributorPrimarySkills = [ "Frontend Engineering", "Backend Engineering", "Full-stack Engineering", "Game Development", "Product Design", "Technical Writing", "Community Building", "Operations & Program Management", ]; const careerRoleOptions = [ "Software Engineer", "Game Designer", "Product Manager", "Developer Advocate", "Technical Writer", "Community Manager", "Creative Producer", "Research Scientist", ]; const careerExperienceLevels = [ "Emerging (0-2 years)", "Intermediate (3-5 years)", "Senior (6-9 years)", "Staff & Principal (10+ years)", ]; const openOpportunities = [ { title: "Senior Gameplay Engineer", type: "Full-time · Remote", summary: "Shape immersive gameplay experiences across AeThex Labs and partner studios.", tags: ["Unreal", "C++", "Multiplayer", "Systems"], }, { title: "Developer Experience Lead", type: "Full-time · Hybrid", summary: "Own the contributor journey, from onboarding to high-impact delivery.", tags: ["DX", "Community", "Strategy"], }, { title: "Product Storyteller", type: "Contract · Remote", summary: "Craft compelling narratives, docs, and launch campaigns for AeThex platforms.", tags: ["Content", "Docs", "Product"], }, ]; const applicationMilestones = [ { icon: Users, title: "Connect", description: "Share your background, interests, and the kind of problems you want to help solve.", }, { icon: Rocket, title: "Collaborate", description: "Chat with our team, explore active initiatives, and scope out your first project or role.", }, { icon: ShieldCheck, title: "Launch", description: "Join a cross-functional squad, ship impact in your first 30 days, and grow with AeThex.", }, ]; const faqs = [ { question: "How quickly will I hear back after applying?", answer: "We review contributor and career applications every week. Expect a response within 7-10 days, often sooner if new initiatives are staffing up.", }, { question: "Can I apply as both a contributor and a full-time candidate?", answer: "Absolutely. Many AeThex teammates started as contributors. Let us know in your application if you want to explore both paths.", }, { question: "Do I need prior Web3 or game development experience?", answer: "No. We're looking for builders, storytellers, and systems thinkers. Tell us how your experience can unlock new value for the AeThex community.", }, { question: "How do contributors get matched to projects?", answer: "We pair contributors with squads based on domain expertise, time commitment, and squad needs. You'll collaborate with a mentor or lead during your first sprint.", }, ]; const validateEmail = (value: string) => /.+@.+\..+/.test(value.trim()); const Opportunities = () => { const { user, profile } = useAuth(); const toast = useAethexToast(); const [submittingContributor, setSubmittingContributor] = useState(false); const [submittingCareer, setSubmittingCareer] = useState(false); const profileWebsite = profile && typeof (profile as any).website_url === "string" ? ((profile as any).website_url as string) : ""; const [contributorForm, setContributorForm] = useState({ fullName: "", email: "", location: "", primarySkill: "", availability: "", portfolioUrl: "", interests: [], message: "", }); const [careerForm, setCareerForm] = useState({ fullName: "", email: "", location: "", roleInterest: "", experienceLevel: "", portfolioUrl: "", resumeUrl: "", message: "", }); useEffect(() => { setContributorForm((prev) => ({ ...prev, fullName: prev.fullName || profile?.full_name || user?.email?.split("@")[0] || "", email: prev.email || user?.email || "", location: prev.location || profile?.location || "", portfolioUrl: prev.portfolioUrl || profileWebsite || "", })); setCareerForm((prev) => ({ ...prev, fullName: prev.fullName || profile?.full_name || user?.email?.split("@")[0] || "", email: prev.email || user?.email || "", location: prev.location || profile?.location || "", portfolioUrl: prev.portfolioUrl || profileWebsite || "", })); }, [profile, profileWebsite, user]); const toggleContributorInterest = (value: string) => { setContributorForm((prev) => { const exists = prev.interests.includes(value); return { ...prev, interests: exists ? prev.interests.filter((interest) => interest !== value) : [...prev.interests, value], }; }); }; const submitApplication = async ( payload: Omit & { type: "contributor" | "career"; }, ) => { await aethexApplicationService.submitApplication(payload); }; const handleContributorSubmit = async ( event: React.FormEvent, ) => { event.preventDefault(); if (!contributorForm.fullName.trim()) { toast.error({ title: "Name required", description: "Please tell us who you are.", }); return; } if (!validateEmail(contributorForm.email)) { toast.error({ title: "Valid email required", description: "Share an email so we can follow up.", }); return; } if (!contributorForm.primarySkill) { toast.error({ title: "Select your primary skill", description: "Choose the area where you create the most impact.", }); return; } setSubmittingContributor(true); try { await submitApplication({ type: "contributor", full_name: contributorForm.fullName, email: contributorForm.email, location: contributorForm.location, primary_skill: contributorForm.primarySkill, availability: contributorForm.availability, portfolio_url: contributorForm.portfolioUrl, message: contributorForm.message, interests: contributorForm.interests, }); toast.success({ title: "Application received", description: "Thank you! Our contributor success team will reach out shortly.", }); setContributorForm({ fullName: profile?.full_name || contributorForm.email.split("@")[0] || "", email: contributorForm.email, location: profile?.location || "", primarySkill: "", availability: "", portfolioUrl: profileWebsite || contributorForm.portfolioUrl, interests: [], message: "", }); } catch (error: any) { toast.error({ title: "Submission failed", description: error?.message || "We could not submit your contributor application.", }); } finally { setSubmittingContributor(false); } }; const handleCareerSubmit = async ( event: React.FormEvent, ) => { event.preventDefault(); if (!careerForm.fullName.trim()) { toast.error({ title: "Name required", description: "Please add your full name.", }); return; } if (!validateEmail(careerForm.email)) { toast.error({ title: "Valid email required", description: "We need a reachable email to move forward.", }); return; } if (!careerForm.roleInterest) { toast.error({ title: "Choose a role focus", description: "Select the type of role you're most excited about.", }); return; } setSubmittingCareer(true); try { await submitApplication({ type: "career", full_name: careerForm.fullName, email: careerForm.email, location: careerForm.location, role_interest: careerForm.roleInterest, experience_level: careerForm.experienceLevel, portfolio_url: careerForm.portfolioUrl, resume_url: careerForm.resumeUrl, message: careerForm.message, }); toast.success({ title: "Thanks for applying", description: "Our talent team will review your experience and reach out soon.", }); setCareerForm({ fullName: profile?.full_name || careerForm.email.split("@")[0] || "", email: careerForm.email, location: profile?.location || "", roleInterest: "", experienceLevel: "", portfolioUrl: profileWebsite || careerForm.portfolioUrl, resumeUrl: "", message: "", }); } catch (error: any) { toast.error({ title: "Submission failed", description: error?.message || "We could not submit your career application.", }); } finally { setSubmittingCareer(false); } }; return (
Build the future at AeThex

Contribute. Collaborate. Craft the next era of AeThex.

Whether you are a community contributor or exploring full-time roles, this is your gateway to ship meaningfully with the AeThex team. We unite game makers, storytellers, engineers, and strategists around bold ideas.

Contributor network Mentors, maintainers, and shipmates.

4,200+

Teams hiring now Across Labs, Platform, and Community.

12 squads

What makes AeThex different? Cross-functional teams, high-trust culture, and shipped outcomes over vanity metrics.

Hybrid squads

Contributors and full-time teammates collaborate inside the same rituals, tooling, and roadmap.

Impact-first onboarding

Ship something real during your first sprint with a dedicated mentor or squad lead.

Transparent growth

Clear expectations, async updates, and opportunities to move from contributor to core team.

Explore opportunities

Contributor paths & immediate hiring needs

Choose how you want to collaborate with AeThex. We empower flexible contributor engagements alongside full-time roles across labs, platform, and community.

Rolling reviews

Contributor cohorts are evaluated weekly. Urgent hiring roles receive priority outreach within 72 hours.

Core Contributors Shape feature roadmaps, ship code, design experiences, or lead community programs.

Typical commitment: 5-15 hrs / week

  • Join a squad shipping AeThex platform, docs, or live services
  • Collaborate directly with PMs, producers, and staff engineers
  • Earn AeThex recognition, mentorship, and prioritized hiring pathways
Fellows & Apprentices Guided programs for emerging builders to gain portfolio-ready experience.

Typical commitment: 10-20 hrs / week for 12 weeks

  • Structured mentorship with clear milestones and feedback
  • Contribute to lab prototypes, live events, or curriculum builds
  • Ideal for rising professionals breaking into games or platform engineering
Full-time roles Join AeThex as a core teammate with benefits, equity pathways, and ownership of initiatives.

Immediate needs across engineering, design, product, and community.

  • Global-first, remote-friendly culture with async collaboration
  • Cross-functional squads aligned to measurable player and creator outcomes
  • Opportunities to incubate new AeThex Labs ventures
{openOpportunities.map((role) => (
{role.title} {role.type}
Priority

{role.summary}

{role.tags.map((tag) => ( {tag} ))}
))}
Apply now

Tell us how you want to build with AeThex

Share a snapshot of your experience, interests, and availability. We calibrate opportunities weekly and match you with the best-fit squad or role.

Need help?

Email{" "} opportunities@aethex.com {" "} if you want to talk through the right track before applying.

Contributor journey Careers at AeThex Contributor application Ideal for open-source, part-time, or fellowship-style collaborations.
setContributorForm((prev) => ({ ...prev, fullName: event.target.value, })) } required />
setContributorForm((prev) => ({ ...prev, email: event.target.value, })) } required />
setContributorForm((prev) => ({ ...prev, location: event.target.value, })) } placeholder="City, Country" />
setContributorForm((prev) => ({ ...prev, portfolioUrl: event.target.value, })) } placeholder="https://" />
{contributorInterestOptions.map((interest) => ( ))}