Personal website for Dr. Jodie Rummer, Professor of Marine Biology at James Cook University, showcasing her research, publications, and contributions to marine science and conservation.
- Framework: Next.js
- Language: TypeScript
- Styling: Tailwind CSS
- Components: Shadcn UI & Radix UI
- Deployment: Vercel
- Server-Side Rendering (SSR) for optimal performance
- Dark mode support
- Responsive design for all devices
- SEO optimized with structured data
- Accessibility compliant
- TypeScript for type safety
- Modern, clean UI with Tailwind CSS
- Node.js 18+
- pnpm (recommended) or npm
- Clone the repository:
git clone https://github.com/yourusername/jodierummer.git
cd jodierummer- Install dependencies:
pnpm install- Create a
.env.localfile:
cp .env.template .env.local- Start the development server:
pnpm dev- Open http://localhost:3000 in your browser.
jodierummer/
├── app/ # Next.js app directory
│ ├── about/ # About page and CV
│ ├── research/ # Research areas and projects
│ ├── publications/ # Academic publications
│ ├── women-in-science/ # Diversity initiatives
│ └── contact/ # Contact information
├── components/ # Reusable React components
├── lib/ # Utility functions and configs
├── public/ # Static assets
└── styles/ # Global styles and Tailwind config
- Uses Tailwind CSS for styling
- Custom theme configuration in
tailwind.config.ts - Consistent color palette and typography
- Mobile-first responsive design
- Dark mode support
- Desktop (1280px and up)
- Tablet (768px to 1279px)
- Mobile (320px to 767px)
Sensitive credentials (Bluesky, YouTube API, Google Analytics) are stored in environment variables — see .env.template. Never commit .env.local.
Headers are configured in next.config.js and applied to all routes via the headers() export.
| Header | Value | Purpose |
|---|---|---|
X-Frame-Options |
DENY |
Blocks other sites from embedding pages in iframes (SEO-relevant) |
Content-Security-Policy |
frame-ancestors 'none' |
Modern equivalent of X-Frame-Options |
X-Content-Type-Options |
nosniff |
Prevents MIME-type sniffing |
Referrer-Policy |
strict-origin-when-cross-origin |
Limits referrer data sent to third parties |
Permissions-Policy |
camera/mic/geo disabled | Restricts browser feature access |
Content-Security-Policy-Report-Only |
Full policy (see config) | Monitors CSP violations without blocking; iterate before enforcing |
Enforced today: framing, MIME sniffing, referrer, and permissions headers.
Report-only (monitoring): a full CSP allowlisting Google Analytics, Vercel Analytics/Speed Insights, YouTube embeds, and external image CDNs. Check browser DevTools console for CSP violation reports after deploy, then tighten and switch to an enforcing Content-Security-Policy when clean.
Strict-Transport-Security is set at the Cloudflare layer (not in Next.js). Keep HSTS enabled in Cloudflare SSL/TLS → Edge Certificates → HTTP Strict Transport Security.
Traffic flows Browser → Cloudflare → Vercel. After each deploy, confirm Cloudflare passes through (does not strip) headers from Vercel:
- Transform Rules — Ensure no rule removes or overrides
X-Frame-Options,Content-Security-Policy, or related headers. - Optional belt-and-suspenders — Duplicate core headers in a Cloudflare Modify Response Header rule if Vercel headers ever fail to reach the browser.
Access-Control-Allow-Origin: *— This header is not required for a static marketing site with no public API. In Cloudflare, check Rules → Transform Rules and Configuration Rules for anything adding CORS headers; remove if unnecessary.
After deploy, confirm headers are present:
curl -I https://jodierummer.comOr scan with securityheaders.com.
Locally after pnpm build && pnpm start:
curl -I http://localhost:3000- External links use
rel="noopener noreferrer" - No public API routes; third-party fetches (Bluesky, microlink) run server-side only
- Next.js
<Image>uses an explicit hostname allowlist innext.config.js
- WCAG 2.1 compliant
- Semantic HTML
- ARIA attributes where needed
- Keyboard navigation support
- Screen reader friendly
The site is deployed on Vercel with:
- Automatic deployments on push to main
- Preview deployments for pull requests
- Edge functions for optimal performance
- Analytics and monitoring
This project is licensed under the MIT License - see the LICENSE file for details.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For any questions or concerns, please let us know.