<style> canvas { position: absolute; inset: 0; display: block; z-index: 2 !important; } </style> <canvas id="globe"></canvas> <style> canvas { position: absolute; inset: 0; display: block; z-index: 3; background: transparent; } </style> <canvas id="globe"></canvas> <script> const canvas = document.getElementById('globe'); const ctx = canvas.getContext('2d'); const globes = [ { xPercent: 9, yPercent: 0, radius: 200, color: 'green', baseDotCount: 7000, dotMinSize: 1, dotMaxSize: 1.25, dotScaleFactor: 1, opacity: 1, rotationSpeed: 0.003, wobbleSpeed: 0.02, wobbleAmount: 0.1, orbitOffset: { x: 0.1, y: -0.05 }, transparencyZone: { x: 0.5, y: 0.5, radius: 0.5 } }, { xPercent: 15, yPercent: 90, radius: 400, color: 'orange', baseDotCount: 3000, dotMinSize: 1.5, dotMaxSize: 2, dotScaleFactor: 1.5, opacity: 1, rotationSpeed: 0.002, wobbleSpeed: 0.01, wobbleAmount: 0.1, orbitOffset: { x: 0, y: 0 }, transparencyZone: { x: 0, y: 0, radius: 2 } }, { xPercent: 90, yPercent: 70, radius: 350, color: 'green', baseDotCount: 3000, dotMinSize: 6, dotMaxSize: 6, dotScaleFactor: 1, opacity: 1, rotationSpeed: 0.001, wobbleSpeed: 0.005, wobbleAmount: 0.2, orbitOffset: { x: -0.1, y: 0.05 }, transparencyZone: { x: 0, y: 0.9, radius: 2 } } ]; function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; regenerateGlobeDots(); } function regenerateGlobeDots() { const scaleFactor = Math.min(window.innerWidth / 1200, 1); globes.forEach(globe => { const count = Math.floor(globe.baseDotCount * scaleFactor); globe.dots = []; for (let i = 0; i < count; i++) { const theta = Math.random() * 2 * Math.PI; const phi = Math.acos(2 * Math.random() - 1); globe.dots.push({ theta, phi }); } }); } window.addEventListener('resize', resizeCanvas); resizeCanvas(); let tick = 0; function interpolateGradient(r, palette = 'orange') { if (palette === 'green') { const t = r; return { r: Math.round(50 * (1 - t) + 180 * t), g: Math.round(255 * (1 - t) + 255 * t), b: Math.round(100 * (1 - t) + 50 * t), }; } if (r < 0.5) { const t = r / 0.5; return { r: Math.round(255 * (1 - t) + 255 * t), g: Math.round(160 * (1 - t) + 100 * t), b: Math.round(0 * (1 - t) + 50 * t) }; } else { const t = (r - 0.5) / 0.5; return { r: Math.round(255 * (1 - t) + 100 * t), g: Math.round(100 * (1 - t) + 20 * t), b: Math.round(50 * (1 - t)) }; } } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); // Transparent background ctx.save(); globes.forEach((globe, index) => { const x = canvas.width * (globe.xPercent / 100); const y = canvas.height * (globe.yPercent / 100); const radius = globe.radius * (canvas.width / 1200); const { dots, color, dotMinSize, dotMaxSize, dotScaleFactor, opacity, rotationSpeed, wobbleSpeed, wobbleAmount, orbitOffset, transparencyZone } = globe; const rotation = tick * rotationSpeed; const wobble = Math.sin(tick * wobbleSpeed + index) * wobbleAmount; ctx.translate(x, y); for (const dot of dots) { const theta = dot.theta + rotation; const phi = dot.phi + wobble; const sx = radius * Math.sin(phi) * Math.cos(theta); const sy = radius * Math.sin(phi) * Math.sin(theta); const sz = radius * Math.cos(phi); const scale = 0.6 + sz / (2 * radius); let px = (sx + (orbitOffset?.x || 0) * radius) * scale; let py = (sy + (orbitOffset?.y || 0) * radius) * scale; // Transparency zone adjustment let transparencyFactor = 1; if (transparencyZone) { const zoneX = (transparencyZone.x - 0.5) * 2 * radius; const zoneY = (transparencyZone.y - 0.5) * 2 * radius; const zoneR = radius * transparencyZone.radius; const dx = px / scale - zoneX; const dy = py / scale - zoneY; const d = Math.sqrt(dx * dx + dy * dy); if (d < zoneR) { transparencyFactor = d / zoneR; // fades in } } const alpha = (0.4 + 0.6 * ((sz + radius) / (2 * radius))) * opacity * transparencyFactor; const dotRadius = dotMinSize + (dotMaxSize - dotMinSize) * scale * dotScaleFactor; const dist = Math.sqrt(px * px + py * py) / (radius * 1.2); const grad = interpolateGradient(Math.min(dist, 1), color); ctx.beginPath(); ctx.arc(px, py, dotRadius, 0, Math.PI * 2); ctx.fillStyle = `rgba(${grad.r}, ${grad.g}, ${grad.b}, ${alpha})`; ctx.fill(); } ctx.translate(-x, -y); }); ctx.restore(); tick++; requestAnimationFrame(draw); } draw(); </script>
canvas { pointer-events: none !important; }
Speakers

Jamila Rizvi

Craig Cowdrey

Mark Oostergo

Shelley Johnson

Raechel Gavin

Kevin Figueiredo

Cilia Robinson

Stella Petrou Concha
More to be announced
Location
Suite 3, 13A Hickson Road, Dawes Point, NSW 2000
Why Sonder Summit?
About Sonder
Sonder Summit FAQs
What can I expect at Sonder Summit?
Get ready for a one-day-only event, packed with a great line-up of speakers, energising Sonder activations, and executive-level networking opportunities, plus so much more.
- Be the first to hear the latest insights on employee health, safety and wellbeing
- Catch up with industry friends, both old and new
- Learn practical strategies to implement, both in the immediate future, and looking ahead
- Feel inspired and uplifted to make a positive change in your workplace and community
Who should come to Sonder Summit?
Sonder Summit has been designed for people who lead employee safety, health and wellbeing. You’ll be in great company; expect to connect with senior leaders in people & culture, wellbeing, safety, and risk – as well as those who are passionate about building a safer, healthier, and more supportive workplace.
When and where is Sonder Summit 2025?
Sonder Summit 2025 will be held on Thursday, 18 September at ACO on the Pier – Suite 3, 13A Hickson Road, Dawes Point, NSW 2000
On the day, our online delegates will be sent a live streaming link to tune in to our main stage.
When will the full program and speakers be announced?
We’re continuing to update the program and will announce speakers as they’re confirmed. Bookmark this page to check back for the latest updates.
Is this a paid event?
Nope – it’s completely free to attend! As this is our first Sonder Summit, we’re delighted to offer this experience at no cost to our guests. Please note that as spots are limited, in-person passes are invite-only, so be sure to register early once invited to secure your spot.
When and how will I receive my registration pass?
If you’ve registered for in-person attendance, your confirmation will be emailed to you within a few minutes after you complete your registration. We’ll send your Sonder Summit access pass a few days before the event.
I can’t attend in person anymore, what should I do?
No problem! Please let us know as soon as you can by emailing summit@sonder.io, and we’ll reassign your Sonder Summit access pass to someone on the waitlist.
Is there a dress code?
Business casual is recommended. Feel free to dress comfortably.
How do I get to ACO on the Pier?
You can find all transportation information on the ACO on the Pier website, including directions, parking, and public transport options.
Can't find what you're looking for?
Contact us at summit@sonder.io