[{"id":"8e942b64-83fa-4784-9d6f-bc33ee2569a2","thread_id":"d4a8f045-46aa-4dcd-9ee9-c0d681f62ff2","created_at":"2026-04-30T23:14:30Z","branch_list":["00000000-0000-4000-0000-000000000000"],"state":"done","prompt":"Our task is to create a JavaScript bookmarklet to create and download an .ics file on the fly for https://sessions.minnestar.org/schedule\n\nHere's the view-source from the server:\n\n(the message.txt attached)\n\nAnd the way you know if the user is attending a session is by the data-session-attending HTML attribute in the DOM:\n\n<button class=\"toggle-attendance\" data-session-id=\"2004\" data-session-attending=\"true\">Attending</button>\n\nThe generated .ics should include the correct time for each session block, along with the session title, and location. The presenters can go in the description.\n\nAsk any clarifying questions.","reply":"<details><summary>Gathered key details from<p></p>\n<ul>\n<li>message-2650a821-bffc-4e9d-a65c-04ffa453c7f0.txt</li></ul></summary>\n\n<h3>Query</h3>\n<p>Get the full document content.</p>\n<h3>Response</h3>\n<p>Initially available: lines (1, 2000)</p>\n<hr>\n<p>Exploration ranges:</p>\n<ul>\n<li>lines (2001, 4000)</li>\n</ul>\n<hr>\n<p><!DOCTYPE html><br>\n<html><br>\n <head><br>\n <meta name=\"csrf-param\" content=\"authenticity_token\" /><br>\n<meta name=\"csrf-token\" content=\"ZbhSzEVi5y6yEm_yDOO6y3ud69lDo1zp4zhEDva6obXPI6WojwESTlMXkXhnojKEMLXN7Ou1eds-gAH9fu01cQ\" /><br>\n <title>Minnebar20 – Session Schedule</title><br>\n <link rel=\"stylesheet\" href=\"/assets/application-7d406a9d3925d501af3e3fabf997137357235ae0abb727e5fd7c83b608cc2a0f.css\" media=\"all\" /><br>\n <script src=\"/assets/application-643a843919b0422dcee5d43f528788c754fab1364d20b2a5ed50e205ab6bd073.js\"></script><br>\n <link rel=\"icon\" type=\"image/x-icon\" href=\"/assets/favicon-f5851b854bee1dcada1fe7e3cb6f3e1f8bacc95a42277ca0d39f47752101a1be.ico\" /></p>\n<p><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"><br>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><br>\n<meta property=\"og:title\" content=\"Minnebar20 – Session Schedule\" /><br>\n<meta name=\"twitter:title\" content=\"Minnebar20 – Session Schedule\"><br>\n<meta name=\"twitter:card\" content=\"summary_large_image\"><br>\n<meta name=\"twitter:image\" content=\"https://sessions.minnestar.org/assets/social-preview-9d1f0ea19c0275424644fa056213001c1d65cac3c4ca630219f27678972f28e9.png\"><br>\n<meta property=\"og:image\" content=\"https://sessions.minnestar.org/assets/social-preview-9d1f0ea19c0275424644fa056213001c1d65cac3c4ca630219f27678972f28e9.png\"><br>\n<meta property=\"og:image:alt\" content=\"Minnebar20 is a participant-led unconference free and open to all. It'll be held on Saturday, May 2nd, 2026 from 8am-7pm at Best Buy HQ.\"><br>\n<meta property=\"og:description\" content=\"Minnebar20 is a participant-led unconference free and open to all. It'll be held on Saturday, May 2nd, 2026 from 8am-7pm at Best Buy HQ.\" /><br>\n<meta name=\"twitter:description\" content=\"Minnebar20 is a participant-led unconference free and open to all. It'll be held on Saturday, May 2nd, 2026 from 8am-7pm at Best Buy HQ.\"><br>\n<meta name=\"description\" content=\"Minnebar20 is a participant-led unconference free and open to all. It'll be held on Saturday, May 2nd, 2026 from 8am-7pm at Best Buy HQ.\"></p>\n<p></head><br>\n <body id='schedule-body'><br>\n <div class='nav-top'><br>\n<div class='timeslots'><br>\n<a class='timeslot' endsAt='1777735500' href='#timeslot_172' id='timeslot_172_nav' startsAt='1777733100'><br>\n 9:45<br>\n</a><br>\n<a class='timeslot' endsAt='1777738800' href='#timeslot_173' id='timeslot_173_nav' startsAt='1777736400'><br>\n10:40<br>\n</a><br>\n<a class='timeslot' endsAt='1777742100' href='#timeslot_175' id='timeslot_175_nav' startsAt='1777739700'><br>\n11:35<br>\n</a><br>\n<a class='timeslot' endsAt='1777745400' href='#timeslot_177' id='timeslot_177_nav' startsAt='1777743000'><br>\n12:30<br>\n</a><br>\n<a class='timeslot' endsAt='1777748700' href='#timeslot_178' id='timeslot_178_nav' startsAt='1777746300'><br>\n 1:25<br>\n</a><br>\n<a class='timeslot' endsAt='1777752000' href='#timeslot_179' id='timeslot_179_nav' startsAt='1777749600'><br>\n 2:20<br>\n</a><br>\n<a class='timeslot' endsAt='1777755300' href='#timeslot_180' id='timeslot_180_nav' startsAt='1777752900'><br>\n 3:15<br>\n</a><br>\n<a class='timeslot' endsAt='1777758600' href='#timeslot_181' id='timeslot_181_nav' startsAt='1777756200'><br>\n 4:10<br>\n</a><br>\n</div><br>\n<div class='links'><br>\n<a href='/files/MAP_COMBINED_11x17.svg' target='_blank'><br>\nMap<br>\n</a><br>\n<a href='https://minnestar.org/faqs/minnebar-faq/' target='_blank'><br>\nFAQ<br>\n</a><br>\n</div><br>\n</div></p>\n<p><div class='schedule'><br>\n<div class='schedule-header'><br>\n<h1><br>\nMinnebar20<br>\nSession Schedule<br>\n</h1><br>\n<div class='controls'><br>\n<div class='group'><br>\n<a href=\"/events/46\">Browse / Edit Sessions</a><br>\n</div><br>\n<div class='group'><br>\n<a class='button' href='#' id='hide-all'>Hide all details</a><br>\n<a class='button' href='#' id='show-all'>Show all details</a><br>\n</div><br>\n</div><br>\n<div class='clr'></div><br>\n</div><br>\n<div class='timeslots'><br>\n<div class='timeslot' id='timeslot_168'><br>\n<h2><br>\n<div class='time'> 8:00 – 8:30</div><br>\n<div class='title'>🍩 Registration / Breakfast</div><br>\n</h2><br>\n</div><br>\n<div class='timeslot' id='timeslot_169'><br>\n<h2><br>\n<div class='time'> 8:30 – 8:50</div><br>\n<div class='title'>Kickoff</div><br>\n</h2><br>\n</div><br>\n<div class='timeslot' id='timeslot_170'><br>\n<h2><br>\n<div class='time'> 8:50 – 9:30</div><br>\n<div class='title'>Session 0</div><br>\n</h2><br>\n<div class='sessions'><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2136\">Attending</button><br>\n<h3 class='title'>Session 0: 20 Years of Minnestar (Trivia Edition)</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Minnestar</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>This year, we're doing something different.</p></p>\n<p><p>To celebrate 20 years of Minnestar, Session 0 will be a trivia game show — mixing community trivia with stories from some familiar faces who’ve helped build this community over the years.</p></p>\n<p><p>We’ll have OGs on stage — including Minnestar cofounders Ben Edwards and Luke Francl (👀 yes, you heard that right!) — sharing memories, milestones, and a few behind-the-scenes moments.</p></p>\n<p><p>You’ll play along from your phone. Whether it’s your first Minnebar or your twentieth, it will be the perfect way to learn what the day is all about before it kicks off.</p></p>\n<p><p>We always start the day together — and for our 20th, we’re making it count.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Minnestar</div><br>\n<p>Minnestar is a nonprofit community organization that connects Minnesota’s tech ecosystem through free, inclusive, and community-led events. We’re best known for Minnebar and Minnedemo — spaces where technologists, founders, creatives, and curious minds come together to share ideas, demo projects, and support one another.</p></p>\n<p><p>At Minnestar, we believe the best tech community is one that’s accessible, welcoming, and powered by the people in it.</p></p>\n<p><p><a href=\"https://minnestar.org/\">Learn more about Minnestar</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n<div class='column'><br>\n</div><br>\n</div><br>\n</div><br>\n<div class='timeslot' id='timeslot_171'><br>\n<h2><br>\n<div class='time'> 9:30 – 4:50</div><br>\n<div class='title'>All day</div><br>\n</h2><br>\n<div class='sessions'><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2132\">Attending</button><br>\n<div class='room' href='/maps/uptowner.png'><br>\nUptowner<br>\n</div><br>\n<h3 class='title'>Networking Lounge</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Minnestar</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Minnebar is a great place to catch up with old friends, the Networking Lounge is a dedicated place to meet new people. Join us to chat about anything and everything.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Minnestar</div><br>\n<p>Minnestar is a nonprofit community organization that connects Minnesota’s tech ecosystem through free, inclusive, and community-led events. We’re best known for Minnebar and Minnedemo — spaces where technologists, founders, creatives, and curious minds come together to share ideas, demo projects, and support one another.</p></p>\n<p><p>At Minnestar, we believe the best tech community is one that’s accessible, welcoming, and powered by the people in it.</p></p>\n<p><p><a href=\"https://minnestar.org/\">Learn more about Minnestar</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1944\">Attending</button><br>\n<h3 class='title'> Mega Minne Multi Indie Mini Arcade</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Beth Korth</div><br>\n<div class='presenter'>Minnestar</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Stop by to play some locally made games!</p></p>\n<p><p>This year the arcade will have:</p></p>\n<p><p>🎮 TVs running a selection of locally made video games</p></p>\n<p><p>🎲 Tables with locally designed board games</p></p>\n<p><p>🧠 Information about how to get involved with game development in the Twin Cities, including our chapter of the International Game Developers Association (igdatc)</p></p>\n<p><p>💪 Volunteers on-hand to talk about all of the above</p></p>\n<p><p>This thing is going all day long!</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Beth Korth</div></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Minnestar</div><br>\n<p>Minnestar is a nonprofit community organization that connects Minnesota’s tech ecosystem through free, inclusive, and community-led events. We’re best known for Minnebar and Minnedemo — spaces where technologists, founders, creatives, and curious minds come together to share ideas, demo projects, and support one another.</p></p>\n<p><p>At Minnestar, we believe the best tech community is one that’s accessible, welcoming, and powered by the people in it.</p></p>\n<p><p><a href=\"https://minnestar.org/\">Learn more about Minnestar</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1943\">Attending</button><br>\n<h3 class='title'>Newbie Table</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Minnestar</div><br>\n<div class='presenter'>Meg Steuer</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>New to Minnebar? Come find the Newbie Table outside of Sandy's Place (the cafeteria)!</p></p>\n<p><p>The Newbie Table is your home base to ask questions, meet friendly faces, and get the lay of the land.</p></p>\n<p><p>Whether you’re flying solo or just want someone to chat with between sessions, stop by and say hi. We’ll have longtime community members on hand to help you navigate the day, make connections, and feel right at home.</p></p>\n<p><p>This table is open all day.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Minnestar</div><br>\n<p>Minnestar is a nonprofit community organization that connects Minnesota’s tech ecosystem through free, inclusive, and community-led events. We’re best known for Minnebar and Minnedemo — spaces where technologists, founders, creatives, and curious minds come together to share ideas, demo projects, and support one another.</p></p>\n<p><p>At Minnestar, we believe the best tech community is one that’s accessible, welcoming, and powered by the people in it.</p></p>\n<p><p><a href=\"https://minnestar.org/\">Learn more about Minnestar</a></p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Meg Steuer</div><br>\n<p>No bio.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2028\">Attending</button><br>\n<h3 class='title'>UX Office Hours</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Bryce Howitson</div><br>\n<div class='presenter'>Rothanak Chhoun</div><br>\n<div class='presenter'>Elle Yesnes</div><br>\n<div class='presenter'>Homer Rutledge</div><br>\n<div class='presenter'>Alexis Logsdon</div><br>\n<div class='presenter'>Joe Lencioni </div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p><strong>Do you crave feedback on your project/product/service/hobby/idea?</strong></p></p>\n<p><p>Stop by and chat with experts in UX, Product, Marketing, and much more. Topics are open and varied. We're here to provide feedback and answer questions. But be warned, we like to ask \"why\". You may be challenged to think differently. And we might even discuss unexpected solutions. <strong>This is your chance to get feedback or ask questions in a small conversational setting.</strong></p></p>\n<p><p>If you're asking, \"What might I get out of attending?\" <strong>Past UX office hours have touched on topics like:</strong></p></p>\n<p><ul><br>\n<li>How do I get my users to...?</li><br>\n<li>Help me identify my audience</li><br>\n<li>What's the best way to get feedback on my product?</li><br>\n<li>Do I have product-market fit? If so, how do I know?</li><br>\n<li>Would you give me a UX review on my project?</li><br>\n<li>How do I hire a good designer?</li><br>\n<li>I haven't identified competitors. Do I have a valid service?</li><br>\n<li>How do I work with my engineering team?</li><br>\n<li>How do I work with my design team?</li><br>\n</ul></p>\n<p><p><em>Where to find us: The UX Office Hours will be staffed throughout the event. Find us in the B1 building near the \"living room\", in the pods (small rooms with tables/whiteboards), or nearby. Look for volunteers wearing orange mentor badges.</em></p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Bryce Howitson</div><br>\n<p>Bryce is obsessed with creating products that people want to use. He helps organizations of all sizes prototype and test their ideas. Sometimes called a designer, a developer, a strategist, a writer, or an artist, Bryce has led teams and worked in the trenches.</p></p>\n<p><p>Bryce is a Google Developer Expert in UI/UX/Product/Web Technologies and a certified Design Sprint Master.</p></p>\n<p><p>He shares his knowledge by mentoring and teaching from his homeland in the great frozen north of Minnesota.</p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Rothanak Chhoun</div><br>\n<p>Rothanak is a Senior Experience Designer for the Employee Segment and acts as a design leader and contributor that is focused on improving employee digital experiences across all domains at U.S. Bank. Prior to joining U.S. Bank in 2021, Rothanak spent several years as a Design Lead with 3M Design where he lead design research and strategy for new product and technology initiatives for its Health Care Business Group, a consortium of six distinct health care industries ranging from Food Safety, to Medical Solutions, to Health Information Systems, leading to the invention of several ideas and patents by 3M. Prior to his work in strategy and innovation, Rothanak has worked in legal technologies, is a classically trained graphic designer, and is co-named in a medical sciences journal and patents filed with the USPTO.</p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Elle Yesnes</div><br>\n<p>Elle (She/Her) is the Design Director at <a href=\"https://www.sotodigital.io/\">Soto Digital</a>, an awesome/really cool custom software agency. She's has been immersed in design for over 15 years. She’s collaborated on all types of teams and industries with projects varying from power sports apps to financial ai software, all while always advocating for users.</p></p>\n<p><p>Elle likes to struggle through video games, garden, play frisbee and spend time with her wife and golden retriever, Goose.</p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Homer Rutledge</div></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Alexis Logsdon</div><br>\n<p>Alexis (she/her) is a freelance content and UX strategist. She works with clients in both government and the private sector to create cohesive user journeys across platforms and venues. Alexis leans on her pre-UX experience as a research librarian to ask the kinds of questions that reveal pain points users experience when seeking goods and services.</p></p>\n<p><p>Outside of work, Alexis enjoys hanging out with her kid and their sweet old lady dog, world travel, and doing deep dives on family history research for her friends.</p></p>\n<p><p><strong>Currently seeking fractional and part-time consulting contracts!</strong></p></p>\n<p><p>You can reach her at her <a href=\"www.alexislogsdon.com\">website</a> or via <a href=\"mailto:info@alexislogsdonconsulting.com\">email</a>.</p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Joe Lencioni </div><br>\n<p>(he/him) Founder and CTO at <a href=\"https://happo.io\">Happo</a>, former Airbnb engineer, and a 25-year veteran of the industry. Based in Northfield, I build tools to ensure the web remains accessible and high-quality for everyone. I'm a maker at heart—from writing code and automating my home to carving spoons and singing in a choir—and I’m driven by helping others find as much joy in the craft of programming as I do.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n</div><br>\n</div><br>\n<div class='timeslot' id='timeslot_172'><br>\n<h2><br>\n<div class='time'> 9:45 – 10:25</div><br>\n<div class='title'>Session Block 1</div><br>\n</h2><br>\n<div class='sessions'><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1920\">Attending</button><br>\n<div class='room' href='/assets/maps/theater-fe0370eea0aa14e25f66f5e98584371d74b35880be3cf95f31edb502b3d0eb39.png'><br>\nTheater<br>\n</div><br>\n<h3 class='title'>📡🕸️ Preppers & Comrades Unite: Building a Decentralized Mesh Network for Resilient Communication</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Chris Wodicka</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>What happens when digital communication systems go down or simply aren't available?</p></p>\n<p><p>While that might sound like a worst-case scenario, it’s also a practical problem. Communication can become unreliable or inaccessible for all kinds of reasons, ranging from infrastructure outages and remote environments to situations where networks are congested, limited, or impeded.</p></p>\n<p><p>In this session we’ll explore <strong>Meshtastic</strong>, an open-source, off-grid communication platform that uses low-power LoRa radios to create decentralized mesh networks. These networks allow devices to send text messages and share location data without relying on cellular service, Wi-Fi, or traditional infrastructure.</p></p>\n<p><p>You’ll learn how Meshtastic works, what makes it unique, and where it fits into real-world use cases from outdoor adventures to emergency preparedness, as well as grassroots communication with privacy in mind.</p></p>\n<p><p>I’ll also demo a personal project I built which extends Meshtastic’s capabilities by bridging it with a modern messaging platform, opening up new possibilities for resilient and adaptable communication systems that can operate across network boundaries.</p></p>\n<p><p>Whether you're curious about off-grid tech, mesh networking, or building resilient systems, this talk will give you a practical introduction and a look at what’s already happening in Minneapolis and across the world.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Chris Wodicka</div><br>\n<p>By day I'm a UX/UI Designer at Livefront where I get to work on cool mobile apps and websites. By night I love to tinker with my home server and go camping in Minnesota's northwoods.</p></p>\n<p><p>Find me on <a href=\"https://www.linkedin.com/in/ccwod/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1927\">Attending</button><br>\n<div class='room' href='/assets/maps/harriet-73368221c9fe9c9a543c36a01e436349a310dc9dab7b6fc11bf78a96b261ebf0.png'><br>\nHarriet<br>\n</div><br>\n<h3 class='title'>Build a Business that Isn't Soul Sucking</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Beth Elliott</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Whether you're founder-curious or you've already taken the plunge, this one's for you.</p></p>\n<p><p>You finally have the freedom to build something on your own terms. So why does the business you're planning look suspiciously like the job you just left?</p></p>\n<p><p>In this session, we'll walk through real stories of people who started with the obvious idea and ended up building something far more interesting, far more profitable, and uniquely theirs. Along the way, you'll reflect on your own business idea, stress test it, and leave with a clearer sense of what you should actually be building.</p></p>\n<p><p>Fair warning: You might walk out of here with a completely different business than the one you walked in with. That's kind of the point.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Beth Elliott</div><br>\n<p>Beth Elliott has spent 20 years working with people and teams across Fortune 500, nonprofit, and tech organizations, helping them navigate change and make clearer decisions about what matters most.</p></p>\n<p><p>As the founder of Tangled Rabbit, she works with people in job transition and early-stage founders who know they have something valuable to offer but struggle to stand out in a crowded market. Beth helps them clarify what they are uniquely positioned to do and connect it to real market needs, so they can build careers or businesses that work because they are unmistakably theirs.</p></p>\n<p><p>Website: <a href=\"https://www.tangledrabbit.com/\">https://www.tangledrabbit.com/</a></p></p>\n<p><p>LinkedIn: <a href=\"https://www.linkedin.com/in/belliott17/\">https://www.linkedin.com/in/belliott17/</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2004\">Attending</button><br>\n<div class='room' href='/assets/maps/nokomis-436b4f6a934c7d3a4e9f00ac25d1f109a937337c12a52b62ee43fd01df1ab7dd.png'><br>\nNokomis<br>\n</div><br>\n<h3 class='title'>More... \"Diagrams to Get your $hit together\"</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Jade Barker</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Back by popular demand! ...FYI \"Computer Science\" used to be called \"Decision Science\". Save yourself hassles with better decisions. If you don't know what to do, try a diagram. Bring some scratch paper etc. if you want to work along.</p></p>\n<p><p>1- Consulting daily grind; What do people (customers) actually WANT from me?! <br>\nSolve this with a User Story! \"As a <em>__, I want to _</em><em>, So I can <em></em></em>.\" </p></p>\n<p><p>I'll walk you through the classic format, share a couple real world examples, and expand that into white boarding like a professional. After 13 years in the tech community, I still do this literally every single consulting call. </p></p>\n<p><p>2- Gird the loins of your mind; Iron clad communication for boundaries and positions.<br>\n\"When you _<em>, I feel _</em>, what I wanted to feel is <em>__. If you keep doing _</em><em>, I will <em></em></em>.\"</p></p>\n<p><p>Sometimes confusion is intentional. Cut through that bull$hit like butter. Know your own mind, and communicate it so clearly you can determine if the other person is acting in good faith. Plus, how to clear your mind in 5 minute with quick-and-dirty journaling. This one will fix like half of your interpersonal stuff, more if this stuff is brand new to you.</p></p>\n<p><p>3- Hard bull$hit like; Should I leave or should I stay?<br>\nThis is not actually a binary decision, this goes in a 4-square box... Because inaction is still a choice. It will help you trick yourself into bravery.</p></p>\n<p><p>I'll show you how to map out the hard stuff, so you at least SEE what you are facing. Sometimes the possible outcomes can have VERY different weights and your choice gets simple. Sometimes it just gives you enough mental distance that you can work up the guts to do the needful thing. At very least, you name the monster.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Jade Barker</div><br>\n<p>Warrior Princess of Tech - I use a wacky title because it saves me hassles.</p></p>\n<p><p>Fintech Cofounder at Silicon Prairie, Founded in 2016. We're mostly Technologists that had to become Investment Bankers. We built proprietary software (and license it), plus operate several regulated Financial Institutions. We've done about $75 Million worth of deals to date.</p></p>\n<p><ul><br>\n<li>Co-Founder of a Blockchain 501(c)(3) - 2014</li><br>\n<li>Investment Crowdfunding Portals - 2016</li><br>\n<li>Smart Contract Document Stack Geppetto - 2017</li><br>\n<li>SEC Transfer Agency - 2018</li><br>\n<li>FINRA Broker Dealer - 2020</li><br>\n<li>Adjunct Professor for Blockchain Graduate Computer Science - 2023</li><br>\n<li>SEC/FINRA Alternative Trading System (\"ATS\") - 2023</li><br>\n</ul></p>\n<p><p>Feel free to reach out on Linkedin, just mention Minnebar. <br>\n<a href=\"https://www.linkedin.com/in/jadebarker/\">https://www.linkedin.com/in/jadebarker/</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2100\">Attending</button><br>\n<div class='room' href='/maps/bde maka ska.png'><br>\nBde Maka Ska<br>\n</div><br>\n<h3 class='title'>10x'ing Myself and My Team: Leading With Agents, Not Just Using Them</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Andy Ganoe</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most AI productivity talks focus on one person doing one thing faster. What happens when you're responsible for a whole team and you start weaving agents into how everyone works?</p></p>\n<p><p>That's where I've been for the last six months. Turning meeting notes into Jira stories. Automating compliance checks. Building tools that work for engineers, QA, product, scrum masters, analytics, and non-technical team members alike. The pattern is always the same, find the thing you do over and over, teach an agent how you do it, and get that time back.</p></p>\n<p><p>I'll share how I built the tooling, standardized it across roles, and what happened when people started managing workflows instead of just executing them.</p></p>\n<p><p>This isn't about replacing anyone. It's about giving every person on your team leverage they didn't have before. I'll be honest, the job looks different now. People on my team don't just execute tasks anymore. They orchestrate, review, and decide what ships. If you're a leader trying to scale your team's impact, or someone in a hands-on role wondering why your day suddenly feels different, this is what's working for us right now.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Andy Ganoe</div><br>\n<p>Andy Ganoe is a leader and technologist serving as Director of Technical Operations overseeing engineering, DevOps, and compliance. He loves to play with technology and build with AI, and has been focused on turning that into something practical, building tools, standardizing patterns, and getting everyone from engineers to non-technical team members working alongside agents.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2011\">Attending</button><br>\n<div class='room' href='/assets/maps/minnetonka-8db53e880d5b4f573c725f5992d6439094819117b370c096f6fb3275ef11ff65.png'><br>\nMinnetonka<br>\n</div><br>\n<h3 class='title'>Only Amiga Makes It Possible: Discovering the Future in a Computer from 1985</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Benjamin Ortega</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>In 1985, Commodore shipped a home computer, the Amiga, with a hardware operation queue, a scanline-synchronized display coprocessor, and a four-channel audio engine, all running in parallel without touching the CPU. We've spent forty years reinventing it.</p></p>\n<p><p>The Amiga is remembered for the extraordinary games, graphics, and music people created with it. We'll dive into the hardware and learn what made this custom chipset remarkable, tracing how the architecture that made a 1985 home computer feel like magic also incorporates many of the same ideas as the GPU pipelines, async patterns, and parallel processing models we as technologists work with today.</p></p>\n<p><p>Still not hyped enough? Watch <a href=\"https://www.youtube.com/watch?v=zAVb0X64rNU\">this</a>.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Benjamin Ortega</div><br>\n<p>Ben is a software maker who spends his best hours elbow-deep in homelab projects and the occasional questionable car hack. He's also passionate about building technology at its best and doing things that matter: civic tech, community-driven tools, and tools that amplify diverse voices and give more people a seat at the table. A software engineer at Best Buy by day, he also enjoys playing music and riding bikes.</p></p>\n<p><p>Find me elsewhere on:</p></p>\n<p><ul><br>\n<li><a href=\"https://www.linkedin.com/in/benortega/\">LinkedIn</a></li><br>\n<li><a href=\"https://bsky.app/profile/substars.bsky.social\">bluesky</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1965\">Attending</button><br>\n<div class='room' href='/assets/maps/proverb-edison-755383e7ffbc56ede12758c2a7c9ef5773d26f109ef5c95e23659bce15322e33.png'><br>\nProverb-Edison<br>\n</div><br>\n<h3 class='title'>Cybersecurity Warnings 😳</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>John Benninghoff</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Let's talk about cybersecurity warnings! 😳 Security warnings - and many other computer warnings - are terrible, and there are <em>so many examples</em>...but why is that and does it really have to be that way? I'm lucky to have worked on a project to explain what makes a good cybersecurity warning for product designers, security professionals, and lawyers, and I can tell you that it doesn't!</p></p>\n<p><p>Come join us in mocking a gallery of bad security and not-security warnings, in screenshots and emoji. Along the way, we'll talk about the history of security and traditional product warnings, what we know about making good warnings, celebrate a (small) gallery of good warnings, and talk about how we can all get better!</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>John Benninghoff</div><br>\n<p>John Benninghoff's interest in cybersecurity began in 1985 when he read the book <em>Out of the Inner Circle: A Hacker's Guide to Computer Security</em>, and found a way to get paid to do it starting in 1998. John is a proud security heretic, bringing his love of human factors, design, economics, probability, and psychology to the practice, focusing on how to integrate security into how work is done and improve organizational performance rather than avoid security issues. He currently consults through his company, <a href=\"https://www.security-differently.com\">Security Differently</a>.</p></p>\n<p><p>John has also done work in exploratory data analysis and visualization, risk analysis and quantification, Site Reliability Engineering, and writing code in R. John holds a Masters Degree in Safety Science from Trinity College Dublin, where his research focus was on applying safety principles to technology. Outside of work, John enjoys spending time outdoors, hiking running, and camping.</p></p>\n<p><p>Links to all his current and past work can be found at <a href=\"https://jbenninghoff.com\">https://jbenninghoff.com</a>.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1905\">Attending</button><br>\n<div class='room' href='/assets/maps/zeke landres-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nZeke Landres<br>\n</div><br>\n<h3 class='title'>Escape the Screenshot Graveyard: Using Notion AI to turn notes, memos & screenshots into action, content, and next steps</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Jenna Redfield</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most people don’t have an organization problem.<br>\nThey have a “saved it… never used it” problem.</p></p>\n<p><p>Screenshots. Saved posts. Notes. Ideas.<br>\nYou save everything… and use none of it.</p></p>\n<p><p>In this session, you’ll learn a simple system using Notion AI to turn what you capture into something useful—fast.</p></p>\n<p><p>Think:</p></p>\n<p><p>turn notes into clear next steps</p></p>\n<p><p>turn screenshots into content ideas</p></p>\n<p><p>turn old thoughts into actual drafts</p></p>\n<p><p>finally follow up instead of forgetting</p></p>\n<p><p>We’ll also use custom AI agents + personalities trained on your saved content—so your ideas don’t just sit there, they actually get applied to your workflow.</p></p>\n<p><p>No complicated “second brain.”<br>\nJust a clean system: Capture → Organize → Apply</p></p>\n<p><p>If your camera roll and notes app are a graveyard of good ideas… this is for you.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Jenna Redfield</div><br>\n<p>Jenna Redfield is a Notion Ambassador, digital organization specialist, and founder of <strong>Red Thread Studio</strong> and <strong>Red Thread Systems</strong>. Jenna helps entrepreneurs turn scattered digital “stuff” (screenshots, meeting notes, saved links, and half-formed ideas) into simple systems they’ll actually use—so great insights don’t get buried and people stop starting from scratch.</p></p>\n<p><p>With 10+ years in marketing, video, and content strategy, Jenna has supported hundreds of small businesses in building workflows that reduce overwhelm and turn raw inputs into real outputs like clear next steps, client deliverables, and consistent content. Through <strong>Red Thread Studio’s VIP Video Day</strong>, Jenna helps business owners capture high-quality video content efficiently, then repurpose and organize it into repeatable content systems.</p></p>\n<p><p>Jenna shares practical strategies for digital organization, content, and business optimization through <strong>The Optimization Toolbox</strong> on <strong>YouTube</strong> and <strong>Substack</strong>, and is a frequent speaker on helping entrepreneurs build systems that make follow-through easier.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2005\">Attending</button><br>\n<div class='room' href='/assets/maps/challenge-83825ec7e9dac09a92e7320dee95e09bf83a63d10f385e33dc9a158444a51b2d.png'><br>\nChallenge<br>\n</div><br>\n<h3 class='title'>Don't Let AI Eat You Alive: What Every Employee, Leader, and Organization Must Do Before It’s Too Late</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Rod Brown</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Don’t Let AI Eat You Alive: What Workers Need to Know Now<br>\nShort Description / Abstract<br>\nAI isn’t coming for your job, it’s already reshaping how work gets valued, measured, and rewarded. Most workers are unprepared, and most organizations aren’t helping.<br>\nThe real issue isn’t AI. It’s that organizations have never been good at measuring what people actually contribute. They track what’s easy to count hours, outputs, titles and AI is now optimizing around those flawed metrics. Workers who can’t clearly articulate and evidence their contribution are the most exposed.<br>\nThis session introduces the Contributive Value (CV) framework, a new way to understand why performance systems fail most workers, and OUTSMART, a practical eight element model individuals can use right now to navigate AI disruption, assess their value, and communicate it effectively.<br>\nThis isn’t a doom session. It’s a clear diagnosis—with a survival guide attached.<br>\nSession Format<br>\n• Problem framing (10 minutes)<br>\n• CV + OUTSMART frameworks (15 minutes)<br>\n• Open discussion and Q&A (15 minutes)<br>\nInteractive and discussion driven.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Rod Brown</div><br>\n<p>Rod has spent 30+ years studying why organizations fail to measure what people truly contribute and what to do about it. He is the creator of the Contributive Value framework and author (with co-author Charles Donly) of the forthcoming Don’t Let AI Eat You Alive (Globe Pequot / Prometheus, 2027). He has held leadership roles at Xerox, Dell (contract), and Oracle (PeopleSoft), and has served on the boards of Greater MSP and MnSCU–MSU Mankato.</p></p>\n<p><p>Co-Author-Charles Donly is CEO of F2 AI, which is digitizing and modernizing U.S. shipbuilding using AI, machine learning, and edge computing. He's spent 20+ years building and leading global engineering teams across defense, med-tech, and enterprise AI and has a rare gift for making complex systems legible to anyone in the room. He is also Head of Technical Advisory Board in Austin, Texas.<br><br>\nTogether: one built the human framework for measuring contribution. The other builds AI systems that operate at the edge of what's technically possible. This session brings both perspectives to a question every worker and leader needs to answer right now.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2037\">Attending</button><br>\n<div class='room' href='/assets/maps/learn-df050961fbc6679fe483e013b5e138016dc74f3ac11cb7f6fccba519e8f71bf5.png'><br>\nLearn<br>\n</div><br>\n<h3 class='title'>You Are a Superhero. Let's Discover Your Superpower So You Can Use It for Greatness</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Michelle Smeby</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Your superpower is the unique expertise or characteristic that defines you. It’s what your colleagues, family, and friends recognize you for. Discovering your superpower helps you understand your strengths and build trusted relationships. When you know what you bring to the team, you can leverage your superpower when issues arise that require your unique talent. </p></p>\n<p><p>By understanding and utilizing your and your team’s unique superpowers, you can unlock everyone's full potential. This leads to greater success in your endeavors. When people feel respected and valued for their skills, they bring their authentic selves and are motivated to do their best. </p></p>\n<p><p>In this session you will learn:</p>\n<ul>\n<li>How to discover your superpower</li>\n<li>What to do if your manager doesn't value or tries to suppress your unique gift</li>\n<li>How to unleash your superpower to inspire the people around you</li>\n<li>How to start seeing superpowers around you, to build the best teams</p></li>\n</ul>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Michelle Smeby</div><br>\n<p>Michelle Smeby is CEO and Transformation Leader of wHolistic Change, Inc. with 25 years of experience implementing enterprise solutions at Fortune 500 companies. Michelle is an author, speaker, trainer, and consultant who specializes in helping corporations deliver transformational change.</p></p>\n<p><p>Michelle has a Masters degree in biomedical engineering and is a Senior Member of the Institute of Electrical and Electronics Engineers (IEEE).</p></p>\n<p><p>Michelle’s first book, \"wHolistic Change: Delivering Corporate Change That Lasts\" has been used in over 70 countries spanning 6 continents. Her second book, \"The Tenacious Leader: Your Map to Overcome Change Fatigue\" is coming soon in 2026.</p></p>\n<p><p><strong>Links:</strong></p>\n<ul>\n<li><a href=\"https://www.wholistic-change.com/\">wHolistic Change, Inc</a></li>\n<li><a href=\"https://www.linkedin.com/in/michellesmeby/\">LinkedIn Profile</a></p></li>\n</ul>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2124\">Attending</button><br>\n<div class='room' href='/assets/maps/discovery-fb2e2f3f87843e262b3141afaeffa503953ff10f6548030f8395dd1ae8f0db06.png'><br>\nDiscovery<br>\n</div><br>\n<h3 class='title'>Editing Photos On Your Phone with No Apps</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>John Wilson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>You have a phone. You have photos. Have you ever tried editing your photos on your phone... and just got frustrated? </p></p>\n<p><p>This session is for you if:</p></p>\n<p><ul><br>\n<li>You have experienced this frustration and gave up</li><br>\n<li>You didn't even know there were editing tools available</li><br>\n<li>You are experienced photographer but found the little sliders on the phone fiddly and gave up after approximately 68 seconds of fiddling </li><br>\n</ul></p>\n<p><p>(That last one was me! I had a fair amount of experience editing digital photos when I got my first phone with a \"real\" camera, and the default editing experience drove me up the wall.)</p></p>\n<p><p>In this session, I'll be covering:</p></p>\n<p><ul><br>\n<li>A meta-method for learning how to use photo editing software</li><br>\n<li>Filters! What they are, how they work, why only three of them are any good</li><br>\n<li>Every single photo adjustment slider on an iPhone and what they are used for (If you have an Android phone, your sliders are mostly exactly the same but, depending on the Android version and phone, you may be missing sliders or have extra ones)</li><br>\n<li>HDR (High Dynamic Range) and how it fools you into thinking your photos are better than they are</li><br>\n<li>A general workflow for editing photos</li><br>\n<li>Any questions you might have</li><br>\n</ul></p>\n<p><p>At the end of this session, you'll know more about photo editing, especially on phones. And hopefully you'll have a few new guidelines and tricks up your sleeve when you take a photo of something and it just looks a bit blah.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>John Wilson</div><br>\n<p>John Wilson is a long time photographer, mostly of his own kids. Although he still uses a digital fancy-pants camera, and even shoots the occasional roll of film, he often finds himself taking a picture with the only camera available (the phone). In his day job, he's a Senior Software Engineer, in his extremely limited free time, he likes to design and build synthesizers, and paint with watercolors (although usually not both at the same time)</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://crazybutable.com/\">Personal site</a></li><br>\n<li><a href=\"https://mastodon.social/@crazybutable/\">Mastodon</a></li><br>\n<li><a href=\"https://www.youtube.com/@crazybutable\">Youtube</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2053\">Attending</button><br>\n<div class='room' href='/assets/maps/gandhi-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nGandhi<br>\n</div><br>\n<h3 class='title'>AI Is Becoming Infrastructure: Why Context Engineering and Platforms Will Define the Next Decade</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Lyndon Carlson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Everyone is talking about models, prompts, and agents.</p></p>\n<p><p>That’s not where the real shift is happening.</p></p>\n<p><p>AI is rapidly becoming infrastructure; embedded into how software is built, how decisions are made, and how companies operate. But most teams are still treating it like a tool, and that’s why so many AI initiatives stall out.</p></p>\n<p><p>In this session, we’ll cut through the hype and focus on what actually matters:</p></p>\n<p><ul><br>\n<li>Why AI projects get stuck between demo and production</li><br>\n<li>Why model choice matters less than you think—and context matters more</li><br>\n<li>What “context engineering” really is (and why it’s becoming a core discipline)</li><br>\n<li>How companies are quietly becoming AI platform builders, often without realizing it</li><br>\n</ul></p>\n<p><p>This is a mental model reset.</p></p>\n<p><p>If you’re a builder, leader, or just trying to make sense of where AI is headed, this session will give you a clearer picture of what’s actually changing and what to do about it.</p></p>\n<p><p>Come ready to challenge assumptions, ask questions, and share what you’re seeing.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Lyndon Carlson</div><br>\n<p>Lyndon Carlson is an AI platform leader and founding CTO focused on building and aligning production-grade AI systems. His work spans training domain-specific models, applying reinforcement learning for alignment, and deploying agentic systems that operate reliably in real-world environments.</p></p>\n<p><p>He currently leads AI initiatives at Trissential and is the founding CTO of ChatLPO, where he has built scalable AI platforms used by thousands of users. He has also led greenfield AI initiatives in partnership with AWS, including model development, alignment, and system deployment, with an emphasis on safety, governance, and enterprise scale.</p></p>\n<p><p>Lyndon’s work focuses on bridging the gap between AI capability and real-world impact, turning advanced models into systems that organizations can actually trust and use.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://www.linkedin.com/in/lyndon-carlson/\">LinkedIn</a></li><br>\n<li><a href=\"https://trissential.com/services/artificial-intelligence/\">Consulting Services</a></li><br>\n<li><a href=\"https://chatlpo.com/\">ChatLPO</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2092\">Attending</button><br>\n<div class='room' href='/assets/maps/stephen leacock-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nStephen Leacock<br>\n</div><br>\n<h3 class='title'>LinkedIn Isn’t Broken...Your Strategy Is 😳 A LinkedIn growth workshop for founders who want leads-not likes 🙌</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Colin Hirdman</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I'm excited to present a live workshop for founders who want to turn LinkedIn into a real source of leads and sales—without posting or sending spammy messages.</p></p>\n<p><p>⸻</p></p>\n<p><p><strong>What You’ll Learn:</strong></p></p>\n<p><ul><br>\n<li>✅ The exact LinkedIn philosophy I’ve used to generate millions in revenue</li><br>\n<li>✅ How to build a network of real buyers—not just connections</li><br>\n<li>✅ Proven campaign strategies to turn LinkedIn into a consistent source of leads and sales</li><br>\n</ul></p>\n<p><p>⸻</p></p>\n<p><p><strong>What This Is (and Isn’t):</strong></p></p>\n<p><p>This is a no-fluff, strategy-first session.</p></p>\n<p><p>We will NOT cover:</p></p>\n<p><p>❌ Optimizing your profile<br><br>\n❌ Posting schedules<br><br>\n❌ Chasing likes, comments, or “engagement hacks”</p></p>\n<p><p>We WILL focus on:</p></p>\n<p><p>✅ How to grow an audience of ideal prospects<br><br>\n✅ How to create opt-in interest instead of chasing people<br><br>\n✅ How to turn LinkedIn into a repeatable system for conversations and revenue</p></p>\n<p><p>⸻</p></p>\n<p><p><strong>Who This Is For:</strong></p></p>\n<p><p>• Founders who know LinkedIn matters—but aren’t seeing results<br><br>\n• Builders who don’t want to become “content creators”<br><br>\n• Anyone who wants a clear, practical system they can actually use</p></p>\n<p><p>⸻</p></p>\n<p><p><strong>What to Expect:</strong></p></p>\n<p><p>Come ready to:</p></p>\n<p><p>• Rethink how LinkedIn actually works<br><br>\n• See real strategies you can implement immediately<br><br>\n• Ask questions and apply this to your business in real time</p></p>\n<p><p>⸻</p></p>\n<p><p><strong>Why I’m Doing This</strong></p></p>\n<p><p>I’ve spent years running LinkedIn campaigns that drive real business results.</p></p>\n<p><p>This session is about sharing what actually works—so you can:</p></p>\n<p><p>• Stay authentic<br><br>\n• Build trust with the right people<br><br>\n• Turn LinkedIn into a growth engine for your business</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Colin Hirdman</div><br>\n<p>I'm a Twin Cities entrepreneur and Minnebar veteran. Love building and learning, you can learn about what I'm up to at <a href=\"https://monkeyislandventures.com\">https://monkeyislandventures.com</a>. I'm also a volunteer on the MN Blockchain Initiative board (<a href=\"https://www.mnblockchain.org/\">https://www.mnblockchain.org/</a>).</p></p>\n<p><p>Look forward to meeting you!</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li>LinkedIn: <a href=\"https://www.linkedin.com/in/colinhirdman/\">https://www.linkedin.com/in/colinhirdman/</a><br>\n</li><br>\n<li>Twitter: @colinhirdman</li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2043\">Attending</button><br>\n<div class='room' href='/assets/maps/tackle-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nTackle<br>\n</div><br>\n<h3 class='title'>From CAD to Injection-Molded Parts in 12 Hours</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Dagmawe Mamo</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>For a bootstrapped hardware startup, traditional injection molding can be painfully slow and expensive. In this session, I’ll walk through a faster path: first 3D printing the mold to validate the part, then machining an aluminum mold on a Genmitsu Pro Ultra desktop CNC, and finally using a roughly $700 desktop injection molding machine to start producing plastic parts the same day.</p></p>\n<p><p>I’ll talk through the real tradeoffs, what this workflow can and can’t do, and why it can be a huge advantage for founders trying to move fast without spending thousands on tooling, waiting weeks for overseas suppliers, or getting hit with extra costs like tariffs and shipping delays. If you’re building physical products and need a scrappy, practical way to prototype and iterate faster, this talk is for you.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Dagmawe Mamo</div><br>\n<p>No bio.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2109\">Attending</button><br>\n<div class='room' href='/assets/maps/louis pasteur-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nLouis Pasteur<br>\n</div><br>\n<h3 class='title'>Service to Software: Turn Your \"How-To\" into a Monetized Micro-App</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Marlaina Love</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Learn how to package your expertise into <strong>digital solutions that generate recurring revenue streams</strong>, attract better clients, and give you the breathing room you deserve.</p></p>\n<p>You'll walk away with a clear plan and actionable framework to:</p>\n<p><ul><br>\n<li>📦 <strong>Package your expertise</strong> into digital solutions clients can access immediately</li><br>\n<li>💰 <strong>Build multiple revenue streams</strong> from the work you've already perfected</li><br>\n<li>🎯 <strong>Attract the right clients</strong>—the ones ready to invest and succeed</li><br>\n</ul></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Marlaina Love</div><br>\n<p>Marlaina is the Founder and CEO of The Diamond Resilience, a creative tech studio developing infrastructure for alternative career pathways in technology. Since launch, she has helped over 60 professionals turn their expertise into digital solutions that generate $500 to $1,000+ in passive income. Her mission is to equip talented individuals with the tools, mentorship, and community needed to monetize their existing knowledge.</p></p>\n<p><p>With experience as a corporate Project and Program Management consultant leading global teams in supply chain, medical devices, autonomous vehicles, and retail, Marlaina understands both corporate challenges and the untapped creative potential of professionals. She now channels her experience and expertise into developing the infrastructure that supports a resilient workforce, enabling professionals to build independent, self-sustaining careers in an AI-powered, digital-first economy.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://www.linkedin.com/in/lovemarlaina\">LinkedIn</a></li><br>\n<li><a href=\"https://www.linkedin.com/company/thediamondresilience\">Website</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2086\">Attending</button><br>\n<div class='room' href='/maps/nevada.png'><br>\nNevada<br>\n</div><br>\n<h3 class='title'>The Human Side of AI Adoption: Why Most AI Projects Fail Before They Start</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Heather McCarl</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Everyone's implementing AI. Most of it isn't working. <strong>Not because the tools are bad, but because the people using them are still thinking the same way they always have.</strong> Finite thinking in an infinite game.</p></p>\n<p><p>In this session, we'll cut through the hype and get honest about the real reason AI initiatives stall: organizational mindset. You'll learn how to spot the invisible assumptions and paradigms that quietly kill AI projects before they ever get off the ground and what to do about it.</p></p>\n<p><p>You'll walk away with:</p></p>\n<p><ul><br>\n<li><p>A simple framework for diagnosing whether your team is ready for AI adoption (hint: most aren't as ready as they think)</p></li><br>\n<li><p>The specific language patterns that signal deep resistance to change</p></li><br>\n<li><p>A practical first step you can take Monday morning (no tools required)</p></li><br>\n</ul></p>\n<p><p>This session is for founders, leaders, consultants, and anyone who has watched a promising AI initiative die a slow, frustrating death. You don't need to be technical. You just need to care about making change actually stick.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Heather McCarl</div><br>\n<p>Data Science Leader | AI Consultant | Speaker & Trainer</p></p>\n<p><p>With over 20 years of experience in data science, Heather McCarl is the founder of Ethos AI Consultants, where she focuses on the intersection of emerging technology and responsible implementation. With a passion for navigating the complexities of AI, Heather helps organizations build frameworks that are as ethical as they are innovative. When she’s not deconstructing AI workflows, she’s crocheting, learning something new, gardening or spending time with family. </p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><p><a href=\"https://www.ethosaiconsultants.com\">Ethos AI Consulting</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2117\">Attending</button><br>\n<div class='room' href='/assets/maps/texas-23344a38e113415658ae210154eb5eb82d6559ba6e9d80139637c879fbc8df24.png'><br>\nTexas<br>\n</div><br>\n<h3 class='title'>Well Dontcha Know: The National Center for Autonomous Technologies is in Northern Minnesota</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Marty Wetherall</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Yep, you betcha! Seven years ago, <strong>The National Center for Autonomous Technologies (NCAT) was founded in Thief River Falls, Minnesota</strong> through the National Science Foundation’s Advanced Technological Education (NSF ATE) program. </p></p>\n<p><p>The NSF ATE program has been funding innovation at two-year colleges for over 25 years focusing on the education of technicians for the high-technology fields that drive our nation’s economy. </p></p>\n<p><p>As the first national ATE center in autonomous technologies, NCAT's is nurturing the technical workforce of tomorrow in the following domains:</p></p>\n<p><ul><br>\n<li><br>\n<strong>Air</strong> (Uncrewed Aircraft Systems)</li><br>\n<li><br>\n<strong>Land</strong> (Self-Driving Vehicles)</li><br>\n<li><br>\n<strong>Sea</strong> (Uncrewed Maritime Systems)</li><br>\n</ul></p>\n<p><p>Come learn more about how NCAT is accelerating autonomous innovation – <strong><em>aligning talent and funding with emerging tech</em></strong> – all from way up north here in Minnesota. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Marty Wetherall</div><br>\n<p>Girl Dad, Entrepreneur, co-founder of esports management platform <strong>LeagueOS</strong> (Twins Techstars '22), leading comms for the <strong>National Center for Autonomous Technologies (NCAT)</strong>.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li>Insta/X/Bluesky: @mcw719</li><br>\n<li><a href=\"https://www.linkedin.com/in/martywetherall/\">LinkedIn</a></li><br>\n<li><a href=\"https://leagueos.gg\">LeagueOS</a></li><br>\n<li><a href=\"https://ncatech.org\">NCAT</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2067\">Attending</button><br>\n<div class='room' href='/maps/california.png'><br>\nCalifornia<br>\n</div><br>\n<h3 class='title'>Every Engineer Sucks at Job Hunting Until They Learn This</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Tyler Dane</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>There are three ways to get into a company: The front door, the side door, and the window. </p></p>\n<p><p>Everyone initially tries the front door because it only requires a resume and a LinkedIn. However, the front door’s low barrier to entry makes it competitive and strips you of your leverage.</p></p>\n<p><p>Getting in through the side door or window, on the other hand, requires an unconventional set of beliefs and techniques that make most developers uncomfortable. 90% of them refuse to approach these entry points, making them less competitive for the few who can tolerate the discomfort.</p></p>\n<p><p>This talk is about <strong>narrative:</strong> how it works in the hiring process, how to craft yours, and the types of stories to avoid at all costs.</p></p>\n<p><p>During the first half, I’ll explain the difference between the side door and window and why <strong>choosing an archetype</strong> is a non-negotiable prerequisite for both. </p></p>\n<p><p>During the second half, I’ll offer 10 archetypes you can choose from, along with a popular engineer who embodies it. Some examples:</p></p>\n<p><ul><br>\n<li>The Principled Prince (Bret Victor)</li><br>\n<li>The Guinea Pig (Fireship)</li><br>\n<li>The Craftsman (DHH)</li><br>\n<li>The Sailor (Linus Torvalds)</li><br>\n</ul></p>\n<p><p>Finally, we'll <strong>apply the theory</strong> with a quiet, individual writing exercise. </p></p>\n<p><p>By the end, you’ll have <strong>the outline of a remarkable story</strong> that will make you stand out and get the job offer you deserve on your terms. </p></p>\n<p><p>If you already get tons of interviews from the LinkedIn Easy Apply button, then this talk isn’t for you. If you’re committed to grinding Leetcode and blindly applying to hundreds of jobs until you get lucky, this talk isn’t for you.</p></p>\n<p><p>This is for those who are sick of brute-forcing their careers. They’re good at their craft, but aren’t getting enough opportunities. It’s for those who pass the first few rounds, but don’t get offers. More than anything, it’s for those who recognize that humans make decisions based on emotions and good stories.</p></p>\n<p><p>On the fence? Think of this talk as the offspring of these two videos:</p></p>\n<p><ul><br>\n<li><br>\n<a href=\"https://www.youtube.com/watch?v=X_a4JkCWfFc\">is it impossible to get a junior developer job in 2026?</a> (me)</li><br>\n<li><br>\n<a href=\"https://vimeo.com/906418692\">Inventing on Principle</a> (Bret Victor)</li><br>\n</ul></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Tyler Dane</div><br>\n<p>I used the techniques in this talk to weasel into a Backend Engineer role at a startup, despite graduating with a History degree a few months earlier. Then I used them to land a Fullstack role and double my salary. Then I got a Lead Frontend role and doubled my salary again. Now I get Founding Engineer offers on autopilot (This stuff works!). </p></p>\n<p><p>I've also interviewed over 100 engineers and have seen the surprising ways companies <em>actually</em> decide who to hire after the interview.</p></p>\n<p><p>I’m currently building an <a href=\"https://github.com/SwitchbackTech/compass\">open-source planner for minimalists</a> and <a href=\"https://newsletter.fullstack.zip/\">writing about system design</a>.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1934\">Attending</button><br>\n<div class='room' href='/maps/florida.png'><br>\nFlorida<br>\n</div><br>\n<h3 class='title'>Shipping Atoms and Bits: What Building Physical Products Taught Me About Better Engineering Decisions</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Tamil Kadir Rajavel</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most tech talks assume your product lives in the cloud. Mine ships in a box.</p></p>\n<p><p>I lead engineering at a small professional audio/video company where software, firmware, and hardware all have to work together on day one. Our products range from Bluetooth Auracast audio devices to AI-powered real-time translation, and all of them have to ship on time with a small team and a real budget. A hardware mistake means a costly respin, not a quick patch. That changes how you think about every decision.</p></p>\n<p><p>In this session I'll share things that building physical products taught me that I think apply to anyone making engineering decisions:</p></p>\n<p><ul><br>\n<li><br>\n<strong>Coordinating teams that move at completely different speeds.</strong> Hardware timelines don't bend to your sprint cadence. How we blend structured milestones with agile sprints so firmware, software, and hardware teams stay aligned without slowing each other down.</li><br>\n<li><br>\n<strong>Rolling out AI tools when you don't have an AI team.</strong> Our actual strategy for adopting AI tools across the entire company, what stuck, what flopped, and how it's changed what we can take on.</li><br>\n<li><br>\n<strong>Your team isn't generic, so why is your tooling?</strong> Enterprise software is either too expensive or too bloated for a small team, and the spreadsheet you've been nursing along is one pivot table away from collapse. I used Claude Code to build a custom resource planning tool in a week. No dev team, no six-figure license. I'll make the case that building your own tools is now a real option for any small company.</li><br>\n<li><br>\n<strong>Saying no to good ideas.</strong> How constraints on time, people, and budget force better prioritization than any framework.</li><br>\n</ul></p>\n<p><p>Whether you're an engineer thinking about leadership, a founder wearing every hat, or a developer curious how the \"other side\" builds products, there's something here for you.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Tamil Kadir Rajavel</div><br>\n<p>Tamil Kadir Rajavel leads engineering at <a href=\"https://www.williamsav.com/\">Williams AV</a>, where his team ships professional audio and assistive communication products across hardware, firmware, and software. That includes Bluetooth Auracast devices and AI-powered real-time translation solutions.</p></p>\n<p><p>With 15+ years of experience spanning a venture-backed startup, a Fortune 500 multinational, and a PE-backed small business, he's been hands-on as an embedded engineer, owned roadmaps as a product manager, and now leads engineering teams as a director. He holds an M.S. in Electrical Engineering from the University of Minnesota.</p></p>\n<p><p>First-time Minnebar presenter, long-time attendee who finally decided to get on stage.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://www.linkedin.com/in/tamilkadirrajavel/\">LinkedIn</a></li><br>\n<li><a href=\"https://tamilkadirrajavel.com/\">Personal Website</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2071\">Attending</button><br>\n<div class='room' href='/maps/georgia.png'><br>\nGeorgia<br>\n</div><br>\n<h3 class='title'>Kill the Login: How AI Agents Replace Software Destinations</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Justin Buhl</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most enterprise software sits there waiting - waiting for someone to remember it exists, log in, and do something. A manager has to open a recognition platform to thank an employee. An employee has to find a redemption portal to spend the points they've earned. The software works, but only if humans come to it.</p></p>\n<p><p>AI agents invert this entirely. Instead of a recognition platform waiting for a manager, an agent detects that Sarah just helped Kevin ship his project and messages the manager in Slack at the right moment: \"Want to recognize her?\" From there, the manager adds their own words - the agent created the opportunity, not the message. The destination disappears, the human moment doesn't.</p></p>\n<p><p>At Augeo, we're building these systems now for our clients - but the pattern isn't industry-specific. It applies anywhere your product depends on someone remembering to show up. In this session, Justin will walk through what we've learned: the design patterns that actually work, where agents should replace destinations, and how to spot those opportunities in your own products.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Justin Buhl</div><br>\n<p>Justin Buhl is the Chief Technology Officer of Kigo, a subsidiary of Augeo building the infrastructure for AI native loyalty experiences. He leads the company's technology and product development, driving the platforms that enable personalized, intent based rewards across enterprise loyalty programs. A lifelong builder, Justin is experienced in developing mobile and web applications and the companies around them from the ground up.</p></p>\n<p><p>Justin organizes AI Tinkerers Minneapolis St. Paul, bringing together local AI builders to share demos and ideas. He was the co-founder of the fitness rewards platform Plyo and spends his free time tinkering with new technologies.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1956\">Attending</button><br>\n<div class='room' href='/maps/oregon.png'><br>\nOregon<br>\n</div><br>\n<h3 class='title'>Sol LeWitt, Combinatorial Enumeration, and Rogue</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Mark Gritter</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Sol LeWitt wrote that \"the serial artist does not attempt to produce a beautiful or mysterious object but functions merely as a clerk cataloguing the results of his premise.” This premise could be a set of axioms, a geometric constraint – or a roguelike level generator! From this viewpoint, the enumeration of all outputs from a procedural content system is itself a type of artwork.</p></p>\n<p><p>Rogue, a text-based dungeon crawler from the 1980s, is one of the first games that used procedurally generated content. It generates a random layout for each level that the player explores. Rogue's simple algorithms for doing so have been a source of inspiration for game developers for decades. But because Rogue uses a 32-bit psuedorandom number generator, there are \"only\" four billion possible levels, and we can enumerate them all. (I'd hoped that there was some crunchy technical content about how to do so efficiently -- but it's actually pretty easy!)</p></p>\n<p><p>I’ll explore this connection between 20th century conceptual art and 21st century expressive range analysis. I'll show some examples of serial art, more recent examples of complete enumerations, and some results from looking at the Rogue level generator.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Mark Gritter</div><br>\n<p>Mark Gritter is a Founding Engineer at ThirdLaw, his fifth startup experience, building monitoring and control for AI systems.</p></p>\n<p><p>Mark formerly worked at Akita Software and Postman on API observailbity; at HashiCorp on the Vault team; co-founded Tintri, an enterprise storage company that IPOed in 2017; and was a day-one employee at Kealia, a video streaming startup acquired by Sun Microsystems in 2004.</p></p>\n<p><p>Mark's previous Minnebar presentations have covered topics such as correctness of algorithms, combinatorial auctions, scaling a startup, building a file system, and procedural content generation.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://github.com/mgritter\">GitHub</a></li><br>\n<li><a href=\"https://mathstodon.xyz/@markgritter\">Mastodon: @markgritter@mathstodon.xyz</a></li><br>\n<li><a href=\"https://bsky.app/profile/markgritter.bsky.social\">Bluesky: @markgritter.bsky.social</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1964\">Attending</button><br>\n<div class='room' href='/maps/pennsylvania.png'><br>\nPennsylvania<br>\n</div><br>\n<h3 class='title'>DefineTheBox Customer Relationship Management (CRM)</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Joe Slaughter</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>DefineTheBox to focus on solving customers' needs with products and services and derisking quality escapes from user requirements.</p></p>\n<p><p>Join for a Case Study and lesson on defining Requirements, generate documents related to Quality Management, Preventative Actions Plans, Functional Requirements from Scope to Quote customers.</p></p>\n<p><p>Innovators like you spend time creating documents to carry out guidelines and plans to meet customer needs. As customer needs become more complicated over time, scope creep becomes a liability.</p></p>\n<p><p>Join us for a live Case Study how to DefineTheBox with Devices, Process and Users,</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Joe Slaughter</div><br>\n<p>Founder of DefineTheBox a solution for copying and pasting spreadsheets to not so living-documents and instead databasing User Requirements, Risks and Quality plans to manage living documents for customers assets </p></p>\n<p><p>Chemical Engineer, Founder, startup enthusiast</p></p>\n<p><p><a href=\"https://appsource.microsoft.com/en-us/product/dynamics-365/layer1holdingsllc1667923574055.definethebox\">https://appsource.microsoft.com/en-us/product/dynamics-365/layer1holdingsllc1667923574055.definethebox</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n</div><br>\n</div><br>\n<div class='timeslot' id='timeslot_173'><br>\n<h2><br>\n<div class='time'>10:40 – 11:20</div><br>\n<div class='title'>Session Block 2</div><br>\n</h2><br>\n<div class='sessions'><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2108\">Attending</button><br>\n<div class='room' href='/assets/maps/theater-fe0370eea0aa14e25f66f5e98584371d74b35880be3cf95f31edb502b3d0eb39.png'><br>\nTheater<br>\n</div><br>\n<h3 class='title'>What tech lessons should we learn from the ICE invasion?</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Paul Cantrell</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>This year put the Twin Cities at the forefront of international attention — and not because of the large number of AI talks we managed to squeeze into our local unconference. We are the site of a disaster; we are (we're told) a city of heroes. We just lived through something whose memory will outlive all of us. We should reflect on it.</p></p>\n<p><p>Coming from personal experience on the ground in South Minneapolis, in the thick of it, this talk will share <strong>lessons about technology</strong>: how it helps us, how it fails to help us, how it hurts us. These are lessons about fighting authoritarianism. They are also general lessons about product design, about security, about our human aspirations, about risk, about triage, about ethical computing — lessons we already knew, or should have known, but that are now thrown into sharp relief by the clear light only crisis can bring.</p></p>\n<p><p>After the talk portion, time allowing, there will be a period of scaffolded small group discussion and idea sharing for those who wish to participate.</p></p>\n<p><p>This session is a tech-focused counterpart to <a href=\"https://sessions.minnestar.org/sessions/2126\">The Part You Didn’t See</a>.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Paul Cantrell</div><br>\n<p>Paul fell in love with programming at first sight on an Apple ][+ and never looked back. He teaches computer science at <a href=\"http://www.macalester.edu/academics/mscs/\">Macalester College</a> and is a freelance software developer (often with the fine folks at <a href=\"http://bustout.com\">Bust Out</a>).</p></p>\n<p><p>Living a secret double life as a classically trained <a href=\"http://innig.net/music/\">composer and pianist</a>, he brings a musician's passion for aesthetics and nuanced detail to the craft of writing software, thus making his bio sound all fancy.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://innig.net\">Personal site</a></li><br>\n<li><a href=\"https://hachyderm.io/@inthehands\">Mastodon</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2096\">Attending</button><br>\n<div class='room' href='/assets/maps/harriet-73368221c9fe9c9a543c36a01e436349a310dc9dab7b6fc11bf78a96b261ebf0.png'><br>\nHarriet<br>\n</div><br>\n<h3 class='title'>AI Sucks ☯️</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Sergio Najera-Feito</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>It's undeniable how truly amazing modern AI is, and in 2026, we’ve only scratched the surface of AI’s true potential. </p></p>\n<p><p>Clearly AI has some incredible, life-changing, and far-reaching use cases, given virtually every other presentation here at Minnebar20 is about AI.</p></p>\n<p><p>At the same time, it’s being overprescribed as the end all be all solution to everything, from replacing 80% of the workers at your company with AI, to your own personal AI Jesus for only $1.99 (per minute)!</p></p>\n<p><p>But AI sucks at a lot of things, and we need to talk about it.</p></p>\n<p><p>This talk has a few simple goals, which are to demonstrate:<br></p>\n<ul>\n<li>real life examples of what AI sucks at, from silly to scary<br></li>\n<li>ways to discuss tradeoffs of AI without being entirely “doom and gloom”<br></li>\n<li>actionable things you can do to contribute to a less sucky AI experience </p></li>\n</ul>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Sergio Najera-Feito</div><br>\n<p> - Nerd<br></p>\n<ul>\n<li>Enjoyer of human beings<br></li>\n<li>Co-creator of <a href=\"https://www.periclethegame.com\">Pericle: Gathering Darkness</a></p></li>\n</ul>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1935\">Attending</button><br>\n<div class='room' href='/assets/maps/nokomis-436b4f6a934c7d3a4e9f00ac25d1f109a937337c12a52b62ee43fd01df1ab7dd.png'><br>\nNokomis<br>\n</div><br>\n<h3 class='title'>Don’t Blame the User—Fix the Design: The UX of Streets and Cities</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Mel Bernstein</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Following up from last year’s deep dive into traffic signal technology, this talk shifts focus to the human side of our streets.</p></p>\n<p><p>Why do people “break the rules”?<br>\nWhy do some streets feel stressful, even when they’re technically safe?<br>\nWhy do drivers, cyclists, and pedestrians seem to be in constant conflict?</p></p>\n<p><p>The answer often isn’t (just) bad behavior—it’s design.</p></p>\n<p><p>In this session, we’ll apply UX thinking to urban planning: interfaces, signals, mental models, and cognitive load in the real world. We’ll look at bikeways, intersections, transit, and accessibility—and how each user is making decisions based on incomplete, conflicting signals.</p></p>\n<p><p>Cities are designed systems—and they’re constantly changing. This talk will give you a UX lens to better understand the streets you use every day, spot what works (and what doesn’t), and feel more confident engaging in the changes shaping your neighborhood.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Mel Bernstein</div><br>\n<p>Hello! I'm a Minneapolis-based UX engineer. I love biking, jazz, and sharing good food with friends and family!</p></p>\n<p><p>Since moving back to Minneapolis and getting involved in local advocacy groups, I've started to connect the pieces between digital and physical UX.</p></p>\n<p><p><a href=\"https://www.linkedin.com/in/melissa-bernstein-ubc/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2048\">Attending</button><br>\n<div class='room' href='/maps/bde maka ska.png'><br>\nBde Maka Ska<br>\n</div><br>\n<h3 class='title'>Building a Knowledge Graph Your AI Can Actually Use</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Jared Rickert</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most \"chat with your docs\" tools disappoint. They hallucinate, miss connections, and burn tokens. <strong>The problem isn't the AI — it's how we structure our notes.</strong></p></p>\n<p><p>In this interactive session, we'll build a shared knowledge graph together using:</p></p>\n<p><ul><br>\n<li><br>\n<strong>Markdown files</strong> as the base format</li><br>\n<li><br>\n<strong>Entity types</strong> (character, location, event) to classify notes</li><br>\n<li><br>\n<strong>Explicit links</strong> between notes to encode relationships</li><br>\n</ul></p>\n<p><p>We'll start with a blank folder, add structured notes together, then watch an AI navigate the graph we built — following relationships, not just matching keywords.</p></p>\n<p><p><strong>Bring your laptop if you want to contribute.</strong> No ML background required.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Jared Rickert</div><br>\n<p>No bio.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2002\">Attending</button><br>\n<div class='room' href='/assets/maps/minnetonka-8db53e880d5b4f573c725f5992d6439094819117b370c096f6fb3275ef11ff65.png'><br>\nMinnetonka<br>\n</div><br>\n<h3 class='title'>Boldly You: Showing Up to Your Life’s Purpose</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Alan Fernald</div><br>\n</div><br>\n</div></p>\n<p>Context: [Document content lines 1-2000]</p>\n<hr>\n<p><div class='description'><br>\n<p>How can knowing your life’s purpose unlock acceleration in your career, your business, and your thought leadership? And what are the practices of purpose-driven leaders who show up from a place of authenticity and the aliveness within them?</p></p>\n<p><p>Join Alan Fernald, career coach and speaker from The Purpose-Driven Leader, for a talk on the three practices that support you in showing up at your most powerfully and magnetically in your career and life. These practices are centering your agency, infinite games versus finite games, and cultivating wholeheartedness. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Alan Fernald</div><br>\n<p>Alan Fernald is the founder and purpose coach at The Purpose-Driven Leader, a purpose coaching company that empowers rising and mid-career professionals to deepen their self-knowledge, express their purpose, and maximize their success and impact in delivering on it.</p></p>\n<p><p>Alan works with you from a place of your self-knowledge and your strengths. He helps you break through your fixed or scarcity mindset and express your personal mission statement, your North Star. From there, Alan works with you to develop your growth plan, a roadmap to you delivering on your purpose.</p></p>\n<p><p>Prior to founding the Purpose-Driven Leader, Alan refined his leadership acumen through a range of roles, from management consulting to electoral campaign leadership, to leading DEI work at Fortune 500 financial services companies.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2017\">Attending</button><br>\n<div class='room' href='/assets/maps/proverb-edison-755383e7ffbc56ede12758c2a7c9ef5773d26f109ef5c95e23659bce15322e33.png'><br>\nProverb-Edison<br>\n</div><br>\n<h3 class='title'>What the Heck is a Qubit?</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Scott McKuen</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>What do people actually mean when they talk about <strong>quantum computing</strong>? What could it possibly mean for a bit to be <em>both zero and one simultaneously</em>? Or to <em>just try all the answers at once and pick the best one</em>? What is being <em>entangled</em>? Are we really on the verge of quantum-mediated alternate-history time-travel? </p></p>\n<p><p>No. But a lot of the other strange things you might have heard about are real! And you (yes, YOU) can already work with prototype machines today. If you've ever wondered what it was like to work in our industry in the 1950s, when computing was brand new and nobody knew where it would end up, quantum computing can give you some of that - not with time travel, but just by being <em>raw</em>.</p></p>\n<p><p>The basic ideas: qubits, superposition, and entanglement, can be managed with high school algebra. So we will do a little bit of that. </p></p>\n<p><p>We will also briefly refresh (or initialize) your memory of basic bits and gates from classical computing, to orient us and make the similarities and differences clear. And we will point to some online resources where you can build logic gates, play with quantum circuits, and explore more on your own.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Scott McKuen</div><br>\n<p>Math and Physics geek from Iowa - Iowa State, then UIUC. Twenty+ years in Silicon Valley, then moved back to the Midwest for a better quality of life. Lots of previous work in AI/ML and finance.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://github.com/scottmckuen\">GitHub</a></li><br>\n<li>Twitter: @mckuens</li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2078\">Attending</button><br>\n<div class='room' href='/assets/maps/zeke landres-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nZeke Landres<br>\n</div><br>\n<h3 class='title'>Think First. Prompt Later. Be un-BOT-able.</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Kathy Comfort</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>We'll explore the shift from the Knowledge Era to the Wisdom Era, where judgment and discernment become the scarce resource. And we'll work with two practical tools: Braindumping and Ignorance Mapping. Leave with a new relationship to uncertainty and a sharper sense of what makes you un-BOT-able.</p></p>\n<p><p>If everyone walks into the room with the same AI tools and the same access to knowledge, how do you differentiate? I think the answer is counterintuitive.</p></p>\n<p><p>While everyone is racing to master AI, the real leverage is going all in on your thinking. Not instead of AI — but harnessing AI. Better thinking, better judgment, better questions: that's what separates signal from noise.</p></p>\n<p><p>Your edge isn't what you know. It's hidden in your openness to explore the unknown.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Kathy Comfort</div><br>\n<p>A strategy and technology professional currently focused on creating mass human flourishing. Interested in solving the most urgent challenge of our time: How do people learn, think, and lead in a world where knowledge is democratized and expertise is commoditized?</p></p>\n<p><p><a href=\"https://www.linkedin.com/in/kathycomfort/\">LinkedIn</a> | <a href=\"https://centaurianai.com/\">Centaurian AI</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2010\">Attending</button><br>\n<div class='room' href='/assets/maps/challenge-83825ec7e9dac09a92e7320dee95e09bf83a63d10f385e33dc9a158444a51b2d.png'><br>\nChallenge<br>\n</div><br>\n<h3 class='title'>Understanding Agentic Commerce 🤖🛒</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Ahnaf Prio</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Agentic commerce is the next shift in how we build online shopping experiences. Instead of users navigating flows, systems can now coordinate tasks like product discovery, cart building, and checkout across different platforms—initiated and fulfilled by agents on behalf of the user.</p></p>\n<p><p>This talk breaks down what’s actually real today versus what’s still forming. We’ll walk through the landscape—commerce specs like ACP and UCP that are shaping how discovery and checkout work in these systems, alongside foundational pieces like MCP for tool access and A2A for agent coordination. We’ll ground it in what’s already working today: existing backend systems and APIs being orchestrated by agents to enable end-to-end shopping flows, and the emerging patterns.</p></p>\n<p><p>You’ll get a clear picture of where things stand today and how all of this actually fits together—hopefully walking away with something useful you can apply, whether you’re building as a developer or thinking about it from a business strategy lens.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Ahnaf Prio</div><br>\n<p>Ahnaf Prio is a Senior Engineering Manager at Best Buy, where he leads the agentic commerce team. He is the former CTO of Invive.io, a biotech startup that explored innovation in the life insurance space. He previously served as CTO of Tavolo, a restaurant technology company recognized as Emerging Startup of the Year in Minnesota (2021). He currently serves on the Board of Directors for the University of Minnesota Morris Alumni Association and on the Neighborhood Sales Tax Revitalization Board for the City of Saint Paul.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1915\">Attending</button><br>\n<div class='room' href='/assets/maps/learn-df050961fbc6679fe483e013b5e138016dc74f3ac11cb7f6fccba519e8f71bf5.png'><br>\nLearn<br>\n</div><br>\n<h3 class='title'>Building A Profitable Independent Newsletter</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Rick Ellis</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I am a longtime journalist that founded the web site AllYourScreens.com and its sister newsletter Too Much TV.</p></p>\n<p><p>TooMuchTV is a five day a week newsletter with a current free subscriber base of around 175,000 and a paid subscriber base of just under 9,000 paid subscribers. In the past several years, the newsletter has won several national journalism awards and broken a number of big stories. It's been mentioned in a number of other publications, including in the Associated Press, The Independent, The Verge, CNET, The Minnesota Star Tribune, Slate, Marketwatch, Variety, The Hollywood Reporter, The Guardian and many more.</p></p>\n<p><p>I'll talk about the journey that led to me running a financially successful newsletter and the lessons I learned along the way. It's not easy to accomplish, but it is possible and if nothing else, perhaps I can inspire a few people to give their idea a serious shot at success.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Rick Ellis</div><br>\n<p>Rick Ellis is the founder of AllYourScreens.com and the newsletter TooMuchTV. He's a former stand-up comic, syndicated talk show host & award-winning news journalist. His reporting led to an appearance in the documentary \"The Dark Side Of Kids TV,\" and he has won awards for investigative reporting. He's a member of the National Press Club and was the winner of the 2025 National A&E Journalism Award for \"Best Entertainment News Site by an Individual Not Tied to an Organization.\"</p></p>\n<p><p>Email: <a href=\"mailto:rick@allyourscreens.com\">rick@allyourscreens.com</a></p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li>Bluesky: @toomuchtv.substack.com</li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1966\">Attending</button><br>\n<div class='room' href='/assets/maps/discovery-fb2e2f3f87843e262b3141afaeffa503953ff10f6548030f8395dd1ae8f0db06.png'><br>\nDiscovery<br>\n</div><br>\n<h3 class='title'>UNLOCKING PRODUCTIVITY: THE POWER OF AI TOOLS IN THE WORKPLACE V4</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Senthil Kumaran</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>\"Remember last year when we were 'Ghibli-fying' photos and marveling at the first wave of AI agents? That was the rehearsal. This year, the curtain has officially stayed up, and the 'Magic' has turned into Muscle.\"<br>\n<br><br><br>\n<b>The Power of Autonomy & Context</b></p></p>\n<p><p>We’ll kick off with the game-changers in Agentic AI: systems that don't just \"chat\" but independently solve problems. We’ll specifically dive into Google AI Studio and Gemini 2.5 Flash, showing how its massive context window can digest hours of video or thousands of documents in seconds to act as your ultimate research partner.<br>\n<br><br><br>\n<b>The 60+ Tool Transformation</b></p></p>\n<p><p>I’ll break down a curated list of over 60 industry-leading tools to replace your most tedious tasks:<br>\n<br>Productivity & Research: Mastering Perplexity, Grok 3, and Gamma for instant intelligence.<br>\n<br>Content Powerhouses: Using Kling, HeyGen, and VEO 3 for video, and Midjourney for elite design.<br>\n<br>The Business Engine: Automating entire workflows with Make, Zapier, and Bardeen.<br>\n<br>Specialized Agents: Deploying Seona AI for SEO and Otter/Fireflies to automate your meetings.<br>\n<br><br><br>\n<b>Building Your Own \"Staff\"</b></p></p>\n<p><p>Learn how to use Agentic AI to create autonomous digital assistants that execute tasks. From Social Media Management with Tapilo and TweetHunter to Vibe Coding with Lovable and Cursor, you’ll see how to build a virtual department on a shoestring budget.<br>\n<br><br><br>\nThe Bottom Line This isn't just a list of \"cool apps.\" It’s a roadmap for Productivity 4.0. Whether you are a startup founder using Tome or an executive streamlining with Copilot, you’ll leave with a toolkit to transform your workday from \"busy\" to \"impactful.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Senthil Kumaran</div><br>\n<p>Senthil S. Kumaran is a technology executive, architect, and educator with over 30 years of experience in software engineering and leadership. He has driven digital transformation and technological innovation across various sectors, including healthcare, finance, retail, and manufacturing. His expertise includes strategic IT leadership, cloud-native architecture, enterprise architecture, and the implementation of advanced technologies like applied AI and machine learning to create scalable, impactful solutions. He is also a recognized thought leader in applying agile methodologies and DevOps practices.</p></p>\n<p><p>Kumaran currently serves as the CIO at MNGI Digestive Health and holds a part-time position as an Adjunct Professor at Concordia University. In this academic role, he teaches courses in software engineering, emerging technologies, and data management. He is also a sought-after speaker who has presented at over 100 technical and healthcare conferences on the intersection of technology, healthcare, and AI.</p></p>\n<p><p>As the technical co-founder of Virtuwell, a pioneering telehealth platform, Kumaran designed and implemented a HIPAA-compliant system that served over one million patients, earning a 98%+ positive feedback rating. His contributions included developing clinical decision support systems and optimizing patient engagement workflows. At Virtuwell, he led the AI, Machine Learning, and Enterprise Architecture group, driving over $100 million in savings, innovation, and growth through digital product development.</p></p>\n<p><p>He holds a Master's in Electronics Engineering from Bharathiar University, India, and an MBA from the University of St. Thomas. He is also an active contributor to various nonprofits and frequently presents at technology events worldwide.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1923\">Attending</button><br>\n<div class='room' href='/assets/maps/gandhi-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nGandhi<br>\n</div><br>\n<h3 class='title'>When Disability Is Misread: Safety in High-Stress Systems</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Sharyn Morrow</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Imagine you process information more slowly, avoid eye contact when overwhelmed, or shut down under stress. Now imagine being confronted by law enforcement during a large-scale enforcement operation like Operation Metro Surge here in Minnesota.</p></p>\n<p><p>What might be interpreted as defiance could simply be disability.</p></p>\n<p><p>This session examines that moment, when behavior is interpreted quickly and often incorrectly. We will explore practical tools and community-informed strategies that help people with disabilities prepare, communicate clearly, and reduce risk in high-stress encounters. You will leave with concrete ideas you can apply in design, policy, and real-world interactions.</p></p>\n<p><p>If you care about accessibility, dignity, and real human impact, join the conversation.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Sharyn Morrow</div><br>\n<p>Sharyn is an accessibility leader with 30+ years of experience across design, development, testing, and remediation. They specialize in turning accessibility standards into practical, human-centered solutions.</p></p>\n<p><p>An AuDHDer and parent of an autistic adult, Sharyn brings lived experience to their work at the intersection of accessibility, systems design, and real-world use. They hold a CPACC credential from IAAP and are currently an Accessibility Manager at ablr 360.</p></p>\n<p><p>Previously: iCIMS, U.S. Bank, Siteimprove, Clockwork, Fallon, Securian, Minnesota DHS, and Thomson Reuters (West Publishing).</p></p>\n<p><ul><br>\n<li><a href=\"https://www.sharynmorrow.com\">sharynmorrow.com</a></li><br>\n<li><a href=\"https://www.linkedin.com/in/sharynm/\">linkedin.com</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1969\">Attending</button><br>\n<div class='room' href='/assets/maps/stephen leacock-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nStephen Leacock<br>\n</div><br>\n<h3 class='title'>Real World Speech Interfaces: What Builders Are Seeing</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Jaim Zuber</div><br>\n<div class='presenter'>Ian Bicking</div><br>\n<div class='presenter'>Vaish Sagar</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Are you building with speech, or thinking about it? Let’s compare notes.</p></p>\n<p><p>Speech interfaces (e.g. speech-to-text, text-to-speech) have become one of the most practical (and widespread) ways AI shows up in real products.</p></p>\n<p><p>2025 was the year of AI meeting note takers. Transcription apps are everywhere (and seemingly popped up out of nowhere).</p></p>\n<p><p>2026 is about dictation. WisprFlow and Willow are changing how we interact with computers. Prompting Claude from a keyboard is sooo 2025.</p></p>\n<p><p>Yet, it feels like we’ve only scratched the surface of what these technologies can do. </p></p>\n<p><p>Building in the space? Let’s talk shop and make wild guesses on where this is headed.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Jaim Zuber</div><br>\n<p>Apple Platforms Engineering and Leadership. Mobile and desktop.</p></p>\n<p><p>Hacking on speech-to-text (ASR) systems while he searches for the next gig.</p></p>\n<p><p>He likes hockey, BBQ, and making <a href=\"http://rare-medium.com/\">noise</a> with a modest array of instruments… sometimes in <a href=\"http://rare-medium.com/dates.html\">public</a>.</p></p>\n<p><p><strong>Links:</strong></p>\n<ul>\n<li><a href=\"https://jaimzuber.com\">jaimzuber.com</a></li>\n<li><a href=\"https://bsky.app/profile/jaimzuber.com\">BlueSky</a></li>\n<li><a href=\"https://mspsocial.net/@jaimzuber\">Mastodon</a></li>\n<li><a href=\"https://github.com/sharpfive\">GitHub</a></p></li>\n</ul>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Ian Bicking</div><br>\n<p>Ian Bicking is a software developer, currently independent. His accidental largest contribution was as author of pip and virtualenv.</p></p>\n<p><p>He previously worked at Brilliant.org, Meta, and Mozilla.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://ianbicking.org\">Blog at ianbicking.org</a></li><br>\n<li><a href=\"https://github.com/ianb\">GitHub</a></li><br>\n<li><a href=\"https://bsky.app/profile/ianbicking.org\">Blue Sky ianbicking.org</a></li><br>\n<li><a href=\"https://hachyderm.io/@ianbicking\">Mastodon @ianbicking@hachyderm.io</a></li><br>\n</ul></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Vaish Sagar</div><br>\n<p>I'm an AI engineer, full-stack developer, and two-time founder with a Master's in Computer Science specializing in NLP from Arizona State University. Recognized by the U.S. government with an O-1A for extraordinary abilities in AI, I have five years of experience spanning enterprise data engineering at Oracle, consumer product development, and applied AI research. I've built and shipped two startup platforms from scratch, was a Sequoia Capital Arc Accelerator finalist, and was featured on Fox9 News for consumer tech innovation.<br>\nWhat sets my work apart is where it lives: at the intersection of AI and music. I've built AI tools inside DAW environments, applied music theory principles to reduce artifacts in AI-generated audio, and trained a GPT-style transformer from scratch to study musical structures in song lyrics. As a guitarist and vocalist, I bring a musician's ear to my technical work. My current project, \"What Does B-Major Sound Like in a Parallel Universe?\", is a reflection of that curiosity, of exploring what music could be. </p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2074\">Attending</button><br>\n<div class='room' href='/assets/maps/tackle-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nTackle<br>\n</div><br>\n<h3 class='title'>Business Partners and Co-Founders: The Good, the Bad, the Weird</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Richard Chandler, MA, LPC</div><br>\n<div class='presenter'>Grant Chandler</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Business partnerships can be a force multiplier or a slow-moving failure mode. This session is a facilitated conversation for co-founders and partners (and those exploring a partnership) seeking practical tools to build a better working relationship. If you are in a partnership that feels great, messy, or somewhere in between, come compare notes with other partners and co-founders in the room.</p></p>\n<p><p>Together, we will surface the real issues that make or break partnerships, including expectations, decision-making, conflict patterns and communication breakdowns. Bring your scenarios, questions, and lessons learned. The goal is to leave with clearer language, healthier defaults, and a few practical tools you can apply immediately.</p></p>\n<p><p><strong>Who this is for:</strong></p></p>\n<p><ul><br>\n<li>Co-founders and business partners, past, present, and future.</li><br>\n<li>Entrepreneurs considering a partnership, currently in one, or recovering from a hard one.</li><br>\n<li>Anyone building a company with a friend, family member, or long-time collaborator.</li><br>\n</ul></p>\n<p><p><strong>What you will take away:</strong></p></p>\n<p><ul><br>\n<li>Tools for clarifying roles, expectations, and decision-making before conflict escalates</li><br>\n<li>Common partnership pitfalls, and early warning signs to watch for</li><br>\n<li>Practical ways to have hard conversations without triggering defensiveness or shutdown</li><br>\n<li>Prompts for separating “business relationship” issues from “personal relationship” issues</li><br>\n<li>Ideas for repair when trust has been dented, and how to prevent repeat patterns</li><br>\n</ul></p>\n<p><p><strong>Format:</strong></p></p>\n<p><p>Facilitated discussion with prompts, short frameworks, and group sharing. We will also pull insights from participants’ real scenarios (time-boxed).</p></p>\n<p><p><strong>Note:</strong> This is not legal advice. We will focus on partnership process, communication, and practical decision-making tools, not legal partnership agreements.</p></p>\n<p><p><strong>About the hosts:</strong></p></p>\n<p><p>Richard Chandler, “The Business Partners Counselor,” is a long-time business partnership counselor and executive coach. Grant Chandler is a Lean Six Sigma Black Belt and consultant focused on building clear, repeatable ways of working. They are also a father-son business partnership, and have helped many partners align and stay effective under real-world constraints.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Richard Chandler, MA, LPC</div><br>\n<p>Richard Chandler, MA, LPC, combines decades of experience as a licensed psychotherapist, executive coach, and business partners counselor, bringing unique expertise in relationship dynamics in personal and business settings. He works with partnerships and teams throughout the United States and Canada to help business partners overcome communication barriers and move forward productively.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://thebusinesspartnerscounselor.com/\">Website</a></li><br>\n<li><a href=\"https://www.linkedin.com/in/richardjchandler/\">LinkedIn</a></li><br>\n</ul></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Grant Chandler</div><br>\n<p>Long-time Minnebar Attendee, Lean Six Sigma Black Belt, educator, and operations professional who’s known for explaining things clearly and building systems people can actually use. Grant has taught web and graphic design certificate programs and built curriculum from the ground up, covering UX, accessibility, HTML/CSS, WordPress, and career coaching. Their day-to-day work includes hands-on process improvement - facilitating workshops, cleaning up intake and prioritization, and writing documentation that teams keep coming back to. </p></p>\n<p><p>Outside of work, Grant’s maker projects - breadmaking, gardening, sewing, electronics, and 3D printing - keep that same practical, hands-on approach sharp..</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2013\">Attending</button><br>\n<div class='room' href='/assets/maps/louis pasteur-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nLouis Pasteur<br>\n</div><br>\n<h3 class='title'>How To Talk With Your Team About Best Practices (a new way of efficiently discussing and prioritizing the best practices that matter most to your team)</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Xandra Best</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>The conversation around best practices can be ... complicated. There is always more that your technical team could be doing to follow best practices. Resources are always limited, and there are always legitimate competing business priorities for the team to consider. Prioritizing the best practices that matter to your team can be like comparing apples to oranges.</p></p>\n<p><p>The best teams have discussions including both business and technical members around which best practices to adopt and why, but those conversations are as difficult as they are vital. Let's talk about how we might make those conversations work better! In this session, I'll present a new approach for tackling these conversations. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Xandra Best</div><br>\n<p>No bio.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2093\">Attending</button><br>\n<div class='room' href='/maps/nevada.png'><br>\nNevada<br>\n</div><br>\n<h3 class='title'>JUMP! A regular person’s guide to introducing AI at work and in real life.</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Glenn</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Everyone’s talking about AI—but if you’re in a “normal” job (especially in a regulated field), it’s not obvious where to start or what’s actually safe and useful to hand over to the machines. In this session, I’ll share how I’ve gradually woven AI into both my day job at a financial firm and my everyday life, without becoming an AI engineer or breaking compliance. <br>\nYou’ll see how I use tools like ChatGPT, Claude, Cowork, and HeyGen to act like a one‑person marketing and content team (ad icons, copy‑fitting, SEO‑friendly video scripts, avatar videos), as well as a first‑line “smart friend” for real‑world troubleshooting—like fixing a thermostat that wouldn’t talk to my furnace and AC, or debugging a broken HTML email signature from screenshots and source code. <br>\nI’ll be honest about what worked, what broke (like over‑engineered JSON and free‑tier GitHub limits), and how I decide where AI doesn’t belong. We’ll cover: <br>\n• Where to start: low‑risk, high‑leverage AI use cases you can try this week at work and at home. <br>\n• How to introduce AI inside a regulated or sensitive environment without freaking out compliance or leadership. <br>\n• A simple decision framework for when to rely on AI, when to keep it as a draft‑only helper, and when not to use it at all. <br>\nThis will be a collaborative session—come ready to share your own experiments, questions, and “is this OK to do?” scenarios. Whether you’re AI‑curious but stuck on “where do I start?” or already dabbling with tools, you’ll leave with concrete workflows, prompts, and sanity checks you can apply immediately. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Glenn</div><br>\n<p>Glenn spent over 20 years as a Creative Director at advertising agencies across Minneapolis — which basically means he's spent decades solving problems under pressure, translating complicated things into plain language, and convincing people to care about stuff. He never studied technology, never learned to code, and would still describe himself as a regular person who just can't stop poking at things to see how they work. That curiosity led him down the AI rabbit hole a few years ago, and he hasn't come up for air since. Today he works in marketing at a financial firm, where he's figured out how to use tools like Claude, ChatGPT, and others to punch way above his weight — without breaking compliance, alienating IT, or pretending to be an engineer. JUMP! is his honest account of what worked, what didn't, and why you don't need to be technical to start.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2049\">Attending</button><br>\n<div class='room' href='/assets/maps/texas-23344a38e113415658ae210154eb5eb82d6559ba6e9d80139637c879fbc8df24.png'><br>\nTexas<br>\n</div><br>\n<h3 class='title'>Livin' the Solo Founder Dream. I'll share learnings from building my second Consumer app. Open to participation!</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>larry bieza</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I've completed my consumer web app for my startup, yolomeal.com. I am just finishing the mobile app (submitted to app stores). </p></p>\n<p><p>For new solo founders: I'll share my process, and why certain decision were made. It's a lonely road, so let's walk for a few minutes together. </p></p>\n<p><p>For UX/UI folks: Critique what I've built, and share your thoughts. I'm always open to your ideas.</p></p>\n<p><p>For Sales and Marketing: I'll share my new never-done-before marketing strategy, which should be active during Minnebar. Let's check the analytics!</p></p>\n<p><p>This is a chance for all attendees, to help inform me, and each other. I appreciate all of you. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>larry bieza</div><br>\n<p>Larry is the founder of Yolomeal.com. We reveal the best tasting food at restaurants in your city. He is formerly the founder of Lyfmap.com, for which he ran a successful Wefunder campaign. </p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1955\">Attending</button><br>\n<div class='room' href='/maps/california.png'><br>\nCalifornia<br>\n</div><br>\n<h3 class='title'>What Happens When You Combine Bad Bunny + AI + Mental Health? </h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Michael Arulfo</div><br>\n<div class='presenter'>Dr.Charryse Johnson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>It starts with a WestCoast Swing Dance demo to a Bad Bunny song. Then it gets real. Cadre's Chief AI Officer (CAIO) Mike Arulfo breaks down the AI Enterprise strategy powering a mental health platform built for humans, not algorithms. Michael will also cover the latest trends in Artificial Intelligence happening in the Enterprise and Startup environments based on his current experience working in an AI tech startup and from Human X 2026 in San Francisco and the Chief Architect Network (CAN)Summit in London! Dr. Charryse Johnson unveils The Cadre Way AI Framework— a clinical governance framework defining how AI operates in moments of vulnerability. Two perspectives. One mission. Zero boring slides.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Michael Arulfo</div><br>\n<p>Michael Arulfo is the Chief AI Officer and Field CTO at Cadre, where he architects the AI strategy and Enterprise AI platform powering a mental health platform that connects members with vetted peer coaches through content, community, and clinically governed technology. Mike also serves as the Field CTO and leader of the Cadre AI Agency Lab (CAAL) where he provides AI Strategy and Enterprise Architecture guidance to Fortune 1000 and Fortune 500 clients. </p></p>\n<p><p>He is the co-author of The Cadre AI Framework, a groundbreaking AI governance framework that defines how AI is permitted to operate in moments of human vulnerability — setting the standard for responsible AI in mental health.Trained in AI strategy and Architecture at MIT and UC Berkeley, Mike brings over two decades of executive leadership across health care’s most demanding environments. </p></p>\n<p><p>He served as an Enterprise Architect at UnitedHealthcare (Office of the CIO), Chief Architect of Optum Everycare at OptumHealth, and Principal Enterprise Architect at Boston Scientific, where he co-chaired the company’s generative AI tiger team in the Office of the CIO. His career includes pioneering work on 3M.com and collaboration with the Mayo Clinic, building a foundation in large-scale health care systems that few can match. Mike’s impact has been recognized at every level. </p></p>\n<p><p>He is the recipient of the Bravo! Leadership Award from UnitedHealthcare, the Bravo! Relationship Award from OptumHealth, the CEO Winning Spirit Award from Boston Scientific (2024), and a 2026 Minnesota ORBIE Award nomination from the Inspire Leadership Network. Marquis Who’s Who (2025) recently honored him as a leader in Enterprise AI, with a feature profile published via the Associated Press. He is a builder, a strategist, and when the moment calls for it — a West Coast swing dancer!</p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Dr.Charryse Johnson</div><br>\n<p>Dr. Charryse Johnson is a Clinical Mental Health Consultant and Behavioral Health Systems Strategist, serving as Chief Clinical Officer at Cadre. She is the architect of The Cadre Way™, a clinically grounded coaching framework designed to bridge the gap between everyday support and clinical care — redefining how individuals access mental health support in real time.</p></p>\n<p><p>At Cadre, Dr. Johnson leads the clinical integrity of the platform, ensuring that human connection, ethical standards, and evidence-informed practices remain central as technology evolves. She is a co-contributor to The Cadre AI Framework, helping define how AI can responsibly support individuals in moments of stress, vulnerability, and decision-making without replacing human care.</p></p>\n<p><p>With a background in clinical mental health, neuroscience-informed practice, and behavioral systems design, Dr. Johnson is known for translating complex psychological concepts into scalable, real-world solutions. Her work sits at the intersection of mental health, human performance, and innovation, shaping the future of how care is delivered.</p></p>\n<p><p>She is committed to making the invisible visible ensuring that even in a world of advancing technology, people are still seen, understood, and supported where it matters most.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><p><a href=\"https://drcharryse.com/\">Personal site</a></p></li><br>\n<li><p><a href=\"https://www.linkedin.com/in/drcharryse/\">LinkedIn</a></p></li><br>\n<li><p><a href=\"https://cadre.io/\">Cadre</a></p></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2044\">Attending</button><br>\n<div class='room' href='/maps/florida.png'><br>\nFlorida<br>\n</div><br>\n<h3 class='title'>🛜 The Community Connection: Strategic Marketing, Outreach, and PR for Community Leaders</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Juan LLerena</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p><strong>Are you marketing, or are you just making noise?</strong></p></p>\n<p><p>In a world where attention is the most valuable currency, many leaders find themselves \"stuck\"—not because they aren't working hard, but because they are operating in silos without a clear roadmap. Being stuck doesn't mean you're broken; it means you're ready for a shift in strategy and mindset. The Community Connection is a high-impact workshop designed to help you stop reacting and start leading by building a bridge between your vision and your community.</p></p>\n<p><p><strong>What We’ll Cover</strong><br>\nThis session takes a 20,000-foot view of your organization to help you see the value of strategic connections.</p></p>\n<p><ul><br>\n<li>The \"Triple Threat\" Strategy: Master the intersection of Marketing (the what/how), Outreach (the who), and Public Relations (the why) to build authentic community awareness. </li><br>\n<li>The Proactive Roadmap: Move from a reactive \"firefighting\" mode to a proactive strategic plan that ensures consistency across every program and maximizes limited budgets. </li><br>\n<li>The Modern Media Toolkit: Learn how to navigate the \"PESO\" model—Paid, Earned, Shared, and Owned media—to meet your audience exactly where they are. </li><br>\n<li>Inclusive Communication: Learn to look \"beyond the lens\" to ensure your messaging is accessible, culturally aware, and reaching the non-English speaking members of your community. </li><br>\n</ul></p>\n<p><p>The Elev@te Framework: A practical, 3-step framework to get you \"Unstuck & Thriving\" by clarifying your path, simplifying your priorities, and protecting your most valuable asset—your energy. </p></p>\n<p><p><strong>Workshop Goals:</strong></p>\n<ol>\n<li>Transform your philosophy: Shift from seeing marketing as \"selling\" to seeing it as a vital community conversation.</li>\n<li>Streamline your strategy: Learn how to pick just 3 priorities for the next 90 days to create real momentum.</li>\n<li>Build a Bridge: Develop the skills to become the \"Ultimate Connector\" in your local ecosystem</p></li>\n</ol>\n<p><p><strong>Who Is This For?</strong></p>\n<ul>\n<li>Entrepreneurs & Business Owners looking to deepen their local impact.</li>\n<li>Decision Makers in for-profit and nonprofit sectors who need a cohesive communication strategy.</li>\n<li>Aspiring Entrepreneurs who want to build a business that \"doesn't break them.\"</li>\n<li>Tech-Interested Leaders ready to leverage modern digital tools and SEO for community growth</p></li>\n</ul>\n<p><p><strong>About Your Facilitator: Juan Llerena</strong><br>\nJuan Llerena is a community builder, entrepreneur, the founder of JLLB Media Creative Strategy & Business Growth, and founder and Executive Director of Vamos Impact, a MN based 501(c)3 nonprofit serving Latinos in Entrepreneurship. </p></p>\n<p><p>With over 20 years of experience connecting businesses to communities, Juan has served as a leader in both the for-profit and nonprofit worlds. </p></p>\n<p><p>He is the author of the book Elev@te: Lessons to Master the Balance of Entrepreneurship, Personal Growth, and Self-Care, and he brings a \"constant learning\" mindset to every strategy session. Known as the \"ultimate community connector,\" Juan specializes in helping leaders shift their mindset to build sustainable, thriving organizations.</p></p>\n<p><p><em>\"You are not behind. You're just getting started. There’s a better way to build a community that doesn't break you.\" — Juan Llerena</em></p></p>\n<p><p><strong><a href=\"https://www.linkedin.com/in/juan-llerena-845ba357/\">LinkedIn</a> - <br>\n<a href=\"https://jllbmedia.com/\">JLLB Media</a> - <br>\n<a href=\"https://vamosimpact.org/\">Vamos Impact Nonprofit</a></strong></p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Juan LLerena</div><br>\n<p><strong>Juan Llerena – Author, Founder, Business & Marketing Consultant, Social Entrepreneur</strong></p></p>\n<p><p>Juan Llerena is an author, business and marketing consultant, and founder of JLLB Media and Vamos Impact, a 501(c)3 nonprofit based in Minnesota. With over 20 years of experience helping entrepreneurs and small businesses grow, Juan blends strategic marketing know-how with a deep commitment to empowering diverse communities.</p></p>\n<p><p>As a social entrepreneur, he’s passionate about creating pathways for immigrant and minority-owned businesses to succeed—offering training, branding, and visibility strategies that actually work. Juan is also the author of Elev@te: AI Beginners Guide for Marketers and Business Owners, a journal-style resource designed to help entrepreneurs balance personal growth with business success.</p></p>\n<p><p>His work sits at the intersection of communication, community, and creativity—fueled by the belief that entrepreneurship is not just about making money, but making meaning.</p></p>\n<p><p>Juan lives with his family in Waconia, MN, and has called Minnesota home for the last 25 years.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><p><a href=\"https://www.linkedin.com/in/juan-llerena-845ba357/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2025\">Attending</button><br>\n<div class='room' href='/maps/georgia.png'><br>\nGeorgia<br>\n</div><br>\n<h3 class='title'>Project Vanguard - Veterans in (or interested in) Energy Networking opportunity</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>William Hossain</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>If you are a <strong>Veteran</strong>, a Family Member of a Veteran, or Ally of Veterans, you are welcome to connect with <strong>Project Vanguard Fellow William Hossain</strong> (an Asset Manager of utility scale energy sites).</p></p>\n<p><p>Come see how you can join a growing local and national community of Veterans and supporters that are focused on protecting and growing the energy infrastructure of the US, as well as connecting Veterans to career opportunities in energy industry. </p></p>\n<p><p>This will be a free-flowing session that could lead to expanding your network, discovering new opportunities, and learning about future events hosted by Project Vanguard - pending Happy Hour(s) to be sponsored!+</p></p>\n<p><p><a href=\"https://projectvanguard.com/\">link</a><br>\n<a href=\"https://www.linkedin.com/in/williamhossain/\">link</a></p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>William Hossain</div><br>\n<p>William was an 8-year Nuclear Navy Veteran, who operated nuclear reactors during two deployments aboard an aircraft carrier. William currently works for Geronimo Power, headquartered in Bloomington, MN, as an Asset Manager for multiple renewable energy projects across the greater Midwest.</p></p>\n<p><p>William is a current Fellow and Minnesota Community Leader for Project Vanguard. </p></p>\n<p><p>William was brought to the Twin Cities in pursuit of an MBA at Minnesota Carlson and decided to take up residence.</p></p>\n<p><p>If you wish to connect, please note that you found my information via Minnestar.</p></p>\n<p><p><a href=\"https://projectvanguard.com/\">Project Vanguard</a></p></p>\n<p><p><a href=\"linkedin.com/in/williamhossain/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2030\">Attending</button><br>\n<div class='room' href='/maps/oregon.png'><br>\nOregon<br>\n</div><br>\n<h3 class='title'>Normalize Your Team: Working Genius IS the Primary Key</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Mitch Bliven</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Most technology organizations optimize their development pipelines, yet few remove the friction from how work moves through their people. Bad systems don't scale and if your human architecture isn't intentionally designed, even the best software architecture will suffer from stalled decisions. </p></p>\n<p><p>This session unpacks the Working Genius framework as a relational schema for your team. We will identify the invisible bottlenecks between the first spark and final implementation, aligning your team’s natural energy with your release cadence to eliminate deployment friction.</p></p>\n<p><p>Join us to learn how to debug your team dynamics and take home a framework to:</p></p>\n<p><p>𝗠𝗮𝗽 𝗦𝘆𝘀𝘁𝗲𝗺 𝗩𝘂𝗹𝗻𝗲𝗿𝗮𝗯𝗶𝗹𝗶𝘁𝗶𝗲𝘀: Know where your personal and organizational blind spots are before you initiate a project, so you avoid the misfires that slow down execution.</p></p>\n<p><p>𝗗𝗲𝗳𝗶𝗻𝗲 𝗬𝗼𝘂𝗿 𝗗𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝗶𝗲𝘀: Create clear ownership and intent to synchronize execution and eliminate the waste of rework and delay.</p></p>\n<p><p>𝗢𝗽𝘁𝗶𝗺𝗶𝘇𝗲 𝗧𝗵𝗿𝗼𝘂𝗴𝗵𝗽𝘂𝘁: Aligning roles to how people naturally think and contribute reduces burnout while increasing output and accountability.</p></p>\n<p><p>You'll leave with a concrete mental model to stop relying on unstructured, high-friction collaboration, and start treating your team's dynamics with the same architectural rigor as your codebase.</p></p>\n<p><p>I am sharing this framework because it is the tool I used five years ago to re-engineer my own career. Making the transition from a W-2 employee to founding a business is never easy, but Working Genius made it possible.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Mitch Bliven</div><br>\n<p>Mitch is the founder of GNS and a Working Genius Certified Facilitator serving the Twin Cities metro area. His path started in social work, then moved to the private sector where he found a passion for using data to solve problems. Unfortunately this did not stop him from being entirely burned out. After eight years he was introduced to Working Genius which led him to discover that his natural gift of curiosity wasn't a nuisance, but his greatest professional strength. </p></p>\n<p><p>Today, Mitch combines a human-centric perspective with data-driven rigor to design high-performing collaborative teams. Through the Working Genius framework, he helps organizations identify where team friction originates, align people to their natural strengths, and build communication systems that accelerate execution.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2059\">Attending</button><br>\n<div class='room' href='/maps/pennsylvania.png'><br>\nPennsylvania<br>\n</div><br>\n<h3 class='title'>Decoding Your Equity Compensation: Stock Options & RSUs with AMA</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Trevor Ausen</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Do you work at a startup and receive stock as part of your compensation? Or are you at a big tech company and receive RSUs each year? These stock compensation programs can be complicated and have tax consequences that aren't always clear.</p></p>\n<p><p>I’ve met so many people who have exercised their options or sold some RSUs and then received a huge tax bill they weren’t expecting. Some good planning up front could have reduced that tax bill and prepared you to pay it before you got that April surprise.</p></p>\n<p><p>In this session, we’ll cover the most common equity types, how they work, and how they’re taxed. From there, we’ll have time for you to ask any questions about equity compensation and personal finance.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Trevor Ausen</div><br>\n<p>Trevor Ausen, CFP®, RICP® is an experienced financial planner with more than 10 years in financial planning. I have experience advising clients with equity compensation, small businesses, rental properties, and retirement withdrawal strategies.</p></p>\n<p><p>I really enjoy working with professionals with equity compensation. Authentic Life Financial Planning was started to help these professionals define their Authentic Life and align their finances to make that life a reality. </p></p>\n<p><p>I live in Minneapolis, MN, with my wife, Annie, our newborn son, and cats, Penguin and Oreo. I enjoy sailing, live music, and travel. My favorite destination so far is Sydney, Australia, although Norway and the Bahamas are close runners-up. </p></p>\n<p><p>Say hello or connect on <a href=\"https://www.linkedin.com/in/trevorausen/\">LinkedIn</a></p></p>\n<p><p>Learn more at <a href=\"https://www.authenticlifefp.com/\">Authentic Life Financial Planning</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2134\">Attending</button><br>\n<div class='room' href='/maps/uptowner.png'><br>\nUptowner<br>\n</div><br>\n<h3 class='title'>Medtech & Med Device Meetup [Networking Lounge]</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Hillary Drake</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Building in medtech or med-device? Connect with others working across healthcare innovation — from founders to operators to investors — and swap insights, challenges, and ideas.</p></p>\n<p><p>Minnebar is a great place to catch up with old friends, the Networking Lounge is a dedicated place to meet new people. Join us to chat about anything and everything.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Hillary Drake</div><br>\n<p>Hillary Drake is CEO and co-founder of <a href=\"https://liminalnetwork.com/\">Liminal Network</a>. Hillary has over twenty years of experience in logistics working for manufacturers, resellers, and service providers. She is passionate about creating practical solutions to real-world problems.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n</div><br>\n</div><br>\n<div class='timeslot' id='timeslot_174'><br>\n<h2><br>\n<div class='time'>11:20 – 12:30</div><br>\n<div class='title'>🍕 Early Lunch</div><br>\n</h2><br>\n</div><br>\n<div class='timeslot' id='timeslot_175'><br>\n<h2><br>\n<div class='time'>11:35 – 12:15</div><br>\n<div class='title'>Session Block 3</div><br>\n</h2><br>\n<div class='sessions'><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1932\">Attending</button><br>\n<div class='room' href='/assets/maps/theater-fe0370eea0aa14e25f66f5e98584371d74b35880be3cf95f31edb502b3d0eb39.png'><br>\nTheater<br>\n</div><br>\n<h3 class='title'>What the fuck are passkeys and why are they everywhere now?</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Dan Lew</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>It seems like every time you login to a website nowadays, it asks you to create a passkey. If you’re like me, you initially assumed this was some sort of scam. But now that it’s everywhere, you’re beginning to wonder what it’s all about and why every website is pushing it constantly.</p></p>\n<p><p>This talk will cover the basics of what a passkey is, how they came to be, and what you should do about them now that they’re here.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Dan Lew</div><br>\n<p>Dan Lew has code in his DNA and has been speaking since he was two years old. He's focused these skills on software development for the past two decades, working on many large mobile apps (FlightTrack, Expedia, Trello) as well as maintaining some open source libraries and applications. Currently he works on civic tech projects at <a href=\"https://www.mightyacorn.com/\">Mighty Acorn Digital</a>.</p></p>\n<p><p>When not speaking, he's silent.</p></p>\n<p><p>You can <a href=\"https://bsky.app/profile/danlew42.bsky.social\">contact him on Bluesky</a>, <a href=\"http://danlew.net/\">read his website</a>, or <a href=\"https://github.com/dlew\">stalk his commit history</a>.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2022\">Attending</button><br>\n<div class='room' href='/assets/maps/harriet-73368221c9fe9c9a543c36a01e436349a310dc9dab7b6fc11bf78a96b261ebf0.png'><br>\nHarriet<br>\n</div><br>\n<h3 class='title'>I Learned How to Tell Stories in This Building — Here's What Most Techies Miss</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Meredith Clause</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I spent years at Best Buy headquarters learning how to make complex (often technical) strategy land with executives who had 90 seconds of attention and zero patience for jargon. That framework now drives every narrative I build for CIOs and startup founders — and it was never about slides. Even though they were good.</p></p>\n<p><p>Most leaders try to communicate strategy by adding more detail, more data, more evidence. That's backwards. The leaders who get funded, who get buy-in, who move organizations - they do something fundamentally different. They build narratives with stakes that motivate an audience to act.</p></p>\n<p><p>This session breaks down the communication gap that kills good ideas. Why it happens, why smart people solve it the wrong way, and three specific moves you can apply immediately to make your ideas land with any audience. I'll use real examples from building executive narratives for CIOs at companies like Estée Lauder and Bacardi, and for founders raising capital. This is a talk, not a pitch. Come ready to argue with me about what actually works.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Meredith Clause</div><br>\n<p>With more than 25 years of executive leadership experience, I work alongside CIOs and technology teams to translate complexity into clarity — for boards, investors, and enterprise stakeholders. </p></p>\n<p><p>Before founding Storycore, I served as CMO of a global fitness franchise (Anytime Fitness), VP at Regis Corporation, and held senior leadership roles at Best Buy. That operator background shapes how I approach technology narratives: strategy first, story second. <br>\n</p></p>\n<p><p>Today, I partner with enterprise technology leaders navigating transformation, AI acceleration, and high stakes executive scrutiny - helping them articulate strategy with precision and confidence. </p></p>\n<p><p><br>\nMBA, Carlson School of Management, University of Minnesota<br>\nIDEO-Certified in human-centered storytelling<br>\nFormer Fortune 500 executive</p></p>\n<p><p><br>\nA little more about me, personally:<br>\nHobbyist Cyclist<br>\nWorld-Ranked CrossFit Athlete, JV Division<br>\nUnabashed Paint By Number enthusiast</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1910\">Attending</button><br>\n<div class='room' href='/assets/maps/nokomis-436b4f6a934c7d3a4e9f00ac25d1f109a937337c12a52b62ee43fd01df1ab7dd.png'><br>\nNokomis<br>\n</div><br>\n<h3 class='title'>The Future of Energy and the 30X Problem</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>David Koerner</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>In the next decade, it is predicted that the rising energy demands of AI and electrification will require millions of new tech workers and thousands of new, billion dollar companies. Thats because the transition to sustainable, carbon free energy requires 70TW of clean energy by 2050. To accomplish this, the US power grid will have to be almost completely reimagined and rebuilt. New energy sources must be found, developed, and dispatched, and doing so requires hardware, software, and business models that do not exist today.</p></p>\n<p><p>This is called the 30X problem.</p></p>\n<p><p>Back for a fourth year at Minnebar, this rapid-fire summary will highlight the leading startups and discoveries in the world of solar, wind, nuclear, hydrogen and geo power. It will suggest what the future of energy might look like for technologists here in Minnesota: founders, engineers, designers, investors, policymakers, and anyone interested in clean energy.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>David Koerner</div><br>\n<p>David is a marketing nerd. He spent the last 8 years working in cleantech for a Bill Gates backed teck company, 75F, and speaks about the many marketing and messaging problems of climate change and the sustainability movement.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2058\">Attending</button><br>\n<div class='room' href='/maps/bde maka ska.png'><br>\nBde Maka Ska<br>\n</div><br>\n<h3 class='title'>Train AI To Be Your Employee</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>David Solberg</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Training an agent is surprisingly similar to training a real person.</p></p>\n<p><p>Both come with their own abilities, but you need to teach them to do things in ways specialized to your business. AI systems call these \"Skills,\" but they're essentially documentation of how to perform specialized tasks.</p></p>\n<p><p><strong>In this presentation, I will show how I trained an AI to perform a time-consuming administrative role that would be impractical for a human to do.</strong></p></p>\n<p><p>The agent works for a home maintenance company and researches and enters customized maintenance plans for homes. I will discuss the nuances of training, including task guidance, guardrails, and continuous learning.</p></p>\n<p><p>The first step is a human, who goes into the home and takes pictures of each appliance's nameplate, and then uploads those images to a folder.</p></p>\n<p><p>From there, the AI agent handles the rest:</p></p>\n<p><ul><br>\n<li><p>Identifies the manufacturer, brand, manufacture date, and appliance type.</p></li><br>\n<li><p>Queries the federal recall database to ensure there aren't active recalls for the appliance.</p></li><br>\n<li><p>Downloads the appliance manual and reads through it to determine customized maintenance tasks.</p></li><br>\n<li><p>Finds all filters for the appliance along with direct links to order replacements online.</p></li><br>\n<li><p>Enters all that information into a server database.</p></li><br>\n</ul></p>\n<p><p>This information is used by customers and technicians in web and mobile applications.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>David Solberg</div><br>\n<p>Software Engineer for 15 years. Entrepreneur.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2014\">Attending</button><br>\n<div class='room' href='/assets/maps/minnetonka-8db53e880d5b4f573c725f5992d6439094819117b370c096f6fb3275ef11ff65.png'><br>\nMinnetonka<br>\n</div><br>\n<h3 class='title'>Website Improv: You're the Worst Client Ever</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Tom Benbow</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I built a platform for developing websites. You're going to help me test it — by being the most difficult clients imaginable.</p></p>\n<p><p>Here's how it works: someone pitches a website idea, I build it live using Geppetto (the tool I've been building), and then you tell me everything that's wrong with it. More Comic Sans. Make the logo bigger. Actually, start over. I want it to feel more... blue. </p></p>\n<p><p>I'll do my best to keep up. It might go off the rails. That's the point.</p></p>\n<p><p>Along the way, I'll share some thoughts on how we can use AI to enhance our workflow while maintaining control.</p></p>\n<p><p>Come if you enjoy watching someone build things under pressure, have strong opinions about fonts, or have ever wanted to say \"I'll know it when I see it\" and mean it.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Tom Benbow</div><br>\n<p>Tom builds unusual software. Think motion-tracking experiences for kids, anonymous SMS-based lost and found, or a terminal-style life tracker that exposes patterns in your life — like you ate three burritos on your best climbing day. He's currently building Geppetto, a platform for building and managing websites that uses AI as an assistant, not the creative director. He has chosen to demo it live with no script. Fingers crossed.</p></p>\n<p><p><a href=\"https://www.tombenbow.com\">tombenbow.com</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1907\">Attending</button><br>\n<div class='room' href='/assets/maps/proverb-edison-755383e7ffbc56ede12758c2a7c9ef5773d26f109ef5c95e23659bce15322e33.png'><br>\nProverb-Edison<br>\n</div><br>\n<h3 class='title'>Writing the Video Game Narrative </h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Savannah Boedigheimer</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Beyond the skills to program and create your own video game, there is a process to create a unique story to base it on. In this session I will be teaching how to write the plot of your own video game. It will give you a step-by-step tutorial to begin your journey into writing an in-depth storyline that your players will love.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Savannah Boedigheimer</div><br>\n<p>Hello! I'm Savannah Boedigheimer, a first year graduate student at Southwest Minnesota State University working towards my MBA with a emphasis on event coordination, marketing, and entrepreneurship. I strive to continue working in social media marketing and event coordination, and am excited to explore more job opportunities in the business and marketing sectors.<br>\nI currently work as a consultant for the SW MN SBDC focused on content creation through Unauthorized LLC. I have nearly a decade experience in public speaking, being a presenter and at conferences such as THAT Conference, as well as nationally award winning competitive public speaking through FBLA-C.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2042\">Attending</button><br>\n<div class='room' href='/assets/maps/zeke landres-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nZeke Landres<br>\n</div><br>\n<h3 class='title'>Resume Refresh: Ready for AI, Designed to Impress</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Angela Peterson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>In today's market, your resume needs to be effective for every audience reviewing it, from the software screening you in or out, to the recruiter scanning your summary, to the hiring manager making the call. Your resume makes its first impression long before you do. The good news? You don't need to start from scratch.</p></p>\n<p><p>These strategies work with the resume you already have. In this session, we'll cover:</p></p>\n<p><ul><br>\n<li><p>Building a resume that passes ATS and AI screening tools without sounding robotic or \"AI-optimized\"</p></li><br>\n<li><p>Structuring your experience so recruiters can quickly identify your fit</p></li><br>\n<li><p>Transforming your existing resume into a clear and compelling narrative</p></li><br>\n<li><p>Highlighting impact and skills in a way that resonates with hiring managers</p></li><br>\n<li><p>How to make a lasting impression that sets you apart in a tight market</p></li><br>\n</ul></p>\n<p><p>Walk away with practical strategies to develop a resume that makes an impact and moves you forward.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Angela Peterson</div><br>\n<p>Angela Peterson is Lead Recruiter at VALERE Consulting and Recruiting, a woman-owned Twin Cities staffing agency, with 10+ years of experience specializing in IT, UX, Product, Business, and Executive roles for organizations ranging from startups to Fortune 5 enterprises nationwide, helping candidates in our community understand the power of positioning and what actually makes a resume stand out, from structure and storytelling to the subtle details that make a strong impact.</p></p>\n<p><p><a href=\"https://www.linkedin.com/in/angela-peterson25/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1959\">Attending</button><br>\n<div class='room' href='/assets/maps/challenge-83825ec7e9dac09a92e7320dee95e09bf83a63d10f385e33dc9a158444a51b2d.png'><br>\nChallenge<br>\n</div><br>\n<h3 class='title'>Cannabis! Building a cultivation, R&D, manufacturing and dispensary business in the Twin Cities. </h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Mary MacCarthy</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Recreational, adult use cannabis is now legal in Minnesota. What's it like building a large cannabis business compared to other healthcare or high tech businesses? Join me to hear the Northern Calyx journey and get free merch. </p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Mary MacCarthy</div><br>\n<p>After 35 years at 3M, Medtronic, Imation, Cardiovascular Systems, University of Minnesota, startups and consulting, I've stepped into a cannabis CEO gig. </p></p>\n<p><p><a href=\"https://www.linkedin.com/in/marymaccarthy/\">https://www.linkedin.com/in/marymaccarthy/</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1953\">Attending</button><br>\n<div class='room' href='/assets/maps/learn-df050961fbc6679fe483e013b5e138016dc74f3ac11cb7f6fccba519e8f71bf5.png'><br>\nLearn<br>\n</div><br>\n<h3 class='title'>Hack Your Legal Costs: AI + Your Attorney in 2026</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Alex Frescoln</div><br>\n<div class='presenter'>Todd Taylor</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Founders are already using ChatGPT, Grok, Claude and other AI to draft contracts, review investor terms, and do legal research. Some of that's great, and some of it's going to cost you your company when it blows up.</p></p>\n<p><p>This session is a practical walkthrough of how to use AI and your lawyer together to get quality legal work done faster and cheaper. We'll look at live examples: AI drafting a SAFE (what it nails, what it hallucinates), AI reviewing a contractor agreement (what it catches, what it misses), and AI \"doing legal research\" (when it's useful, when it's confidently making things up).</p></p>\n<p><p>You'll leave knowing:</p></p>\n<p><ul><br>\n<li>How to use AI output to make your lawyer faster and your bill smaller</li><br>\n<li>The mistakes AI makes about startup legal work that could actually sink your company</li><br>\n<li>Confidentiality risks with AI</li><br>\n<li>What an AI-forward law firm looks like in practice, and why it matters for your budget</li><br>\n</ul></p>\n<p><p>This isn't a talk about AI replacing lawyers. It's about founders being smarter about how they use both. Bring your laptop.</p></p>\n<p><p>Presenters: Todd Taylor and Alex Frescoln, Avisen Legal — startup and business lawyers with an AI-forward practice serving founders, funders, and growth companies.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Alex Frescoln</div><br>\n<p>I'm a Startup Attorney who works with founders, project developers, and established companies launching new ventures. I enjoy working with companies that are looking for innovative solutions to solve tough problems. Avisen Legal services cover formation, fundraising, equity structuring, governance, contracts, and more.</p></p>\n<p><p><a href=\"https://www.avisenlegal.com/team/alex-frescoln/\">https://www.avisenlegal.com/team/alex-frescoln/</a></p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Todd Taylor</div><br>\n<p>I’m an enthusiastic entrepreneurial attorney for startups, founders and funders. I work with companies in all industries but have always loved technology companies. At Avisen we do incorporation, founders agreements, incentive plans, series seed, SAFEs, series A and everything a startup and their funders need to grow and succeed.</p></p>\n<p><p><a href=\"https://www.avisenlegal.com/team/todd-taylor/\">https://www.avisenlegal.com/team/todd-taylor/</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1909\">Attending</button><br>\n<div class='room' href='/assets/maps/discovery-fb2e2f3f87843e262b3141afaeffa503953ff10f6548030f8395dd1ae8f0db06.png'><br>\nDiscovery<br>\n</div><br>\n<h3 class='title'>Bootstrapping Your E-Commerce Empire Side Hustle With No Money</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Jonathan Spaulding</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>This session is a tactical walkthrough of bootstrapping a micro e-commerce business using 3D printing and eBay. We’ll cover niche selection, rapid product iteration, demand validation and fulfillment, all without spending a nickel. Whether you’re a maker, a marketer, or just side-hustle curious, you’ll leave with a clear path to launch something small, scrappy, and profitable.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Jonathan Spaulding</div><br>\n<p>Jonathan writes software by day and runs a tiny 3D-printed manufacturing empire by night. He enjoys creative side projects like building campers, wiring up LED games with Raspberry Pis, and turning random ideas into things that actually exist. Known to juggle, dance, and talk to strangers.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1899\">Attending</button><br>\n<div class='room' href='/assets/maps/gandhi-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nGandhi<br>\n</div><br>\n<h3 class='title'>Multiplayer Interactive Fiction on the Elixir VM</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Brent Anderson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>This session aims to answer the age-old question: \"What would happen if you mixed the modern Elixir programming language with interactive fiction in the style of Zork or 'Choose-your-own-adventure' stories?\"</p></p>\n<p><p>While it may seem an unlikely mashup, the actor-based model of <a href=\"https://www.inklestudios.com/ink\">Elixir</a> combined with the non-linear workflows possible in the <a href=\"https://www.inklestudios.com/ink\">Ink scripting language</a> for narrative fiction fit together to create an interesting, fun environment.</p></p>\n<p><p>A few things that may come out of this session include:</p></p>\n<p><ul><br>\n<li>A more humane alternative to forcing AI automation into flows that demand a human touch</li><br>\n<li>How to design dynamic, complex, multiplayer entertainment experiences</li><br>\n<li>Incorporating complex consequences into non-linear workflow engines</li><br>\n<li>The sheer fun of messing with storytelling while learning about the actor model of programming</li><br>\n</ul></p>\n<p><p>Come for the storytelling, stay for the drama of Actors with Inky scripts!</p></p>\n<p><p>Regarding topic level: Although we will be engaging with topics that are themselves extremely deep (narrative fiction, actor-based programming models), this session will aim to be accessible to a general audience.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Brent Anderson</div><br>\n<p>I am a technical co-founder who builds teams & crafts software. Currently, I am a founding software engineer @ <a href=\"https://knock.app\">Knock Labs</a> 🖖.</p></p>\n<p><p>👨💻 Past roles include founder, engineering manager, full-stack software engineer, mobile developer, and non-profit board member. I have lead teams across a variety of industries, including tech startups, hospitality, education, entertainment, and logistics.</p></p>\n<p><ul><br>\n<li><a href=\"https://brentjanderson.com\">Brent's website</a></li><br>\n</ul></p>\n<p><p>\"We think too much and feel too little. More than machinery, we need humanity; more than cleverness, we need kindness and gentleness. Without these qualities, life will be violent and all will be lost.\" <br>\n~ Charlie Chaplin</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n</div><br>\n<div class='column'><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1939\">Attending</button><br>\n<div class='room' href='/assets/maps/stephen leacock-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nStephen Leacock<br>\n</div><br>\n<h3 class='title'>Early Stage Funding in Minnesota</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Sean E. Williams</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>With the launch of the Minnesota Angel Investor Network, there are new opportunities for funding in Minnesota! Learn how getting funding from angel investors works, as well as other funding options available within the state. Also, learn what makes a good pitch, and what to avoid.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Sean E. Williams</div><br>\n<p>Sean E. Williams is an award-winning ecosystem innovator with 20+ years of experience in cross-sector collaboration, strategy, and innovation. He is passionate about creating opportunities for entrepreneurs and businesses for long-term growth and sustainability, with a mission of diversity, equity, and inclusion. He is currently the Executive Director of the Owatonna Area Business Development Center, as well as co-founder and COO of FanSpark. Sean is also a New York Times bestselling comic book writer.</p></p>\n<p><p><a href=\"https://owatonna.biz\">Owatonna Area Business Development Center</a><br>\n<a href=\"https://fanspark.pro\">FanSpark</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2111\">Attending</button><br>\n<div class='room' href='/assets/maps/tackle-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nTackle<br>\n</div><br>\n<h3 class='title'>The AI Native SDLC: Idea to Working Code at Scale, Live</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Michael Halagan</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>I've been putting together a workflow that uses Claude Code Plugins, a custom docs MCP server, and the Linear MCP to take an idea from rough sketch to work items that are actually ready to build, and then from tickets into working code. This talk is a live walkthrough of that.</p></p>\n<p><p>I'll start with a brand new idea and take it through the whole flow in front of you. A PM-style prototype turning into scoped Linear tickets, Claude Code picking those tickets up, and doing the implementation work. Along the way I'll compare each step to how the same thing would play out in a more traditional flow, since that's where the value becomes obvious.</p></p>\n<p><p>The stack:</p></p>\n<p><ul><br>\n<li><br>\n<strong>Claude Code Plugins</strong> for role-specific workflows, so the PM step, the engineering step, and the review step each have their own purpose-built experience</li><br>\n<li><br>\n<strong>A custom docs MCP server</strong> that gives every agent the same grounding in product context, architecture, and team conventions</li><br>\n<li><br>\n<strong>The Linear MCP</strong> so the output lands as real work items, not yet another tool your team has to remember to check</li><br>\n</ul></p>\n<p><p>If you're a PM trying to hand engineering better-formed ideas, an engineer tired of untangling half-baked tickets, or a founder looking to cut down on handoffs between idea and code, I think you'll get something out of this one.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Michael Halagan</div><br>\n<p>Mike Halagan is the founder and CEO of Local AI, a Twin Cities consulting firm that helps companies put AI to work in production. He's spent the last 15+ years building ML and AI systems, starting as a bioinformatics scientist at Be The Match working on bone marrow donor-recipient matching, then moving through data science, engineering, and leadership roles at C.H. Robinson where he eventually led 50+ engineers across five teams. The dynamic pricing engine his teams shipped became a recurring talking point on quarterly earnings calls.</p></p>\n<p><p>These days he spends most of his time embedded with client engineering teams, designing and shipping LLM and agent-based systems on AWS Bedrock AgentCore and Azure Agent Service. Recent work has included customer-facing chatbots, underwriting agents, compliance automation, and end-to-end MLOps platforms for clients in healthcare, insurance, retail, and logistics. </p></p>\n<p><p>Based in Maple Grove. M.S. in Biomedical Informatics & Computational Biology from the University of Minnesota.</p></p>\n<p><p><a href=\"https://www.linkedin.com/in/mikehalagan/\">LinkedIn</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1931\">Attending</button><br>\n<div class='room' href='/assets/maps/louis pasteur-9f0b7af613e518dab5aea75637ec4edd0848a17700decfc744811b11083c317b.png'><br>\nLouis Pasteur<br>\n</div><br>\n<h3 class='title'>End-to-end tests considered harmful (securing credentials for E2E and synthetic testing)</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Katie Kodes</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Last summer, eager to show a team how easily they could author Microsoft Playwright tests to determine whether their site still works after each new vendor patch ... I came five seconds away from hitting \"send\" on a test run results report that would have included:</p></p>\n<p><ol><br>\n<li>screenshots of my bank account number, and</li><br>\n<li>browser history including a cookie that could have let them log in as me and reroute my next payments to themselves.</li><br>\n</ol></p>\n<p><p>My impatient boundless enthusiasm is partly to blame, but it could happen to any of us, because the problem is inherent to the nature of automation:</p></p>\n<p><ul><br>\n<li><br>\n<strong>Credential</strong> problems arise quickly when we take humans out of the loop and automate testing <strong>authenticated systems</strong>.</li><br>\n</ul></p>\n<p><p>This session explores the security implications of common testing practices, and presents practical alternatives that maintain quality assurance and observability without compromising security.</p></p>\n<p><p>You'll learn authentication and authorization patterns to improve test security across the software development lifecycle.</p></p>\n<p><p>Properly implementing mitigations like health check endpoints, synthetic data, and privilege separation likely involves more subject matter expertise than is reasonable to expect everyone to hold at once, so you'll leave this session with a shareable vocabulary you can use to align business, development, quality, identity, security, and monitoring teams as you work toward safer test automation against your most important systems.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Katie Kodes</div><br>\n<p>Once told, \"I've always imagined your brain is shaped like an old-fashioned library card catalog,\" Katie is thrilled by any chance to help others find -- and maintain -- order in their data and tech processes.</p></p>\n<p><p><strong>Links:</strong></p></p>\n<p><ul><br>\n<li><a href=\"https://www.katiekodes.com/\">KatieKodes.com blog</a></li><br>\n</ul></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2054\">Attending</button><br>\n<div class='room' href='/maps/nevada.png'><br>\nNevada<br>\n</div><br>\n<h3 class='title'>Secure AI Agents from Development to Runtime </h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Kishor Patil</div><br>\n<div class='presenter'>Misho Changalov</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>The Distance Between \"Hello World\" and \"Secure-at-Scale\"<br>\n A developer spins up an AI agent, gives it access to a database, and suddenly magic happens. It’s writing emails, taking actions, and automating the enterprise. It looks flawless. It feels like the future.</p></p>\n<p><p>I’m here to talk about why that magic often breaks the moment it hits a production firewall.</p></p>\n<p><p>As a practitioner leading GCP architecture, I spend a lot of time thinking about the distance between a \"smart\" agent and a \"secure\" one. The gap isn't usually the LLM's intelligence; it’s the Decision Architecture we build around it. </p></p>\n<p><p>In this session, we’re moving past the AI hype to look at the actual scars of building secure agentic workflows. We will move through the lifecycle of an agent, from the initial development sandbox to a governed, enterprise runtime.</p></p>\n<p><p>What we will explore together:</p></p>\n<p><p>The Development Gap: Why \"Prompt Engineering\" isn't a security strategy and how we build supply chain trust for models.<br>\nThe Runtime Reality: Encoding enterprise \"values\" into technical guardrails using GCP’s security suite.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Kishor Patil</div><br>\n<p>I am a Senior Manager of Cloud Platform Engineering at Best Buy, where I lead enterprise-scale Google Cloud and AI deployments. </p></p>\n<p></div><br>\n<div class='bio'><br>\n<div class='name'>Misho Changalov</div><br>\n<p>Moved from anything Integration to anything AI&ML and cloud throughout my career. I like to detangle technical knots, draw, design and lead teams of smart people. Currently holding a position of a Senior Engineering Manager at Best Buy.</p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"2088\">Attending</button><br>\n<div class='room' href='/assets/maps/texas-23344a38e113415658ae210154eb5eb82d6559ba6e9d80139637c879fbc8df24.png'><br>\nTexas<br>\n</div><br>\n<h3 class='title'>💥We Blame the Dogs, But...Have You Seen the Humans!: Designing Behavior Where Pressure Builds.</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Air Gustafson</div><br>\n</div><br>\n</div><br>\n<div class='description'><br>\n<p>Dog parks are one of the few public spaces with zero behavioral infrastructure—and predictable conflict points.</p></p>\n<p><p>Instead of blaming “bad dogs” or “irresponsible owners,” what if we designed simple, visible systems that guide human behavior at the exact moments pressure builds?</p></p>\n<p><p>In this session, we’ll break down one real-world scenario (dog park gate entry) and explore how small design signals—timing, spacing, movement—can reduce friction before it escalates.</p></p>\n<p><p>If you work in product, UX, behavior or systems design, this is a live case study in shaping behavior without rules, enforcement, or training.</p></p>\n<p><div class='bios'><br>\n<div class='bio'><br>\n<div class='name'>Air Gustafson</div><br>\n<p>Air Gustafson is the founder of Morty’s Bark & Brew and Bliss by Meatspace. She works at the intersection of human behavior and shared environments, designing simple systems that help people navigate pet-inclusive spaces with more awareness and less friction.</p></p>\n<p><p>Her current focus is developing a real-world pilot that applies these principles to dog parks, reframing behavior not as training, but as infrastructure.</p></p>\n<p><p>💼<a href=\"https://www.linkedin.com/feed/update/urn:li:activity:7445853479857778688/?originTrackingId=CngoAf4KtzAmhL%2FwvbB76A%3D%3D\">LinkedIn</a><br>\n🐾<a href=\"https://www.mortysbarkbrew.com/\">Morty's Bark & Brew</a><br>\n🧭<a href=\"https://brand.page/meatspacedog\">Meatspace</a></p></p>\n<p></div><br>\n</div><br>\n</div><br>\n<div class='summary'></div><br>\n</div><br>\n<div class='session'><br>\n<div class='header'><br>\n<button class=\"toggle-attendance\" data-session-id=\"1924\">Attending</button><br>\n<div class='room' href='/maps/california.png'><br>\nCalifornia<br>\n</div><br>\n<h3 class='title'>Whose Utopia? Restructuring the Digital Environment in an Age of Human - AI Relationships</h3><br>\n<div class='presenters'><br>\n<div class='presenter'>Kris Taylor</div></p>\n<p>Context: [Document content lines 2001-4000]</p>\n</details><p>Looking at the HTML structure, I have everything I need. Let me analyze the key patterns:</p>\n<p><strong>From the source:</strong></p>\n<ul>\n<li>Timeslot blocks have <code>startsAt</code> and <code>endsAt</code> Unix timestamps on the <code><a class='timeslot'></code> nav elements</li>\n<li>Each <code>.timeslot</code> div has an <code>id</code> like <code>timeslot_172</code></li>\n<li>Sessions have <code><button class=\"toggle-attendance\" data-session-id=\"...\" data-session-attending=\"true\"></code></li>\n<li>Room is in <code><div class='room'></code>, title in <code><h3 class='title'></code>, presenters in <code>.presenter</code> divs</li>\n</ul>\n<p>The nav anchors have the timestamps, and the timeslot content divs are matched by ID. Here's the bookmarklet:</p>\n<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code>javascript:<span class=\"p\">(</span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">{</span>\n <span class=\"c\">// Build a map of timeslot id -> {start, end} from nav anchors</span>\n <span class=\"k\">const</span> <span class=\"n\">timeMap</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.nav-top .timeslot[startsAt]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span> <span class=\"c\">// e.g. #timeslot_172</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">href</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s\">'#'</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n start: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'startsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span><span class=\"p\">,</span>\n end: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'endsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span>\n <span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">events</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.timeslot[id]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">block</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">block</span><span class=\"p\">.</span>id<span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">times</span> <span class=\"o\">=</span> <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">times</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span> <span class=\"c\">// skip blocks without timestamps (registration, lunch, etc.)</span>\n\n <span class=\"n\">block</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.session'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">session</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">btn</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'button.toggle-attendance'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">btn</span> <span class=\"o\">||</span> <span class=\"n\">btn</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'data-session-attending'</span><span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"s\">'true'</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">titleEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'h3.title'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">roomEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.room'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">presenterEls</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.presenter'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">titleEl</span> ? <span class=\"n\">titleEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">'Untitled Session'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">location</span> <span class=\"o\">=</span> <span class=\"n\">roomEl</span> ? <span class=\"n\">roomEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">''</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">presenters</span> <span class=\"o\">=</span> <span class=\"nf\">Array</span><span class=\"p\">.</span><span class=\"nf\">from</span><span class=\"p\">(</span><span class=\"n\">presenterEls</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">map</span><span class=\"p\">(</span><span class=\"n\">p</span> <span class=\"o\">=></span> <span class=\"n\">p</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">', '</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"p\">{</span> title<span class=\"p\">,</span> location<span class=\"p\">,</span> presenters<span class=\"p\">,</span> start: <span class=\"n\">times</span><span class=\"p\">.</span>start<span class=\"p\">,</span> end: <span class=\"n\">times</span><span class=\"p\">.</span>end <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">===</span> 0<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'No attended sessions found. Make sure you are marked as attending sessions.'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">unixSec</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Date</span><span class=\"p\">(</span><span class=\"n\">unixSec</span> <span class=\"o\">*</span> 1000<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">d</span><span class=\"p\">.</span><span class=\"nf\">toISOString</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"p\">[</span><span class=\"sc\">-</span><span class=\"sc\">:</span><span class=\"p\">]</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\.</span><span class=\"se\">\\d</span><span class=\"p\">{</span>3<span class=\"p\">}</span><span class=\"o\">/</span></span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">str</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">return</span> <span class=\"n\">str</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\\\</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\\\\\'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">;</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\;'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">,</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\,'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\n</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"c\">// ICS lines must be <= 75 octets; fold with CRLF + space</span>\n <span class=\"k\">const</span> <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span>length <span class=\"o\">></span> 75<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>0<span class=\"p\">,</span> 75<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"s\">' '</span> <span class=\"o\">+</span> <span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>75<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">const</span> <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n <span class=\"s\">'BEGIN:VCALENDAR'</span><span class=\"p\">,</span>\n <span class=\"s\">'VERSION:2.0'</span><span class=\"p\">,</span>\n <span class=\"s\">'PRODID:-//Minnebar Schedule Bookmarklet//EN'</span><span class=\"p\">,</span>\n <span class=\"s\">'CALSCALE:GREGORIAN'</span><span class=\"p\">,</span>\n <span class=\"s\">'METHOD:PUBLISH'</span>\n <span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">uid</span> <span class=\"o\">=</span> <span class=\"s\">'minnebar-'</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>start <span class=\"o\">+</span> <span class=\"s\">'-'</span> <span class=\"o\">+</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"s\">'@minnestar.org'</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'BEGIN:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'UID:'</span> <span class=\"o\">+</span> <span class=\"n\">uid</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTART:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>start<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTEND:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>end<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'SUMMARY:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>title<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'LOCATION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>presenters<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'DESCRIPTION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"s\">'Presenters: '</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>presenters<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VCALENDAR'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">icsContent</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">blob</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Blob</span><span class=\"p\">(</span><span class=\"p\">[</span><span class=\"n\">icsContent</span><span class=\"p\">]</span><span class=\"p\">,</span> <span class=\"p\">{</span> type: <span class=\"s\">'text/calendar;charset=utf-8'</span> <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">createObjectURL</span><span class=\"p\">(</span><span class=\"n\">blob</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">createElement</span><span class=\"p\">(</span><span class=\"s\">'a'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>href <span class=\"o\">=</span> <span class=\"n\">url</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>download <span class=\"o\">=</span> <span class=\"s\">'minnebar-schedule.ics'</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">appendChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">click</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">removeChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">revokeObjectURL</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'Downloaded '</span> <span class=\"o\">+</span> <span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">+</span> <span class=\"s\">' session(s) to minnebar-schedule.ics'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n</code></pre></div>\n<p><strong>To install as a bookmarklet:</strong></p>\n<ol>\n<li>Create a new bookmark in your browser</li>\n<li>Paste the entire code above as the URL (it must start with <code>javascript:</code>)</li>\n<li>Navigate to <code>https://sessions.minnestar.org/schedule</code></li>\n<li>Click the bookmarklet</li>\n</ol>\n<p><strong>How it works:</strong></p>\n<ul>\n<li>Reads <code>startsAt</code>/<code>endsAt</code> Unix timestamps from the nav timeslot anchors and maps them to timeslot IDs</li>\n<li>Finds all sessions where <code>data-session-attending=\"true\"</code></li>\n<li>Extracts title, room (location), and presenters (description)</li>\n<li>Generates a valid <code>.ics</code> file with proper line folding and escaping</li>\n<li>Triggers a download automatically</li>\n</ul>\n<p><strong>One caveat:</strong> The \"all day\" sessions (timeslot_171) and special blocks like Registration/Kickoff don't have nav anchor timestamps, so they'll be skipped. Only the numbered session blocks (Block 1–8) have timestamps and will be included.</p>","md":"Looking at the HTML structure, I have everything I need. Let me analyze the key patterns:\n\n**From the source:**\n- Timeslot blocks have `startsAt` and `endsAt` Unix timestamps on the `<a class='timeslot'>` nav elements\n- Each `.timeslot` div has an `id` like `timeslot_172`\n- Sessions have `<button class=\"toggle-attendance\" data-session-id=\"...\" data-session-attending=\"true\">`\n- Room is in `<div class='room'>`, title in `<h3 class='title'>`, presenters in `.presenter` divs\n\nThe nav anchors have the timestamps, and the timeslot content divs are matched by ID. Here's the bookmarklet:\n\n```javascript\njavascript:(function(){\n // Build a map of timeslot id -> {start, end} from nav anchors\n const timeMap = {};\n document.querySelectorAll('.nav-top .timeslot[startsAt]').forEach(a => {\n const href = a.getAttribute('href'); // e.g. #timeslot_172\n const id = href.replace('#', '');\n timeMap[id] = {\n start: parseInt(a.getAttribute('startsAt'), 10),\n end: parseInt(a.getAttribute('endsAt'), 10)\n };\n });\n\n const events = [];\n\n document.querySelectorAll('.timeslot[id]').forEach(block => {\n const id = block.id;\n const times = timeMap[id];\n if (!times) return; // skip blocks without timestamps (registration, lunch, etc.)\n\n block.querySelectorAll('.session').forEach(session => {\n const btn = session.querySelector('button.toggle-attendance');\n if (!btn || btn.getAttribute('data-session-attending') !== 'true') return;\n\n const titleEl = session.querySelector('h3.title');\n const roomEl = session.querySelector('.room');\n const presenterEls = session.querySelectorAll('.presenter');\n\n const title = titleEl ? titleEl.textContent.trim() : 'Untitled Session';\n const location = roomEl ? roomEl.textContent.trim() : '';\n const presenters = Array.from(presenterEls).map(p => p.textContent.trim()).join(', ');\n\n events.push({ title, location, presenters, start: times.start, end: times.end });\n });\n });\n\n if (events.length === 0) {\n alert('No attended sessions found. Make sure you are marked as attending sessions.');\n return;\n }\n\n function toICSDate(unixSec) {\n const d = new Date(unixSec * 1000);\n return d.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n function escapeICS(str) {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n }\n\n function foldLine(line) {\n // ICS lines must be <= 75 octets; fold with CRLF + space\n const out = [];\n while (line.length > 75) {\n out.push(line.substring(0, 75));\n line = ' ' + line.substring(75);\n }\n out.push(line);\n return out.join('\\r\\n');\n }\n\n const lines = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//Minnebar Schedule Bookmarklet//EN',\n 'CALSCALE:GREGORIAN',\n 'METHOD:PUBLISH'\n ];\n\n events.forEach((ev, i) => {\n const uid = 'minnebar-' + ev.start + '-' + i + '@minnestar.org';\n lines.push('BEGIN:VEVENT');\n lines.push(foldLine('UID:' + uid));\n lines.push('DTSTART:' + toICSDate(ev.start));\n lines.push('DTEND:' + toICSDate(ev.end));\n lines.push(foldLine('SUMMARY:' + escapeICS(ev.title)));\n if (ev.location) lines.push(foldLine('LOCATION:' + escapeICS(ev.location)));\n if (ev.presenters) lines.push(foldLine('DESCRIPTION:' + escapeICS('Presenters: ' + ev.presenters)));\n lines.push('END:VEVENT');\n });\n\n lines.push('END:VCALENDAR');\n\n const icsContent = lines.join('\\r\\n');\n const blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'minnebar-schedule.ics';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n alert('Downloaded ' + events.length + ' session(s) to minnebar-schedule.ics');\n})();\n```\n\n**To install as a bookmarklet:**\n1. Create a new bookmark in your browser\n2. Paste the entire code above as the URL (it must start with `javascript:`)\n3. Navigate to `https://sessions.minnestar.org/schedule`\n4. Click the bookmarklet\n\n**How it works:**\n- Reads `startsAt`/`endsAt` Unix timestamps from the nav timeslot anchors and maps them to timeslot IDs\n- Finds all sessions where `data-session-attending=\"true\"`\n- Extracts title, room (location), and presenters (description)\n- Generates a valid `.ics` file with proper line folding and escaping\n- Triggers a download automatically\n\n**One caveat:** The \"all day\" sessions (timeslot_171) and special blocks like Registration/Kickoff don't have nav anchor timestamps, so they'll be skipped. Only the numbered session blocks (Block 1–8) have timestamps and will be included.","profile":{"id":"095899c5-634b-4eeb-ad03-41fd508fbb51","name":"Code","accessible":true,"model":"claude-4-sonnet","deprecate":false,"retired":false,"successor_model":null,"model_name":"Claude 4.6 Sonnet","model_provider":"anthropic","model_input_limit":1000000,"recommended":false,"model_info":"\n\n\n\n<div class=\"heading\">\n <div class=\"left\">\n \n \n \n <svg class=\"model-icon icon-xs\" data-model=\"claude-4-sonnet\">\n <use href=\"#icon-kagi-1\"/>\n </svg>\n <h3>\n \n <span class=\"model-name\">Code</span>\n </h3>\n </div>\n\n \n</div>\n\n\n<hr />\n<ul>\n \n <li>\n <h4>\n Model\n </h4>\n <span class=\"flex align-center gap-8\">\n <svg class=\"icon-xs icon\">\n <use href=\"#icon-anthropic\" />\n </svg>\n <span class=\"model-name\">Claude 4.6 Sonnet</span>\n </span>\n </li>\n <li>\n <h4>\n Web access\n </h4>\n <span>On</span>\n </li>\n <li>\n <h4>\n Lenses\n </h4>\n <span>--</span>\n </li>\n \n</ul>\n\n\n","model_provider_name":"Anthropic","internet_access":true,"personalizations":false,"shortcut":null,"is_default_profile":true},"metadata":"<li>\n <span class=\"attribute\">Model</span>\n <span class=\"value\"><i class=\"icon-xs mr-4\"><svg><use href=\"#icon-anthropic\"></use></svg></i>Claude 4.6 Sonnet</span>\n</li>\n<li>\n <span class=\"attribute\">Version</span>\n <span class=\"value\">claude-sonnet-4-6</span>\n</li>\n<li>\n <span class=\"attribute\">Speed (tok/s)</span>\n <span class=\"value\">64</span>\n</li>\n<li>\n <span class=\"attribute\">Tokens</span>\n <span class=\"value\">50,181</span>\n</li>\n<li>\n <span class=\"attribute\">Cost / Total ($)</span>\n <span class=\"value\">0.21 / 0.21</span>\n</li>\n<li>\n <span class=\"attribute\">End to end time (s)</span>\n <span class=\"value\">38.83</span>\n</li>\n<li>\n <span class=\"attribute\">Submitted</span>\n <span class=\"value\">2026-04-30 19:14</span>\n</li>\n\n","documents":[{"id":"d330c34a-6776-46ae-9fee-141665325649","name":"message-2650a821-bffc-4e9d-a65c-04ffa453c7f0.txt","type":"file","mime":"text/plain","data":"data:text/plain;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFt\nZT0iY3NyZi1wYXJhbSIgY29udGVudD0iYXV0aGVudGljaXR5X3Rva2VuIiAv\nPgo8bWV0YSBuYW1lPSJjc3JmLXRva2VuIiBjb250ZW50PSJaYmhTekVWaTV5\nNnlFbV95RE9PNnkzdWQ2OWxEbzF6cDR6aEVEdmE2b2JYUEk2V29qd0VTVGxN\nWGtYaG5vaktFTUxYTjdPdTFlZHMtZ0FIOWZ1MDFjUSIgLz4KICAgIDx0aXRs\nZT5NaW5uZWJhcjIwIOKAkyBTZXNzaW9uIFNjaGVkdWxlPC90aXRsZT4KICAg\nIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL2Fzc2V0cy9hcHBsaWNh\ndGlvbi03ZDQwNmE5ZDM5MjVkNTAxYWYzZTNmYWJmOTk3MTM3MzU3MjM1YWUw\nYWJiNzI3ZTVmZDdjODNiNjA4Y2MyYTBmLmNzcyIgbWVkaWE9ImFsbCIgLz4K\nICAgIDxzY3JpcHQgc3JjPSIvYXNzZXRzL2FwcGxpY2F0aW9uLTY0M2E4NDM5\nMTliMDQyMmRjZWU1ZDQzZjUyODc4OGM3NTRmYWIxMzY0ZDIwYjJhNWVkNTBl\nMjA1YWI2YmQwNzMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJpY29u\nIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9hc3NldHMvZmF2aWNvbi1m\nNTg1MWI4NTRiZWUxZGNhZGExZmU3ZTNjYjZmM2UxZjhiYWNjOTVhNDIyNzdj\nYTBkMzlmNDc3NTIxMDFhMWJlLmljbyIgLz4KCiAgICA8bWV0YSBodHRwLWVx\ndWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UsY2hyb21l\nPTEiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRo\nPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8bWV0YSBwcm9w\nZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9Ik1pbm5lYmFyMjAg4oCTIFNlc3Np\nb24gU2NoZWR1bGUiIC8+CjxtZXRhIG5hbWU9InR3aXR0ZXI6dGl0bGUiIGNv\nbnRlbnQ9Ik1pbm5lYmFyMjAg4oCTIFNlc3Npb24gU2NoZWR1bGUiPgo8bWV0\nYSBuYW1lPSJ0d2l0dGVyOmNhcmQiIGNvbnRlbnQ9InN1bW1hcnlfbGFyZ2Vf\naW1hZ2UiPgo8bWV0YSBuYW1lPSJ0d2l0dGVyOmltYWdlIiBjb250ZW50PSJo\ndHRwczovL3Nlc3Npb25zLm1pbm5lc3Rhci5vcmcvYXNzZXRzL3NvY2lhbC1w\ncmV2aWV3LTlkMWYwZWExOWMwMjc1NDI0NjQ0ZmEwNTYyMTMwMDFjMWQ2NWNh\nYzNjNGNhNjMwMjE5ZjI3Njc4OTcyZjI4ZTkucG5nIj4KPG1ldGEgcHJvcGVy\ndHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL3Nlc3Npb25zLm1pbm5l\nc3Rhci5vcmcvYXNzZXRzL3NvY2lhbC1wcmV2aWV3LTlkMWYwZWExOWMwMjc1\nNDI0NjQ0ZmEwNTYyMTMwMDFjMWQ2NWNhYzNjNGNhNjMwMjE5ZjI3Njc4OTcy\nZjI4ZTkucG5nIj4KPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlOmFsdCIgY29u\ndGVudD0iTWlubmViYXIyMCBpcyBhIHBhcnRpY2lwYW50LWxlZCB1bmNvbmZl\ncmVuY2UgZnJlZSBhbmQgb3BlbiB0byBhbGwuIEl0JiMzOTtsbCBiZSBoZWxk\nIG9uIFNhdHVyZGF5LCBNYXkgMm5kLCAyMDI2IGZyb20gOGFtLTdwbSBhdCBC\nZXN0IEJ1eSBIUS4iPgo8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24i\nIGNvbnRlbnQ9Ik1pbm5lYmFyMjAgaXMgYSBwYXJ0aWNpcGFudC1sZWQgdW5j\nb25mZXJlbmNlIGZyZWUgYW5kIG9wZW4gdG8gYWxsLiBJdCYjMzk7bGwgYmUg\naGVsZCBvbiBTYXR1cmRheSwgTWF5IDJuZCwgMjAyNiBmcm9tIDhhbS03cG0g\nYXQgQmVzdCBCdXkgSFEuIiAvPgo8bWV0YSBuYW1lPSJ0d2l0dGVyOmRlc2Ny\naXB0aW9uIiBjb250ZW50PSJNaW5uZWJhcjIwIGlzIGEgcGFydGljaXBhbnQt\nbGVkIHVuY29uZmVyZW5jZSBmcmVlIGFuZCBvcGVuIHRvIGFsbC4gSXQmIzM5\nO2xsIGJlIGhlbGQgb24gU2F0dXJkYXksIE1heSAybmQsIDIwMjYgZnJvbSA4\nYW0tN3BtIGF0IEJlc3QgQnV5IEhRLiI+CjxtZXRhIG5hbWU9ImRlc2NyaXB0\naW9uIiBjb250ZW50PSJNaW5uZWJhcjIwIGlzIGEgcGFydGljaXBhbnQtbGVk\nIHVuY29uZmVyZW5jZSBmcmVlIGFuZCBvcGVuIHRvIGFsbC4gSXQmIzM5O2xs\nIGJlIGhlbGQgb24gU2F0dXJkYXksIE1heSAybmQsIDIwMjYgZnJvbSA4YW0t\nN3BtIGF0IEJlc3QgQnV5IEhRLiI+CiAKCiAgICAKICA8L2hlYWQ+CiAgPGJv\nZHkgaWQ9J3NjaGVkdWxlLWJvZHknPgogICAgPGRpdiBjbGFzcz0nbmF2LXRv\ncCc+CjxkaXYgY2xhc3M9J3RpbWVzbG90cyc+CjxhIGNsYXNzPSd0aW1lc2xv\ndCcgZW5kc0F0PScxNzc3NzM1NTAwJyBocmVmPScjdGltZXNsb3RfMTcyJyBp\nZD0ndGltZXNsb3RfMTcyX25hdicgc3RhcnRzQXQ9JzE3Nzc3MzMxMDAnPgog\nOTo0NQo8L2E+CjxhIGNsYXNzPSd0aW1lc2xvdCcgZW5kc0F0PScxNzc3NzM4\nODAwJyBocmVmPScjdGltZXNsb3RfMTczJyBpZD0ndGltZXNsb3RfMTczX25h\ndicgc3RhcnRzQXQ9JzE3Nzc3MzY0MDAnPgoxMDo0MAo8L2E+CjxhIGNsYXNz\nPSd0aW1lc2xvdCcgZW5kc0F0PScxNzc3NzQyMTAwJyBocmVmPScjdGltZXNs\nb3RfMTc1JyBpZD0ndGltZXNsb3RfMTc1X25hdicgc3RhcnRzQXQ9JzE3Nzc3\nMzk3MDAnPgoxMTozNQo8L2E+CjxhIGNsYXNzPSd0aW1lc2xvdCcgZW5kc0F0\nPScxNzc3NzQ1NDAwJyBocmVmPScjdGltZXNsb3RfMTc3JyBpZD0ndGltZXNs\nb3RfMTc3X25hdicgc3RhcnRzQXQ9JzE3Nzc3NDMwMDAnPgoxMjozMAo8L2E+\nCjxhIGNsYXNzPSd0aW1lc2xvdCcgZW5kc0F0PScxNzc3NzQ4NzAwJyBocmVm\nPScjdGltZXNsb3RfMTc4JyBpZD0ndGltZXNsb3RfMTc4X25hdicgc3RhcnRz\nQXQ9JzE3Nzc3NDYzMDAnPgogMToyNQo8L2E+CjxhIGNsYXNzPSd0aW1lc2xv\ndCcgZW5kc0F0PScxNzc3NzUyMDAwJyBocmVmPScjdGltZXNsb3RfMTc5JyBp\nZD0ndGltZXNsb3RfMTc5X25hdicgc3RhcnRzQXQ9JzE3Nzc3NDk2MDAnPgog\nMjoyMAo8L2E+CjxhIGNsYXNzPSd0aW1lc2xvdCcgZW5kc0F0PScxNzc3NzU1\nMzAwJyBocmVmPScjdGltZXNsb3RfMTgwJyBpZD0ndGltZXNsb3RfMTgwX25h\ndicgc3RhcnRzQXQ9JzE3Nzc3NTI5MDAnPgogMzoxNQo8L2E+CjxhIGNsYXNz\nPSd0aW1lc2xvdCcgZW5kc0F0PScxNzc3NzU4NjAwJyBocmVmPScjdGltZXNs\nb3RfMTgxJyBpZD0ndGltZXNsb3RfMTgxX25hdicgc3RhcnRzQXQ9JzE3Nzc3\nNTYyMDAnPgogNDoxMAo8L2E+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdsaW5rcyc+\nCjxhIGhyZWY9Jy9maWxlcy9NQVBfQ09NQklORURfMTF4MTcuc3ZnJyB0YXJn\nZXQ9J19ibGFuayc+Ck1hcAo8L2E+CjxhIGhyZWY9J2h0dHBzOi8vbWlubmVz\ndGFyLm9yZy9mYXFzL21pbm5lYmFyLWZhcS8nIHRhcmdldD0nX2JsYW5rJz4K\nRkFRCjwvYT4KPC9kaXY+CjwvZGl2PgoKPGRpdiBjbGFzcz0nc2NoZWR1bGUn\nPgo8ZGl2IGNsYXNzPSdzY2hlZHVsZS1oZWFkZXInPgo8aDE+Ck1pbm5lYmFy\nMjAKU2Vzc2lvbiBTY2hlZHVsZQo8L2gxPgo8ZGl2IGNsYXNzPSdjb250cm9s\ncyc+CjxkaXYgY2xhc3M9J2dyb3VwJz4KPGEgaHJlZj0iL2V2ZW50cy80NiI+\nQnJvd3NlIC8gRWRpdCBTZXNzaW9uczwvYT4KPC9kaXY+CjxkaXYgY2xhc3M9\nJ2dyb3VwJz4KPGEgY2xhc3M9J2J1dHRvbicgaHJlZj0nIycgaWQ9J2hpZGUt\nYWxsJz5IaWRlIGFsbCBkZXRhaWxzPC9hPgo8YSBjbGFzcz0nYnV0dG9uJyBo\ncmVmPScjJyBpZD0nc2hvdy1hbGwnPlNob3cgYWxsIGRldGFpbHM8L2E+Cjwv\nZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0nY2xyJz48L2Rpdj4KPC9kaXY+Cjxk\naXYgY2xhc3M9J3RpbWVzbG90cyc+CjxkaXYgY2xhc3M9J3RpbWVzbG90JyBp\nZD0ndGltZXNsb3RfMTY4Jz4KPGgyPgo8ZGl2IGNsYXNzPSd0aW1lJz4gODow\nMCDigJMgIDg6MzA8L2Rpdj4KPGRpdiBjbGFzcz0ndGl0bGUnPvCfjakgUmVn\naXN0cmF0aW9uIC8gQnJlYWtmYXN0PC9kaXY+CjwvaDI+CjwvZGl2Pgo8ZGl2\nIGNsYXNzPSd0aW1lc2xvdCcgaWQ9J3RpbWVzbG90XzE2OSc+CjxoMj4KPGRp\ndiBjbGFzcz0ndGltZSc+IDg6MzAg4oCTICA4OjUwPC9kaXY+CjxkaXYgY2xh\nc3M9J3RpdGxlJz5LaWNrb2ZmPC9kaXY+CjwvaDI+CjwvZGl2Pgo8ZGl2IGNs\nYXNzPSd0aW1lc2xvdCcgaWQ9J3RpbWVzbG90XzE3MCc+CjxoMj4KPGRpdiBj\nbGFzcz0ndGltZSc+IDg6NTAg4oCTICA5OjMwPC9kaXY+CjxkaXYgY2xhc3M9\nJ3RpdGxlJz5TZXNzaW9uIDA8L2Rpdj4KPC9oMj4KPGRpdiBjbGFzcz0nc2Vz\nc2lvbnMnPgo8ZGl2IGNsYXNzPSdjb2x1bW4nPgo8ZGl2IGNsYXNzPSdzZXNz\naW9uJz4KPGRpdiBjbGFzcz0naGVhZGVyJz4KPGJ1dHRvbiBjbGFzcz0idG9n\nZ2xlLWF0dGVuZGFuY2UiIGRhdGEtc2Vzc2lvbi1pZD0iMjEzNiI+QXR0ZW5k\naW5nPC9idXR0b24+CjxoMyBjbGFzcz0ndGl0bGUnPlNlc3Npb24gMDogMjAg\nWWVhcnMgb2YgTWlubmVzdGFyIChUcml2aWEgRWRpdGlvbik8L2gzPgo8ZGl2\nIGNsYXNzPSdwcmVzZW50ZXJzJz4KPGRpdiBjbGFzcz0ncHJlc2VudGVyJz5N\naW5uZXN0YXI8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdkZXNj\ncmlwdGlvbic+CjxwPlRoaXMgeWVhciwgd2UncmUgZG9pbmcgc29tZXRoaW5n\nIGRpZmZlcmVudC48L3A+Cgo8cD5UbyBjZWxlYnJhdGUgMjAgeWVhcnMgb2Yg\nTWlubmVzdGFyLCBTZXNzaW9uIDAgd2lsbCBiZSBhIHRyaXZpYSBnYW1lIHNo\nb3cg4oCUIG1peGluZyBjb21tdW5pdHkgdHJpdmlhIHdpdGggc3RvcmllcyBm\ncm9tIHNvbWUgZmFtaWxpYXIgZmFjZXMgd2hv4oCZdmUgaGVscGVkIGJ1aWxk\nIHRoaXMgY29tbXVuaXR5IG92ZXIgdGhlIHllYXJzLjwvcD4KCjxwPldl4oCZ\nbGwgaGF2ZSBPR3Mgb24gc3RhZ2Ug4oCUIGluY2x1ZGluZyBNaW5uZXN0YXIg\nY29mb3VuZGVycyBCZW4gRWR3YXJkcyBhbmQgTHVrZSBGcmFuY2wgKPCfkYAg\neWVzLCB5b3UgaGVhcmQgdGhhdCByaWdodCEpIOKAlCBzaGFyaW5nIG1lbW9y\naWVzLCBtaWxlc3RvbmVzLCBhbmQgYSBmZXcgYmVoaW5kLXRoZS1zY2VuZXMg\nbW9tZW50cy48L3A+Cgo8cD5Zb3XigJlsbCBwbGF5IGFsb25nIGZyb20geW91\nciBwaG9uZS4gV2hldGhlciBpdOKAmXMgeW91ciBmaXJzdCBNaW5uZWJhciBv\nciB5b3VyIHR3ZW50aWV0aCwgaXQgd2lsbCBiZSB0aGUgcGVyZmVjdCB3YXkg\ndG8gbGVhcm4gd2hhdCB0aGUgZGF5IGlzIGFsbCBhYm91dCBiZWZvcmUgaXQg\na2lja3Mgb2ZmLjwvcD4KCjxwPldlIGFsd2F5cyBzdGFydCB0aGUgZGF5IHRv\nZ2V0aGVyIOKAlCBhbmQgZm9yIG91ciAyMHRoLCB3ZeKAmXJlIG1ha2luZyBp\ndCBjb3VudC48L3A+Cgo8ZGl2IGNsYXNzPSdiaW9zJz4KPGRpdiBjbGFzcz0n\nYmlvJz4KPGRpdiBjbGFzcz0nbmFtZSc+TWlubmVzdGFyPC9kaXY+CjxwPk1p\nbm5lc3RhciBpcyBhIG5vbnByb2ZpdCBjb21tdW5pdHkgb3JnYW5pemF0aW9u\nIHRoYXQgY29ubmVjdHMgTWlubmVzb3Rh4oCZcyB0ZWNoIGVjb3N5c3RlbSB0\naHJvdWdoIGZyZWUsIGluY2x1c2l2ZSwgYW5kIGNvbW11bml0eS1sZWQgZXZl\nbnRzLiBXZeKAmXJlIGJlc3Qga25vd24gZm9yIE1pbm5lYmFyIGFuZCBNaW5u\nZWRlbW8g4oCUIHNwYWNlcyB3aGVyZSB0ZWNobm9sb2dpc3RzLCBmb3VuZGVy\ncywgY3JlYXRpdmVzLCBhbmQgY3VyaW91cyBtaW5kcyBjb21lIHRvZ2V0aGVy\nIHRvIHNoYXJlIGlkZWFzLCBkZW1vIHByb2plY3RzLCBhbmQgc3VwcG9ydCBv\nbmUgYW5vdGhlci48L3A+Cgo8cD5BdCBNaW5uZXN0YXIsIHdlIGJlbGlldmUg\ndGhlIGJlc3QgdGVjaCBjb21tdW5pdHkgaXMgb25lIHRoYXTigJlzIGFjY2Vz\nc2libGUsIHdlbGNvbWluZywgYW5kIHBvd2VyZWQgYnkgdGhlIHBlb3BsZSBp\nbiBpdC48L3A+Cgo8cD48YSBocmVmPSJodHRwczovL21pbm5lc3Rhci5vcmcv\nIj5MZWFybiBtb3JlIGFib3V0IE1pbm5lc3RhcjwvYT48L3A+Cgo8L2Rpdj4K\nPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdzdW1tYXJ5Jz48L2Rpdj4KPC9k\naXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdjb2x1bW4nPgo8L2Rpdj4KPC9kaXY+\nCjwvZGl2Pgo8ZGl2IGNsYXNzPSd0aW1lc2xvdCcgaWQ9J3RpbWVzbG90XzE3\nMSc+CjxoMj4KPGRpdiBjbGFzcz0ndGltZSc+IDk6MzAg4oCTICA0OjUwPC9k\naXY+CjxkaXYgY2xhc3M9J3RpdGxlJz5BbGwgZGF5PC9kaXY+CjwvaDI+Cjxk\naXYgY2xhc3M9J3Nlc3Npb25zJz4KPGRpdiBjbGFzcz0nY29sdW1uJz4KPGRp\ndiBjbGFzcz0nc2Vzc2lvbic+CjxkaXYgY2xhc3M9J2hlYWRlcic+CjxidXR0\nb24gY2xhc3M9InRvZ2dsZS1hdHRlbmRhbmNlIiBkYXRhLXNlc3Npb24taWQ9\nIjIxMzIiPkF0dGVuZGluZzwvYnV0dG9uPgo8ZGl2IGNsYXNzPSdyb29tJyBo\ncmVmPScvbWFwcy91cHRvd25lci5wbmcnPgpVcHRvd25lcgo8L2Rpdj4KPGgz\nIGNsYXNzPSd0aXRsZSc+TmV0d29ya2luZyBMb3VuZ2U8L2gzPgo8ZGl2IGNs\nYXNzPSdwcmVzZW50ZXJzJz4KPGRpdiBjbGFzcz0ncHJlc2VudGVyJz5NaW5u\nZXN0YXI8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdkZXNjcmlw\ndGlvbic+CjxwPk1pbm5lYmFyIGlzIGEgZ3JlYXQgcGxhY2UgdG8gY2F0Y2gg\ndXAgd2l0aCBvbGQgZnJpZW5kcywgdGhlIE5ldHdvcmtpbmcgTG91bmdlIGlz\nIGEgZGVkaWNhdGVkIHBsYWNlIHRvIG1lZXQgbmV3IHBlb3BsZS4gSm9pbiB1\ncyB0byBjaGF0IGFib3V0IGFueXRoaW5nIGFuZCBldmVyeXRoaW5nLjwvcD4K\nCjxkaXYgY2xhc3M9J2Jpb3MnPgo8ZGl2IGNsYXNzPSdiaW8nPgo8ZGl2IGNs\nYXNzPSduYW1lJz5NaW5uZXN0YXI8L2Rpdj4KPHA+TWlubmVzdGFyIGlzIGEg\nbm9ucHJvZml0IGNvbW11bml0eSBvcmdhbml6YXRpb24gdGhhdCBjb25uZWN0\ncyBNaW5uZXNvdGHigJlzIHRlY2ggZWNvc3lzdGVtIHRocm91Z2ggZnJlZSwg\naW5jbHVzaXZlLCBhbmQgY29tbXVuaXR5LWxlZCBldmVudHMuIFdl4oCZcmUg\nYmVzdCBrbm93biBmb3IgTWlubmViYXIgYW5kIE1pbm5lZGVtbyDigJQgc3Bh\nY2VzIHdoZXJlIHRlY2hub2xvZ2lzdHMsIGZvdW5kZXJzLCBjcmVhdGl2ZXMs\nIGFuZCBjdXJpb3VzIG1pbmRzIGNvbWUgdG9nZXRoZXIgdG8gc2hhcmUgaWRl\nYXMsIGRlbW8gcHJvamVjdHMsIGFuZCBzdXBwb3J0IG9uZSBhbm90aGVyLjwv\ncD4KCjxwPkF0IE1pbm5lc3Rhciwgd2UgYmVsaWV2ZSB0aGUgYmVzdCB0ZWNo\nIGNvbW11bml0eSBpcyBvbmUgdGhhdOKAmXMgYWNjZXNzaWJsZSwgd2VsY29t\naW5nLCBhbmQgcG93ZXJlZCBieSB0aGUgcGVvcGxlIGluIGl0LjwvcD4KCjxw\nPjxhIGhyZWY9Imh0dHBzOi8vbWlubmVzdGFyLm9yZy8iPkxlYXJuIG1vcmUg\nYWJvdXQgTWlubmVzdGFyPC9hPjwvcD4KCjwvZGl2Pgo8L2Rpdj4KPC9kaXY+\nCjxkaXYgY2xhc3M9J3N1bW1hcnknPjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFz\ncz0nc2Vzc2lvbic+CjxkaXYgY2xhc3M9J2hlYWRlcic+CjxidXR0b24gY2xh\nc3M9InRvZ2dsZS1hdHRlbmRhbmNlIiBkYXRhLXNlc3Npb24taWQ9IjE5NDQi\nPkF0dGVuZGluZzwvYnV0dG9uPgo8aDMgY2xhc3M9J3RpdGxlJz4JTWVnYSBN\naW5uZSBNdWx0aSBJbmRpZSBNaW5pIEFyY2FkZTwvaDM+CjxkaXYgY2xhc3M9\nJ3ByZXNlbnRlcnMnPgo8ZGl2IGNsYXNzPSdwcmVzZW50ZXInPkJldGggS29y\ndGg8L2Rpdj4KPGRpdiBjbGFzcz0ncHJlc2VudGVyJz5NaW5uZXN0YXI8L2Rp\ndj4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdkZXNjcmlwdGlvbic+Cjxw\nPlN0b3AgYnkgdG8gcGxheSBzb21lIGxvY2FsbHkgbWFkZSBnYW1lcyE8L3A+\nCgo8cD5UaGlzIHllYXIgdGhlIGFyY2FkZSB3aWxsIGhhdmU6PC9wPgoKPHA+\n8J+OriBUVnMgcnVubmluZyBhIHNlbGVjdGlvbiBvZiBsb2NhbGx5IG1hZGUg\ndmlkZW8gZ2FtZXM8L3A+Cgo8cD7wn46yIFRhYmxlcyB3aXRoIGxvY2FsbHkg\nZGVzaWduZWQgYm9hcmQgZ2FtZXM8L3A+Cgo8cD7wn6egIEluZm9ybWF0aW9u\nIGFib3V0IGhvdyB0byBnZXQgaW52b2x2ZWQgd2l0aCBnYW1lIGRldmVsb3Bt\nZW50IGluIHRoZSBUd2luIENpdGllcywgaW5jbHVkaW5nIG91ciBjaGFwdGVy\nIG9mIHRoZSBJbnRlcm5hdGlvbmFsIEdhbWUgRGV2ZWxvcGVycyBBc3NvY2lh\ndGlvbiAoaWdkYXRjKTwvcD4KCjxwPvCfkqogVm9sdW50ZWVycyBvbi1oYW5k\nIHRvIHRhbGsgYWJvdXQgYWxsIG9mIHRoZSBhYm92ZTwvcD4KCjxwPlRoaXMg\ndGhpbmcgaXMgZ29pbmcgYWxsIGRheSBsb25nITwvcD4KCjxkaXYgY2xhc3M9\nJ2Jpb3MnPgo8ZGl2IGNsYXNzPSdiaW8nPgo8ZGl2IGNsYXNzPSduYW1lJz5C\nZXRoIEtvcnRoPC9kaXY+Cgo8L2Rpdj4KPGRpdiBjbGFzcz0nYmlvJz4KPGRp\ndiBjbGFzcz0nbmFtZSc+TWlubmVzdGFyPC9kaXY+CjxwPk1pbm5lc3RhciBp\ncyBhIG5vbnByb2ZpdCBjb21tdW5pdHkgb3JnYW5pemF0aW9uIHRoYXQgY29u\nbmVjdHMgTWlubmVzb3Rh4oCZcyB0ZWNoIGVjb3N5c3RlbSB0aHJvdWdoIGZy\nZWUsIGluY2x1c2l2ZSwgYW5kIGNvbW11bml0eS1sZWQgZXZlbnRzLiBXZeKA\nmXJlIGJlc3Qga25vd24gZm9yIE1pbm5lYmFyIGFuZCBNaW5uZWRlbW8g4oCU\nIHNwYWNlcyB3aGVyZSB0ZWNobm9sb2dpc3RzLCBmb3VuZGVycywgY3JlYXRp\ndmVzLCBhbmQgY3VyaW91cyBtaW5kcyBjb21lIHRvZ2V0aGVyIHRvIHNoYXJl\nIGlkZWFzLCBkZW1vIHByb2plY3RzLCBhbmQgc3VwcG9ydCBvbmUgYW5vdGhl\nci48L3A+Cgo8cD5BdCBNaW5uZXN0YXIsIHdlIGJlbGlldmUgdGhlIGJlc3Qg\ndGVjaCBjb21tdW5pdHkgaXMgb25lIHRoYXTigJlzIGFjY2Vzc2libGUsIHdl\nbGNvbWluZywgYW5kIHBvd2VyZWQgYnkgdGhlIHBlb3BsZSBpbiBpdC48L3A+\nCgo8cD48YSBocmVmPSJodHRwczovL21pbm5lc3Rhci5vcmcvIj5MZWFybiBt\nb3JlIGFib3V0IE1pbm5lc3RhcjwvYT48L3A+Cgo8L2Rpdj4KPC9kaXY+Cjwv\nZGl2Pgo8ZGl2IGNsYXNzPSdzdW1tYXJ5Jz48L2Rpdj4KPC9kaXY+CjwvZGl2\nPgo8ZGl2IGNsYXNzPSdjb2x1bW4nPgo8ZGl2IGNsYXNzPSdzZXNzaW9uJz4K\nPGRpdiBjbGFzcz0naGVhZGVyJz4KPGJ1dHRvbiBjbGFzcz0idG9nZ2xlLWF0\ndGVuZGFuY2UiIGRhdGEtc2Vzc2lvbi1pZD0iMTk0MyI+QXR0ZW5kaW5nPC9i\ndXR0b24+CjxoMyBjbGFzcz0ndGl0bGUnPk5ld2JpZSBUYWJsZTwvaDM+Cjxk\naXYgY2xhc3M9J3ByZXNlbnRlcnMnPgo8ZGl2IGNsYXNzPSdwcmVzZW50ZXIn\nPk1pbm5lc3RhcjwvZGl2Pgo8ZGl2IGNsYXNzPSdwcmVzZW50ZXInPk1lZyBT\ndGV1ZXI8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8ZGl2IGNsYXNzPSdkZXNjcmlw\ndGlvbic+CjxwPk5ldyB0byBNaW5uZWJhcj8gQ29tZSBmaW5kIHRoZSBOZXdi\naWUgVGFibGUgb3V0c2lkZSBvZiBTYW5keSdzIFBsYWNlICh0aGUgY2FmZXRl\ncmlhKSE8L3A+Cgo8cD5UaGUgTmV3YmllIFRhYmxlIGlzIHlvdXIgaG9tZSBi\nYXNlIHRvIGFzayBxdWVzdGlvbnMsIG1lZXQgZnJpZW5kbHkgZmFjZXMsIGFu\nZCBnZXQgdGhlIGxheSBvZiB0aGUgbGFuZC48L3A+Cgo8cD5XaGV0aGVyIHlv\ndeKAmXJlIGZseWluZyBzb2xvIG9yIGp1c3Qgd2FudCBzb21lb25lIHRvIGNo\nYXQgd2l0aCBiZXR3ZWVuIHNlc3Npb25zLCBzdG9wIGJ5IGFuZCBzYXkgaGku\nIFdl4oCZbGwgaGF2ZSBsb25ndGltZSBjb21tdW5pdHkgbWVtYmVycyBvbiBo\nYW5kIHRvIGhlbHAgeW91IG5hdmlnYXRlIHRoZSBkYXksIG1ha2UgY29ubmVj\ndGlvbnMsIGFuZCBmZWVsIHJpZ2h0IGF0IGhvbWUuPC9wPgoKPHA+VGhpcyB0\nYWJsZSBpcyBvcGVuIGFsbCBkYXkuPC9wPgoKPGRpdiBjbGFzcz0nYmlvcyc+\nCjxkaXYgY2xhc3M9J2Jpbyc+CjxkaXYgY2xhc3M9J25hbWUnPk1pbm5lc3Rh\ncjwvZGl2Pgo8cD5NaW5uZXN0YXIgaXMgYSBub25wcm9maXQgY29tbXVuaXR5\nIG9yZ2FuaXphdGlvbiB0aGF0IGNvbm5lY3RzIE1pbm5lc290YeKAmXMgdGVj\naCBlY29zeXN0ZW0gdGhyb3VnaCBmcmVlLCBpbmNsdXNpdmUsIGFuZCBjb21t\ndW5pdHktbGVkIGV2ZW50cy4gV2XigJlyZSBiZXN0IGtub3duIGZvciBNaW5u\nZWJhciBhbmQgTWlubmVkZW1vIOKAlCBzcGFjZXMgd2hlcmUgdGVjaG5vbG9n\naXN0cywgZm91bmRlcnMsIGNyZWF0aXZlcywgYW5kIGN1cmlvdXMgbWluZHMg\nY29tZSB0b2dldGhlciB0byBzaGFyZSBpZGVhcywgZGVtbyBwcm9qZWN0cywg\nYW5kIHN1cHBvcnQgb25lIGFub3RoZXIuPC9wPgoKPHA+QXQgTWlubmVzdGFy\nLCB3ZSBiZWxpZXZlIHRoZSBiZXN0IHRlY2ggY29tbXVuaXR5IGlzIG9uZSB0\naGF04oCZcyBhY2Nlc3NpYmxlLCB3ZWxjb21pbmcsIGFuZCBwb3dlcmVkIGJ5\nIHRoZSBwZW9wbGUgaW4gaXQuPC9wPgoKPHA+PGEgaHJlZj0iaHR0cHM6Ly9t\naW5uZXN0YQ==\n"}]},{"id":"2280e5a7-c91f-492f-bffc-8732f440f417","thread_id":"d4a8f045-46aa-4dcd-9ee9-c0d681f62ff2","created_at":"2026-04-30T23:20:04Z","branch_list":["00000000-0000-4000-0000-000000000000"],"state":"done","prompt":"I missed that there's a `<div class='description'>`, just use that for the description for each .ics event.","reply":"<p>Simple swap — replace the presenters logic with the description div:</p>\n<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code>javascript:<span class=\"p\">(</span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">timeMap</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.nav-top .timeslot[startsAt]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">href</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s\">'#'</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n start: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'startsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span><span class=\"p\">,</span>\n end: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'endsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span>\n <span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">events</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.timeslot[id]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">block</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">block</span><span class=\"p\">.</span>id<span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">times</span> <span class=\"o\">=</span> <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">times</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"n\">block</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.session'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">session</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">btn</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'button.toggle-attendance'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">btn</span> <span class=\"o\">||</span> <span class=\"n\">btn</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'data-session-attending'</span><span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"s\">'true'</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">titleEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'h3.title'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">roomEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.room'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">descEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.description'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">titleEl</span> ? <span class=\"n\">titleEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">'Untitled Session'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">location</span> <span class=\"o\">=</span> <span class=\"n\">roomEl</span> ? <span class=\"n\">roomEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">''</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"n\">descEl</span> ? <span class=\"n\">descEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">''</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"p\">{</span> title<span class=\"p\">,</span> location<span class=\"p\">,</span> description<span class=\"p\">,</span> start: <span class=\"n\">times</span><span class=\"p\">.</span>start<span class=\"p\">,</span> end: <span class=\"n\">times</span><span class=\"p\">.</span>end <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">===</span> 0<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'No attended sessions found. Make sure you are marked as attending sessions.'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">unixSec</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Date</span><span class=\"p\">(</span><span class=\"n\">unixSec</span> <span class=\"o\">*</span> 1000<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">d</span><span class=\"p\">.</span><span class=\"nf\">toISOString</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"p\">[</span><span class=\"sc\">-</span><span class=\"sc\">:</span><span class=\"p\">]</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\.</span><span class=\"se\">\\d</span><span class=\"p\">{</span>3<span class=\"p\">}</span><span class=\"o\">/</span></span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">str</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">return</span> <span class=\"n\">str</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\\\</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\\\\\'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">;</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\;'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">,</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\,'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\n</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span>length <span class=\"o\">></span> 75<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>0<span class=\"p\">,</span> 75<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"s\">' '</span> <span class=\"o\">+</span> <span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>75<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">const</span> <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n <span class=\"s\">'BEGIN:VCALENDAR'</span><span class=\"p\">,</span>\n <span class=\"s\">'VERSION:2.0'</span><span class=\"p\">,</span>\n <span class=\"s\">'PRODID:-//Minnebar Schedule Bookmarklet//EN'</span><span class=\"p\">,</span>\n <span class=\"s\">'CALSCALE:GREGORIAN'</span><span class=\"p\">,</span>\n <span class=\"s\">'METHOD:PUBLISH'</span>\n <span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">uid</span> <span class=\"o\">=</span> <span class=\"s\">'minnebar-'</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>start <span class=\"o\">+</span> <span class=\"s\">'-'</span> <span class=\"o\">+</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"s\">'@minnestar.org'</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'BEGIN:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'UID:'</span> <span class=\"o\">+</span> <span class=\"n\">uid</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTART:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>start<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTEND:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>end<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'SUMMARY:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>title<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'LOCATION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'DESCRIPTION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VCALENDAR'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">icsContent</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">blob</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Blob</span><span class=\"p\">(</span><span class=\"p\">[</span><span class=\"n\">icsContent</span><span class=\"p\">]</span><span class=\"p\">,</span> <span class=\"p\">{</span> type: <span class=\"s\">'text/calendar;charset=utf-8'</span> <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">createObjectURL</span><span class=\"p\">(</span><span class=\"n\">blob</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">createElement</span><span class=\"p\">(</span><span class=\"s\">'a'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>href <span class=\"o\">=</span> <span class=\"n\">url</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>download <span class=\"o\">=</span> <span class=\"s\">'minnebar-schedule.ics'</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">appendChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">click</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">removeChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">revokeObjectURL</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'Downloaded '</span> <span class=\"o\">+</span> <span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">+</span> <span class=\"s\">' session(s) to minnebar-schedule.ics'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>The only changes are replacing the presenter logic with <code>session.querySelector('.description')</code> and using its <code>textContent</code> directly as the description field.</p>","md":"Simple swap — replace the presenters logic with the description div:\n\n```javascript\njavascript:(function(){\n const timeMap = {};\n document.querySelectorAll('.nav-top .timeslot[startsAt]').forEach(a => {\n const href = a.getAttribute('href');\n const id = href.replace('#', '');\n timeMap[id] = {\n start: parseInt(a.getAttribute('startsAt'), 10),\n end: parseInt(a.getAttribute('endsAt'), 10)\n };\n });\n\n const events = [];\n\n document.querySelectorAll('.timeslot[id]').forEach(block => {\n const id = block.id;\n const times = timeMap[id];\n if (!times) return;\n\n block.querySelectorAll('.session').forEach(session => {\n const btn = session.querySelector('button.toggle-attendance');\n if (!btn || btn.getAttribute('data-session-attending') !== 'true') return;\n\n const titleEl = session.querySelector('h3.title');\n const roomEl = session.querySelector('.room');\n const descEl = session.querySelector('.description');\n\n const title = titleEl ? titleEl.textContent.trim() : 'Untitled Session';\n const location = roomEl ? roomEl.textContent.trim() : '';\n const description = descEl ? descEl.textContent.trim() : '';\n\n events.push({ title, location, description, start: times.start, end: times.end });\n });\n });\n\n if (events.length === 0) {\n alert('No attended sessions found. Make sure you are marked as attending sessions.');\n return;\n }\n\n function toICSDate(unixSec) {\n const d = new Date(unixSec * 1000);\n return d.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n function escapeICS(str) {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n }\n\n function foldLine(line) {\n const out = [];\n while (line.length > 75) {\n out.push(line.substring(0, 75));\n line = ' ' + line.substring(75);\n }\n out.push(line);\n return out.join('\\r\\n');\n }\n\n const lines = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//Minnebar Schedule Bookmarklet//EN',\n 'CALSCALE:GREGORIAN',\n 'METHOD:PUBLISH'\n ];\n\n events.forEach((ev, i) => {\n const uid = 'minnebar-' + ev.start + '-' + i + '@minnestar.org';\n lines.push('BEGIN:VEVENT');\n lines.push(foldLine('UID:' + uid));\n lines.push('DTSTART:' + toICSDate(ev.start));\n lines.push('DTEND:' + toICSDate(ev.end));\n lines.push(foldLine('SUMMARY:' + escapeICS(ev.title)));\n if (ev.location) lines.push(foldLine('LOCATION:' + escapeICS(ev.location)));\n if (ev.description) lines.push(foldLine('DESCRIPTION:' + escapeICS(ev.description)));\n lines.push('END:VEVENT');\n });\n\n lines.push('END:VCALENDAR');\n\n const icsContent = lines.join('\\r\\n');\n const blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'minnebar-schedule.ics';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n alert('Downloaded ' + events.length + ' session(s) to minnebar-schedule.ics');\n})();\n```\n\nThe only changes are replacing the presenter logic with `session.querySelector('.description')` and using its `textContent` directly as the description field.","profile":{"id":"095899c5-634b-4eeb-ad03-41fd508fbb51","name":"Code","accessible":true,"model":"claude-4-sonnet","deprecate":false,"retired":false,"successor_model":null,"model_name":"Claude 4.6 Sonnet","model_provider":"anthropic","model_input_limit":1000000,"recommended":false,"model_info":"\n\n\n\n<div class=\"heading\">\n <div class=\"left\">\n \n \n \n <svg class=\"model-icon icon-xs\" data-model=\"claude-4-sonnet\">\n <use href=\"#icon-kagi-1\"/>\n </svg>\n <h3>\n \n <span class=\"model-name\">Code</span>\n </h3>\n </div>\n\n \n</div>\n\n\n<hr />\n<ul>\n \n <li>\n <h4>\n Model\n </h4>\n <span class=\"flex align-center gap-8\">\n <svg class=\"icon-xs icon\">\n <use href=\"#icon-anthropic\" />\n </svg>\n <span class=\"model-name\">Claude 4.6 Sonnet</span>\n </span>\n </li>\n <li>\n <h4>\n Web access\n </h4>\n <span>On</span>\n </li>\n <li>\n <h4>\n Lenses\n </h4>\n <span>--</span>\n </li>\n \n</ul>\n\n\n","model_provider_name":"Anthropic","internet_access":true,"personalizations":false,"shortcut":null,"is_default_profile":true},"metadata":"<li>\n <span class=\"attribute\">Model</span>\n <span class=\"value\"><i class=\"icon-xs mr-4\"><svg><use href=\"#icon-anthropic\"></use></svg></i>Claude 4.6 Sonnet</span>\n</li>\n<li>\n <span class=\"attribute\">Version</span>\n <span class=\"value\">claude-sonnet-4-6</span>\n</li>\n<li>\n <span class=\"attribute\">Speed (tok/s)</span>\n <span class=\"value\">94</span>\n</li>\n<li>\n <span class=\"attribute\">Tokens</span>\n <span class=\"value\">5,221</span>\n</li>\n<li>\n <span class=\"attribute\">Cost / Total ($)</span>\n <span class=\"value\">0.04 / 0.25</span>\n</li>\n<li>\n <span class=\"attribute\">End to end time (s)</span>\n <span class=\"value\">13.35</span>\n</li>\n<li>\n <span class=\"attribute\">Submitted</span>\n <span class=\"value\">2026-04-30 19:20</span>\n</li>\n\n","documents":[]},{"id":"d0d36e15-ea45-46fa-b917-b5cf157ce01c","thread_id":"d4a8f045-46aa-4dcd-9ee9-c0d681f62ff2","created_at":"2026-05-01T16:20:38Z","branch_list":["00000000-0000-4000-0000-000000000000"],"state":"done","prompt":"Can the description still do a .textContent to strip HTML so it's plaintext but still include hyperlinks, if there are any?","reply":"<p>Good question — <code>.textContent</code> strips everything including link text/URLs. The approach here is to pre-process anchor tags, replacing them with <code>text (url)</code> format before extracting text content. We clone the node so the DOM isn't mutated:</p>\n<p>Replace the <code>descEl</code> extraction block with this:</p>\n<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code><span class=\"k\">let</span> <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s\">''</span><span class=\"p\">;</span>\n<span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">descEl</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">clone</span> <span class=\"o\">=</span> <span class=\"n\">descEl</span><span class=\"p\">.</span><span class=\"nf\">cloneNode</span><span class=\"p\">(</span><span class=\"kc\">true</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">clone</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'a[href]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">replaceWith</span><span class=\"p\">(</span><span class=\"n\">text</span> <span class=\"o\">===</span> <span class=\"n\">href</span> ? <span class=\"n\">text</span> : <span class=\"n\">text</span> <span class=\"o\">+</span> <span class=\"s\">' ('</span> <span class=\"o\">+</span> <span class=\"n\">href</span> <span class=\"o\">+</span> <span class=\"s\">')'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"n\">clone</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>This produces readable plaintext like <code>Check out Minnestar (https://minnestar.org)</code> for any links, while everything else is stripped to plain text as before.</p>","md":"Good question — `.textContent` strips everything including link text/URLs. The approach here is to pre-process anchor tags, replacing them with `text (url)` format before extracting text content. We clone the node so the DOM isn't mutated:\n\nReplace the `descEl` extraction block with this:\n\n```javascript\nlet description = '';\nif (descEl) {\n const clone = descEl.cloneNode(true);\n clone.querySelectorAll('a[href]').forEach(a => {\n const href = a.getAttribute('href');\n const text = a.textContent.trim();\n a.replaceWith(text === href ? text : text + ' (' + href + ')');\n });\n description = clone.textContent.trim();\n}\n```\n\nThis produces readable plaintext like `Check out Minnestar (https://minnestar.org)` for any links, while everything else is stripped to plain text as before.","profile":{"id":"095899c5-634b-4eeb-ad03-41fd508fbb51","name":"Code","accessible":true,"model":"claude-4-sonnet","deprecate":false,"retired":false,"successor_model":null,"model_name":"Claude 4.6 Sonnet","model_provider":"anthropic","model_input_limit":1000000,"recommended":false,"model_info":"\n\n\n\n<div class=\"heading\">\n <div class=\"left\">\n \n \n \n <svg class=\"model-icon icon-xs\" data-model=\"claude-4-sonnet\">\n <use href=\"#icon-kagi-1\"/>\n </svg>\n <h3>\n \n <span class=\"model-name\">Code</span>\n </h3>\n </div>\n\n \n</div>\n\n\n<hr />\n<ul>\n \n <li>\n <h4>\n Model\n </h4>\n <span class=\"flex align-center gap-8\">\n <svg class=\"icon-xs icon\">\n <use href=\"#icon-anthropic\" />\n </svg>\n <span class=\"model-name\">Claude 4.6 Sonnet</span>\n </span>\n </li>\n <li>\n <h4>\n Web access\n </h4>\n <span>On</span>\n </li>\n <li>\n <h4>\n Lenses\n </h4>\n <span>--</span>\n </li>\n \n</ul>\n\n\n","model_provider_name":"Anthropic","internet_access":true,"personalizations":false,"shortcut":null,"is_default_profile":true},"metadata":"<li>\n <span class=\"attribute\">Model</span>\n <span class=\"value\"><i class=\"icon-xs mr-4\"><svg><use href=\"#icon-anthropic\"></use></svg></i>Claude 4.6 Sonnet</span>\n</li>\n<li>\n <span class=\"attribute\">Version</span>\n <span class=\"value\">claude-sonnet-4-6</span>\n</li>\n<li>\n <span class=\"attribute\">Speed (tok/s)</span>\n <span class=\"value\">44</span>\n</li>\n<li>\n <span class=\"attribute\">Tokens</span>\n <span class=\"value\">5,514</span>\n</li>\n<li>\n <span class=\"attribute\">Cost / Total ($)</span>\n <span class=\"value\">0.03 / 0.28</span>\n</li>\n<li>\n <span class=\"attribute\">End to end time (s)</span>\n <span class=\"value\">8.36</span>\n</li>\n<li>\n <span class=\"attribute\">Submitted</span>\n <span class=\"value\">2026-05-01 12:20</span>\n</li>\n\n","documents":[]},{"id":"e964ca51-1f55-4abc-a193-cddd39006c43","thread_id":"d4a8f045-46aa-4dcd-9ee9-c0d681f62ff2","created_at":"2026-05-01T16:21:04Z","branch_list":["00000000-0000-4000-0000-000000000000"],"state":"done","prompt":"Let's update the code with that.","reply":"<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code>javascript:<span class=\"p\">(</span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">timeMap</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.nav-top .timeslot[startsAt]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">href</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s\">'#'</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n start: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'startsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span><span class=\"p\">,</span>\n end: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'endsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span>\n <span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">events</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.timeslot[id]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">block</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">block</span><span class=\"p\">.</span>id<span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">times</span> <span class=\"o\">=</span> <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">times</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"n\">block</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.session'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">session</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">btn</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'button.toggle-attendance'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">btn</span> <span class=\"o\">||</span> <span class=\"n\">btn</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'data-session-attending'</span><span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"s\">'true'</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">titleEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'h3.title'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">roomEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.room'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">descEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.description'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">titleEl</span> ? <span class=\"n\">titleEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">'Untitled Session'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">location</span> <span class=\"o\">=</span> <span class=\"n\">roomEl</span> ? <span class=\"n\">roomEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">''</span><span class=\"p\">;</span>\n\n <span class=\"k\">let</span> <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s\">''</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">descEl</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">clone</span> <span class=\"o\">=</span> <span class=\"n\">descEl</span><span class=\"p\">.</span><span class=\"nf\">cloneNode</span><span class=\"p\">(</span><span class=\"kc\">true</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">clone</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'a[href]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">replaceWith</span><span class=\"p\">(</span><span class=\"n\">text</span> <span class=\"o\">===</span> <span class=\"n\">href</span> ? <span class=\"n\">text</span> : <span class=\"n\">text</span> <span class=\"o\">+</span> <span class=\"s\">' ('</span> <span class=\"o\">+</span> <span class=\"n\">href</span> <span class=\"o\">+</span> <span class=\"s\">')'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"n\">clone</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"p\">{</span> title<span class=\"p\">,</span> location<span class=\"p\">,</span> description<span class=\"p\">,</span> start: <span class=\"n\">times</span><span class=\"p\">.</span>start<span class=\"p\">,</span> end: <span class=\"n\">times</span><span class=\"p\">.</span>end <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">===</span> 0<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'No attended sessions found. Make sure you are marked as attending sessions.'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">unixSec</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Date</span><span class=\"p\">(</span><span class=\"n\">unixSec</span> <span class=\"o\">*</span> 1000<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">d</span><span class=\"p\">.</span><span class=\"nf\">toISOString</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"p\">[</span><span class=\"sc\">-</span><span class=\"sc\">:</span><span class=\"p\">]</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\.</span><span class=\"se\">\\d</span><span class=\"p\">{</span>3<span class=\"p\">}</span><span class=\"o\">/</span></span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">str</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">return</span> <span class=\"n\">str</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\\\</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\\\\\'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">;</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\;'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">,</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\,'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\n</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span>length <span class=\"o\">></span> 75<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>0<span class=\"p\">,</span> 75<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"s\">' '</span> <span class=\"o\">+</span> <span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>75<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">const</span> <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n <span class=\"s\">'BEGIN:VCALENDAR'</span><span class=\"p\">,</span>\n <span class=\"s\">'VERSION:2.0'</span><span class=\"p\">,</span>\n <span class=\"s\">'PRODID:-//Minnebar Schedule Bookmarklet//EN'</span><span class=\"p\">,</span>\n <span class=\"s\">'CALSCALE:GREGORIAN'</span><span class=\"p\">,</span>\n <span class=\"s\">'METHOD:PUBLISH'</span>\n <span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">uid</span> <span class=\"o\">=</span> <span class=\"s\">'minnebar-'</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>start <span class=\"o\">+</span> <span class=\"s\">'-'</span> <span class=\"o\">+</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"s\">'@minnestar.org'</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'BEGIN:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'UID:'</span> <span class=\"o\">+</span> <span class=\"n\">uid</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTART:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>start<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTEND:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>end<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'SUMMARY:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>title<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'LOCATION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'DESCRIPTION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VCALENDAR'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">icsContent</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">blob</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Blob</span><span class=\"p\">(</span><span class=\"p\">[</span><span class=\"n\">icsContent</span><span class=\"p\">]</span><span class=\"p\">,</span> <span class=\"p\">{</span> type: <span class=\"s\">'text/calendar;charset=utf-8'</span> <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">createObjectURL</span><span class=\"p\">(</span><span class=\"n\">blob</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">createElement</span><span class=\"p\">(</span><span class=\"s\">'a'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>href <span class=\"o\">=</span> <span class=\"n\">url</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>download <span class=\"o\">=</span> <span class=\"s\">'minnebar-schedule.ics'</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">appendChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">click</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">removeChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">revokeObjectURL</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'Downloaded '</span> <span class=\"o\">+</span> <span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">+</span> <span class=\"s\">' session(s) to minnebar-schedule.ics'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n</code></pre></div>","md":"```javascript\njavascript:(function(){\n const timeMap = {};\n document.querySelectorAll('.nav-top .timeslot[startsAt]').forEach(a => {\n const href = a.getAttribute('href');\n const id = href.replace('#', '');\n timeMap[id] = {\n start: parseInt(a.getAttribute('startsAt'), 10),\n end: parseInt(a.getAttribute('endsAt'), 10)\n };\n });\n\n const events = [];\n\n document.querySelectorAll('.timeslot[id]').forEach(block => {\n const id = block.id;\n const times = timeMap[id];\n if (!times) return;\n\n block.querySelectorAll('.session').forEach(session => {\n const btn = session.querySelector('button.toggle-attendance');\n if (!btn || btn.getAttribute('data-session-attending') !== 'true') return;\n\n const titleEl = session.querySelector('h3.title');\n const roomEl = session.querySelector('.room');\n const descEl = session.querySelector('.description');\n\n const title = titleEl ? titleEl.textContent.trim() : 'Untitled Session';\n const location = roomEl ? roomEl.textContent.trim() : '';\n\n let description = '';\n if (descEl) {\n const clone = descEl.cloneNode(true);\n clone.querySelectorAll('a[href]').forEach(a => {\n const href = a.getAttribute('href');\n const text = a.textContent.trim();\n a.replaceWith(text === href ? text : text + ' (' + href + ')');\n });\n description = clone.textContent.trim();\n }\n\n events.push({ title, location, description, start: times.start, end: times.end });\n });\n });\n\n if (events.length === 0) {\n alert('No attended sessions found. Make sure you are marked as attending sessions.');\n return;\n }\n\n function toICSDate(unixSec) {\n const d = new Date(unixSec * 1000);\n return d.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n function escapeICS(str) {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n }\n\n function foldLine(line) {\n const out = [];\n while (line.length > 75) {\n out.push(line.substring(0, 75));\n line = ' ' + line.substring(75);\n }\n out.push(line);\n return out.join('\\r\\n');\n }\n\n const lines = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//Minnebar Schedule Bookmarklet//EN',\n 'CALSCALE:GREGORIAN',\n 'METHOD:PUBLISH'\n ];\n\n events.forEach((ev, i) => {\n const uid = 'minnebar-' + ev.start + '-' + i + '@minnestar.org';\n lines.push('BEGIN:VEVENT');\n lines.push(foldLine('UID:' + uid));\n lines.push('DTSTART:' + toICSDate(ev.start));\n lines.push('DTEND:' + toICSDate(ev.end));\n lines.push(foldLine('SUMMARY:' + escapeICS(ev.title)));\n if (ev.location) lines.push(foldLine('LOCATION:' + escapeICS(ev.location)));\n if (ev.description) lines.push(foldLine('DESCRIPTION:' + escapeICS(ev.description)));\n lines.push('END:VEVENT');\n });\n\n lines.push('END:VCALENDAR');\n\n const icsContent = lines.join('\\r\\n');\n const blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'minnebar-schedule.ics';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n alert('Downloaded ' + events.length + ' session(s) to minnebar-schedule.ics');\n})();\n```","profile":{"id":"095899c5-634b-4eeb-ad03-41fd508fbb51","name":"Code","accessible":true,"model":"claude-4-sonnet","deprecate":false,"retired":false,"successor_model":null,"model_name":"Claude 4.6 Sonnet","model_provider":"anthropic","model_input_limit":1000000,"recommended":false,"model_info":"\n\n\n\n<div class=\"heading\">\n <div class=\"left\">\n \n \n \n <svg class=\"model-icon icon-xs\" data-model=\"claude-4-sonnet\">\n <use href=\"#icon-kagi-1\"/>\n </svg>\n <h3>\n \n <span class=\"model-name\">Code</span>\n </h3>\n </div>\n\n \n</div>\n\n\n<hr />\n<ul>\n \n <li>\n <h4>\n Model\n </h4>\n <span class=\"flex align-center gap-8\">\n <svg class=\"icon-xs icon\">\n <use href=\"#icon-anthropic\" />\n </svg>\n <span class=\"model-name\">Claude 4.6 Sonnet</span>\n </span>\n </li>\n <li>\n <h4>\n Web access\n </h4>\n <span>On</span>\n </li>\n <li>\n <h4>\n Lenses\n </h4>\n <span>--</span>\n </li>\n \n</ul>\n\n\n","model_provider_name":"Anthropic","internet_access":true,"personalizations":false,"shortcut":null,"is_default_profile":true},"metadata":"<li>\n <span class=\"attribute\">Model</span>\n <span class=\"value\"><i class=\"icon-xs mr-4\"><svg><use href=\"#icon-anthropic\"></use></svg></i>Claude 4.6 Sonnet</span>\n</li>\n<li>\n <span class=\"attribute\">Version</span>\n <span class=\"value\">claude-sonnet-4-6</span>\n</li>\n<li>\n <span class=\"attribute\">Speed (tok/s)</span>\n <span class=\"value\">140</span>\n</li>\n<li>\n <span class=\"attribute\">Tokens</span>\n <span class=\"value\">6,708</span>\n</li>\n<li>\n <span class=\"attribute\">Cost / Total ($)</span>\n <span class=\"value\">0.02 / 0.30</span>\n</li>\n<li>\n <span class=\"attribute\">End to end time (s)</span>\n <span class=\"value\">9.9</span>\n</li>\n<li>\n <span class=\"attribute\">Submitted</span>\n <span class=\"value\">2026-05-01 12:21</span>\n</li>\n\n","documents":[]},{"id":"04900ccf-b7b0-430a-9093-47b7d5bf7dcb","thread_id":"d4a8f045-46aa-4dcd-9ee9-c0d681f62ff2","created_at":"2026-05-01T16:53:09Z","branch_list":["00000000-0000-4000-0000-000000000000"],"state":"done","prompt":"The generated .ics fails validation — it's missing a DTSTAMP for each event.","reply":"<p>Add <code>DTSTAMP</code> right after <code>UID</code> in the <code>forEach</code> block — it just needs to be the current UTC timestamp:</p>\n<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code><span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">uid</span> <span class=\"o\">=</span> <span class=\"s\">'minnebar-'</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>start <span class=\"o\">+</span> <span class=\"s\">'-'</span> <span class=\"o\">+</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"s\">'@minnestar.org'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"nf\">Math</span><span class=\"p\">.</span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"nf\">Date</span><span class=\"p\">.</span><span class=\"nf\">now</span><span class=\"p\">(</span><span class=\"p\">)</span> <span class=\"o\">/</span> 1000<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'BEGIN:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'UID:'</span> <span class=\"o\">+</span> <span class=\"n\">uid</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTAMP:'</span> <span class=\"o\">+</span> <span class=\"n\">now</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTART:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>start<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTEND:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>end<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'SUMMARY:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>title<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'LOCATION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'DESCRIPTION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Here's the full updated bookmarklet:</p>\n<div class=\"codehilite\"><span class=\"filename\">Javascript</span><pre><span></span><code>javascript:<span class=\"p\">(</span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">timeMap</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.nav-top .timeslot[startsAt]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">href</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"s\">'#'</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n start: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'startsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span><span class=\"p\">,</span>\n end: <span class=\"nf\">parseInt</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'endsAt'</span><span class=\"p\">)</span><span class=\"p\">,</span> 10<span class=\"p\">)</span>\n <span class=\"p\">}</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">events</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.timeslot[id]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">block</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">id</span> <span class=\"o\">=</span> <span class=\"n\">block</span><span class=\"p\">.</span>id<span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">times</span> <span class=\"o\">=</span> <span class=\"n\">timeMap</span><span class=\"p\">[</span><span class=\"n\">id</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">times</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"n\">block</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'.session'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">session</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">btn</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'button.toggle-attendance'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">btn</span> <span class=\"o\">||</span> <span class=\"n\">btn</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'data-session-attending'</span><span class=\"p\">)</span> <span class=\"o\">!==</span> <span class=\"s\">'true'</span><span class=\"p\">)</span> <span class=\"k\">return</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">titleEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'h3.title'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">roomEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.room'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">descEl</span> <span class=\"o\">=</span> <span class=\"n\">session</span><span class=\"p\">.</span><span class=\"nf\">querySelector</span><span class=\"p\">(</span><span class=\"s\">'.description'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">titleEl</span> ? <span class=\"n\">titleEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">'Untitled Session'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">location</span> <span class=\"o\">=</span> <span class=\"n\">roomEl</span> ? <span class=\"n\">roomEl</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span> : <span class=\"s\">''</span><span class=\"p\">;</span>\n\n <span class=\"k\">let</span> <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s\">''</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">descEl</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">clone</span> <span class=\"o\">=</span> <span class=\"n\">descEl</span><span class=\"p\">.</span><span class=\"nf\">cloneNode</span><span class=\"p\">(</span><span class=\"kc\">true</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">clone</span><span class=\"p\">.</span><span class=\"nf\">querySelectorAll</span><span class=\"p\">(</span><span class=\"s\">'a[href]'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"n\">a</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">href</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">getAttribute</span><span class=\"p\">(</span><span class=\"s\">'href'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">replaceWith</span><span class=\"p\">(</span><span class=\"n\">text</span> <span class=\"o\">===</span> <span class=\"n\">href</span> ? <span class=\"n\">text</span> : <span class=\"n\">text</span> <span class=\"o\">+</span> <span class=\"s\">' ('</span> <span class=\"o\">+</span> <span class=\"n\">href</span> <span class=\"o\">+</span> <span class=\"s\">')'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"n\">clone</span><span class=\"p\">.</span>textContent<span class=\"p\">.</span><span class=\"nf\">trim</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"p\">{</span> title<span class=\"p\">,</span> location<span class=\"p\">,</span> description<span class=\"p\">,</span> start: <span class=\"n\">times</span><span class=\"p\">.</span>start<span class=\"p\">,</span> end: <span class=\"n\">times</span><span class=\"p\">.</span>end <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">===</span> 0<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'No attended sessions found. Make sure you are marked as attending sessions.'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">unixSec</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Date</span><span class=\"p\">(</span><span class=\"n\">unixSec</span> <span class=\"o\">*</span> 1000<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">d</span><span class=\"p\">.</span><span class=\"nf\">toISOString</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"p\">[</span><span class=\"sc\">-</span><span class=\"sc\">:</span><span class=\"p\">]</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\.</span><span class=\"se\">\\d</span><span class=\"p\">{</span>3<span class=\"p\">}</span><span class=\"o\">/</span></span><span class=\"p\">,</span> <span class=\"s\">''</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">str</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">return</span> <span class=\"n\">str</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\\\</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\\\\\'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">;</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\;'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"s\">,</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\,'</span><span class=\"p\">)</span><span class=\"p\">.</span><span class=\"nf\">replace</span><span class=\"p\">(</span><span class=\"ss\"><span class=\"o\">/</span><span class=\"se\">\\n</span><span class=\"o\">/</span>g</span><span class=\"p\">,</span> <span class=\"s\">'\\\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">function</span> <span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"p\">]</span><span class=\"p\">;</span>\n <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span>length <span class=\"o\">></span> 75<span class=\"p\">)</span> <span class=\"p\">{</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>0<span class=\"p\">,</span> 75<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">line</span> <span class=\"o\">=</span> <span class=\"s\">' '</span> <span class=\"o\">+</span> <span class=\"n\">line</span><span class=\"p\">.</span><span class=\"nf\">substring</span><span class=\"p\">(</span>75<span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">return</span> <span class=\"n\">out</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span>\n\n <span class=\"k\">const</span> <span class=\"n\">lines</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n <span class=\"s\">'BEGIN:VCALENDAR'</span><span class=\"p\">,</span>\n <span class=\"s\">'VERSION:2.0'</span><span class=\"p\">,</span>\n <span class=\"s\">'PRODID:-//Minnebar Schedule Bookmarklet//EN'</span><span class=\"p\">,</span>\n <span class=\"s\">'CALSCALE:GREGORIAN'</span><span class=\"p\">,</span>\n <span class=\"s\">'METHOD:PUBLISH'</span>\n <span class=\"p\">]</span><span class=\"p\">;</span>\n\n <span class=\"n\">events</span><span class=\"p\">.</span><span class=\"nf\">forEach</span><span class=\"p\">(</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"o\">=></span> <span class=\"p\">{</span>\n <span class=\"k\">const</span> <span class=\"n\">uid</span> <span class=\"o\">=</span> <span class=\"s\">'minnebar-'</span> <span class=\"o\">+</span> <span class=\"n\">ev</span><span class=\"p\">.</span>start <span class=\"o\">+</span> <span class=\"s\">'-'</span> <span class=\"o\">+</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"s\">'@minnestar.org'</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"nf\">Math</span><span class=\"p\">.</span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"nf\">Date</span><span class=\"p\">.</span><span class=\"nf\">now</span><span class=\"p\">(</span><span class=\"p\">)</span> <span class=\"o\">/</span> 1000<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'BEGIN:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'UID:'</span> <span class=\"o\">+</span> <span class=\"n\">uid</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTAMP:'</span> <span class=\"o\">+</span> <span class=\"n\">now</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTSTART:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>start<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'DTEND:'</span> <span class=\"o\">+</span> <span class=\"nf\">toICSDate</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>end<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'SUMMARY:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>title<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'LOCATION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>location<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"nf\">foldLine</span><span class=\"p\">(</span><span class=\"s\">'DESCRIPTION:'</span> <span class=\"o\">+</span> <span class=\"nf\">escapeICS</span><span class=\"p\">(</span><span class=\"n\">ev</span><span class=\"p\">.</span>description<span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VEVENT'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">push</span><span class=\"p\">(</span><span class=\"s\">'END:VCALENDAR'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"k\">const</span> <span class=\"n\">icsContent</span> <span class=\"o\">=</span> <span class=\"n\">lines</span><span class=\"p\">.</span><span class=\"nf\">join</span><span class=\"p\">(</span><span class=\"s\">'\\r\\n'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">blob</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nf\">Blob</span><span class=\"p\">(</span><span class=\"p\">[</span><span class=\"n\">icsContent</span><span class=\"p\">]</span><span class=\"p\">,</span> <span class=\"p\">{</span> type: <span class=\"s\">'text/calendar;charset=utf-8'</span> <span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">createObjectURL</span><span class=\"p\">(</span><span class=\"n\">blob</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"k\">const</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nf\">createElement</span><span class=\"p\">(</span><span class=\"s\">'a'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>href <span class=\"o\">=</span> <span class=\"n\">url</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span>download <span class=\"o\">=</span> <span class=\"s\">'minnebar-schedule.ics'</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">appendChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"n\">a</span><span class=\"p\">.</span><span class=\"nf\">click</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"nb\">document</span><span class=\"p\">.</span>body<span class=\"p\">.</span><span class=\"nf\">removeChild</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span><span class=\"p\">;</span>\n <span class=\"no\">URL</span><span class=\"p\">.</span><span class=\"nf\">revokeObjectURL</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">)</span><span class=\"p\">;</span>\n\n <span class=\"nf\">alert</span><span class=\"p\">(</span><span class=\"s\">'Downloaded '</span> <span class=\"o\">+</span> <span class=\"n\">events</span><span class=\"p\">.</span>length <span class=\"o\">+</span> <span class=\"s\">' session(s) to minnebar-schedule.ics'</span><span class=\"p\">)</span><span class=\"p\">;</span>\n<span class=\"p\">}</span><span class=\"p\">)</span><span class=\"p\">(</span><span class=\"p\">)</span><span class=\"p\">;</span>\n</code></pre></div>","md":"Add `DTSTAMP` right after `UID` in the `forEach` block — it just needs to be the current UTC timestamp:\n\n```javascript\n events.forEach((ev, i) => {\n const uid = 'minnebar-' + ev.start + '-' + i + '@minnestar.org';\n const now = toICSDate(Math.floor(Date.now() / 1000));\n lines.push('BEGIN:VEVENT');\n lines.push(foldLine('UID:' + uid));\n lines.push('DTSTAMP:' + now);\n lines.push('DTSTART:' + toICSDate(ev.start));\n lines.push('DTEND:' + toICSDate(ev.end));\n lines.push(foldLine('SUMMARY:' + escapeICS(ev.title)));\n if (ev.location) lines.push(foldLine('LOCATION:' + escapeICS(ev.location)));\n if (ev.description) lines.push(foldLine('DESCRIPTION:' + escapeICS(ev.description)));\n lines.push('END:VEVENT');\n });\n```\n\nHere's the full updated bookmarklet:\n\n```javascript\njavascript:(function(){\n const timeMap = {};\n document.querySelectorAll('.nav-top .timeslot[startsAt]').forEach(a => {\n const href = a.getAttribute('href');\n const id = href.replace('#', '');\n timeMap[id] = {\n start: parseInt(a.getAttribute('startsAt'), 10),\n end: parseInt(a.getAttribute('endsAt'), 10)\n };\n });\n\n const events = [];\n\n document.querySelectorAll('.timeslot[id]').forEach(block => {\n const id = block.id;\n const times = timeMap[id];\n if (!times) return;\n\n block.querySelectorAll('.session').forEach(session => {\n const btn = session.querySelector('button.toggle-attendance');\n if (!btn || btn.getAttribute('data-session-attending') !== 'true') return;\n\n const titleEl = session.querySelector('h3.title');\n const roomEl = session.querySelector('.room');\n const descEl = session.querySelector('.description');\n\n const title = titleEl ? titleEl.textContent.trim() : 'Untitled Session';\n const location = roomEl ? roomEl.textContent.trim() : '';\n\n let description = '';\n if (descEl) {\n const clone = descEl.cloneNode(true);\n clone.querySelectorAll('a[href]').forEach(a => {\n const href = a.getAttribute('href');\n const text = a.textContent.trim();\n a.replaceWith(text === href ? text : text + ' (' + href + ')');\n });\n description = clone.textContent.trim();\n }\n\n events.push({ title, location, description, start: times.start, end: times.end });\n });\n });\n\n if (events.length === 0) {\n alert('No attended sessions found. Make sure you are marked as attending sessions.');\n return;\n }\n\n function toICSDate(unixSec) {\n const d = new Date(unixSec * 1000);\n return d.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n function escapeICS(str) {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n }\n\n function foldLine(line) {\n const out = [];\n while (line.length > 75) {\n out.push(line.substring(0, 75));\n line = ' ' + line.substring(75);\n }\n out.push(line);\n return out.join('\\r\\n');\n }\n\n const lines = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//Minnebar Schedule Bookmarklet//EN',\n 'CALSCALE:GREGORIAN',\n 'METHOD:PUBLISH'\n ];\n\n events.forEach((ev, i) => {\n const uid = 'minnebar-' + ev.start + '-' + i + '@minnestar.org';\n const now = toICSDate(Math.floor(Date.now() / 1000));\n lines.push('BEGIN:VEVENT');\n lines.push(foldLine('UID:' + uid));\n lines.push('DTSTAMP:' + now);\n lines.push('DTSTART:' + toICSDate(ev.start));\n lines.push('DTEND:' + toICSDate(ev.end));\n lines.push(foldLine('SUMMARY:' + escapeICS(ev.title)));\n if (ev.location) lines.push(foldLine('LOCATION:' + escapeICS(ev.location)));\n if (ev.description) lines.push(foldLine('DESCRIPTION:' + escapeICS(ev.description)));\n lines.push('END:VEVENT');\n });\n\n lines.push('END:VCALENDAR');\n\n const icsContent = lines.join('\\r\\n');\n const blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'minnebar-schedule.ics';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n alert('Downloaded ' + events.length + ' session(s) to minnebar-schedule.ics');\n})();\n```","profile":{"id":"095899c5-634b-4eeb-ad03-41fd508fbb51","name":"Code","accessible":true,"model":"claude-4-sonnet","deprecate":false,"retired":false,"successor_model":null,"model_name":"Claude 4.6 Sonnet","model_provider":"anthropic","model_input_limit":1000000,"recommended":false,"model_info":"\n\n\n\n<div class=\"heading\">\n <div class=\"left\">\n \n \n \n <svg class=\"model-icon icon-xs\" data-model=\"claude-4-sonnet\">\n <use href=\"#icon-kagi-1\"/>\n </svg>\n <h3>\n \n <span class=\"model-name\">Code</span>\n </h3>\n </div>\n\n \n</div>\n\n\n<hr />\n<ul>\n \n <li>\n <h4>\n Model\n </h4>\n <span class=\"flex align-center gap-8\">\n <svg class=\"icon-xs icon\">\n <use href=\"#icon-anthropic\" />\n </svg>\n <span class=\"model-name\">Claude 4.6 Sonnet</span>\n </span>\n </li>\n <li>\n <h4>\n Web access\n </h4>\n <span>On</span>\n </li>\n <li>\n <h4>\n Lenses\n </h4>\n <span>--</span>\n </li>\n \n</ul>\n\n\n","model_provider_name":"Anthropic","internet_access":true,"personalizations":false,"shortcut":null,"is_default_profile":true},"metadata":"<li>\n <span class=\"attribute\">Model</span>\n <span class=\"value\"><i class=\"icon-xs mr-4\"><svg><use href=\"#icon-anthropic\"></use></svg></i>Claude 4.6 Sonnet</span>\n</li>\n<li>\n <span class=\"attribute\">Version</span>\n <span class=\"value\">claude-sonnet-4-6</span>\n</li>\n<li>\n <span class=\"attribute\">Speed (tok/s)</span>\n <span class=\"value\">104</span>\n</li>\n<li>\n <span class=\"attribute\">Tokens</span>\n <span class=\"value\">8,245</span>\n</li>\n<li>\n <span class=\"attribute\">Cost / Total ($)</span>\n <span class=\"value\">0.06 / 0.36</span>\n</li>\n<li>\n <span class=\"attribute\">End to end time (s)</span>\n <span class=\"value\">16.22</span>\n</li>\n<li>\n <span class=\"attribute\">Submitted</span>\n <span class=\"value\">2026-05-01 12:53</span>\n</li>\n\n","documents":[]}]