[{"data":1,"prerenderedAt":153},["ShallowReactive",2],{"talk-\u002Ftalks\u002F2025-10-21\u002Fstrasbourgjs":3,"talks-explore-en-b775ce48-d189-4813-9bfb-4198ad5daf60":70},{"metadata":4,"summary":40,"transcript":69},{"id":5,"title":6,"artifacts":7,"date":9,"description":10,"event":11,"extension":19,"links":20,"locale":26,"meta":27,"slug":28,"sourceLanguage":29,"stem":30,"talkId":31,"topics":32,"__hash__":39},"talks\u002Ftalks\u002F2025-10-21\u002Fstrasbourgjs.json","Reactivity and signals: demystifying frontend magic",{"summary":8},"summary.en.md","2025-10-21","Unpack frontend reactivity: change propagation, dependency tracking, signals, computed values, and effects in modern frameworks.",{"name":12,"url":13,"location":14},"StrasbourgJS","https:\u002F\u002Fstrasbourgjs.org\u002F",{"city":15,"country":16,"latitude":17,"longitude":18},"Strasbourg","France",48.576651520014444,7.755109833536078,"json",{"slides":21,"thumbnail":22,"thumbnailDark":23,"source":24,"pdf":25},"https:\u002F\u002Ftalks.soubiran.dev\u002F2025-10-21\u002Fstrasbourgjs","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-10-21\u002Fstrasbourgjs\u002Fthumbnail.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-10-21\u002Fstrasbourgjs\u002Fthumbnail-dark.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-10-21\u002Fstrasbourgjs\u002Fsrc","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-10-21\u002Fstrasbourgjs\u002Fpdf","en",{},"2025-10-21\u002Fstrasbourgjs","fr","talks\u002F2025-10-21\u002Fstrasbourgjs","b775ce48-d189-4813-9bfb-4198ad5daf60",[33,34,35,36,37,38],"computed-values","dependency-tracking","effects","frontend-reactivity","signals","vue","FZJOODFsu41ot3jrt8KSbYwRJ2vM0bOVFKi54dDvLCA",{"id":41,"body":42,"extension":65,"meta":66,"rawbody":67,"stem":30,"__hash__":68},"talksSummary\u002Ftalks\u002F2025-10-21\u002Fstrasbourgjs.md",{"type":43,"value":44,"toc":61},"minimark",[45,58],[46,47,48,49,53,54,57],"p",{},"How does a frontend know which code to run after state changes? This talk answers the question with ",[50,51,52],"code",{},"ui = fn(state)",", an Excel example, and a small reactive system built with ",[50,55,56],{},"alien-signals",".",[46,59,60],{},"It introduces dependency graphs and doubly linked lists, then explores subscribers, computed values, effects, propagation strategies, and several unresolved problems such as glitches, cycles, mutable state, and changing dependency graphs. The last examples show how these mechanisms map to Vue.",{"title":62,"searchDepth":63,"depth":63,"links":64},"",2,[],"md",{},"How does a frontend know which code to run after state changes? This talk answers the question with `ui = fn(state)`, an Excel example, and a small reactive system built with `alien-signals`.\n\nIt introduces dependency graphs and doubly linked lists, then explores subscribers, computed values, effects, propagation strategies, and several unresolved problems such as glitches, cycles, mutable state, and changing dependency graphs. The last examples show how these mechanisms map to Vue.\n","1CarwhaPCo30Hmz_Ju23C6z9Vwf24qxiExfNBI3aMgA",null,[71,102,131],{"id":72,"title":73,"artifacts":74,"date":75,"description":76,"event":77,"extension":19,"links":84,"locale":26,"meta":90,"slug":91,"sourceLanguage":29,"stem":92,"talkId":93,"topics":94,"__hash__":101},"talks\u002Ftalks\u002F2025-12-09\u002Fparis-typescript.json","In JavaScript, there's a package for everything... and often for nothing.",{"summary":8},"2025-12-09","Examine the cost of unnecessary JavaScript dependencies and learn how to reduce the footprint of packages, bundles, and the delivery pipeline.",{"name":78,"url":79,"location":80},"Paris TypeScript","https:\u002F\u002Ftypescript.paris\u002F",{"city":81,"country":16,"latitude":82,"longitude":83},"Paris",48.87169321094806,2.304536999998755,{"slides":85,"thumbnail":86,"thumbnailDark":87,"source":88,"pdf":89},"https:\u002F\u002Ftalks.soubiran.dev\u002F2025-12-09\u002Fparis-typescript","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-12-09\u002Fparis-typescript\u002Fthumbnail.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-12-09\u002Fparis-typescript\u002Fthumbnail-dark.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-12-09\u002Fparis-typescript\u002Fsrc","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-12-09\u002Fparis-typescript\u002Fpdf",{},"2025-12-09\u002Fparis-typescript","talks\u002F2025-12-09\u002Fparis-typescript","002afe47-59fc-4f1d-9717-a7b779167a37",[95,96,97,98,99,100],"bundle-size","dependencies","e18e","javascript","package-management","performance","U4n3QlK4t5_NZrGW71uPSDBJbO8Ko_3MG7qdu-Ym48E",{"id":103,"title":6,"artifacts":104,"date":106,"description":10,"event":107,"extension":19,"links":114,"locale":26,"meta":125,"slug":126,"sourceLanguage":29,"stem":127,"talkId":128,"topics":129,"__hash__":130},"talks\u002Ftalks\u002F2025-04-30\u002Fmixit.json",{"summary":8,"transcript":105},"transcript.en.md","2025-04-30",{"name":108,"url":109,"location":110},"MiXiT","https:\u002F\u002Fmixitconf.org\u002F",{"city":111,"country":16,"latitude":112,"longitude":113},"Lyon",45.78405605635917,4.869033628453851,{"slides":115,"thumbnail":116,"thumbnailDark":117,"source":118,"pdf":119,"recording":120,"youtubeEmbed":121,"audio":122,"transcript":123,"article":124},"https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Fthumbnail.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Fthumbnail-dark.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Fsrc","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Fpdf","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Frecording","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F3PcrqsBVGgA","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Faudio","https:\u002F\u002Fsoubiran.dev\u002Ftalks\u002F2025-04-30\u002Fmixit","https:\u002F\u002Ftalks.soubiran.dev\u002F2025-04-30\u002Fmixit\u002Farticle",{},"2025-04-30\u002Fmixit","talks\u002F2025-04-30\u002Fmixit","19af3c1a-3178-4692-9962-80383fcf130c",[33,34,35,36,37,38],"lJRnGPlccRx6tYMEyG8QaT-RRFxA8LlS_3LFVYxNNN0",{"id":132,"title":6,"artifacts":133,"date":134,"description":10,"event":135,"extension":19,"links":141,"locale":26,"meta":147,"slug":148,"sourceLanguage":29,"stem":149,"talkId":150,"topics":151,"__hash__":152},"talks\u002Ftalks\u002F2026-06-27-1\u002Fasynconf.json",{"summary":8},"2026-06-27",{"name":136,"url":137,"location":138},"Asynconf","https:\u002F\u002Fapp.itsasync.fr\u002Fconference",{"city":81,"country":16,"latitude":139,"longitude":140},48.89269193190247,2.2396244361872975,{"slides":142,"thumbnail":143,"thumbnailDark":144,"source":145,"pdf":146},"https:\u002F\u002Ftalks.soubiran.dev\u002F2026-06-27-1\u002Fasynconf","https:\u002F\u002Ftalks.soubiran.dev\u002F2026-06-27-1\u002Fasynconf\u002Fthumbnail.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2026-06-27-1\u002Fasynconf\u002Fthumbnail-dark.png","https:\u002F\u002Ftalks.soubiran.dev\u002F2026-06-27-1\u002Fasynconf\u002Fsrc","https:\u002F\u002Ftalks.soubiran.dev\u002F2026-06-27-1\u002Fasynconf\u002Fpdf",{},"2026-06-27-1\u002Fasynconf","talks\u002F2026-06-27-1\u002Fasynconf","3a6cc04a-9744-4594-9083-ec545eaaeaaa",[33,34,35,36,37,38],"aCtN3bWLcdN9qGQL5BvV09bkDgH4B2Nexmx4loZ9np4",1790086905877]