A comprehensive community platform built for Open Source Weekend, featuring upcoming events, past meetups, and a dynamic job board. Powered by Astro, Tailwind CSS, and Google Sheets as the CMS.
- Community Hub: central landing page (
/) showcasing the community mission, upcoming events, and job opportunities. - Events System:
- Lists Upcoming and Past events automatically based on dates.
- Dynamic data fetching from Google Sheets.
- Job Board:
- Real-time job listings fetched from Google Sheets.
- Status Indicators: "Open" or "Closed" status with visual warnings for closed roles.
- Openings Count: Displays the number of available positions.
- Server-Side Rendering (SSR): Dynamic content with excellent SEO and performance.
- Design System: Premium, dark-mode ready UI built with Tailwind CSS v4 and
lucide-astroicons.
- Framework: Astro (SSR mode)
- Styling: Tailwind CSS v4
- Deployment: VPS with Docker (via GitHub Actions CI/CD)
- Data Source: Google Sheets (via CSV export) for both Jobs and Events.
- Node.js (v18+)
- npm
git clone https://github.com/oscfcommunity/OpenSourceWeekend.git
cd OpenSourceWeekend
npm install# No environment variables required for standard setupNote: Your Google Sheets must be "Published to the Web" as a CSV.
npm run devVisit http://localhost:4321 to see the app.
├── src/
│ ├── components/
│ │ ├── ui/ # Reusable design system (Badge, Button, etc.)
│ │ ├── EventCard.astro # Event display component
│ │ └── JobCard.astro # Job display component
│ ├── lib/
│ │ ├── events.ts # Events fetching & caching logic
│ │ └── jobs.ts # Jobs fetching & caching logic
│ ├── pages/
│ │ ├── index.astro # Landing Page
│ │ ├── events/ # Events Page
│ │ └── jobs/ # Job Board & Detail Pages
│ └── layouts/ # Main Layout (Header, Footer)
└── astro.config.mjs # SSR configuration (Node adapter)
To correctly fetch data, your Google Sheets must use the exact headers below. Copy and paste these into the first row of your spreadsheets.
title,startDate,endDate,link,location,type,descriptiontitle,company,jobSlug,featured,skills,experience,jobType,jobMode,location,companyWebsite,applyLink,postedOn,About Company,Job Description,Status,openingsThis repository includes a GitHub Actions workflow at .github/workflows/deploy.yml that runs on every push to main. It does the following:
- Checks out the repo
- Copies the repository to your VPS via SCP
- SSHes to the VPS and builds the Docker image there, then restarts the container
Required GitHub Secrets
VPS_HOST— your VPS IP or hostnameVPS_USER— SSH user on the VPS (e.g.,rootordeploy)VPS_PRIVATE_KEY— the private SSH key (PEM format) that matches a public key in~/.ssh/authorized_keysforVPS_USERVPS_PORT— optional SSH port (defaults to22)VPS_TARGET_DIR— path on the VPS where the repo will be copied and built (e.g.,/home/deploy/osw)DOCKER_IMAGE_NAME— optional image name (default:osw-frontend:latest)
Notes and security
- Add only the private key to GitHub Secrets, never commit keys to the repo.
- Ensure the
VPS_USERhas permission to run Docker or usesudofrom that account. - The workflow builds the Docker image on the VPS. This avoids pushing images to a registry.
Quick checklist to enable deploys
- On your VPS, create a deploy user and give it Docker access, or use
root. - Add the public key to
/home/<user>/.ssh/authorized_keys. - Add the private key and other secrets to your GitHub repository's Secrets.
- Push a commit to the
trunkbranch — the workflow will run automatically.
If you'd prefer pushing images to a registry (Docker Hub / GitHub Container Registry) and pulling them from the VPS instead, I can update the workflow to build & push the image from Actions and perform a docker pull on the VPS.