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
- Language: TypeScript
- Styling: Tailwind CSS v4
- Animation: Motion (Framer Motion)
- Database: Google Firestore β NoSQL cloud database
- Auth: Firebase Authentication β Google OAuth + Email/Password
- Email: Resend β Transactional emails
- Bot Protection: MAGEN Trust β Human-first verification
- Storage: Vercel Blob β File uploads
- Deployment: Vercel
- Analytics: Vercel Analytics
- Node.js 18+
- pnpm (recommended) or npm
- A Firebase project with Firestore and Authentication enabled
- A Resend account (for transactional emails)
git clone https://github.com/devsanantonio/next-devsa.git
cd next-devsapnpm installcp .env.example .env.localEdit .env.local with your keys:
# Firebase Client SDK
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
# Google Firestore β Service Account Key (JSON string)
GOOGLE_SERVICE_ACCOUNT_KEY={"type":"service_account","project_id":"your-project",...}
# MAGEN Trust (Bot Protection)
MAGEN_API_KEY=your_magen_api_key
MAGEN_SITE_ID=your_site_id
# Resend (Email)
RESEND_API_KEY=your_resend_api_key
# Admin Setup (one-time use to create first admin)
ADMIN_SETUP_SECRET=your_random_secret_for_initial_setuppnpm devThe app will be running at http://localhost:3000.
After deploying, create the first admin by making a POST request:
curl -X POST https://your-domain.com/api/admin/setup \
-H "Content-Type: application/json" \
-d '{"email": "your-email@example.com", "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 (navbar + footer)
β βββ globals.css # Global styles + Tailwind
β βββ robots.ts # SEO robots config
β βββ sitemap.ts # Dynamic sitemap
β β
β βββ admin/ # π Admin Dashboard
β β βββ page.tsx # Admin dashboard (events, communities, admins)
β β βββ create-event/ # Create new community event
β β βββ page.tsx
β β
β βββ jobs/ # πΌ Job Board
β β βββ page.tsx # Jobs landing page (hero + listings)
β β βββ layout.tsx # Jobs layout (auth provider)
β β βββ signin/ # Firebase Auth sign-in
β β β βββ page.tsx
β β βββ post/ # Post a new job listing
β β β βββ page.tsx
β β βββ [slug]/ # Individual job detail page
β β β βββ page.tsx
β β βββ admin/ # Jobs super-admin panel
β β β βββ page.tsx
β β βββ dashboard/ # Authenticated user dashboard
β β βββ page.tsx # Dashboard home (stats, activity)
β β βββ profile/ # Edit user profile
β β βββ messages/ # Direct messages
β β βββ notifications/ # Notification center
β β
β βββ buildingtogether/ # Partners + Communities hub
β β βββ page.tsx # Logo grid hero page
β β βββ [slug]/ # Individual community/partner page
β β βββ page.tsx
β β βββ group-page-client.tsx
β β βββ partner-page-client.tsx
β β
β βββ events/ # Community Events
β β βββ page.tsx # Events calendar
β β βββ [slug]/ # Dynamic event detail pages
β β βββ morehumanthanhuman/ # AI Conference page
β β βββ pysanantonio/ # PySA event page
β β
β βββ coworking-space/ # Geekdom coworking page
β βββ devsatv/ # DEVSA TV content page
β βββ signin/ # Admin access request page
β β
β βββ api/ # API Routes
β βββ admin/ # Admin endpoints
β β βββ auth/ # Admin authentication
β β βββ data/ # Admin data management
β β βββ migrate/ # Data migration utilities
β β βββ setup/ # First-time admin setup
β βββ auth/ # Firebase Auth
β β βββ verify/ # Token verification
β βββ jobs/ # Job listings CRUD
β β βββ route.ts # GET/POST jobs
β β βββ admin/ # Jobs admin endpoints
β β βββ applications/ # Job applications
β β βββ comments/ # Job comments/discussions
β βββ job-board/ # Job board user management
β β βββ profile/ # User profile CRUD
β β βββ upload/ # Profile image uploads
β βββ communities/ # Communities CRUD
β βββ events/ # Events CRUD
β βββ messages/ # Direct messaging
β βββ notifications/ # Notifications
β βββ newsletter/ # Newsletter subscription
β βββ rsvp/ # Event RSVP
β βββ ai-conference/ # AI Conference registration
β βββ call-for-speakers/ # Speaker submissions
β βββ access-request/ # Organizer access requests
β βββ upload/ # General file uploads
β βββ magen/ # MAGEN bot protection
β β βββ health/ # Health check
β β βββ start-session/ # Start verification session
β β βββ verify/ # Verify session
β βββ og/ # Open Graph image generation
β βββ buildingtogether/
β βββ coworking-space/
β βββ devsatv/
β βββ event/
β βββ events/
β βββ morehumanthanhuman/
β
βββ components/ # React Components
β βββ navbar.tsx # Site navigation
β βββ footer.tsx # Site footer
β βββ hero-bridge.tsx # Homepage hero
β βββ hero-communities.tsx # Community showcase grid
β βββ partner-section.tsx # Partners carousel
β βββ auth-provider.tsx # Firebase Auth context provider
β βββ auth-button.tsx # Auth button component
β βββ newsletter-form.tsx # Newsletter signup
β βββ access-request-form.tsx # Organizer access request
β βββ magen-newsletter-cta.tsx # Community spotlight section
β βββ glowing-effect.tsx # Glowing border effect
β βββ rich-text-editor.tsx # Rich text editor
β βββ slide-out-menu.tsx # Mobile slide-out menu
β βββ social-media-menu.tsx # Social media links panel
β βββ terminal-dropdown.tsx # Terminal-style dropdown
β βββ events-popup.tsx # Events notification popup
β βββ jobs/ # Job board components
β β βββ jobs-navbar.tsx # Jobs-specific navigation
β β βββ job-card.tsx # Job listing card
β β βββ job-filters.tsx # Search + filter controls
β β βββ comment-section.tsx # Job discussion thread
β β βββ message-thread.tsx # Direct message UI
β β βββ notification-bell.tsx # Notification indicator
β βββ events/ # Event components
β βββ partners/ # Partner/community components
β βββ coworking-space/ # Coworking page components
β βββ aiconference/ # AI Conference components
β βββ pysa/ # PySA event components
β βββ devsatv/ # DEVSA TV components
β βββ icons/ # SVG icon components
β
βββ data/ # Static Data (fallback)
β βββ communities.ts # Tech community listings
β βββ events.ts # Community events
β βββ partners.ts # Partner organizations
β βββ pysa/ # PySA event data
β βββ sessions.ts
β βββ speakers.ts
β βββ faqs.ts
β βββ partners.ts
β
βββ lib/ # Utilities + Config
β βββ firebase-admin.ts # Firebase Admin SDK (server)
β βββ firebase.ts # Firebase Client SDK (browser)
β βββ auth-middleware.ts # Auth middleware helpers
β βββ magen.ts # MAGEN verification helpers
β βββ resend.ts # Resend email client
β βββ utils.ts # General utilities (cn, etc.)
β βββ emails/ # Email templates
β β βββ access-approved.ts
β β βββ access-request-received.ts
β β βββ speaker-thank-you.ts
β βββ hooks/ # Custom React hooks
β
βββ types/ # TypeScript Type Definitions
β βββ magen.d.ts
β
βββ public/ # Static Assets
Protected dashboard for community organizers. Manage events, communities, and admin users. Requires approved admin access via Firestore.
Full-featured job board for the San Antonio tech ecosystem:
- For employers: Post W2, 1099, or equity-based roles
- For job seekers: Browse listings, filter by type/location, apply directly
- Dashboard: Profile management, messaging, notifications
- Auth: Firebase Authentication (Google OAuth + email/password)
Discover 20+ local tech communities and partner organizations. Data is sourced from Firestore with a static fallback.
Community event calendar with RSVP functionality. Includes special event pages for the AI Conference and PySA.
We welcome contributions from the San Antonio tech community!
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR-USERNAME/next-devsa.git cd next-devsa - Create a feature branch:
git checkout -b feature/your-feature-name
- Install dependencies:
pnpm install
- Make your changes and test locally:
pnpm dev
- Run the linter:
pnpm lint
- Commit with a clear message:
git commit -m "Add: brief description of your change" - Push to your fork:
git push origin feature/your-feature-name
- Open a Pull Request on the main repository with a description of your changes
Communities are managed through the Admin Dashboard, but static fallback data lives in data/communities.ts:
{
id: "your-community-id",
name: "Your Community Name",
description: "Brief description of your community",
logo: "https://your-logo-url.png",
website: "https://your-website.com",
meetup: "https://meetup.com/your-group",
discord: "https://discord.gg/your-invite",
}Edit data/partners.ts:
{
id: "partner-id",
name: "Partner Name",
logo: "https://partner-logo-url.png",
description: "What the partner does",
website: "https://partner-website.com",
}pnpm dev # Start dev server with Turbopack
pnpm build # Build for production
pnpm start # Start production server
pnpm lint # Run ESLint