DEVSA is the central platform connecting San Antonio's tech community. We bridge the gap between passionate builders, local partners, and the growing tech ecosystem.
π Live Site: devsa.community
DEVSA started with a simple question: "Where is the tech community in San Antonio?"
We found 20+ tech-focused organizations scattered across the city, not collaborating and living in their own bubbles. So we built DEVSA to bring them togetherβa platform where you can discover tech communities that match your interests and where these groups can collaborate, share resources, and grow stronger together.
- Framework: Next.js 16 with App Router
- Styling: Tailwind CSS v4
- Animation: Motion (Framer Motion)
- Database: Google Firestore - NoSQL cloud database
- Bot Protection: MAGEN - Human-first verification
- Deployment: Vercel
- Analytics: Vercel Analytics
- Node.js 18+
- pnpm (recommended) or npm
# Clone the repository
git clone https://github.com/your-org/next-devsa.git
cd next-devsa
# Install dependencies
pnpm install
# Set up environment variables
cp .env.example .env.local
# Edit .env.local with your keys (see Environment Variables section)
# Start development server
pnpm devThe app will be running at http://localhost:3000
Create a .env.local file with:
# Google Firestore - Service Account Key (as JSON string)
GOOGLE_SERVICE_ACCOUNT_KEY={"type":"service_account","project_id":"your-project",...}
# MAGEN (Bot Protection)
MAGEN_API_KEY=your_magen_api_key
MAGEN_SECRET_KEY=your_magen_secret_key
# Admin Setup (one-time use to create first admin)
ADMIN_SETUP_SECRET=your_random_secret_for_initial_setupAfter deploying, set up your first admin by making a POST request:
curl -X POST https://your-domain.com/api/admin/setup \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "secret": "your_admin_setup_secret"}'This only works once when no admins exist in the system.
next-devsa/
βββ app/ # Next.js App Router
β βββ page.tsx # Homepage
β βββ layout.tsx # Root layout with navbar/footer
β βββ globals.css # Global styles & Tailwind
β βββ api/ # API routes
β β βββ magen/ # MAGEN bot protection endpoints
β β βββ og/ # Open Graph image generation
β β βββ admin/ # Admin API endpoints
β β βββ newsletter/ # Newsletter subscription
β β βββ events/ # Events CRUD
β β βββ access-request/ # Access request for organizers
β βββ events/ # Events pages
β β βββ page.tsx # Community calendar
β β βββ community/[slug]/ # Dynamic community event pages
β β βββ morehumanthanhuman/ # AI Conference page
β β βββ pysanantonio/ # PySA event page
β βββ admin/ # Protected admin pages
β β βββ page.tsx # Admin dashboard
β β βββ create-event/ # Create event page
β βββ coworking-space/ # Geekdom coworking page
β βββ signin/ # Access request page
β
βββ components/ # React components
β βββ hero-bridge.tsx # Main hero section
β βββ hero-communities.tsx # Community showcase grid
β βββ partner-section.tsx # Partners carousel
β βββ magen-newsletter-cta.tsx # Community spotlight section
β βββ navbar.tsx # Navigation bar
β βββ footer.tsx # Site footer
β βββ access-request-form.tsx # Organizer access request form
β βββ events/ # Event-specific components
β βββ coworking-space/ # Coworking page components
β βββ pysa/ # PySA event components
β βββ aiconference/ # AI Conference components
β βββ icons/ # SVG icon components
β
βββ data/ # Static data files
β βββ communities.ts # Tech community listings
β βββ events.ts # Community events
β βββ partners.ts # Partner organizations
β βββ pysa/ # PySA event data
β βββ sessions.ts # Conference sessions
β βββ speakers.ts # Speaker information
β βββ sponsors.ts # Event sponsors
β
βββ lib/ # Utility functions
β βββ firebase-admin.ts # Firebase Admin SDK setup
β βββ magen.ts # MAGEN bot protection
β βββ utils.ts # General utilities (cn, etc.)
β βββ magen.ts # MAGEN verification helpers
β
βββ types/ # TypeScript type definitions
β βββ magen.d.ts # MAGEN types
β
βββ public/ # Static assets
We welcome contributions from the San Antonio tech community! Here's how you can help:
- Edit
data/communities.ts - Add your community object following the existing format:
{
id: "your-community-id",
name: "Your Community Name",
description: "Brief description of your community",
logo: "https://your-logo-url.png",
color: "#yourBrandColor",
website: "https://your-website.com",
meetup: "https://meetup.com/your-group",
discord: "https://discord.gg/your-invite",
}- Edit
data/partners.ts - Add your partner organization:
{
id: "partner-id",
name: "Partner Name",
logo: "https://partner-logo-url.png",
description: "What the partner does",
website: "https://partner-website.com",
}- Fork the repository
- Create a feature branch:
git checkout -b feature/add-my-community - Make your changes
- Test locally with
pnpm dev - Commit with a clear message:
git commit -m "Add XYZ Community to listings" - Push to your fork:
git push origin feature/add-my-community - Open a Pull Request with a description of your changes
pnpm dev # Start development server with Turbopack
pnpm build # Build for production
pnpm start # Start production server
pnpm lint # Run ESLint