From b3dbc603245b026bf343a9cee9b3dd0fb05ffbbc Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Fri, 30 Jan 2026 14:37:14 +0000 Subject: [PATCH] Website updates round 3 - Add floating concepts: Parallel worlding, Guerrilla futuring - Replace Speculative fiction with Economic sci-fi - Fix all example URLs with correct links - Update Digital Publishing description - Convert Playing with Reality to bullet points - Update Who should attend with comprehensive list - Change contribution field to multi-select checkboxes - Update Ready to Play? to Ready to Hijack Reality? - Fix Location footer link - Add organizing team info (Rok, Pekko, Carolina) - Add website credit - Add Maker Spaces & Equipment section - Add Financial Transparency section with CCG25 link - Update server.js for multi-select contribute handling Co-Authored-By: Claude Opus 4.5 --- index.html | 138 ++++++++++++++++++++++++++++++++++++----------------- server.js | 33 ++++++++----- 2 files changed, 115 insertions(+), 56 deletions(-) diff --git a/index.html b/index.html index 76d499e..3fec08f 100644 --- a/index.html +++ b/index.html @@ -1300,12 +1300,20 @@
โœ’๏ธ - Speculative
fiction + Economic
sci-fi
๐ŸŽฒ Games as
organisations
+
+ ๐ŸŒ + Parallel
worlding +
+
+ ๐Ÿ”ฎ + Guerrilla
futuring +
@@ -1328,7 +1336,7 @@
๐Ÿ“š

Digital Publishing

-

Digital publishing with partner organisations like the Institute of Network Cultures (TBC)

+

Publishing short sci-fi stories, tabletop games, LARP toolkits and other formats as an open-access anthology with partners like Bread Coop and the Institute of Network Cultures (TBC)

๐ŸŽฎ @@ -1364,15 +1372,18 @@
-

Treating culture and social conventions as reprogrammable design spaces.

+
    +
  • Unshackled play with social conventions, aka "reality", aka "the world"
  • +
  • Treating culture as reprogrammable design spaces
  • +
@@ -1393,10 +1404,10 @@ @@ -1416,13 +1427,12 @@

Examples

- Futurematic - Tomorrow's Energy Today - A Night at the Orfelia - The Treaty of Finsbury Park - Queer Embassy of Possible Futures - NOVA: Future Thoughts on Surviving Together - Future 14b + Futurematic + Tomorrow's Energy Today + A Night at the Orfelia + The Treaty of Finsbury Park + Queer Embassy of Possible Futures + NOVA: Future Thoughts on Surviving Together
@@ -1441,12 +1451,12 @@ @@ -1466,12 +1476,12 @@

Examples

- Witnesspedia - POCAS - Nordic Larp Wiki - Green Mediaography - Board Game Mechanics Repository - Artists, Activists, and Worldbuilders on DAOs + Witnesspedia + POCAS + Nordic Larp Wiki + Green Mediaography + Board Game Mechanics Repository + Artists, Activists, and Worldbuilders on DAOs
@@ -1509,6 +1519,20 @@ A co-working, co-living and event venue that harbours artists, digital movements and decentralized communities +
+ ๐Ÿ› ๏ธ +
+ Maker Spaces & Equipment + Access to 3D printer, laser cutter, sewing station, farmbot, book binding station and various workshop rooms +
+
+
+ ๐Ÿ’ฐ +
+ Financial Transparency + Food for the first 3 days will be catered, then self/community organised. Accommodation at the Hub with potential subsidies. See full transparency details โ†’ +
+
@@ -1551,7 +1575,7 @@

Who should attend?

-

Sci-fi writers, game-makers, artivists, LARPers, weird economists, futurists, performers, eutopian dreamers.

+

Sci-fi and cli-fi writers, pluriversal worldbuilders, game designers, storytellers, artists, performers, LARPers, commons and degrowth activists, weird economists, solarpunks, participatory futurists, speculative designers, researchers and academics, technologists, open-source developers, and any and all curious others.

@@ -1630,17 +1654,41 @@
- - + +
+ + + + + + + + +
@@ -1667,7 +1715,7 @@
-

Ready to Play?

+

Ready to Hijack Reality?

Join fellow dreamers, makers, and reality-benders in prefiguring postcapitalist futures.

Register Now @@ -1687,7 +1735,7 @@

Event

@@ -1701,7 +1749,9 @@
@@ -1890,7 +1940,7 @@ const data = {}; formData.forEach((value, key) => { - if (key === 'interests') { + if (key === 'interests' || key === 'contribute') { if (!data[key]) data[key] = []; data[key].push(value); } else { diff --git a/server.js b/server.js index a0d25ac..5844b2b 100644 --- a/server.js +++ b/server.js @@ -76,7 +76,7 @@ async function appendToGoogleSheet(registration) { registration.location, registration.role, Array.isArray(registration.interests) ? registration.interests.join(', ') : registration.interests, - registration.contribute, + Array.isArray(registration.contribute) ? registration.contribute.join(', ') : registration.contribute, registration.message, registration.newsletter ? 'Yes' : 'No', registration.id @@ -131,15 +131,20 @@ async function sendConfirmationEmail(registration) { }; const contributeLabels = { - 'session': 'Pitch a session', - 'workshop': 'Run a workshop', - 'game': 'Share/playtest a game', - 'performance': 'Perform/facilitate', - 'collaborate': 'Collaborate on something', - 'participate': 'Participate', + 'session': 'Propose a session', + 'workshop': 'Host a workshop', + 'game': 'Bring a game to play or playtest', + 'larp': 'Run a LARP or participatory format', + 'project': 'Co-create a project or publication', + 'other': 'Contribute in another way', + 'attend': 'Attend only', 'unsure': 'Not sure yet' }; + const contributeText = Array.isArray(registration.contribute) && registration.contribute.length > 0 + ? registration.contribute.map(c => contributeLabels[c] || c).join(', ') + : 'Not specified'; + await resend.emails.send({ from: 'WORLDPLAY ', to: registration.email, @@ -198,10 +203,10 @@ async function sendConfirmationEmail(registration) { Interests: ${interestsText} - ${registration.contribute ? ` + ${(Array.isArray(registration.contribute) && registration.contribute.length > 0) || registration.contribute ? ` Contribution: - ${contributeLabels[registration.contribute] || registration.contribute} + ${contributeText} ` : ''} @@ -268,7 +273,7 @@ app.post('/api/register', async (req, res) => { location: location?.trim() || '', role: role === 'other' && otherRole ? `Other: ${otherRole.trim()}` : (role || ''), interests: interests || [], - contribute: contribute || '', + contribute: contribute || [], message: message?.trim() || '', newsletter: newsletter === 'yes', registeredAt: new Date().toISOString(), @@ -343,7 +348,7 @@ app.get('/api/registrations/export', async (req, res) => { r.location, r.role, Array.isArray(r.interests) ? r.interests.join('; ') : r.interests, - r.contribute, + Array.isArray(r.contribute) ? r.contribute.join('; ') : r.contribute, r.message.replace(/"/g, '""'), r.newsletter ? 'Yes' : 'No', r.registeredAt @@ -393,7 +398,11 @@ app.get('/api/stats', async (req, res) => { } // Count by contribute - if (r.contribute) { + if (Array.isArray(r.contribute)) { + r.contribute.forEach(contrib => { + stats.byContribute[contrib] = (stats.byContribute[contrib] || 0) + 1; + }); + } else if (r.contribute) { stats.byContribute[r.contribute] = (stats.byContribute[r.contribute] || 0) + 1; } });