Modern static site built with:
- Astro 6.x
- React 19 components
- TypeScript
Note: The legacy Jekyll site is archived at archive.bumbleflies.de.
cd beta
npm installnpm run devRuns at http://localhost:3000 with hot module reloading.
npm run buildOutputs static site to beta/dist/.
npm run previewbeta/
βββ src/
β βββ components/ # Reusable Astro & React components
β β βββ Layout.astro # Main page layout wrapper
β β βββ Nav.astro # Navigation bar
β β βββ Footer.astro # Footer
β β βββ Hero.astro # Hero sections
β β βββ ServicePillar.astro
β β βββ TeamCard.astro
β β βββ CaseStudyCard.astro
β β βββ ... # Other feature components
β βββ pages/ # Route-based pages
β β βββ index.astro # Homepage
β β βββ [slug].astro # Dynamic routes
β β βββ ...
β βββ content/ # Content collections (structured data)
β β βββ case-studies/ # Case study content & metadata
β β βββ config.ts # Content collection schemas
β βββ styles/ # Global CSS and component styles
β βββ layouts/ # Reusable page layouts
βββ public/ # Static assets (images, fonts, etc.)
βββ astro.config.mjs # Astro configuration
βββ tsconfig.json # TypeScript configuration
βββ package.json # Dependencies & scripts
- Create a file in
src/pages/(e.g.,src/pages/about.astro) - Use the
Layoutcomponent to wrap content:--- import Layout from '../components/Layout.astro'; --- <Layout title="About Us"> <h1>About Bumbleflies</h1> <!-- Page content --> </Layout>
Components go in src/components/. They can be:
- Astro components (
.astro) β Server-side rendered, zero JavaScript by default - React components (
.tsx) β Interactive client-side components
// src/components/MyComponent.astro
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<div class="component">
<h2>{title}</h2>
<slot />
</div>
<style>
.component {
padding: 1rem;
}
</style>Case studies and other content are managed as Astro Content Collections for type-safe structured data.
Case Studies:
- Location:
src/content/case-studies/ - Schema defined in:
src/content/config.ts - Access in components via
getCollection():
---
import { getCollection } from 'astro:content';
const caseStudies = await getCollection('case-studies');
---
{caseStudies.map(study => (
<CaseStudyCard study={study} />
))}Run tests with:
npm run testTests use Vitest with React Testing Library for component testing.
- Global styles:
src/styles/ - Component-scoped styles: Use
<style>blocks in.astroand.tsxfiles - Responsive design: Mobile-first approach with Astro's built-in viewport control
The site is deployed to production via GitHub Actions when changes are pushed to main.
See .github/workflows/ for deployment configuration.
- Zero JavaScript by default β Astro components are server-rendered
- Partial hydration β Only interactive React components ship JavaScript
- Image optimization β Use Astro's
<Image>component for automatic optimization - Static generation β All pages pre-rendered for instant load times
| Command | Purpose |
|---|---|
npm run dev |
Start dev server |
npm run build |
Build for production |
npm run preview |
Preview production build |
npm run test |
Run tests |