From 3f20e2d9c33517300cdf6ebde53b6e8c3aeb27c3 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Mon, 9 Mar 2026 14:29:25 -0700 Subject: [PATCH] feat: replace CTA with registration focus, expand footer, add newsletter & sponsorships - Replace bottom-of-page waitlist form with registration CTA linking to /apply.html - Add newsletter signup bar (email-only, subscribes to Listmonk) for visitors not ready to register - Expand footer to 3-column grid (Event, Navigate, Community) with sponsorships link - Create sponsorship package (VOTC26-Sponsorship-Package.md) and web page (sponsorships.html) - Add /api/newsletter endpoint for lightweight mailing list signup - Update nav link from "Get involved" to "Register", community partners link updated - Fix listmonk.js to not overwrite existing subscriber names with empty strings - Update apply.html and payment-return.html footers for consistency Co-Authored-By: Claude Opus 4.6 --- VOTC26-Sponsorship-Package.md | 290 ++++++++++++++++++++++++++++++ api/listmonk.js | 6 +- api/newsletter.js | 38 ++++ apply.html | 2 +- index.html | 100 ++++++----- main.js | 136 ++++++++++++++ payment-return.html | 2 +- server.js | 2 + sponsorships.html | 330 ++++++++++++++++++++++++++++++++++ styles.css | 209 +++++++++++++++------ 10 files changed, 1011 insertions(+), 104 deletions(-) create mode 100644 VOTC26-Sponsorship-Package.md create mode 100644 api/newsletter.js create mode 100644 main.js create mode 100644 sponsorships.html diff --git a/VOTC26-Sponsorship-Package.md b/VOTC26-Sponsorship-Package.md new file mode 100644 index 0000000..26c1fdc --- /dev/null +++ b/VOTC26-Sponsorship-Package.md @@ -0,0 +1,290 @@ +# Valley of the Commons 2026 +## Sponsorship Package + +--- + +# A Four-Week Pop-Up Village on Common Ground + +**August 24 – September 20, 2026 | Commons Hub, Austrian Alps** + +--- + +## Executive Summary + +**Valley of the Commons (VotC)** is a four-week pop-up village in the Austrian Alps where commons practitioners, governance innovators, housing co-op builders, and cosmo-localism researchers come together to prototype life beyond extractive systems. Rooted at Commons Hub in Höllental, this gathering is a living commons — shared in work and study, in making and care, in governance and everyday life. + +### At a Glance + +| | | +|---|---| +| **Dates** | August 24 – September 20, 2026 | +| **Location** | Commons Hub, Höllental, Austrian Alps | +| **Expected Attendance** | 60–100 participants | +| **Format** | Four-week structured pop-up village | +| **Organizers** | Commons Hub | +| **Pass Value** | €300/week (€1,200 for full 4 weeks) | + +--- + +## Why Sponsor VotC 2026? + +### 1. Reach Engaged Practitioners & Thought Leaders + +VotC attracts a unique audience committed to building alternatives: + +- **Commons Practitioners** — Contributors to cosmo-local production, mutual aid networks, cooperative economies +- **Governance Innovators** — DAO architects, participatory governance designers, cooperative founders +- **Housing Co-op Builders** — Architects, community land trust leaders, co-housing pioneers +- **Academic Researchers** — PhD students, professors, and policy experts on commons, degrowth, and post-capitalism +- **Cosmo-localism Practitioners** — Open-source hardware designers, fab lab operators, distributed manufacturing advocates + +### 2. Association with Tangible Impact + +VotC isn't a conference — it's a practice-oriented community building toward permanence. Outcomes include: + +- **Governance charters** and cooperative legal structures +- **Housing cluster plans** for the valley +- **Open value accounting** frameworks tested in practice +- **Cosmo-local production** prototypes and economic models + +### 3. Values-Aligned Audience + +VotC participants are committed builders who: + +- Lead projects with real traction in cooperative economics, regenerative governance, and housing +- Make decisions for their organizations and communities +- Influence discourse in commons, cooperative, and network society movements +- Seek genuine partnerships over marketing placements + +### 4. Deep Engagement, Not Drive-By Exposure + +Four weeks of co-living creates relationships that last. Sponsors become part of the community fabric, not backdrop. + +--- + +## Audience Profile + +### Who Attends VotC? + +``` +60–100 participants from 15+ countries +``` + +| Segment | % | Description | +|---------|---|-------------| +| **Commons & Co-op Builders** | 30% | Cooperative founders, community organizers, commons practitioners | +| **Researchers & Academics** | 25% | PhD students, professors, think tank members | +| **Governance & Legal Designers** | 20% | DAO contributors, participatory governance architects, co-op lawyers | +| **Makers & Technologists** | 15% | Fab lab operators, open-source hardware designers, cosmo-local producers | +| **Investors & Funders** | 10% | Impact investors, grant makers, commons-aligned foundations | + +### Attendee Interests + +- Commons theory and practice +- Cosmo-local production and open value accounting +- Housing co-ops and co-living design +- Horizontal governance and funding mechanisms +- Degrowth and post-capitalism +- Community currencies and mutual credit +- Network societies and intentional communities +- Regenerative land use and stewardship + +### Geographic Distribution + +- **Europe:** 65% +- **North America:** 15% +- **Global South:** 10% +- **Asia-Pacific:** 10% + +--- + +## Sponsorship Tiers + +### MYCELIUM PARTNER | €10,000 +*Become part of the Valley ecosystem* + +**Recognition & Visibility** +- Logo placement on website hero section and all pages +- Featured sponsor section on event materials and signage +- Acknowledgment at opening and closing ceremonies +- Social media recognition across all VotC channels +- Logo on participant materials and signage + +**Engagement** +- **4 complimentary full passes** (4 weeks each — €4,800 value) +- Dedicated 60-minute sponsored session slot +- Private dinner with organizers and community leaders +- First access to participant list (with consent) for networking + +**Content & Media** +- Sponsor spotlight in pre-event communications +- Feature in post-event summary and report +- Rights to use "Official Partner of VotC 2026" in marketing + +--- + +### SPORE PARTNER | €5,000 +*Plant seeds for regenerative futures* + +**Recognition & Visibility** +- Logo on website sponsor section +- Logo on event signage and materials +- Social media recognition +- Acknowledgment at ceremonies + +**Engagement** +- **2 complimentary full passes** (€2,400 value) +- 30-minute workshop or presentation slot +- Access to participant introductions (with consent) + +**Content & Media** +- Mention in event communications +- Inclusion in post-event summary + +--- + +### SYMBIONT SUPPORTER | €2,500 +*Support commons-building infrastructure* + +**Recognition & Visibility** +- Logo on website sponsor section +- Logo on event signage +- Social media mention + +**Engagement** +- **1 complimentary full pass** (€1,200 value) +- Priority registration access + +**Content & Media** +- Mention in event newsletter + +--- + +### FRIEND OF THE COMMONS | €1,000 +*Show solidarity with the movement* + +**Recognition & Visibility** +- Name/logo listed on website supporters section +- Social media thank-you post + +**Engagement** +- **1 discounted pass** (50% off — €600 value) + +--- + +## Alternative Partnership Opportunities + +Beyond financial sponsorship, we welcome in-kind contributions and creative partnerships: + +### Theme / Week Sponsorship | Custom +Sponsor a specific themed week (e.g., "Cosmo-local Production Week" or "Governance & Funding Week") with naming rights and session curation involvement. + +### Accommodation Sponsorship | ~€3,000–8,000 +Cover accommodation costs for participants who need financial support, enabling broader access across the four weeks. + +### Meal Sponsorship | ~€2,000–6,000 +Sponsor shared meals for a week or the entire event — your name becomes synonymous with nourishment and community care. + +### Documentation Sponsorship | ~€2,000 +Support professional documentation (photography, videography, written summaries) with credit and content rights. + +### Travel Grants | Custom +Fund travel scholarships for participants from underrepresented regions or backgrounds. + +### Technology Partnership | In-Kind +Provide tools, platforms, or infrastructure (collaboration tools, fab lab equipment, etc.) in exchange for recognition. + +--- + +## What Makes VotC Different? + +### It's Not a Conference — It's a Village + +Unlike traditional events, VotC is: + +- **Practice-oriented** — Outcomes feed into real governance charters, housing plans, and economic models +- **Deeply relational** — Four weeks of co-living creates bonds that last +- **Rooted in place** — Höllental isn't just a venue; it's a site for permanence +- **Non-extractive** — Built on commons principles, organized by Commons Hub + +### Participants Contribute, Not Just Consume + +Everyone shares in the work of village life — cooking, cleaning, building, documenting. This creates relationships of mutual care and shared responsibility. + +### Building Toward Permanence + +This popup isn't a simulation. It is a real community taking steps toward valley transformation: exploring housing clusters, cooperative legal structures, and economic models that can anchor a permanent settlement. + +--- + +## Programme Structure + +| Week | Theme | Dates | +|------|-------|-------| +| **Week 1** | Return of the Commons | Aug 24–30 | +| **Week 2** | Cosmo-local Production & Open Value Accounting | Aug 31–Sep 6 | +| **Week 3** | Future Living | Sep 7–13 | +| **Week 4** | Governance & Funding Models | Sep 14–20 | + +**Daily rhythm:** Mornings are structured learning paths. Afternoons host workshops, field visits, and working groups. Evenings are for shared life, reflection, and communal time. Weekends remain open for exploration and connection. + +--- + +## Event Budget Overview + +In the spirit of transparency: + +| Category | Allocation | +|----------|------------| +| Venue & Infrastructure | 35% | +| Food & Catering | 30% | +| Programme & Facilitators | 15% | +| Documentation & Media | 10% | +| Accessibility & Support | 10% | + +--- + +## Contact & Next Steps + +We'd love to discuss how a partnership could work for your organization. + +**Primary Contact:** +- **Email:** team@valleyofthecommons.com + +**Event Website:** +- https://valleyofthecommons.com + +**Community:** +- Telegram: https://t.me/valleyofthecommons + +**Organizer:** +- Commons Hub: https://www.commons-hub.at + +--- + +## Key Dates + +| Date | Milestone | +|------|-----------| +| **Now** | Sponsorship discussions open | +| **May 31, 2026** | Early bird registration closes | +| **July 31, 2026** | Regular registration closes | +| **August 1, 2026** | Final sponsor deliverables due | +| **Aug 24 – Sep 20, 2026** | Valley of the Commons 2026 | +| **October 2026** | Post-event report and media shared | + +--- + +## Closing Note + +VotC isn't seeking sponsors who want logo placement in exchange for attention. We're seeking **partners** who share our vision of commons-based, cooperative, regenerative futures. + +If your organization is building toward a world where value flows differently, where communities hold land and resources in trust, and where governance serves human and ecological flourishing — we want to collaborate. + +Join us in the Austrian Alps for four weeks that might just change how you see what's possible. + +--- + +*This sponsorship package was prepared by Commons Hub. Feel free to share this document with potential partners who might be aligned.* + +**Last updated:** March 2026 diff --git a/api/listmonk.js b/api/listmonk.js index 5ccce45..e300ece 100644 --- a/api/listmonk.js +++ b/api/listmonk.js @@ -28,7 +28,7 @@ async function addToListmonk(email, name, attribs = {}) { // Check if subscriber exists const existing = await client.query( - 'SELECT id, attribs FROM subscribers WHERE email = $1', + 'SELECT id, name, attribs FROM subscribers WHERE email = $1', [email] ); @@ -38,9 +38,11 @@ async function addToListmonk(email, name, attribs = {}) { subscriberId = existing.rows[0].id; const existingAttribs = existing.rows[0].attribs || {}; const merged = { ...existingAttribs, ...mergeAttribs }; + // Only update name if a non-empty name is provided + const updateName = name || existing.rows[0].name || ''; await client.query( 'UPDATE subscribers SET name = $1, attribs = $2, updated_at = NOW() WHERE id = $3', - [name, JSON.stringify(merged), subscriberId] + [updateName, JSON.stringify(merged), subscriberId] ); console.log(`[Listmonk] Updated existing subscriber: ${email} (ID: ${subscriberId})`); } else { diff --git a/api/newsletter.js b/api/newsletter.js new file mode 100644 index 0000000..b8ed9d7 --- /dev/null +++ b/api/newsletter.js @@ -0,0 +1,38 @@ +// Newsletter signup endpoint — adds email to Listmonk mailing list +const { addToListmonk } = require('./listmonk'); + +module.exports = async function handler(req, res) { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + + if (req.method === 'OPTIONS') { + return res.status(200).end(); + } + + if (req.method !== 'POST') { + return res.status(405).json({ error: 'Method not allowed' }); + } + + try { + const { email } = req.body; + + if (!email || !email.includes('@')) { + return res.status(400).json({ error: 'Valid email is required' }); + } + + const emailLower = email.toLowerCase().trim(); + + await addToListmonk(emailLower, '', { + source: 'newsletter_signup', + }); + + return res.status(200).json({ + success: true, + message: 'Successfully subscribed!' + }); + } catch (error) { + console.error('Newsletter signup error:', error); + return res.status(500).json({ error: 'Failed to subscribe. Please try again later.' }); + } +}; diff --git a/apply.html b/apply.html index 8146be1..4ad5e72 100644 --- a/apply.html +++ b/apply.html @@ -706,7 +706,7 @@ + @@ -51,7 +51,7 @@ Collaborators Explore the Valley - Get involved + Register 🐰 APPLY NOW @@ -203,7 +203,7 @@

- Get involved → + Register →

@@ -215,49 +215,30 @@ - -
+ +
-

Get involved

-

Join as a partner, theme curator, or sponsor.

- - -
-
- -
-
- -
-
- -
- -
-
+

Join Us in the Valley

+

Four weeks of commons-building in the Austrian Alps. Live, learn, and build together with practitioners, researchers, and community builders shaping life beyond extractive systems.

+
+ Aug 24 – Sep 20, 2026 + Höllental, Austrian Alps + €300 / week +
+ REGISTER NOW +

You'll be added to our mailing list to stay updated.

+
+
-

Together, we can turn vision into reality.

+ + @@ -265,7 +246,36 @@ diff --git a/main.js b/main.js new file mode 100644 index 0000000..fd8ec0d --- /dev/null +++ b/main.js @@ -0,0 +1,136 @@ +// Smooth scroll to section, ensuring title is visible +function scrollToSection(sectionId, e) { + const section = document.getElementById(sectionId); + if (!section) return; + + e.preventDefault(); + + // Get header height for offset + const header = document.querySelector('.header'); + const headerHeight = header ? header.offsetHeight : 0; + const padding = 40; // Extra padding to ensure title is fully visible + + // Calculate position to show section with title visible + const sectionRect = section.getBoundingClientRect(); + const sectionTop = sectionRect.top + window.pageYOffset; + + // Scroll to position that shows the section title with proper spacing + const scrollPosition = sectionTop - headerHeight - padding; + + window.scrollTo({ + top: Math.max(0, scrollPosition), + behavior: 'smooth' + }); +} + +// Loading screen handler +function initLoadingScreen() { + const loadingScreen = document.getElementById('loading-screen'); + if (!loadingScreen) return; + + let isHiding = false; + + function hideLoadingScreen() { + if (isHiding) return; + isHiding = true; + loadingScreen.classList.add('hidden'); + setTimeout(function() { + loadingScreen.remove(); + }, 1200); + window.removeEventListener('scroll', onScroll); + window.removeEventListener('wheel', onScroll); + window.removeEventListener('touchmove', onScroll); + } + + function onScroll() { + hideLoadingScreen(); + } + + const skipButton = document.getElementById('skip-loading'); + if (skipButton) { + skipButton.addEventListener('click', hideLoadingScreen); + } + + window.addEventListener('scroll', onScroll, { passive: true }); + window.addEventListener('wheel', onScroll, { passive: true }); + window.addEventListener('touchmove', onScroll, { passive: true }); + + window.addEventListener('load', function() { + setTimeout(function() { + hideLoadingScreen(); + }, 6500); + }); +} + +// Newsletter form submission handler +function initNewsletterForm() { + const form = document.getElementById('newsletter-form'); + if (!form) return; + + const emailInput = document.getElementById('newsletter-email'); + const messageDiv = document.getElementById('newsletter-message'); + const submitButton = form.querySelector('button[type="submit"]'); + + form.addEventListener('submit', async function(e) { + e.preventDefault(); + + submitButton.disabled = true; + submitButton.textContent = 'Subscribing...'; + messageDiv.textContent = ''; + messageDiv.className = 'newsletter-message'; + + const email = emailInput.value.trim(); + + if (!email || !email.includes('@')) { + showMessage('Please enter a valid email address.', 'error'); + submitButton.disabled = false; + submitButton.textContent = 'Subscribe'; + return; + } + + try { + const response = await fetch('/api/newsletter', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + showMessage('You\'re subscribed! We\'ll keep you updated.', 'success'); + form.reset(); + } else { + showMessage(data.error || 'Something went wrong. Please try again.', 'error'); + } + } catch (error) { + console.error('Error subscribing:', error); + showMessage('Network error. Please try again.', 'error'); + } finally { + submitButton.disabled = false; + submitButton.textContent = 'Subscribe'; + } + }); + + function showMessage(message, type) { + messageDiv.textContent = message; + messageDiv.className = `newsletter-message ${type}`; + } +} + +document.addEventListener('DOMContentLoaded', function() { + initLoadingScreen(); + + // Set up scroll handlers for anchor links + const registerLinks = document.querySelectorAll('a[href="#register"]'); + registerLinks.forEach(link => { + link.addEventListener('click', (e) => scrollToSection('register', e)); + }); + + const scheduleLinks = document.querySelectorAll('a[href="#schedule"]'); + scheduleLinks.forEach(link => { + link.addEventListener('click', (e) => scrollToSection('schedule', e)); + }); + + initNewsletterForm(); +}); diff --git a/payment-return.html b/payment-return.html index 4778dbc..8ef43f1 100644 --- a/payment-return.html +++ b/payment-return.html @@ -162,7 +162,7 @@