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