A modern, minimal website for the AustroVis workshop series - focused on visualization and visual analytics at Austrian universities.
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- Deployment: GitHub Pages (static export)
- Backend: Netlify Functions (serverless)
This project uses a split architecture:
- Frontend: Static Next.js site hosted on GitHub Pages
- Backend: Serverless functions on Netlify (separate repo: austrovis-serverless)
The static site calls Netlify functions for form submissions, which then forward data to:
- Google Sheets (for event registrations)
- Mailman (for newsletter subscriptions)
- Node.js 20 or higher
- npm or yarn
- Clone the repository:
git clone https://github.com/austrovis/austrovis.github.io.git
cd austrovis.github.io- Install dependencies:
npm install- Create a
.env.localfile for local development:
NEXT_PUBLIC_NEWSLETTER_API_URL=https://austrovis-serverless.netlify.app/.netlify/functions/newsletter
NEXT_PUBLIC_REGISTER_API_URL=https://austrovis-serverless.netlify.app/.netlify/functions/register- Run the development server:
npm run dev- Open http://localhost:3000 in your browser.
austrovis.github.io/
├── app/ # Next.js app directory
│ ├── layout.tsx # Root layout with header/footer
│ ├── page.tsx # Homepage
│ ├── register/ # Event registration page
│ └── globals.css # Global styles
├── components/ # React components
│ ├── Header.tsx # Navigation header
│ ├── Footer.tsx # Footer with links
│ ├── EventCard.tsx # Event display component
│ ├── NewsletterSignup.tsx # Email signup form
│ ├── ParallaxHero.tsx # Hero section with parallax
│ └── ScrollReveal.tsx # Scroll animation wrapper
├── lib/ # Utilities and data
│ └── events.ts # Event data and helpers
├── types/ # TypeScript types
│ └── event.ts # Event type definitions
└── public/ # Static assets
Edit /lib/events.ts to add new events:
{
id: 'unique-id',
title: 'Event Title',
date: new Date('2025-12-01'),
location: 'City, Austria',
university: 'University Name',
description: 'Event description...',
speakers: ['Speaker 1', 'Speaker 2'],
registrationLink: '/register',
}- Colors: Edit Tailwind classes in components
- Fonts: Update
app/layout.tsxto change fonts - Content: Modify
app/page.tsxfor homepage content - Social Links: Update
components/Header.tsxandcomponents/Footer.tsx
The registration form saves data to Google Sheets. See GOOGLE_SHEETS_SETUP.md for detailed setup instructions.
Quick summary:
- Create a Google Sheet with registration data columns
- Create a Google Apps Script web app
- Deploy the script and get the URL
- Add the URL to Netlify environment variables as
GOOGLE_SHEETS_SCRIPT_URL
The newsletter signup forwards to a Mailman mailing list:
- Get your Mailman subscription URL
- Add it to Netlify environment variables as
MAILMAN_SUBSCRIBE_URL
The backend functions are in a separate repository: austrovis-serverless
These functions handle:
- Newsletter subscription forwarding
- Registration form submission to Google Sheets
- CORS handling for cross-origin requests
The site is automatically deployed to GitHub Pages when you push to the main branch via GitHub Actions.
Add these secrets in your repository settings (Settings > Secrets and variables > Actions):
| Secret Name | Description | Example Value |
|---|---|---|
NEXT_PUBLIC_NEWSLETTER_API_URL |
Netlify function URL for newsletter | https://austrovis-serverless.netlify.app/.netlify/functions/newsletter |
NEXT_PUBLIC_REGISTER_API_URL |
Netlify function URL for registration | https://austrovis-serverless.netlify.app/.netlify/functions/register |
- Go to your repository settings
- Navigate to Pages section
- Under Build and deployment, select:
- Source: GitHub Actions
- Add the required secrets (see above)
- Push to the
mainbranch to trigger deployment
The site will be available at: https://austrovis.github.io/
To build for production locally:
npm run buildThis creates a static export in the /out directory.
To test the production build locally:
npm run build
npx serve outNEXT_PUBLIC_NEWSLETTER_API_URL=https://austrovis-serverless.netlify.app/.netlify/functions/newsletter
NEXT_PUBLIC_REGISTER_API_URL=https://austrovis-serverless.netlify.app/.netlify/functions/registerSet the same variables as GitHub repository secrets. They will be embedded into the static build during deployment.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- austrovis-serverless - Serverless backend functions (private)
MIT License - feel free to use this template for your own workshop series!