A regenerative community platform built with Svelte 5, featuring DAO governance, contribution-based economics, and an open-source blueprint for intentional communities.
- Svelte 5 (Runes) - Modern reactive framework with fine-grained reactivity
- SvelteKit - Full-stack framework with static site generation
- Tailwind CSS v4 - Utility-first CSS with custom regenerative theme
- Multi-Step Forms - Application form with Superforms + autosave
- Email Integration - Nodemailer SMTP with beautiful HTML templates
- Newsletter - Linkmonk integration with fallback to Zapier
- Blog - mdsvex-powered blog with reading time and RSS feed
- SEO Optimized - Complete meta tags, JSON-LD, sitemap, OG images
- Dark Mode - System preference detection with manual toggle
- Accessible - WCAG AA compliant with keyboard navigation
- Performance - Lighthouse 95+ target (mobile & desktop)
- i18n Ready - Paraglide.js for English/Spanish localization
- PWA Ready - Web manifest and service worker support
- Node.js 18+ (or Bun)
- pnpm (recommended) or npm
# Clone the repository
git clone https://github.com/yourusername/ecohubs.community.git
cd ecohubs.community
# Install dependencies
pnpm install
# Copy environment variables
cp .env.example .env
# Edit .env with your configuration
# Start development server
pnpm dev
# Open http://localhost:5173# Development
pnpm dev # Start dev server
pnpm dev:host # Start dev server with network access
# Building
pnpm build # Build for production
pnpm preview # Preview production build
# Quality
pnpm lint # Run ESLint
pnpm format # Format with Prettier
pnpm check # Type check with svelte-check
# Testing
pnpm test # Run all tests
pnpm test:unit # Run unit tests
pnpm test:e2e # Run E2E tests with PlaywrightCreate a .env file based on .env.example:
PUBLIC_SITE_URL=https://ecohubs.community
SMTP_HOST=localhost
SMTP_PORT=1025
EMAIL_FROM=noreply@ecohubs.community
ADMIN_EMAIL=admin@ecohubs.community# Newsletter
LINKMONK_URL=https://newsletter.ecohubs.community
LINKMONK_API_KEY=your-api-key
# Integrations
ZAPIER_WEBHOOK_URL=https://hooks.zapier.com/...
AIRTABLE_API_KEY=your-api-key
GITHUB_TOKEN=ghp_your-tokenSee .env.example for complete list with descriptions.
ecohubs.community/
βββ src/
β βββ lib/
β β βββ components/ # Reusable Svelte components
β β β βββ ApplicationForm.svelte
β β β βββ ContactForm.svelte
β β β βββ NewsletterForm.svelte
β β β βββ Hero.svelte
β β β βββ Navbar.svelte
β β β βββ ...
β β βββ config/ # Application configuration
β β β βββ application-questions.ts
β β βββ email-templates/ # Email HTML/text templates
β β βββ server/ # Server-side utilities
β β β βββ email.ts
β β β βββ blog.ts
β β βββ styles/ # Global styles & theme
β β β βββ theme.css
β β βββ utils/ # Utility functions
β βββ routes/ # SvelteKit routes
β β βββ +layout.svelte
β β βββ +page.svelte # Home page
β β βββ api/ # API endpoints
β β β βββ contact/
β β β βββ newsletter/
β β β βββ application/
β β βββ blog/
β β β βββ [slug]/ # Dynamic blog post
β β β βββ +page.svelte # Blog index
β β βββ join/ # Application form
β β βββ contact/ # Contact page
β β βββ ...
β βββ content/ # Blog posts (mdsvex)
β β βββ blog/
β β βββ *.svx
β βββ app.html # HTML template
βββ static/ # Static assets
β βββ manifest.webmanifest
βββ .github/
β βββ workflows/ # CI/CD pipelines
βββ DEPLOYMENT.md # Deployment guide
βββ vercel.json # Vercel configuration
See DEPLOYMENT.md for detailed instructions on:
- Vercel - One-click deployment with automatic CI/CD
- Self-Hosted Node - Full control with PM2, Nginx, SSL
- Static Hosting - Netlify, GitHub Pages, etc.
- Email Configuration - Nodemailer, Mailu, MailHog
- CI/CD - GitHub Actions workflows
Quick summary:
# Vercel
vercel
# Self-hosted (after setup)
pnpm build
pm2 start ecosystem.config.js
# Static
pnpm build
# Deploy build/ directory- Create directory in
src/routes/ - Add
+page.svelteand+page.ts - Set
export const prerender = truein+page.ts - Use
<SEO>component for metadata
Example:
<script lang="ts">
import SEO from '$lib/components/SEO.svelte';
</script>
<SEO
title="Page Title"
description="Page description for SEO"
/>- Tailwind CSS v4 with custom theme
- Colors:
ecohubs-primary,ecohubs-dark,ecohubs-accent - Typography: Serif headings (
font-serif), sans body - Dark mode: Automatic with system preference
- Custom classes:
.glass-card,.text-gradient,.organic-shape
| Component | Purpose |
|---|---|
ApplicationForm.svelte |
Multi-step application with Superforms |
ContactForm.svelte |
Contact form with validation |
NewsletterForm.svelte |
Email subscription (Linkmonk) |
Hero.svelte |
Animated hero section |
Navbar.svelte |
Responsive navigation with auto-hide |
Footer.svelte |
Site footer with newsletter |
SEO.svelte |
Meta tags + JSON-LD helper |
All email templates support both HTML and plain text:
- Contact:
src/lib/email-templates/contact.ts - Application:
src/lib/email-templates/application.ts - Each template exports HTML and text functions
Create new blog posts in src/content/blog/:
---
title: "Post Title"
excerpt: "Brief description"
date: "2024-11-20"
author: "Author Name"
tags: ["tag1", "tag2"]
readingTime: 8
---
Content here using markdown...| Metric | Target | Status |
|---|---|---|
| Lighthouse Performance | 95+ | β |
| First Contentful Paint | < 1.5s | β |
| Time to Interactive | < 3.5s | β |
| Cumulative Layout Shift | < 0.1 | β |
- WCAG AA compliant
- Keyboard navigation support
- Proper ARIA labels and roles
- Color contrast ratios verified
- Screen reader tested
# Unit tests (Vitest)
pnpm test:unit
# E2E tests (Playwright)
pnpm test:e2e
# Run all tests
pnpm test- Fork the repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open Pull Request
See CONTRIBUTING.md for detailed guidelines.
MIT License - see LICENSE file for details.
- Built with SvelteKit
- Styled with Tailwind CSS
- Icons by Lucide
- Inspired by Ethereum Infinite Garden & Regen Network
- Documentation: /docs
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: hello@ecohubs.community
Built with π± by the EcoHubs Community