{"version":"https://jsonfeed.org/version/1","title":"Readable: Hacker News","home_page_url":"https://readable.news","feed_url":"https://readable.news/api/feed?format=json","icon":"https://news.ycombinator.com/y18.svg","favicon":"https://news.ycombinator.com/favicon.ico","items":[{"id":"50242939","url":"https://www.sec.gov/Archives/edgar/data/2130357/000162828026067168/anthropicpbc-sx1.htm","external_url":"https://news.ycombinator.com/item?id=50242939","title":"Anthropic S-1","date_published":"2026-10-26T13:04:50Z"},{"id":"50225695","url":"https://danluu.com/ambitious/","external_url":"https://news.ycombinator.com/item?id=50225695","title":"We should be more ambitious with the software we build","date_published":"2026-10-24T21:47:31Z"},{"title":"Root shell on Samsung TV","content_html":"<div class=\"page\" id=\"readability-page-1\"><div><section><p></p><h2>Log in or sign up for X</h2><p></p><div><p>See what’s happening and join the conversation</p><div><p><a href=\"https://twitter.com/i/jf/onboarding/web?mode=signup&redirect_after_login=%2Flog4j%2Fstatus%2F2113014142600953868%3Fs%3D46\"><span><span>Continue with phone</span></span></a></p></div><p><span></span> or <span></span></p><p><a href=\"https://twitter.com/i/jf/onboarding/web?mode=login&redirect_after_login=%2Flog4j%2Fstatus%2F2113014142600953868%3Fs%3D46\"><span><span>Log in with username or email</span></span></a></p></div></section><section><p></p><h2>Relevant people</h2><p></p><div data-navigation-stop tabindex=\"0\" data-href=\"/log4j\" role=\"link\"><a aria-label=\"log4j\" href=\"https://twitter.com/log4j\" data-status=\"active\" aria-current=\"page\"><p><img draggable=\"false\" alt=\"Avatar\" decoding=\"async\" loading=\"lazy\" src=\"https://pbs.twimg.com/profile_images/2103214939112448000/ejp3VPpq_normal.jpg\" srcset=\"https://pbs.twimg.com/profile_images/2103214939112448000/ejp3VPpq_normal.jpg 1x, https://pbs.twimg.com/profile_images/2103214939112448000/ejp3VPpq_x96.jpg 2x, https://pbs.twimg.com/profile_images/2103214939112448000/ejp3VPpq_reasonably_small.jpg 3x\"></p></a><div><div><p><a href=\"https://twitter.com/log4j\" data-status=\"active\" aria-current=\"page\"><span>log4j</span><span>@log4j</span></a><a href=\"https://twitter.com/i/jf/onboarding/web?mode=login&redirect_after_login=%2Flog4j\">Follow</a></p></div><p><span>“advanced persistent threat” - wsj | reverse engineer, pentesting, bounty hunter, occasional LLM enjoyer</span></p></div></div></section><section aria-label=\"Loading\" role=\"status\"><h2>Trending now</h2><div></div><div></div><div></div><div></div><div></div></section><nav aria-label=\"Footer\"><span><a href=\"https://x.com/tos\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Terms</a></span><span><a href=\"https://x.com/privacy\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Privacy</a></span><span><a href=\"https://support.x.com/articles/20170514\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Cookies</a></span><span><a href=\"https://help.x.com/resources/accessibility\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Accessibility</a></span><span><a href=\"https://business.x.com/en/help/troubleshooting/how-twitter-ads-work.html?ref=web-twc-ao-gbl-adsinfo&utm_source=twc&utm_medium=web&utm_campaign=ao&utm_content=adsinfo\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Ads Info</a></span><span>© 2026 X Corp.</span></nav></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Ftwitter.com%2Flog4j%2Fstatus%2F2113014142600953868%3Fs%3D46\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"i own a relatively new (2025) samsung tv.\n\ni kept getting weirdly targeted ads.\n\ni tried reversing the firmware but it was aes encrypted and no keys unless tear it apart and do uart/jtag magic.\n\nzero days it is. root shell on new samsung TVs!\n\ndiscovered PRIVACY HORROR. write up?","image":"https://pbs.twimg.com/media/HVLvKWgXIAAWNTX?format=webp&name=large","authors":[{"name":"X (formerly Twitter)","url":"https://twitter.com/log4j/status/2113014142600953868?s=46","avatar":"https://twitter.com/favicon.ico"}],"id":"50218633","url":"https://twitter.com/log4j/status/2113014142600953868?s=46","external_url":"https://news.ycombinator.com/item?id=50218633","date_published":"2026-10-24T05:49:57Z"},{"id":"50245524","url":"https://www.seattletimes.com/business/microsoft/microsoft-offers-mass-buyouts-for-roughly-a-quarter-of-its-workforce/","external_url":"https://news.ycombinator.com/item?id=50245524","title":"Microsoft offers mass buyouts for roughly a quarter of its workforce","date_published":"2026-10-26T15:35:12Z"},{"id":"50217495","url":"https://grapheneos.social/@GrapheneOS/117492375462459244","external_url":"https://news.ycombinator.com/item?id=50217495","title":"Around a dozen banking apps began specifically permitting GrapheneOS","date_published":"2026-10-24T01:15:14Z"},{"title":"Dolly Parton's Imagination Library","content_html":"<div class=\"page\" id=\"readability-page-1\"><div> <div><h2><span>Dolly Parton’s Imagination Library</span> is dedicated to inspiring a love of reading by gifting books free of charge to children from birth to age five, through funding shared by Dolly Parton and local community partners in the United States, Canada, United Kingdom, Australia and Republic of Ireland.</h2> <p>Inspired by her father’s inability to read and write Dolly started her<span>&#160;Imagination Library</span> in 1995 for the children within her home county. Today, her program spans five countries and gifts millions of free books each month to children around the world.</p> <blockquote> <p>“When I was growing up in the hills of East Tennessee, I knew my dreams would come true. I know there are children in your community with their own dreams. They dream of becoming a doctor or an inventor or a minister. Who knows, maybe there is a little girl whose dream is to be a writer and singer.</p> <p>The seeds of these dreams are often found in books and the seeds you help plant in your community can grow across the world.”</p> </blockquote></div><div> <p> In 1995, Dolly Parton launched an exciting new effort,<span>&#160;Dolly Parton’s Imagination Library</span>, to benefit the children of her home county in East Tennessee, USA. Dolly’s vision was to foster a love of reading among her county’s preschool children and their families by providing them with the gift of a specially selected book each month.</p> </div><div> <p>By mailing high quality, age-appropriate books directly to their homes, she wanted children to be excited about books and to feel the magic that books can create. Moreover, she could ensure that every child would have books, regardless of their family’s income</p> </div> </div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fimaginationlibrary.com%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Dolly Parton’s Imagination Library is a book gifting program that mails free books to children from birth until they begin school in participating areas.","image":"https://imaginationlibrary.com/ilData/usrFiles/2022/05/DPIL-Logo-195.png","authors":[{"name":null,"url":"https://imaginationlibrary.com/","avatar":"https://imaginationlibrary.com/ilData/usrFiles/2021/04/cropped-dpil-favicon-reg-32x32.png"}],"id":"50234474","url":"https://imaginationlibrary.com/","external_url":"https://news.ycombinator.com/item?id=50234474","date_published":"2026-10-25T18:23:54Z"},{"title":"A 10-year-old CNN outperforms frontier LLMs for skin cancer diagnosis","content_html":"<div class=\"page\" id=\"readability-page-1\"><article> <header> <p>I am a dermatologist. I tested the ability of GPT-6 Astra and Claude Fable 5.1 to diagnosis skin cancer and found that they were less accurate than I expected. I compared to a 10-year old CNN and to my surprise found that this was superior.</p> </header> <p>This is a melanoma.</p> <figure> <div><p><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_7403025.jpg\" alt=\"Clinical photograph: Invasive melanoma on the ear, under 0.8 mm thick.\" width=\"600\" height=\"450\" loading=\"lazy\"><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_4552372.jpg\" alt=\"Dermoscopic image: Invasive melanoma on the ear, under 0.8 mm thick.\" width=\"600\" height=\"450\" loading=\"lazy\"></p></div> <figcaption><strong>Figure 1.</strong> Invasive melanoma on the ear, under 0.8 mm thick. Both LLMs called it a seborrhoeic keratosis and said it could be discharged. The CNN called it a melanoma. Clinical photograph on the left, dermoscopic image on the right. Images: <a href=\"https://doi.org/10.34970/648456\">MILK10k</a>, MILK study team, CC BY-NC.</figcaption> </figure> <p>I showed these two images - a clinical photograph and a dermoscopic (skin microscope) image - to GPT-6 Astra and Claude Fable 5.1, two of the most capable AI models available in October 2026. Both said it was a seborrhoeic keratosis, a harmless warty growth, and that the patient could be discharged. I then showed them to fine-tuned version of Inception v3, a convolutional neural network (CNN) first published by Google in 2015 and fine-tuned here on public dermatology images. The CNN got the right answer based on the dermoscopy view. </p> <p>It was one of 200 biopsy-proven lesions I gave to all three. The CNN named the right diagnosis (out of 6 possiblities) for 125 of them (62%). The two frontier LLMs named it for 84 and 85 (42%). A ten-year-old network, fine-tuned for about twenty minutes, beat both of them at recognising skin cancer.</p> <h2 id=\"the-test\">The test<a href=\"https://lynchlab.net/llm-skin-cancer#the-test\" title=\"Link to this section\">#</a></h2> <p>The lesions come from <a href=\"https://doi.org/10.34970/648456\">MILK10k</a>, a public dataset released through the International Skin Imaging Collaboration in 2025, in which each lesion is photographed twice: a clinical close-up and a dermoscopic image taken through the illuminated magnifying lens dermatologists use. I drew 200 lesions at random, all confirmed by histopathology:</p> <ul> <li><strong>100 that should not be discharged:</strong> 30 melanomas, 25 basal cell carcinomas, 25 squamous cell carcinomas (including Bowen’s disease) and 20 actinic keratoses.</li> <li><strong>100 that are safe to discharge:</strong> 50 benign naevi (moles) and 50 seborrhoeic keratoses.</li> </ul> <p>Every lesion was biopsied, including the benign ones, so these are harder to diagnose: a mole that somebody decided to cut out is one that worried a clinician.</p> <figure> <div><p><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_5168853.jpg\" alt=\"Clinical photograph: Basal cell carcinoma on the trunk of a 75-year-old man. Both models answered correctly.\" width=\"600\" height=\"450\" loading=\"lazy\"><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_2485182.jpg\" alt=\"Dermoscopic image: Basal cell carcinoma on the trunk of a 75-year-old man. Both models answered correctly.\" width=\"600\" height=\"450\" loading=\"lazy\"></p><p>Basal cell carcinoma on the trunk of a 75-year-old man. All three models answered correctly.</p></div> <div><p><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_1091183.jpg\" alt=\"Clinical photograph: Invasive melanoma under 0.8 mm thick, with very little pigment. GPT-6 Astra called it a basal cell carcinoma with 95% confidence.\" width=\"600\" height=\"450\" loading=\"lazy\"><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_6551749.jpg\" alt=\"Dermoscopic image: Invasive melanoma under 0.8 mm thick, with very little pigment. GPT-6 Astra called it a basal cell carcinoma with 95% confidence.\" width=\"600\" height=\"450\" loading=\"lazy\"></p><p>Invasive melanoma under 0.8 mm thick, with very little pigment. GPT-6 Astra called it a basal cell carcinoma with 95% confidence. Claude Fable 5.1 and the CNN called it a melanoma.</p></div> <div><p><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_3428806.jpg\" alt=\"Clinical photograph: Seborrhoeic keratosis on the leg. Both models called it an actinic keratosis and said it should not be discharged.\" width=\"600\" height=\"450\" loading=\"lazy\"><img src=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_6279832.jpg\" alt=\"Dermoscopic image: Seborrhoeic keratosis on the leg. Both models called it an actinic keratosis and said it should not be discharged.\" width=\"600\" height=\"450\" loading=\"lazy\"></p><p>Seborrhoeic keratosis on the leg. Both LLMs called it an actinic keratosis and the CNN a squamous cell carcinoma: all three were wrong, though all three would have kept it rather than discharge it.</p></div> <figcaption><strong>Figure 2.</strong> Three more of the 200 test lesions. Clinical photograph on the left, dermoscopic image on the right. Images: <a href=\"https://doi.org/10.34970/648456\">MILK10k</a>, MILK study team, CC BY-NC.</figcaption> </figure> <p><strong>The LLMs</strong> were given both images and nothing else, and asked, as a clinician might use them, for the most likely of the six diagnoses (or “unsure”), a confidence, a second choice, and whether the lesion could be safely discharged with no treatment, biopsy or follow-up. Both models got the same prompt at default settings, and neither refused a case.</p> <p><strong>The CNN</strong> is deliberately not state of the art. I used Inception v3 pretrained on everyday photographs and then fine-tuned all layers on 68,011 dermoscopic and clinical images from the <a href=\"https://www.isic-archive.com/\">ISIC Archive</a> on a single H100 GPU. These 200 test lesions, and every other photograph of the same lesion or patient, were removed from its data (including the validation set) before training, so it had never seen them, and they were not used to choose the model or set its threshold. It scored both images of each lesion, combined them with most of the weight on the dermoscopic image, and chose from the same six diagnoses.</p> <p>You can <a href=\"https://lynchlab.net/skin-ai-inception\">try the CNN yourself</a>. Remarkably the model is small enough to run entirely in a phone browser using WebGPU. Nothing is uploaded, and its random sample button draws from these same 200 lesions.</p> <h2 id=\"diagnosis-62-against-42\">Diagnosis: 62% against 42%<a href=\"https://lynchlab.net/llm-skin-cancer#diagnosis-62-against-42\" title=\"Link to this section\">#</a></h2> <figure> <svg viewbox=\"0 0 520 479\" role=\"img\" aria-label=\"Share of lesions given the correct diagnosis by GPT-6 Astra, Claude Fable 5.1 and Inception v3, overall and by true diagnosis\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"150\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><text x=\"168\" y=\"18\">GPT-6 Astra</text><rect x=\"265\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><text x=\"283\" y=\"18\">Claude Fable 5.1</text><rect x=\"400\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><text x=\"418\" y=\"18\">Inception v3</text><line x1=\"150\" y1=\"34\" x2=\"150\" y2=\"455\"/><line x1=\"225\" y1=\"34\" x2=\"225\" y2=\"455\"/><line x1=\"300\" y1=\"34\" x2=\"300\" y2=\"455\"/><line x1=\"375\" y1=\"34\" x2=\"375\" y2=\"455\"/><line x1=\"450\" y1=\"34\" x2=\"450\" y2=\"455\"/><text x=\"140\" y=\"60\" text-anchor=\"end\">All 200 lesions</text><path d=\"M150,38h122.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-122.0z\"><title>GPT-6 Astra - All 200 lesions: 84 of 200 (42%)</title></path><text x=\"282.0\" y=\"49\">84/200<title>GPT-6 Astra - All 200 lesions: 84 of 200 (42%)</title></text><path d=\"M150,53h123.5a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-123.5z\"><title>Claude Fable 5.1 - All 200 lesions: 85 of 200 (42%)</title></path><text x=\"283.5\" y=\"64\">85/200<title>Claude Fable 5.1 - All 200 lesions: 85 of 200 (42%)</title></text><path d=\"M150,68h183.5a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-183.5z\"><title>Inception v3 - All 200 lesions: 125 of 200 (62%)</title></path><text x=\"343.5\" y=\"79\">125/200<title>Inception v3 - All 200 lesions: 125 of 200 (62%)</title></text><text x=\"0\" y=\"109\">By true diagnosis</text><text x=\"140\" y=\"146\" text-anchor=\"end\">Melanoma</text><path d=\"M150,123h76.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-76.0z\"><title>GPT-6 Astra - Melanoma: 8 of 30 (27%)</title></path><text x=\"236.0\" y=\"134\">8/30<title>GPT-6 Astra - Melanoma: 8 of 30 (27%)</title></text><path d=\"M150,138h106.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-106.0z\"><title>Claude Fable 5.1 - Melanoma: 11 of 30 (37%)</title></path><text x=\"266.0\" y=\"149\">11/30<title>Claude Fable 5.1 - Melanoma: 11 of 30 (37%)</title></text><path d=\"M150,153h126.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-126.0z\"><title>Inception v3 - Melanoma: 13 of 30 (43%)</title></path><text x=\"286.0\" y=\"164\">13/30<title>Inception v3 - Melanoma: 13 of 30 (43%)</title></text><text x=\"140\" y=\"202\" text-anchor=\"end\">BCC</text><path d=\"M150,180h296.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-296.0z\"><title>GPT-6 Astra - BCC: 25 of 25 (100%)</title></path><text x=\"456.0\" y=\"191\">25/25<title>GPT-6 Astra - BCC: 25 of 25 (100%)</title></text><path d=\"M150,195h212.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-212.0z\"><title>Claude Fable 5.1 - BCC: 18 of 25 (72%)</title></path><text x=\"372.0\" y=\"206\">18/25<title>Claude Fable 5.1 - BCC: 18 of 25 (72%)</title></text><path d=\"M150,210h284.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-284.0z\"><title>Inception v3 - BCC: 24 of 25 (96%)</title></path><text x=\"444.0\" y=\"221\">24/25<title>Inception v3 - BCC: 24 of 25 (96%)</title></text><text x=\"140\" y=\"260\" text-anchor=\"end\">SCC</text><path d=\"M150,237h140.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-140.0z\"><title>GPT-6 Astra - SCC: 12 of 25 (48%)</title></path><text x=\"300.0\" y=\"248\">12/25<title>GPT-6 Astra - SCC: 12 of 25 (48%)</title></text><path d=\"M150,252h56.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-56.0z\"><title>Claude Fable 5.1 - SCC: 5 of 25 (20%)</title></path><text x=\"216.0\" y=\"263\">5/25<title>Claude Fable 5.1 - SCC: 5 of 25 (20%)</title></text><path d=\"M150,267h188.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-188.0z\"><title>Inception v3 - SCC: 16 of 25 (64%)</title></path><text x=\"348.0\" y=\"278\">16/25<title>Inception v3 - SCC: 16 of 25 (64%)</title></text><text x=\"140\" y=\"316\" text-anchor=\"end\">Actinic keratosis</text><path d=\"M150,294h146.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-146.0z\"><title>GPT-6 Astra - Actinic keratosis: 10 of 20 (50%)</title></path><text x=\"306.0\" y=\"305\">10/20<title>GPT-6 Astra - Actinic keratosis: 10 of 20 (50%)</title></text><path d=\"M150,309h176.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-176.0z\"><title>Claude Fable 5.1 - Actinic keratosis: 12 of 20 (60%)</title></path><text x=\"336.0\" y=\"320\">12/20<title>Claude Fable 5.1 - Actinic keratosis: 12 of 20 (60%)</title></text><path d=\"M150,324h131.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-131.0z\"><title>Inception v3 - Actinic keratosis: 9 of 20 (45%)</title></path><text x=\"291.0\" y=\"335\">9/20<title>Inception v3 - Actinic keratosis: 9 of 20 (45%)</title></text><text x=\"140\" y=\"374\" text-anchor=\"end\">Naevus</text><path d=\"M150,351h92.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-92.0z\"><title>GPT-6 Astra - Naevus: 16 of 50 (32%)</title></path><text x=\"252.0\" y=\"362\">16/50<title>GPT-6 Astra - Naevus: 16 of 50 (32%)</title></text><path d=\"M150,366h194.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-194.0z\"><title>Claude Fable 5.1 - Naevus: 33 of 50 (66%)</title></path><text x=\"354.0\" y=\"377\">33/50<title>Claude Fable 5.1 - Naevus: 33 of 50 (66%)</title></text><path d=\"M150,381h218.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-218.0z\"><title>Inception v3 - Naevus: 37 of 50 (74%)</title></path><text x=\"378.0\" y=\"392\">37/50<title>Inception v3 - Naevus: 37 of 50 (74%)</title></text><text x=\"140\" y=\"430\" text-anchor=\"end\">Seb. keratosis</text><path d=\"M150,408h74.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-74.0z\"><title>GPT-6 Astra - Seb. keratosis: 13 of 50 (26%)</title></path><text x=\"234.0\" y=\"419\">13/50<title>GPT-6 Astra - Seb. keratosis: 13 of 50 (26%)</title></text><path d=\"M150,423h32.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-32.0z\"><title>Claude Fable 5.1 - Seb. keratosis: 6 of 50 (12%)</title></path><text x=\"192.0\" y=\"434\">6/50<title>Claude Fable 5.1 - Seb. keratosis: 6 of 50 (12%)</title></text><path d=\"M150,438h152.0a4.0,4.0 0 0 1 4.0,4.0v5.0a4.0,4.0 0 0 1 -4.0,4.0h-152.0z\"><title>Inception v3 - Seb. keratosis: 26 of 50 (52%)</title></path><text x=\"312.0\" y=\"449\">26/50<title>Inception v3 - Seb. keratosis: 26 of 50 (52%)</title></text><text x=\"150\" y=\"471\" text-anchor=\"middle\">0%</text><text x=\"225\" y=\"471\" text-anchor=\"middle\">25%</text><text x=\"300\" y=\"471\" text-anchor=\"middle\">50%</text><text x=\"375\" y=\"471\" text-anchor=\"middle\">75%</text><text x=\"450\" y=\"471\" text-anchor=\"middle\">100%</text></svg> <figcaption><strong>Figure 3.</strong> Correct first-choice diagnosis for the two LLMs and the CNN, which chose from the same six diagnoses. Labels show correct answers out of the number of lesions with that histology.</figcaption> </figure> <p>The CNN was right more often overall and on most diagnoses. Allowing a second choice, it reached 173 of 200 against 134 and 138. It named 13 of the 30 melanomas against 8 and 11. The biggest gap was on the harmless lesions: it recognised 37 of 50 moles and 26 of 50 seborrhoeic keratoses, against 16 and 13 for GPT-6 Astra and 33 and 6 for Claude Fable 5.1. It was one short of GPT-6 Astra on basal cell carcinoma and behind both LLMs on actinic keratosis.</p> <p>The models also failed differently. Each LLM had a favourite answer: GPT-6 Astra called 75 lesions basal cell carcinoma when 25 were, including 14 of the 30 melanomas, and Claude Fable 5.1 called 53 lesions actinic keratosis when 20 were. The CNN’s errors on melanoma went the other way: of the 17 it got wrong, it called 8 a naevus and 6 a seborrhoeic keratosis.</p> <h2 id=\"the-results-in-one-table\">The results in one table<a href=\"https://lynchlab.net/llm-skin-cancer#the-results-in-one-table\" title=\"Link to this section\">#</a></h2> <table> <thead> <tr> <th></th> <th>GPT-6 Astra</th> <th>Claude Fable 5.1</th> <th>CNN (Inception v3)</th> </tr> </thead> <tbody> <tr> <td>Correct diagnosis (of 200)</td> <td>84 (42%)</td> <td>85 (42%)</td> <td>125 (62%)</td> </tr> <tr> <td>Correct in first or second choice</td> <td>134</td> <td>138</td> <td>173</td> </tr> <tr> <td>Melanoma as first choice (of 30)</td> <td>8</td> <td>11</td> <td>13</td> </tr> <tr> <td>Unsafe lesions kept (of 100)</td> <td>97</td> <td>96</td> <td>77 at its preset threshold; 98 or 99 when matched</td> </tr> <tr> <td>Safe lesions discharged (of 100)</td> <td>32</td> <td>22</td> <td>76 at its preset threshold</td> </tr> <tr> <td>Melanomas discharged (of 30)</td> <td>3</td> <td>4</td> <td>18 at its preset threshold; 2 or 1 when matched</td> </tr> </tbody> </table> <h2 id=\"caveats\">Caveats<a href=\"https://lynchlab.net/llm-skin-cancer#caveats\" title=\"Link to this section\">#</a></h2> <ul> <li><strong>Small numbers.</strong> Two hundred lesions are enough to show the pattern but not to rank close results, and 30 melanomas give wide uncertainty on the figure that matters most. Each LLM case was run once; answers vary between runs.</li> <li><strong>Hard cases.</strong> Every lesion was biopsied. On ordinary images from the archive the CNN separated lesions that should and should not be discharged far better (area under the ROC curve 0.96, against 0.86 here).</li> <li><strong>Contamination.</strong> MILK10k has been public since 2025, so the LLMs could have seen it in training; if anything that would have helped them. The CNN certainly had not.</li> <li><strong>Not state of the art.</strong> Inception v3 is a baseline. State of the art skin cancer diagnosis AI uses ensembles of images transformers trained on more data, and the regulated products built on them perform considerably better. </li> </ul> <h2 id=\"asked-as-a-patient\">Asked as a patient<a href=\"https://lynchlab.net/llm-skin-cancer#asked-as-a-patient\" title=\"Link to this section\">#</a></h2> <p>Asked as a patient instead, with the clinical photograph alone and the question “do I need to see a doctor?”, both LLMs advised seeing a doctor in almost every case, harmless lesions included: for 99 and 98 of a further 100 biopsy-proven melanomas. </p> <h2 id=\"conclusion\">Conclusion<a href=\"https://lynchlab.net/llm-skin-cancer#conclusion\" title=\"Link to this section\">#</a></h2> <p>A small, old, specialised network using an outdated architecture recognises skin lesions far better than two frontier LLMs. </p> <h2 id=\"run-it-yourself\">Run it yourself<a href=\"https://lynchlab.net/llm-skin-cancer#run-it-yourself\" title=\"Link to this section\">#</a></h2> <p>The cases, prompts, every LLM reply and the scoring code are <a href=\"https://d2gaqzonlm544h.cloudfront.net/skin-ai/data/llm-skin-cancer-test.zip\">in one download</a>, and the CNN is <a href=\"https://lynchlab.net/skin-ai-inception\">here</a>. </p> <p>I designed the test and made the clinical rulings. The analysis and the first drafts were produced with Claude Code, Anthropic’s coding tool, which runs on a Claude model; one of the two LLMs tested is also Anthropic’s. Scoring was done by script against the histology.</p> <p><em>Images are from the MILK10k dataset (MILK study team, International Skin Imaging Collaboration), used under a CC BY-NC licence.</em></p> <p id=\"about\"> Dr Magnus Lynch is a Consultant Dermatologist and Mohs Surgeon at Guy's Hospital and Honorary Reader (equivalent of Associate Professor) at King's College London. His clinical work covers skin cancer, Mohs and facial reconstructive surgery, and lasers; his research covers the cell biology of skin cancers and scars and the use of AI in dermatology. <a href=\"https://lynchlab.net/\">Full profile</a>. </p> </article></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Flynchlab.net%2Fllm-skin-cancer\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"I am a dermatologist. I tested the ability of GPT-6 Astra and Claude Fable 5.1 to diagnosis skin cancer and found that they were less accurate than I expected. I compared to a 10-year old CNN and to my surprise found that this was superior.","image":"https://d2gaqzonlm544h.cloudfront.net/skin-ai/samples/ISIC_7403025.jpg","authors":[{"name":"By Dr Magnus Lynch · 25 October 2026\n        · 5 min read","url":"https://lynchlab.net/llm-skin-cancer","avatar":"https://lynchlab.net/static/ico/lynchlab-favicon.ico"}],"id":"50233779","url":"https://lynchlab.net/llm-skin-cancer","external_url":"https://news.ycombinator.com/item?id=50233779","date_published":"2026-10-25T17:15:38Z"},{"title":"No signs of AI payoff outside the tech sector","content_html":"<div class=\"page\" id=\"readability-page-1\"><div id=\"accordion-4fd4c21fa8\" data-cmp-data-layer=\"{&quot;accordion-4fd4c21fa8&quot;:{&quot;shownItems&quot;:[&quot;accordion-4fd4c21fa8-item-cfd740c717&quot;],&quot;@type&quot;:&quot;core/wcm/components/accordion/v1/accordion&quot;,&quot;repo:modifyDate&quot;:&quot;2026-08-05T06:56:07Z&quot;}}\" data-cmp-expanded data-cmp-is=\"accordion\" data-cmp-variation=\"defaultView\" data-placeholder-text=\"false\" data-cmp-hook-accordion=\"item\" role=\"region\" aria-labelledby=\"accordion-4fd4c21fa8-item-cfd740c717-button\"><p>This presentation may not be distributed, transmitted or otherwise communicated to others in whole or in part without the express consent of Apollo Global Management, Inc. (together with its subsidiaries, “Apollo”).</p><p> Apollo makes no representation or warranty, expressed or implied, with respect to the accuracy, reasonableness, or completeness of any of the statements made during this presentation, including, but not limited to, statements obtained from third parties. Opinions, estimates and projections constitute the current judgment of the speaker as of the date indicated. They do not necessarily reflect the views and opinions of Apollo and are subject to change at any time without notice. Apollo does not have any responsibility to update this presentation to account for such changes. There can be no assurance that any trends discussed during this presentation will continue.</p><p> Statements made throughout this presentation are not intended to provide, and should not be relied upon for, accounting, legal or tax advice and do not constitute an investment recommendation or investment advice. Investors should make an independent investigation of the information discussed during this presentation, including consulting their tax, legal, accounting or other advisors about such information. Apollo does not act for you and is not responsible for providing you with the protections afforded to its clients. This presentation does not constitute an offer to sell, or the solicitation of an offer to buy, any security, product or service, including interest in any investment product or fund or account managed or advised by Apollo.</p><p> Certain statements made throughout this presentation may be “forward-looking” in nature. Due to various risks and uncertainties, actual events or results may differ materially from those reflected or contemplated in such forward-looking information. As such, undue reliance should not be placed on such statements. Forward-looking statements may be identified by the use of terminology including, but not limited to, “may”, “will”, “should”, “expect”, “anticipate”, “target”, “project”, “estimate”, “intend”, “continue” or “believe” or the negatives thereof or other variations thereon or comparable terminology.</p></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fwww.apollo.com%2Fwealth%2Finsights-news%2Finsights%2Fdaily-spark%2Fno-signs-of-ai-payoff-outside-the-tech-sector\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Despite massive investments and widespread hype around artificial intelligence, the technology has delivered zero financial payoff to corporate America outside of tech. Subscribe for daily updates.","image":"https://www.apollo.com/content/dam/apolloaem/apollo-default-page-share-image/apollo-og-image.png","authors":[{"name":"About the Author","url":"https://www.apollo.com/wealth/insights-news/insights/daily-spark/no-signs-of-ai-payoff-outside-the-tech-sector","avatar":"https://www.apollo.com/etc.clientlibs/apolloaem/clientlibs/clientlib-site/resources/icons/apollo.ico"}],"id":"50224463","url":"https://www.apollo.com/wealth/insights-news/insights/daily-spark/no-signs-of-ai-payoff-outside-the-tech-sector","external_url":"https://news.ycombinator.com/item?id=50224463","date_published":"2026-10-24T19:47:19Z"},{"title":"Show HN: Steal My Bitcoin","content_html":"<div class=\"page\" id=\"readability-page-1\"><article aria-labelledby=\"winner-title\"> <h2 id=\"winner-title\">My bitcoin was stolen after: <span id=\"elapsed-hours\" title=\"19 hours 17 minutes\">19.28</span> hours.</h2> <p>Thanks for playing and congrats to the winner. More challenges may appear here in the future. For now, there are no bitcoin on this server.</p>  <dl aria-label=\"Winning result\"> <p> <dt>Date won</dt> <dd id=\"win-date\"><time datetime=\"2026-10-25\">25 October 2026</time></dd> </p> <p> <dt>Time won</dt> <dd id=\"win-time\"><time datetime=\"2026-10-25T15:47:00Z\">15:47 UTC</time></dd> </p> <p> <dt>Prize pot at the win</dt> <dd id=\"prize-pot\">0.02511679 BTC ($2,021.22)</dd> </p> </dl> <p><a href=\"https://mempool.space/address/bc1qlnu50y4zm0nwxkckxu09thn5xdcz8aw6t3cxqy\">View the prize wallet ↗</a></p> <p>Winner writeup: <a href=\"https://github.com/KillaBoi/StealMyBitcoin-PoC\">https://github.com/KillaBoi/StealMyBitcoin-PoC</a></p> <p>Also keep an eye out for a writeup about the experience of hosting this challenge!</p> </article></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fstealmybitcoin.com%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"The Steal my Bitcoin challenge has been won. Thanks for playing!","authors":[{"name":null,"url":"https://stealmybitcoin.com/","avatar":"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2064%22%3E%3Crect%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2216%22%20fill%3D%22%23deecfa%22%2F%3E%3Cpath%20d%3D%22M12%2027c1-13%2010-20%2020-20s19%207%2020%2020%22%20fill%3D%22%23244d73%22%2F%3E%3Cpath%20d%3D%22M9%2029c5-5%2013-6%2023-2%2010-4%2018-3%2023%202l-3%2014c-6%208-13%205-20%200-7%205-14%208-20%200Z%22%20fill%3D%22%23163650%22%2F%3E%3Cpath%20d%3D%22M17%2033c4-2%208-1%2011%203-5%204-9%203-11-3m30%200c-4-2-8-1-11%203%205%204%209%203%2011-3%22%20fill%3D%22%23fff%22%2F%3E%3Cpath%20d%3D%22M25%2051q7%205%2014%200%22%20fill%3D%22none%22%20stroke%3D%22%23244d73%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%2F%3E%3C%2Fsvg%3E"}],"id":"50224916","url":"https://stealmybitcoin.com/","external_url":"https://news.ycombinator.com/item?id=50224916","date_published":"2026-10-24T20:30:31Z"},{"title":"The Goose Programming Language","content_html":"<div class=\"page\" id=\"readability-page-1\"><div> <picture> <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/logo/logo_white_fg_trans_bg_mini.png\"> <source media=\"(prefers-color-scheme: light)\" srcset=\"docs/logo/logo_black_fg_white_bg_mini.png\"> <img alt=\"The Goose programming language\" src=\"https://aardappel.github.io/goose/docs/logo/logo_black_fg_white_bg_mini.png\"> </picture> <p>A memory-safe systems language with no heap allocator, garbage collector, or lifetime annotations. In this repository's benchmarks, Goose runs faster than C++ and Rust while using less memory.</p> <p><a href=\"https://aardappel.github.io/goose/docs/tutorial.html\">Tutorial</a> · <a href=\"https://aardappel.github.io/goose/docs/reference.html\">Reference</a> · <a href=\"https://aardappel.github.io/goose/docs/goose_spec.html\">Specification</a> · <a href=\"https://aardappel.github.io/goose/docs/command_line.html\">Command line</a> · <a href=\"https://aardappel.github.io/goose/docs/packages.html\">Packages</a> · <a href=\"https://aardappel.github.io/goose/samples/index.html\">Samples</a> · <a href=\"https://aardappel.github.io/goose/bench/results.html\">Benchmarks</a> · <a href=\"https://aardappel.github.io/goose/docs/stdlib.html\">Standard library</a></p> <p>Goose has syntax familiar to C and Rust programmers, but <strong>there is no heap</strong>. Every dynamic value lives inline on data stacks managed by the compiler. Growth advances a pointer, and memory is freed when its scope ends. The language's type and lifetime rules make this memory model safe to use.</p> <p><a href=\"https://discord.gg/397eZdbnsR\"><img src=\"https://img.shields.io/badge/chat-discord-blue\" alt=\"Discord Chat\"></a> <a href=\"https://twitter.com/wvo\"><img src=\"https://img.shields.io/twitter/follow/wvo.svg?style=social\" alt=\"Twitter Follow\"></a></p> <h2 id=\"why-goose\">Why Goose</h2> <ul> <li><strong>Faster than C++ and than safe Rust, while memory safe.</strong> Over sixteen benchmarks Goose runs at 3.3x the speed of idiomatic C++, 1.16x hand-optimized C++ and 1.12x the best safe Rust, and uses 1.9x, 1.3x and 1.2x less memory (<a href=\"https://aardappel.github.io/goose/bench/results.html\">results</a>). These gains come from Goose's data layouts and memory model.</li> <li><strong>No allocator, no GC, no reference counting, no destructors.</strong> Memory is a handful of data stacks that the compiler assigns statically. Freeing a structure with a million elements takes a single store, no matter how deeply it is nested.</li> <li><strong>Growth preserves references.</strong> A reference into a growing array stays valid for as long as the array does. In the corresponding benchmarks, Goose keeps typed references where C++ must call <code>reserve</code> and safe Rust uses <code>u32</code> indices.</li> <li><strong>Memory safe with zero annotations.</strong> There is no lifetime syntax, there are no aliasing or exclusivity rules, and there is no <code>unsafe</code>. The compiler infers what every reference is rooted at and rejects references that could outlive their owners.</li> <li><strong>Nested data stays inline.</strong> A string, an array of strings, a record with variable-size fields and an array of those records are each stored as one contiguous block that contains no pointers. A example record that takes 160 bytes and one allocation in C++ takes 29 bytes and no allocations in Goose.</li> <li><strong>Variable sized Enums.</strong> Variable-mode ADTs store each value at the size of its own variant rather than that of the largest variant. On the benchmark that exercises this, they use 4x less memory than a Rust <code>enum</code> and run at 2x its speed.</li> <li><strong>Links narrower than pointers.</strong> A relative reference stores a typed, checked link as a 1, 2 or 4-byte offset. Structures built from them are position independent, so a data structure can be written to a file as is. Saving it is a single write, and loading it is a single read followed by a verification pass that rejects malformed or hostile data.</li> <li><strong>Everything is built in place, guaranteed.</strong> A value is constructed at its final destination through any depth of calls. <code>items.push(parse(line))</code> writes the parsed record directly into the array, and returning a growable array by value does not copy it.</li> <li><strong>Returns across multiple calls.</strong> <code>return err from load</code> returns from a function any number of frames up the call stack. It is checked statically, and needs no unwinder, no <code>Result</code> type and no <code>?</code> on every call.</li> <li><strong>Threads with no shared memory.</strong> A worker is compiled as a separate program with its own memory, and flat values are passed between threads through typed queues with a <code>memcpy</code>. Data races, locks, atomics and memory orderings do not exist in the language.</li> <li><strong>Generics and higher-order functions with no overhead.</strong> An untyped parameter is generic. Function values are compile-time entities, so <code>xs.filter() { it &gt; 0 }</code> compiles to what the handwrittend loop would looks like and builds its result directly in its destination.</li> <li><strong>Compiles to C and can call C.</strong> Goose compiles to one C file, so it runs wherever a C compiler does and calls C directly through <code>extern fn</code>. The bundled TinyCC backend compiles and runs a program in-process, with no build step.</li> </ul> <p>The <a href=\"https://aardappel.github.io/goose/docs/tutorial.html\">tutorial</a> walks through all of this by example, the <a href=\"https://aardappel.github.io/goose/docs/reference.html\">reference</a> covers the whole language topic by topic, the <a href=\"https://aardappel.github.io/goose/docs/goose_spec.html\">specification</a> has the exact rules, and the <a href=\"https://aardappel.github.io/goose/bench/results.html\">benchmarks</a> have the numbers, including the cases where Goose loses.</p> <h2 id=\"features\">Features</h2> <p>This section focuses on what distinguishes Goose. The <a href=\"https://aardappel.github.io/goose/docs/tutorial.html\">tutorial</a> explains these features in more detail, and the <a href=\"https://aardappel.github.io/goose/samples/index.html\">samples</a> show them in thirty-one complete programs.</p> <h3 id=\"one-memory-model-data-stacks-freed-at-scope-exit\">One memory model: data stacks freed at scope exit</h3> <p>A program has the native call stack, static data and N data stacks, where the compiler works out N. A data stack is a large address-space reservation with a bump pointer, and there is no other memory. At most one resizable value is live per stack and it is always on top, so growth never moves anything and never checks a capacity. All of this is proved at compile time; the runtime tracks only the bump pointers.</p> <figure><pre><code><span id=\"cb1-1\"><span>for</span> round <span>in</span> <span>3</span> {</span> <span id=\"cb1-2\"> <span>var</span> scratch<span>:</span> <span>u8</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span> <span>// grow-only: growth is a pointer bump</span></span> <span id=\"cb1-3\"> <span>for</span> i <span>in</span> <span>100000</span> { scratch<span>.</span><span>push</span>((i <span>%</span> <span>256</span>) <span>as</span><span>!</span> <span>u8</span>)<span>;</span> }</span> <span id=\"cb1-4\"> <span>print</span>(<span>\"round \"</span><span>,</span> round<span>,</span> <span>\": \"</span><span>,</span> scratch<span>.</span><span>len</span><span>,</span> <span>\" bytes\"</span>)<span>;</span></span> <span id=\"cb1-5\">} <span>// the free: one store to the stack top</span></span></code></pre></figure> <h3 id=\"memory-never-moves-so-references-survive-growth\">Memory never moves, so references survive growth</h3> <figure><pre><code><span id=\"cb2-1\"><span>struct</span> <span>Item</span> { id<span>:</span> <span>i32</span><span>,</span> weight<span>:</span> <span>f32</span> }</span> <span id=\"cb2-2\"></span> <span id=\"cb2-3\"><span>var</span> items<span>:</span> <span>Item</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb2-4\"><span>let</span> first <span>.=</span> items<span>.</span><span>push</span>(<span>Item</span> { <span>1</span><span>,</span> <span>0.5</span> })<span>;</span> <span>// a reference to element 0</span></span> <span id=\"cb2-5\"><span>for</span> i<span>:</span> <span>i32</span> <span>in</span> <span>2</span><span>..</span><span>1000001</span> { items<span>.</span><span>push</span>(<span>Item</span> { i<span>,</span> <span>0.0</span> })<span>;</span> }</span> <span id=\"cb2-6\">first<span>.</span>weight <span>=</span> <span>99.5</span><span>;</span> <span>// still valid, a million pushes later</span></span></code></pre></figure> <p><code>push</code> returns a reference to the new element, so a program can link elements while building the array. A <code>vector&lt;T&gt;</code> or <code>Vec&lt;T&gt;</code> may reallocate and cannot provide this guarantee. Stable references account for several benchmark gains.</p> <h3 id=\"safe-references-no-annotations\">Safe references, no annotations</h3> <p>Every reference and slice has a static <em>root</em>: the variable that bounds its target's lifetime. A reference must not outlive the variable that owns its target or access that target through an incompatible type. The compiler infers roots and specializes functions for them, so no annotations are needed. There are no aliasing or exclusivity rules. When a lifetime check fails, the error names the reference's root and its destination:</p> <figure><pre><code><span id=\"cb3-1\"><span>fn</span> <span>longest</span>(a<span>:</span> <span>u8</span>[<span>:</span>]<span>,</span> b<span>:</span> <span>u8</span>[<span>:</span>]) <span>-&gt;</span> <span>u8</span>[<span>:</span>] { <span>if</span> a<span>.</span><span>len</span> <span>&gt;=</span> b<span>.</span><span>len</span> { a } <span>else</span> { b } }</span> <span id=\"cb3-2\"></span> <span id=\"cb3-3\"><span>var</span> outer<span>:</span> <span>u8</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb3-4\"><span>var</span> w <span>=</span> outer[<span>..</span>]<span>;</span></span> <span id=\"cb3-5\">{</span> <span id=\"cb3-6\"> <span>var</span> inner<span>:</span> <span>u8</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb3-7\"> <span>format</span>(inner<span>,</span> <span>\"inner text\"</span>)<span>;</span></span> <span id=\"cb3-8\"> w <span>=</span> <span>longest</span>(outer<span>,</span> inner)<span>;</span> <span>// error: storing a reference rooted at inner,</span></span> <span id=\"cb3-9\">} <span>// which does not outlive the destination (§9.2)</span></span></code></pre></figure> <p>A slice <code>T[:]</code> lets a function accept a range from any array kind without copying its elements. For example, <code>split</code> returns slices into its input, and a dictionary keyed by <code>u8[:]</code> stores views of strings rather than copies.</p> <h3 id=\"nested-data-stays-inline\">Nested data stays inline</h3> <p>There is no single array type. Instead there is a family of array types that differ only in how their size can change. Every member is laid out as <code>[metadata][elements...]</code>, inline and packed, never as a pointer to a separate block of elements:</p> <table> <thead> <tr> <th>Type</th> <th>What it is</th> </tr> </thead> <tbody> <tr> <td><code>T[k]</code></td> <td>fixed size, known at compile time</td> </tr> <tr> <td><code>T[]</code>, <code>T[varint]</code></td> <td>sized at construction, frozen after; a fixed or variable-width length</td> </tr> <tr> <td><code>T[..k]</code>, <code>T[..]</code></td> <td>capacity inline; grows and shrinks within it</td> </tr> <tr> <td><code>T[&gt;..]</code></td> <td><strong>grow-only</strong>: the most commonly used kind; references into it stay valid</td> </tr> <tr> <td><code>T[&gt;..&lt;]</code></td> <td><strong>grow-shrink</strong>: stacks, queues, heaps</td> </tr> </tbody> </table> <p>Strings are <code>u8</code> arrays: <code>u8[&gt;..]</code> is a builder, <code>u8[]</code> a finished string stored inline in whatever holds it, <code>u8[..16]</code> a small string inside a struct, <code>u8[:]</code> a view. A struct may contain variable-size parts, which are stored inline in declaration order, so a record is a sequence of bytes with no indirection in it:</p> <figure><pre><code><span id=\"cb4-1\"><span>struct</span> <span>Item</span> { sku<span>:</span> <span>u8</span>[<span>varint</span>]<span>,</span> qty<span>:</span> <span>varint</span><span>,</span> cents<span>:</span> <span>varint</span> }</span> <span id=\"cb4-2\"><span>struct</span> <span>Order</span> { id<span>:</span> <span>varint</span><span>,</span> customer<span>:</span> <span>u8</span>[<span>varint</span>]<span>,</span> items<span>:</span> <span>Item</span>[<span>varint</span>] }</span> <span id=\"cb4-3\"></span> <span id=\"cb4-4\"><span>var</span> book<span>:</span> <span>Order</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb4-5\">book<span>.</span><span>push</span>(<span>Order</span> { id<span>:</span> <span>1001</span><span>,</span> customer<span>:</span> <span>\"alice\"</span><span>,</span></span> <span id=\"cb4-6\"> items<span>:</span> [<span>Item</span> { sku<span>:</span> <span>\"SKU-441\"</span><span>,</span> qty<span>:</span> <span>2</span><span>,</span> cents<span>:</span> <span>1999</span> }<span>,</span></span> <span id=\"cb4-7\"> <span>Item</span> { sku<span>:</span> <span>\"SKU-7\"</span><span>,</span> qty<span>:</span> <span>1</span><span>,</span> cents<span>:</span> <span>500</span> }] })<span>;</span></span></code></pre></figure> <p>That order is <strong>29 bytes and 0 allocations</strong>. As C++ <code>std::string</code> + <code>std::vector&lt;Item&gt;</code> it is 160 bytes and 1 allocation, and as Rust <code>String</code> + <code>Vec&lt;Item&gt;</code> it is 153 bytes and 4 allocations. An entire order book is a single array, so reading it streams through the cache. The trade-off is that an array of variable-size elements is sequential: you can iterate it but not index it (unless you keep a second array of references into it as an index).</p> <h3 id=\"enums-in-two-sizes\">Enums in two sizes</h3> <p>Algebraic data types are the only form of dynamic polymorphism; there is no inheritance and there are no vtables. Every ADT can be stored in two ways, chosen at the point of use. Fixed mode (<code>Shape</code>) stores a tag plus room for the largest payload, so values can be indexed and overwritten. Variable mode (<code>Shape..</code>) gives each value exactly the size of its variant. An array of such values becomes sequential and a value never changes variant, but in exchange you may take references <em>into</em> a payload:</p> <figure><pre><code><span id=\"cb5-1\"><span>enum</span> <span>Shape</span> { <span>Circle</span> { r<span>:</span> <span>f64</span> }<span>,</span> <span>Rect</span> { w<span>:</span> <span>f64</span><span>,</span> h<span>:</span> <span>f64</span> }<span>,</span> <span>Dot</span> }</span> <span id=\"cb5-2\"></span> <span id=\"cb5-3\"><span>var</span> packed<span>:</span> <span>Shape</span><span>..</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span> <span>// 9, 17 and 1 bytes, not 17 each</span></span> <span id=\"cb5-4\">packed<span>.</span><span>push</span>(<span>Shape</span><span>.</span><span>Circle</span> { r<span>:</span> <span>1.0</span> })<span>;</span></span> <span id=\"cb5-5\">packed<span>.</span><span>push</span>(<span>Shape</span><span>.</span><span>Rect</span> { w<span>:</span> <span>2.0</span><span>,</span> h<span>:</span> <span>3.0</span> })<span>;</span></span> <span id=\"cb5-6\">packed<span>.</span><span>push</span>(<span>Shape</span><span>.</span><span>Dot</span>)<span>;</span></span> <span id=\"cb5-7\"><span>for</span> s <span>in</span> packed {</span> <span id=\"cb5-8\"> <span>match</span> s { <span>Rect</span> <span>&amp;</span>r <span>=&gt;</span> { r<span>.</span>w <span>+=</span> <span>1.0</span><span>;</span> }<span>,</span> _ <span>=&gt;</span> {} } <span>// edits the payload in place, inside the array</span></span> <span id=\"cb5-9\">}</span></code></pre></figure> <p><em>Case functions</em> provide another way to dispatch on a variant: define one overload per variant. Calls dispatch on the tag through a jump table, and the compiler checks that the overloads cover every variant:</p> <figure><pre><code><span id=\"cb6-1\"><span>fn</span> <span>area</span>(s<span>:</span> <span>Shape</span><span>.</span><span>Circle</span>) <span>-&gt;</span> <span>f64</span> { <span>3.14159</span> <span>*</span> s<span>.</span>r <span>*</span> s<span>.</span>r }</span> <span id=\"cb6-2\"><span>fn</span> <span>area</span>(s<span>:</span> <span>Shape</span><span>.</span><span>Rect</span>) <span>-&gt;</span> <span>f64</span> { s<span>.</span>w <span>*</span> s<span>.</span>h }</span> <span id=\"cb6-3\"><span>fn</span> <span>area</span>(s<span>:</span> <span>Shape</span><span>.</span><span>Dot</span>) <span>-&gt;</span> <span>f64</span> { <span>0.0</span> }</span> <span id=\"cb6-4\"></span> <span id=\"cb6-5\"><span>for</span> s <span>in</span> packed { <span>print</span>(s<span>,</span> <span>\" area \"</span><span>,</span> <span>area</span>(s))<span>;</span> }</span></code></pre></figure> <h3 id=\"links-narrower-than-pointers\">Links narrower than pointers</h3> <p>A <code>T&amp;</code> is a machine address: it takes eight bytes and never dangles. A <em>relative reference</em> is the same link stored as a narrow offset. A <code>T&amp;&lt;u32&gt;</code> is measured from the field itself to a target in the same array, so the structure is position independent. A <code>T&amp;&lt;u32 in pool&gt;</code> is measured from the base of a named pool, so other arrays can link into the pool. <code>T&amp;&lt;u32&gt;?</code> uses offset 0 as null. Here is a binary search tree in one grow-only array, with 12-byte nodes:</p> <figure><pre><code><span id=\"cb7-1\"><span>struct</span> <span>Node</span> { key<span>:</span> <span>i32</span><span>,</span> left<span>:</span> <span>Node</span><span>&amp;&lt;</span><span>u32</span><span>&gt;?,</span> right<span>:</span> <span>Node</span><span>&amp;&lt;</span><span>u32</span><span>&gt;?</span> } <span>// 12 bytes, links included</span></span> <span id=\"cb7-2\"></span> <span id=\"cb7-3\"><span>fn</span> <span>insert</span>(pool<span>:</span> <span>Node</span>[<span>&gt;..</span>]<span>&amp;,</span> key<span>:</span> <span>i32</span>) {</span> <span id=\"cb7-4\"> <span>if</span> pool<span>.</span><span>len</span> <span>==</span> <span>0</span> { pool<span>.</span><span>push</span>(<span>Node</span> { key<span>:</span> key })<span>;</span> <span>return</span><span>;</span> }</span> <span id=\"cb7-5\"> <span>var</span> cur <span>.=</span> pool[<span>0</span>]<span>;</span> <span>// .= binds a reference; = would copy the node</span></span> <span id=\"cb7-6\"> <span>loop</span> {</span> <span id=\"cb7-7\"> <span>if</span> key <span>==</span> cur<span>.</span>key { <span>return</span><span>;</span> }</span> <span id=\"cb7-8\"> <span>let</span> next <span>=</span> <span>if</span> key <span>&lt;</span> cur<span>.</span>key { cur<span>.</span>left } <span>else</span> { cur<span>.</span>right }<span>;</span></span> <span id=\"cb7-9\"> <span>if</span> next { cur <span>.=</span> next<span>;</span> <span>continue</span><span>;</span> } <span>// narrowed by `if`: next is a Node&amp;</span></span> <span id=\"cb7-10\"> <span>if</span> key <span>&lt;</span> cur<span>.</span>key { cur<span>.</span>left <span>.=</span> pool<span>.</span><span>push</span>(<span>Node</span> { key<span>:</span> key })<span>;</span> }</span> <span id=\"cb7-11\"> <span>else</span> { cur<span>.</span>right <span>.=</span> pool<span>.</span><span>push</span>(<span>Node</span> { key<span>:</span> key })<span>;</span> }</span> <span id=\"cb7-12\"> <span>return</span><span>;</span></span> <span id=\"cb7-13\"> }</span> <span id=\"cb7-14\">}</span></code></pre></figure> <p>References are transparent (there is no <code>*</code> or <code>-&gt;</code>). <code>.=</code> binds or retargets a reference, and <code>Node?</code> is a nullable reference that <code>if</code>, <code>guard</code> and <code>assert</code> narrow. The insert is one push and one store, and the push cannot invalidate <code>cur</code>. When lifetimes are not nested, a <code>reusable</code> pool pairs a grow-only array with a hidden freelist. <code>alloc_ref</code> reuses a free slot or pushes a new one, and <code>free</code> returns a slot to the pool. Since a slot's memory is never actually freed, a stale slot reads a <em>different value of the correct type</em> rather than corrupting memory.</p> <h3 id=\"saving-and-loading-data-as-bytes\">Saving and loading data as bytes</h3> <figure><pre><code><span id=\"cb8-1\"><span>var</span> image<span>:</span> <span>u8</span>[<span>&gt;..</span>] <span>=</span> tree<span>.</span><span>to_bytes</span>()<span>;</span> <span>// a framed byte image of the whole array</span></span> <span id=\"cb8-2\"><span>var</span> loaded<span>,</span> ok <span>=</span> <span>from_bytes</span><span>&lt;</span><span>Node</span>[<span>&gt;..</span>]<span>&gt;</span>(image)<span>;</span> <span>// verified before it becomes a value</span></span> <span id=\"cb8-3\">image[image<span>.</span><span>len</span> <span>-</span> <span>3</span>] <span>=</span> <span>200</span><span>;</span> <span>// tamper with a link ...</span></span> <span id=\"cb8-4\"><span>var</span> bad<span>,</span> bok <span>=</span> <span>from_bytes</span><span>&lt;</span><span>Node</span>[<span>&gt;..</span>]<span>&gt;</span>(image)<span>;</span> <span>// ... and it is false and an empty array</span></span></code></pre></figure> <p>The tree's links are self-relative, so the tree means the same thing wherever it is stored. Saving it writes its bytes and loading it reads them back, with no serializer, no schema and no pointer fixups. <code>from_bytes</code> checks the framing, every tag, every length and every link before the bytes become a value, so a corrupt or hostile file makes it return <code>false</code>, never a wild reference.</p> <h3 id=\"in-place-construction\">In-place construction</h3> <p>The copy-free construction guarantee (<a href=\"https://aardappel.github.io/goose/docs/goose_spec.html#43-the-in-place-construction-guarantee\">spec §4.3</a>) says a constructed value is always built at its final location, which is passed down through calls. A function returning a grow-only array by value writes its elements directly into the caller's variable, or into a field of the record being built inside another array, so out-parameters are rarely needed.</p> <figure><pre><code><span id=\"cb9-1\">words<span>.</span><span>push</span>(<span>str</span>(<span>\"word\"</span><span>,</span> i))<span>;</span> <span>// formatted straight into the new element</span></span> <span id=\"cb9-2\"><span>let</span> evens <span>=</span> xs<span>.</span><span>filter</span>() { it <span>%</span> <span>2</span> <span>==</span> <span>0</span> }<span>;</span> <span>// built straight into `evens`: no temporary</span></span> <span id=\"cb9-3\">book<span>.</span><span>push</span>(<span>Order</span> { id<span>:</span> <span>1001</span><span>,</span> customer<span>:</span> <span>\"alice\"</span><span>,</span> items<span>:</span> <span>parse_items</span>(<span>\"SKU-441:2:1999;SKU-7:1:500\"</span>) })<span>;</span></span></code></pre></figure> <h3 id=\"returning-errors-across-calls\">Returning errors across calls</h3> <figure><pre><code><span id=\"cb10-1\"><span>struct</span> <span>User</span> { name<span>:</span> <span>u8</span>[<span>..</span><span>16</span>]<span>,</span> age<span>:</span> <span>i32</span> }</span> <span id=\"cb10-2\"></span> <span id=\"cb10-3\"><span>fn</span> <span>load</span>(text<span>:</span> <span>u8</span>[<span>:</span>]) <span>-&gt;</span> <span>User</span>[<span>&gt;..</span>]<span>,</span> <span>u8</span>[] {</span> <span id=\"cb10-4\"> <span>var</span> users<span>:</span> <span>User</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb10-5\"> <span>each_split</span>(text<span>,</span> <span>'</span><span>\\n</span><span>'</span>) { users<span>.</span><span>push</span>(<span>parse_user</span>(it))<span>;</span> }<span>;</span></span> <span id=\"cb10-6\"> <span>return</span> users<span>,</span> <span>\"\"</span><span>;</span></span> <span id=\"cb10-7\">}</span> <span id=\"cb10-8\"></span> <span id=\"cb10-9\"><span>fn</span> <span>parse_user</span>(line<span>:</span> <span>u8</span>[<span>:</span>]) <span>-&gt;</span> <span>User</span> { <span>// returns a User: no Result, no error parameter</span></span> <span id=\"cb10-10\"> <span>let</span> comma <span>=</span> <span>find</span>(line<span>,</span> <span>\",\"</span>)<span>;</span></span> <span id=\"cb10-11\"> <span>guard</span> comma <span>&gt;=</span> <span>0</span> <span>else</span> { <span>return</span> []<span>,</span> <span>str</span>(<span>\"expected name,age: \"</span><span>,</span> line) <span>from</span> load<span>;</span> }</span> <span id=\"cb10-12\"> <span>let</span> age<span>,</span> ok <span>=</span> <span>parse_int</span>(line[comma <span>+</span> <span>1</span><span>..</span>])<span>;</span></span> <span id=\"cb10-13\"> <span>guard</span> ok <span>else</span> { <span>return</span> []<span>,</span> <span>str</span>(<span>\"bad age: \"</span><span>,</span> line) <span>from</span> load<span>;</span> }</span> <span id=\"cb10-14\"> <span>let</span> name <span>=</span> <span>trim</span>(line[<span>..</span>comma])<span>;</span></span> <span id=\"cb10-15\"> <span>return</span> <span>User</span> { name<span>:</span> name<span>,</span> age<span>:</span> age <span>as</span> <span>i32</span> }<span>;</span></span> <span id=\"cb10-16\">}</span></code></pre></figure> <p><code>return E from f</code> returns <code>E</code> as the result of the innermost active call of <code>f</code>, however many frames up that call is. Every function in between keeps its plain signature. The construct is checked statically: every call of <code>parse_user</code> must lie inside a <code>load</code> call, so nothing can go uncaught at runtime. It is implemented as a hidden discriminant checked in each frame rather than as an unwinder, and the message is built directly where <code>load</code>'s caller wants it. The parsers in the samples use it for every syntax error.</p> <h3 id=\"generics-and-function-blocks\">Generics and function blocks</h3> <figure><pre><code><span id=\"cb11-1\"><span>fn</span> <span>twice</span>(x) { x <span>+</span> x } <span>// an untyped parameter is a generic one</span></span> <span id=\"cb11-2\"></span> <span id=\"cb11-3\"><span>fn</span> each_pair<span>&lt;</span><span>T</span><span>,</span> <span>F</span><span>&gt;</span>(xs<span>:</span> <span>T</span>[<span>:</span>]) { <span>// F is a function value: a compile-time entity</span></span> <span id=\"cb11-4\"> <span>for</span> i <span>in</span> <span>0</span><span>..</span>xs<span>.</span><span>len</span> <span>-</span> <span>1</span> { <span>F</span>(xs[i]<span>,</span> xs[i <span>+</span> <span>1</span>])<span>;</span> }</span> <span id=\"cb11-5\">}</span> <span id=\"cb11-6\"></span> <span id=\"cb11-7\"><span>fn</span> <span>first_gap</span>(xs<span>:</span> <span>i64</span>[<span>:</span>]) <span>-&gt;</span> <span>i64</span> {</span> <span id=\"cb11-8\"> <span>each_pair</span>(xs) { a<span>,</span> b <span>=&gt;</span> <span>if</span> b <span>-</span> a <span>&gt;</span> <span>1</span> { <span>return</span> a<span>;</span> } }<span>;</span> <span>// returns from first_gap, not each_pair</span></span> <span id=\"cb11-9\"> <span>return</span> <span>-</span><span>1</span><span>;</span></span> <span id=\"cb11-10\">}</span> <span id=\"cb11-11\"></span> <span id=\"cb11-12\"><span>let</span> evens <span>=</span> xs<span>.</span><span>filter</span>() { it <span>%</span> <span>2</span> <span>==</span> <span>0</span> }<span>;</span></span> <span id=\"cb11-13\"><span>let</span> total <span>=</span> <span>fold</span>(xs<span>,</span> <span>0</span>) { acc<span>,</span> x <span>=&gt;</span> acc <span>+</span> x }<span>;</span></span> <span id=\"cb11-14\"><span>sort</span>(xs) { a<span>,</span> b <span>=&gt;</span> a <span>&gt;</span> b }<span>;</span></span></code></pre></figure> <p>Everything is monomorphized. Type arguments are inferred from argument types; type parameters that do not appear in those types can be supplied explicitly. Function values are passed as generic parameters. Every call of a function value is direct and can be inlined, function values cannot escape, and there are no closure objects or function pointers, so a higher-order function compiles to exactly the loop it looks like. A block may <code>return</code> from its lexically enclosing function, and nested functions can use the enclosing function's locals.</p> <h3 id=\"threads-with-no-shared-memory\">Threads with no shared memory</h3> <figure><pre><code><span id=\"cb12-1\"><span>thread_fn</span> <span>worker</span>() { <span>// a separate program with its own memory</span></span> <span id=\"cb12-2\"> <span>loop</span> {</span> <span id=\"cb12-3\"> <span>let</span> job <span>=</span> <span>qget</span><span>&lt;</span><span>Job</span><span>&gt;</span>()<span>;</span> <span>// blocks on the typed queue for Job</span></span> <span id=\"cb12-4\"> <span>guard</span> job<span>.</span>n <span>&gt;=</span> <span>0</span> <span>else</span> { <span>break</span><span>;</span> } <span>// -1 means stop</span></span> <span id=\"cb12-5\"> <span>qput</span>(<span>Result</span> { n<span>:</span> job<span>.</span>n<span>,</span> digits<span>:</span> <span>count_digits</span>(job<span>.</span>n) })<span>;</span></span> <span id=\"cb12-6\"> }</span> <span id=\"cb12-7\">}</span> <span id=\"cb12-8\"></span> <span id=\"cb12-9\"><span>for</span> i <span>in</span> n { ids<span>.</span><span>push</span>(<span>thread_spawn</span>(worker))<span>;</span> }</span></code></pre></figure> <p>There is no shared mutable memory. A <code>thread_fn</code> and everything it calls is compiled as its own program with its own data stacks and its own copies of the globals. Values are passed between threads through typed queues, one per type, and must be <em>flat</em>, with no references at any depth. Passing them is cheap because a flat Goose value is contiguous: a job or a result can carry real data, such as pixels, and passing it is a single <code>memcpy</code>.</p> <p>A failed check or <code>abort</code> in a worker started with <code>thread_spawn_contained</code> ends only that worker. Its message goes to whoever waits for it, not to stderr, so a supervisor can log it and start another:</p> <figure><pre><code><span id=\"cb13-1\"><span>var</span> why<span>:</span> <span>u8</span>[<span>&gt;..</span>] <span>=</span> []<span>;</span></span> <span id=\"cb13-2\"><span>while</span> <span>!</span><span>thread_wait</span>(<span>thread_spawn_contained</span>(serve<span>,</span> attempt)<span>,</span> why) {</span> <span id=\"cb13-3\"> <span>log</span>(why)<span>;</span> <span>// \"assert failed (serve.goose:12)\"</span></span> <span id=\"cb13-4\"> why<span>.</span><span>clear</span>()<span>;</span></span> <span id=\"cb13-5\"> attempt<span>++;</span></span> <span id=\"cb13-6\">}</span></code></pre></figure> <p>The first <code>thread_wait(id, msg)</code> for a worker takes the message; a caller that doesn't ask for it loses it.</p> <h3 id=\"compiling-to-and-calling-c\">Compiling to and calling C</h3> <figure><pre><code><span id=\"cb14-1\"><span>extern</span> <span>fn</span> <span>hypot</span>(x<span>:</span> <span>f64</span><span>,</span> y<span>:</span> <span>f64</span>) <span>-&gt;</span> <span>f64</span><span>;</span> <span>// straight from libm</span></span> <span id=\"cb14-2\"><span>extern</span> <span>fn</span> <span>crc32_bytes</span>(s<span>:</span> <span>const</span> <span>u8</span>[<span>:</span>]) <span>-&gt;</span> <span>u32</span><span>;</span> <span>// a slice crosses as { data, len }</span></span> <span id=\"cb14-3\"><span>extern</span> <span>fn</span> <span>stats_of</span>(xs<span>:</span> <span>i32</span>[<span>:</span>]<span>,</span> out<span>:</span> <span>Stats</span><span>&amp;</span>)<span>;</span> <span>// a struct filled through a pointer</span></span></code></pre></figure> <p>An <code>extern fn</code> binds a Goose signature to a C symbol. The <code>math</code> and <code>os</code> modules use this interface. Only types with supported C representations may cross the boundary; unsupported signatures are rejected at the declaration. The compiler emits one C file for the whole program. The bundled TinyCC backend can compile and run that C inside the Goose compiler's process.</p> <h3 id=\"where-the-speed-comes-from\">Where the speed comes from</h3> <p>Much of the speed comes from the memory model: no heap allocation or per-object teardown, contiguous data, narrow links, and enums sized for the variant they contain. Every index is bounds-checked, and the compiler removes checks it can prove unnecessary. An <code>assert</code> on a slice length often lets the compiler remove the remaining checks in a kernel, so that the kernel can be vectorized. <code>--bce-lines</code> reports the checks that remain. <code>checkfree fn</code> rejects a kernel if any bounds check remains in it; index types let graph edges keep the validation done while the graph was built. Benchmark measurements use whole-process wall-clock time, including teardown.</p> <table> <thead> <tr> <th>Geometric mean over 16 benchmarks</th> <th>vs idiomatic C++</th> <th>vs hand-optimized C++</th> <th>vs best safe Rust</th> </tr> </thead> <tbody> <tr> <td>speed, MSVC backend</td> <td>3.51x</td> <td>1.24x</td> <td>1.13x</td> </tr> <tr> <td>speed, clang backend</td> <td>3.54x</td> <td>1.26x</td> <td>1.19x</td> </tr> <tr> <td>peak memory</td> <td>1.95x less</td> <td>1.32x less</td> <td>1.25x less</td> </tr> </tbody> </table> <p>The <a href=\"https://aardappel.github.io/goose/bench/summary.html\">summary</a> explains the gains and losses; <a href=\"https://aardappel.github.io/goose/bench/results.html\">results.md</a> has every measurement, and <a href=\"https://aardappel.github.io/goose/bench/design.html\">design.md</a> explains what the suite tests.</p> <h3 id=\"limitations\">Limitations</h3> <ul> <li>You have to think about where data lives: who owns it, and how long its scope lasts. Usually the owner is the function that builds the data, which needs no extra work; when it is not, the data goes in a <code>reusable</code> pool.</li> <li>Recursive functions cannot keep growable data across a recursive call. Scratch data must end before the call, and data that outlives the call is passed in as a pool.</li> <li>Arrays of variable-size elements can be iterated but not indexed (unless you keep an index of references beside them). A fixed-mode enum cannot be pointed into, and a variable-mode one cannot be overwritten. You make this choice per container.</li> <li>There are no escaping closures, no function pointers and no dynamic dispatch beyond ADT tags, and only whole-program compilation is supported.</li> <li>A slot that was returned to a <code>reusable</code> pool but is still referenced reads whatever its next owner put there. That is a logic bug, but never memory corruption.</li> </ul> <p><a href=\"https://aardappel.github.io/goose/docs/tutorial.html#18-limitations\">Tutorial §18</a> is the full list.</p> <h2 id=\"install-a-release\">Install a release</h2> <p>Prebuilt compilers for Windows (x64), Linux (x64) and macOS (Apple silicon and Intel) are on the <a href=\"https://github.com/aardappel/goose/releases\">releases page</a>, with the graphics, audio, ui and physics packages compiled in. Unpack one anywhere and put its directory on PATH: the compiler finds the standard library, TinyCC's runtime and the packages beside itself, and keeps what it builds under <code>~/.goose</code> (<code>GOOSE_HOME</code>). The archive also holds these docs, the samples and the VS Code extension.</p> <p>Running a program in-process (<code>goose file.goose</code>) needs nothing else on Windows. On Linux it needs the C library's headers (<code>libc6-dev</code>, or <code>glibc-devel</code>); on macOS, the SDK of the Xcode command line tools (<code>xcode-select --install</code>). <code>goose build</code> also needs a C compiler: Visual Studio 2022 or later, or clang, on Windows; gcc or clang elsewhere. The Linux compiler needs glibc 2.35 or later (Ubuntu 22.04, Debian 12), and the macOS compiler needs macOS 13.3 or later. macOS keeps a downloaded archive's files from running until <code>xattr -dr com.apple.quarantine</code> is run on the unpacked directory.</p> <h2 id=\"build-and-run\">Build and run</h2> <p>You need CMake 3.27 or later, a C++20 compiler (MSVC, clang or gcc) and Python 3 for the test and sample runners. TinyCC, which the in-process backend is built from, is part of the tree. The graphics, audio, ui and physics modules are packages in repositories of their own (<a href=\"https://github.com/aardappel/goose_gfx\">goose_gfx</a> and <a href=\"https://github.com/aardappel/goose_physics\">goose_physics</a>; <code>docs/design/packages.md</code>). <code>-DGOOSE_BUILTIN_LIBS=all</code> fetches them with git at configure time, at the pinned tags, and compiles them into the compiler, so programs that use them run with nothing else installed. Without that option the compiler is built on its own, and the first time a program imports one of these packages, the package is built into <code>~/.goose</code>, which needs git, cmake and a C compiler.</p> <figure><pre><code><span id=\"cb15-1\"><span>git</span> clone https://github.com/aardappel/goose</span> <span id=\"cb15-2\"><span>cd</span> goose</span> <span id=\"cb15-3\"><span>cmake</span> <span>-B</span> build <span>-DCMAKE_BUILD_TYPE</span><span>=</span>Release <span>-DGOOSE_BUILTIN_LIBS</span><span>=</span>all</span> <span id=\"cb15-4\"><span>cmake</span> <span>--build</span> build <span>--config</span> Release</span></code></pre></figure> <p><code>GOOSE_BUILTIN_LIBS</code> can also name some of the...</p></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Faardappel.github.io%2Fgoose%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"A memory-safe systems language with no heap allocator, garbage\ncollector, or lifetime annotations. In this repository's benchmarks,\nGoose runs faster than C++ and Rust while using less memory.","image":"https://img.shields.io/twitter/follow/wvo.svg?style=social","authors":[{"name":"Authors","url":"https://aardappel.github.io/goose/","avatar":"https://aardappel.github.io/goose/docs/logo/logo_black_fg_white_bg_square.png"}],"id":"50224100","url":"https://aardappel.github.io/goose/","external_url":"https://news.ycombinator.com/item?id=50224100","date_published":"2026-10-24T19:06:55Z"},{"title":"America has lost 200k of jobs in media, film and the arts. How much is AI?","content_html":"<div class=\"page\" id=\"readability-page-1\"><div><article><div dir=\"auto\"><p><strong>Thanks for reading! If you haven’t subscribed, please click the button below:</strong></p><p><strong>By subscribing, you’ll join over 80,000 people who read Apricitas!</strong></p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!oz9x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!oz9x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 1456w\" sizes=\"100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!oz9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:245321,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!oz9x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!oz9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png 1456w\" sizes=\"100vw\" fetchpriority=\"high\"></picture></div></a></figure></div><p>America has lost more than 200k jobs in “creative” industries over the last four years, with roughly 50k lost within the last year alone. That makes for one of the worst stretches for media employment in modern US history, with similar job loss intensity and duration occurring only during the major economic recessions of 2001 and 2008. Yet there’s no generalized recession today—instead, this period of job loss coincides with the rise of AI systems that can compose wholesale novels, photorealistic images, soundalike music, and practically every other form of digital art, en masse and at extremely low costs. Is this the fall of the Creative Class?</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!4jWS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!4jWS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 1456w\" sizes=\"100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!4jWS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:378068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!4jWS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!4jWS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21e0c6b5-22e0-4e51-97b0-68bb9abe225a_2886x1843.png 1456w\" sizes=\"100vw\"></picture></div></a></figure></div><p>Proving the exact amount of AI-driven job loss in the arts is extremely difficult. Media firms are decidedly coy about their AI use, both to protect against public backlash and, more financially important, to preserve the legal basis for their copyrights. The effects of AI are also hard to disentangle from other factors currently affecting arts businesses, like consolidation in Hollywood, offshoring of content production, or the continued displacement of traditional media providers in favor of social media creators. Yet perhaps the clearest evidence of AI’s influence is just that all subsectors of the digital arts industry are losing jobs, while in-person entertainment is still growing at a healthy pace.</p><p>Some of those digital job losses are just a continuation of prior trends, like in the publishing industry where technological change has been continually grinding away newspaper and magazine jobs for decades. Yet for sectors like live broadcasting, streaming, or graphic design, recent experience is an unusual downturn compared to the tranquility of years prior. Then there’s the worst-hit sector, movie &amp; sound recording, which has been bleeding jobs at a nearly unprecedented pace over the last three years.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!Exun!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!Exun!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!Exun!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!Exun!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!Exun!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 1456w\" sizes=\"100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!Exun!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/decb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:239810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!Exun!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!Exun!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!Exun!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!Exun!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdecb86b5-a38f-46ea-bce2-c6d5d1a405d5_2886x1843.png 1456w\" sizes=\"100vw\"></picture></div></a></figure></div><p>Hollywood has never seen a stretch as bad as the last four years, with the movie &amp; TV industry losing more than 100k jobs, nearly one-third of the sector’s total. At the depths touched this summer, total employment was lower than at any point since the 2008 recession and approaching the lowest point in 30 years. The streaming era has proven an extremely difficult transition, with traditional films and TV shows losing watch time to user-generated and increasingly AI-assisted or AI-generated content flows.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!zm0D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!zm0D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!zm0D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306992,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!zm0D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!zm0D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d207ac-eea2-417b-a381-f956e19ede9d_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>Overall, nearly half the media job losses of the last four years have been concentrated in the movie &amp; sound recording sector that includes Hollywood. Written publishing has been the next-largest source of job loss, with employment down by more than 70k over the same time frame. Yet the job losses have by no means been contained to any particular part of media; instead they’ve hit nearly every subsector at some point. Nor do they show any sign of abating, with losses consistently hovering at around 50k per year and even accelerating in recent months. Will further AI development continue displacing workers in creative industries?</p><p><span>To understand what </span><strong>could </strong><span>happen to the business of art amidst the rise of AI, it’s important to understand what </span><strong>did</strong><span> happen to it during the first digital transition, the rise of the internet.</span></p><p><span>It was the turn of the millennium, and </span><em>Metallica</em><span> had a problem. Demos of their upcoming, unreleased tracks were bouncing around radio and the internet, originally leaked onto a new internet file-sharing website called Napster. There they found thousands of files shared amongst hundreds of thousands of users, many of which were direct rips of albums that sold for $15 being offered for free. The most anticipated albums were often leaked online even before they were on store shelves. </span><em>Metallica</em><span> sued Napster for copyright infringement, and they were soon joined by separate suits from other prominent artists and eventually the Recording Industry Association of America (RIAA).</span></p><p><span>Much of the general public was understandably unsympathetic to </span><em>Metallica</em><span>, perceived as a bunch of already-successful millionaires trying to bilk even more money from listeners, and were even less sympathetic towards the RIAA, perceived as scurrilous middlemen who take from artists and fans alike. But the two of them easily won their lawsuit, forcing Napster into bankruptcy. Yet </span><em>Metallica</em><span> may have been right on the law but were on the wrong side of technology; the RIAA had won the battle but was losing the war.</span></p><p><span>The modern internet made file-sharing extremely easy, and no matter how much whac-a-mole companies played, they could not possibly catch every illegal upload. The perennial threat of piracy undermined their copyright and limited their ability to charge for music. Eventually, the value of individual songs fell to the point that companies like Spotify and Apple Music could swoop in to acquire massive catalogues, consolidate them, and charge a comparatively trivial fee for access. For what a single </span><em>Metallica</em><span> album would have cost in 2000, you can now get a month’s worth of unlimited access to nearly all human-made music.</span></p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!ItXZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!ItXZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!ItXZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:196878,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt title srcset=\"https://substackcdn.com/image/fetch/$s_!ItXZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!ItXZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9937364-33e6-4ce6-a504-e91f8a02c625_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>The music industry has never returned to the heyday paydays of the peak CD era—even without adjusting for inflation, streaming revenue pales in comparison to ‘90s physical media sales. This was a massive boon to consumers, but it was also a squeeze on musicians that forced them to fundamentally change their business model over time. Instead of just selling records to earn money directly, music itself increasingly became a loss-leading advertisement for the live concerts (and merch) that provided a growing share of artists’ income. Tours got longer, venues got bigger, ticket prices skyrocketed, and musicians frequently took on roles closer to public influencers than isolated artistes. Were it not for rising concert sales, the business model of music would have completely collapsed, and the income going to musicians would have cratered.</p><p>Of course, there were still significant downsides to the transition into the streaming era. Bands (especially smaller ones) complain about the unending pressure to always be on tour. Musicians whose content was suited to home listening lost out to those more suited to giant festivals. Even accounting for concert revenues, musicians made less money than before. Yet musicians fared better than many areas of entertainment subsectors because there was a live component to fall back on—for many media industries, the digital era left no such comfort.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!iTEJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!iTEJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!iTEJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:215214,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt title srcset=\"https://substackcdn.com/image/fetch/$s_!iTEJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!iTEJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11cbc8aa-b1c1-44c0-80b1-6ef5c763924d_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>Over time, the business of video has moved in the opposite direction of music—out of the theatre and into the home. Hollywood formerly made most of its money enticing customers to visit sold-out movie theatres, but these were gradually supplanted by broadcast TV, cable, and physical media. Yet because each successful technological leap increased total video watch time, the industry was still able to thrive amidst technological upheaval. That is, until the modern streaming era.</p><p>Today, the plethora of video options and the rise of social media have sent video producers into a vicious competition for limited attention. Even before adjusting for inflation, movie ticket sales ended last year down 25% from their 2019 peak, cable revenue is down 18% from its peak, and streaming revenue has not been able to compensate for the drop. The mountain of free user-generated content on YouTube, Twitch, TikTok, or social media was already presenting harsh competition for traditional video companies in the years before ChatGPT’s launch, and now streaming services are also competing with a flood of AI-generated content. The business model of video media is fundamentally getting squeezed, and unlike in the music industry, there’s basically no equivalent to live concerts that Hollywood can be used to ease the pain.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!dUVd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!dUVd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!dUVd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:150883,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!dUVd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!dUVd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c82b577-3785-46e8-935e-246f08d65784_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>The actual worst-case scenario for creative workers amidst the AI revolution is something similar to what happened to the publishing industry after the advent of the internet—that is, near-total collapse of their fundamental business model. Newspapers used to employ roughly half a million people in the US, more than the entire oil industry, and now their payrolls are down nearly 85% and still dropping. Magazine publishers likewise have let 66% of their staff go since the 90s, while book publishers have lost 40%.</p><p>The routine informational updates that previously formed newspapers’ bread-and-butter were all de-bundled—box scores moved to sports websites, stock movements went to financial websites, forecasts went to weather websites—each loss compounding on itself to undermine consumers’ need to buy the paper. Search engines became the first place people looked to for information, and newspapers’ advertising revenue rapidly started flowing to companies like Google instead. The collective of social media users became faster at breaking any news story than a daily paper could ever hope to be. When papers eventually did start aggressively paywalling content, the internet made it trivially easy for people to just copy the articles’ content and share it beyond the paywall. The entire business model had collapsed, to the point that now only a select few major newspapers can even survive.</p><p><span>That scale of copyright dilution and forced unbundling is the worst-case scenario for media businesses in the age of AI. It’s possible arts jobs could survive via consumers’ deep-seated aversion to explicitly AI-generated content, but AI is increasingly being used throughout media in ways invisible to the average end consumer. </span><a href=\"https://fred.stlouisfed.org/graph/?g=1Z2RG\">Roughly 32% of workers in the overall arts, entertainment, and recreation sector use Generative AI to some extent</a><span>, which is </span><a href=\"https://fred.stlouisfed.org/graph/?g=1XQ3Q\">less than the 62% average across all industries</a><span>, but still enough that virtually every major media project could have some AI within its workflow.</span></p><p>Indeed, AI is likely seeping into media production processes in ways large companies themselves would struggle to prevent even when they desire to—how can a TV studio be sure nobody in their writers’ room is consulting ChatGPT for jokes or any storyboard artist is generating concept art? And even if professional TV and movie studios do effectively hold out against temptation and prevent internal AI use, how long can they compete with the large mass of wannabe independent creators with much fewer scruples? Plenty of media businesses tried to hold out against the algorithmic content waves of the 2010s and were buried as a result.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!Hsfq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!Hsfq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!Hsfq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:201189,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!Hsfq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!Hsfq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5df059-4f98-46d1-8a74-e7f94c0aa52e_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>Yet fundamentally, it’s difficult to meaningfully predict how new technologies will interact with existing arts businesses. Take the unexpected resurgence in book sales over the last four years. The novel as a commercial art form had been struggling for decades, with fewer books sold in 2019 than at the beginning of the millennium, but the last six years have seen an unprecedented 70% surge in sales. The unlikely savior of the printed word came from perhaps its polar opposite—TikTok.</p><p>Of course, fewer people read now than ever before—for the general public, short-form video apps have accelerated the displacement of reading, just as TV, video games, or social media before them. Yet for a dwindling number of dedicated repeat readers, “BookTok” became a new way to source reviews, analysis, discourse, and community in a way that boosted the reading experience and absolutely turbocharged book sales. It’s possible that AI tools could have those same totally unpredictable spillovers for other museums, concerts, or other forms of art in ways that are unpredictable today, in much the same way short-form video saved books in ways that could never have been anticipated beforehand.</p><p>At the end of the day, the arts are only a small sector of the overall macroeconomy. Media made up a small share of the labor market even at its peak, and it has always been difficult to get hired in creative industries to the point that making fun of art students’ job prospects became an easy punchline. The movie industry has an income profile closer to eggs or bicycles than something major like healthcare or finance. Were the goal to create art for art’s sake, for the intangible and nonmonetizable cultural benefits, it would be relatively easy to counterbalance any economic impacts of AI on artists just by reversing recent cuts to the National Endowments for the Arts &amp; Humanities.</p><p>It’s telling that Anthropic, the most prominent AI lab, has basically never bothered with image, video, or music generation, because the prospective economic benefits are marginal when compared to using AI to tackle math or scientific problems. OpenAI learned this lesson the hard way when it was forced to abandon its video generation platform Sora, deciding it had better use for its limited compute than making synthetic TikToks. Nowadays, the art generation is done primarily by secondary players running smaller models, though even these are large enough to threaten significant disruption to legacy media businesses.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!96J2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!96J2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!96J2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!96J2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!96J2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!96J2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png\" width=\"1456\" height=\"930\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:930,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:313580,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.apricitas.io/i/203775192?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!96J2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 424w, https://substackcdn.com/image/fetch/$s_!96J2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 848w, https://substackcdn.com/image/fetch/$s_!96J2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 1272w, https://substackcdn.com/image/fetch/$s_!96J2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fa718d1-e7f0-422f-9a09-4606948e1ed4_2886x1843.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>In other words, the primary impacts of AI art will be on culture and society rather than the macroeconomy. Yet arts jobs might be a microcosm for other “creative-adjacent” work that occupies a much larger share of economic activity. Take the tech sector itself, which is the clearest place where AI-driven job loss has shown up outside the media business, as powerful coding agents replace human programmers. Annual tech job gains stood at nearly 300k in 2022, but the sector has been bleeding jobs every year since then in what is now its longest labor market downturn.</p><p><span>Right now, AI-driven job displacement has been relatively minor outside of these few narrow sectors. </span><a href=\"https://fred.stlouisfed.org/graph/?g=1Ya2U\">Unemployment is higher than it was four years ago but still below even the 2010s average</a><span>, and overall </span><a href=\"https://fred.stlouisfed.org/graph/?g=1Z2Re\">job turnover rates remain extremely low</a><span>. Some white-collar sectors that looked prime for AI automation have even been on a hiring spree over the last few years, including </span><a href=\"https://fred.stlouisfed.org/graph/?g=1Z2QS\">legal</a><span> and </span><a href=\"https://fred.stlouisfed.org/graph/?g=1Z2R3\">engineering</a><span> firms. Yet if the economic impact of AI ends up being anywhere near large enough to validate the </span><a href=\"https://www.apricitas.io/p/americas-1t-ai-gamble\">trillions of dollars investors are currently betting on it</a><span>, these economic disruptions will only spread from here.</span></p></div></article></div><div><div id=\"discussion\"><h4>Discussion about this post</h4></div><div data-component-name=\"SubscribeFooter\"><h3>Ready for more?</h3></div></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fwww.apricitas.io%2Fp%2Fai-and-the-fall-of-the-creative-class\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"America is Losing Hundreds of Thousands of Jobs in Media, Film & the Arts. How Much is AI to Blame?","image":"https://substackcdn.com/image/fetch/$s_!oz9x!,w_1200,h_675,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F999e3450-1df3-457d-8715-5e2e46d5121c_2886x1843.png","authors":[{"name":"Apricitas Economics","url":"https://www.apricitas.io/p/ai-and-the-fall-of-the-creative-class","avatar":"https://substackcdn.com/image/fetch/$s_!smQQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61c73240-2b39-47a6-9ba2-747c6fa2dfc3%2Ffavicon.ico"}],"id":"50226419","url":"https://www.apricitas.io/p/ai-and-the-fall-of-the-creative-class","external_url":"https://news.ycombinator.com/item?id=50226419","date_published":"2026-10-24T23:11:54Z"},{"title":"I refuse to accept a censored Internet. Join Me at FOSDEM 27","content_html":"<div class=\"page\" id=\"readability-page-1\"><div itemprop=\"text\"> <p>Update: Follow also the <a href=\"https://news.ycombinator.com/item?id=50233929\">discussion on HN</a>.</p> <p>As one of the managers of the <strong>Digital Dissident Devroom</strong>, I invite you to be part of a conversation we cannot afford to ignore.</p> <p>Around the world, people are being silenced, monitored, and denied access to information. Free software can help change that, but only if we build it together. We need tools people can trust and control to communicate safely, expose the truth, and resist censorship.</p> <p>This devroom brings together developers, researchers, activists, and everyone committed to digital freedom. We want real solutions, honest lessons, and collaboration across projects, not product pitches.</p> <p>If you believe technology should serve people, not control them, join us. Bring your ideas, experience, and questions. Let’s build the tools that help keep freedom alive.</p> <p>Our focus complements other devrooms, including Decentralized Internet and Privacy, which explores the broader decentralized ecosystem. While they focus on technologies, we focus on the people under threat and the complete chain of tools that can protect them.</p> <h2>How to apply to speak at the dev room?</h2> <ol> <li>Go to FOSDEM’s official CFP portal <a href=\"https://pretalx.fosdem.org/fosdem-2027/\">from here</a> and login or register.</li> <li>Click on “Submit a proposal”</li> <li>Then fill in the form and select “Digital Dissident” as a track.</li> <li>Done!</li> <li>Please note that by doing this you also accept the <a href=\"https://fosdem.org/2027/practical/conduct/\">FOSDEM Code of Conduct.</a></li> </ol> <h2>Define: Digital Dissident Developer Room</h2> <p>Privacy and anonymity tools each have a home at FOSDEM: the network, security, decentralised and messaging rooms, and various main-track and lightning talks. Someone living under an authoritarian regime (Russia, Iran, China, Belarus, Myanmar and others) never uses a single tool, though. Their day-to-day security depends on a <em>chain</em> of tools that has to hold up end to end:</p> <ol> <li>reaching the network at all (censorship circumvention),</li> <li>communicating without leaking metadata,</li> <li>collecting, verifying and storing evidence safely,</li> <li>publishing or leaking it without exposing the author,</li> <li>doing all this on devices and infrastructure that are themselves a risk.</li> </ol> <p>The weakest link decides the outcome. Talks about one tool rarely cover how it fits with the others, where the seams are, or what breaks at the hand-offs (for example, a circumvention transport that is fingerprinted, or a messenger whose push notifications tie your identity to a Google or Apple account). Nobody currently owns that cross-project view.</p> <p><strong>What this devroom does.</strong> It brings developers of circumvention, anonymity, messaging, publishing and whistleblowing tools into one room. It is deliberately <em>not</em> about any single project. Each session is judged on how well it advances the toolchain: interoperability, shared threat models, shared failure data, and shared engineering practice.</p> <p><strong>Why now.</strong> Censorship in Russia, Iran and China has grown much more sophisticated. It now includes national allow-lists and whitelist-only internet shutdowns, TLS and QUIC fingerprinting, deep packet inspection with active probing, throttling of specific protocols, mobile internet shutdowns, app-store removal of circumvention tools, and mandatory state-run messengers and “sovereign internet” routing. Anti-censorship developers have responded with pluggable transports, domain fronting alternatives, mixnets, decentralised and email-based messaging, and new obfuscation protocols. Progress is fast but fragmented. At FOSDEM 2026 the relevant talks were scattered: Vitaly Repin’s “The Russian Censorship Circumvention, Tom’s Traps, and Jerry’s VPN: A 5-Year Journey” (Saturday, H.1302, Network track) drew a large audience, while NymVPN and Delta Chat’s multi-relay messaging (both Sunday, Decentralized Internet and Privacy devroom) and other related talks ran in other rooms. A single devroom lets that audience and those speakers meet in one place.</p> <p><strong>Relationship to the existing “Decentralized Internet and Privacy” devroom.</strong> That room covers decentralised technology broadly (P2P protocols, browsers, code collaboration, key infrastructure), and censorship or anonymity is only a part of it. Digital Dissident is different: the organising principle is a <em>user under threat</em> and the end-to-end chain that protects them, not a technology class. We want to work with, not against, that room, and will coordinate schedules so the two don’t overlap, and will point overflow speakers to whichever room fits.</p> <p><strong>Themes</strong> (details in the CfP below):</p> <ul> <li><strong>Censorship circumvention and transport:</strong> obfuscation, fingerprint resistance, active-probing defence, bridge distribution, resilience to protocol whitelisting and full shutdowns.</li> <li><strong>Metadata-resistant communication:</strong> mixnets, onion routing, decentralised and federated messengers, store-and-forward and offline-first (mesh, sneakernet, Bluetooth/Wi-Fi Direct).</li> <li><strong>Secure reporting and publishing:</strong> whistleblowing platforms, source protection, document sanitisation, provenance and authenticity, censorship-resistant hosting.</li> <li><strong>Devices and operational security:</strong> hardened mobile and desktop systems, amnesic systems, seizure and border-crossing scenarios, forensic resistance.</li> <li><strong>Usability and threat modelling for at-risk users:</strong> onboarding under duress, safe defaults, training, measuring what really works in the field.</li> <li><strong>Measurement and adversary analysis:</strong> how censors detect and block, open data on blocking events, reproducible censorship research.</li> <li><strong>Digital sovereignty from Big Tech (secondary theme):</strong> reducing dependence on centralised platforms, app stores, push infrastructure, cloud and identity providers, both for individuals and for civil-society organisations.</li> </ul> <p><strong>Structure.</strong> A mix of formats to keep a full room engaged across the whole session:</p> <ul> <li>20 to 30 minute technical talks</li> <li>A closing open discussion on interoperability gaps and shared next steps</li> </ul> <p><strong>Programme quality.</strong> Organisers will review all submissions on technical merit and fit to the toolchain framing, and will aim for a balance of projects, regions and speakers (established projects, new projects, researchers, people from affected communities). Every talk should include an explicit threat model and an honest account of limitations.</p> <p><strong>Projects and communities we intend to invite</strong> (no commitments yet): Nym (mixnet), Delta Chat / chatmail, SimpleX, the Fediverse (ActivityPub implementations and instance operators), Nostr, Psiphon and other circumvention and VPN providers, plus Tor-ecosystem, Reticulum and mesh-networking projects, whistleblowing and secure-submission platforms, and censorship-measurement researchers. Several of these projects presented at FOSDEM 2026.</p> <p><strong>Code of Conduct.</strong> We will follow the FOSDEM Code of Conduct. In addition, talks that describe circumvention or anonymity should avoid operational details that would endanger specific users in the field.</p> <h2>Important Dates</h2> <ul> <li><strong>Sat, 24 October 2026</strong>: Call for Participation opens</li> <li><strong>Mon, 30 November 2026, 23:59 UTC</strong>: Call for Participation ends</li> <li><strong>Wed, 2 December 2026</strong>: Speakers notified</li> <li><strong>Fri, 4 December 2026</strong>: Deadline for speakers to confirm</li> <li><strong>Mon, 7 December 2026</strong>: Schedule published</li> <li>The twenty-sixth edition of FOSDEM will take place on Saturday 30th and Sunday 31st January 2027 at the usual location, ULB Campus Solbosch in Brussels.</li> </ul> </div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Ftalkweb.eu%2Fopenweb%2F4558%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Update: Follow also the discussion on HN.","image":"https://talkweb.eu/wp-content/uploads/2024/01/logo_bg.png","authors":[{"name":null,"url":"https://talkweb.eu/openweb/4558/","avatar":"https://talkweb.eu/wp-content/uploads/2021/11/cropped-O3HWIyF4_400x400-32x32.jpg"}],"id":"50233929","url":"https://talkweb.eu/openweb/4558/","external_url":"https://news.ycombinator.com/item?id=50233929","date_published":"2026-10-25T17:30:55Z"},{"title":"Sebastian Raschka's from-scratch video course on building reasoning models","content_html":"<div class=\"page\" id=\"readability-page-1\"><div><article><div dir=\"auto\"><p><span>I have written a lot about reasoning models here over the last two years on Ahead of AI, including a recent article on mechanisms to </span><a href=\"https://magazine.sebastianraschka.com/p/controlling-reasoning-effort-in-llms\">control reasoning effort levels in contemporary LLMs</a><span>. Reasoning models are still as relevant as ever. In fact, almost all current-generation LLMs today are reasoning models or offer a reasoning mode.</span></p><p><span>For those who are interested in how reasoning models work, including inference scaling, reinforcement learning, and distillation, I wrote my recent </span><a href=\"https://mng.bz/Nwr7\">Build Reasoning Model (From Scratch),</a><span> which implements these from the ground up in PyTorch, which, in my experience, is still the best way to understand and learn how things really work.</span></p><p>Now, in the last few months, I also sat down and recorded accompanying lectures I wanted to share with you. So, below, you will find eight reasoning model-from-scratch coding videos (11 hours of content).</p><p><span>We start with a pre-trained LLM and implement methods to evaluate and improve it in Python and PyTorch. So, if you enjoyed my </span><a href=\"https://magazine.sebastianraschka.com/p/coding-llms-from-the-ground-up\">Coding LLMs from the Ground Up</a><span> course last year, this is essentially the sequel (but you can also watch it without the prior course as a prerequisite).</span></p><p>I’m currently taking a short break and will be back soon with more exciting LLM research roundups next month. In the meantime, I hope you enjoy coding along!</p><p>As a small side note, and since I often get asked how reasoning models relate to today’s AI agents, here’s a short section on this before getting started with the videos.</p><p>A reasoning model is essentially an upgrade from a conventional LLM, that is, adding more post-training via reinforcement learning with verifiable rewards (and optionally inference scaling techniques) to make it more capable of solving more challenging problems. Classically, reasoning models are developed for math and code, but the capabilities can generalize to other problem domains as well.</p><p>A reasoning model then functions as the engine inside an agent harness, where the agent harness is a software or tooling framework around the LLM/reasoning model to tackle even more challenging problems (bigger coding tasks, travel booking, and all other sorts of personal assistant tasks). The task of the harness is sophisticated context management and giving the LLM access to tools.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!0A8p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!0A8p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 424w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 848w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 1272w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!0A8p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png\" width=\"1456\" height=\"769\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!0A8p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 424w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 848w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 1272w, https://substackcdn.com/image/fetch/$s_!0A8p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fa0f45-5efe-4937-a0e9-970b6f65ed8e_1868x986.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p><span>Figure 1: An engine analogy for conventional LLMs, reasoning models, and agent harnesses. Figure from my </span><a href=\"https://magazine.sebastianraschka.com/p/components-of-a-coding-agent\">Components of a Coding Agent</a><span> article.</span></p><p>In this analogy depicted in the figure above, the model is the engine, and the agent harness adds the machinery that lets us use it for various things (as an upgrade from a simple chatbot interface). An agent can use either a conventional LLM or a reasoning model, but reasoning models are the more typical choice as they are more capable. (As mentioned above, most current-gen LLMs are reasoning models with variable reasoning effort settings.)</p><p>So, the bottom line is that reasoning models, as the “engine,” remain an important part of understanding modern LLM agents.</p><p>The resources accompanying these topics shown above are:</p><ul><li><p><span>The </span><em>Build a Large Language Model (From Scratch)</em><span> </span><a href=\"https://amzn.to/4fqvn0D\">book</a><span> and </span><a href=\"https://magazine.sebastianraschka.com/p/coding-llms-from-the-ground-up\">videos</a></p></li><li><p><span>The </span><em>Build A Reasoning Model (From Scratch)</em><span> </span><a href=\"https://amzn.to/4aAKiFY\">book</a><span> (and videos below)</span></p></li><li><p><span>The </span><em>Components of a Coding Agent</em><span> </span><a href=\"https://magazine.sebastianraschka.com/p/components-of-a-coding-agent\">article</a><span> on Substack</span></p></li></ul><p>The videos below focus on developing the reasoning model that can power such a system.</p><p>The reasoning-from-scratch videos focus on a small pre-trained Qwen3 model, where we implement the reasoning methods ourselves in Python and PyTorch. Starting with a pre-trained model lets us focus on the interesting part: evaluation, inference-time scaling, reinforcement learning, and distillation.</p><p>Regarding the prerequisites, I recommend being comfortable with Python and PyTorch. I designed the reasoning materials as standalone content, so the previous Build A Large Language Model (From Scratch) content is recommended but not strictly required.</p><p><span>Compute-resource-wise, you can work through the early text-generation and evaluation examples on a CPU. For the later experiments, especially training, a GPU makes the work much more practical. The first video covers the setup and some more recommendations; the repository also includes </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch02/02_setup-tips\">hardware and environment recommendations</a><span>.</span></p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!xQp0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!xQp0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 424w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 848w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 1272w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!xQp0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png\" width=\"1456\" height=\"485\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;topics&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt=\"topics\" title=\"topics\" srcset=\"https://substackcdn.com/image/fetch/$s_!xQp0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 424w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 848w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 1272w, https://substackcdn.com/image/fetch/$s_!xQp0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67d8d671-53cc-4111-a3df-80ed733af3b5_1868x622.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>Figure 2: An overview of the topics being covered.</p><p><span>These videos accompany my book, </span><a href=\"https://mng.bz/Nwr7\">Build a Reasoning Model (From Scratch)</a><span>. If you like to read through the explanation in more detail and at your own pace, work through exercises, and so on, I recommend the book as a companion here.</span></p><p>For the most in-depth learning experience, my suggestion is to read a chapter, work through its code alongside the corresponding video, and then try the exercises.</p><p><span>The book is available from </span><strong><a href=\"https://mng.bz/Nwr7\">Manning</a></strong><span> and </span><strong><a href=\"https://amzn.to/4aAKiFY\">Amazon</a></strong><span>, and the print edition is in color!</span></p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!GRkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!GRkU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 424w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 848w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 1272w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!GRkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png\" width=\"1456\" height=\"815\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;color-book&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt=\"color-book\" title=\"color-book\" srcset=\"https://substackcdn.com/image/fetch/$s_!GRkU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 424w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 848w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 1272w, https://substackcdn.com/image/fetch/$s_!GRkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa32da890-2402-4704-a90b-b46b4f64b95c_1544x864.png 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p><span>Figure 3: A random excerpt from the </span><a href=\"https://mng.bz/Nwr7\">Build a Reasoning Model (From Scratch)</a><span> print book.</span></p><p>Thank you to everyone who has picked up a copy or recommended it to a friend. Your support helps me keep creating these materials.</p><p><span>As a last, quick side note before getting to the main videos below: For a shorter, more conceptual overview, I also recommend my </span><a href=\"https://www.linkedin.com/learning/ai-reasoning-models-the-building-blocks-for-the-next-generation-of-ai-applications\">AI Reasoning Models course on LinkedIn Learning</a><span> (it should be free for 24h when accessing it via the link there, which shouldn’t then require a LinkedIn Premium subscription).</span></p><p>The course is about 90 minutes and explains how reasoning models work, covering the main ideas behind inference-time scaling, reinforcement learning, and distillation. It’s a good optional preview if you’d like the main ideas without working through the full implementations below.</p><p>To get to the main part of this article, here are the eight main lecture videos.</p><p>The first video starts with an explanation of the relationship between conventional LLMs, reasoning models, and agents. Next, the main topic of the video is setting up the coding environment. This includes installing the Python and PyTorch dependencies (with uv), among others. I also discuss hardware choices and common setup issues.</p><p><strong>Topics covered</strong></p><ul><li><p>The relationship between conventional LLMs, reasoning models, and agent harnesses</p></li><li><p>On the benefits of learning through code implementations</p></li><li><p>The scope of this video series</p></li><li><p>Installing Python dependencies</p></li><li><p>Choosing hardware and checking CUDA or Apple Silicon support</p></li><li><p>Using a remote GPU with VS Code and troubleshooting the environment</p></li></ul><div id=\"youtube2-Kh9mqTzjuEQ\" data-attrs=\"{&quot;videoId&quot;:&quot;Kh9mqTzjuEQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/Kh9mqTzjuEQ?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=Kh9mqTzjuEQ\">Watch video 1</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch02/02_setup-tips\">Setup instructions</a></p><p><span>Before adding reasoning methods in the upcoming videos, we need a working base model. Instead of training it from scratch, since that would be a whole other book (see </span><a href=\"https://amzn.to/4fqvn0D\">Build A Large Language Model (From Scratch)</a><span>), we start with a pre-trained model.</span></p><p>Here, we load the pre-trained weights of a Qwen3 0.6B model. Then, we implement the text-generation process via a streaming text generator and add KV caching and model compilation to make text generation more efficient.</p><p>These implementations give us the baseline and base components we will evaluate and improve in the following videos.</p><p><strong>Topics covered</strong></p><ul><li><p>Encoding text as tokens and decoding it back into text</p></li><li><p>Downloading Qwen3 weights and loading the model on the selected compute device</p></li><li><p>Going over tensor shapes, logits, and next-token predictions</p></li><li><p>Implementing greedy decoding and streaming text generation</p></li><li><p>Handling end-of-sequence tokens and measuring generation speed</p></li><li><p>Adding a KV cache to reuse attention keys and values</p></li><li><p><span>Combining KV caching with </span><code>torch.compile</code><span> and comparing hardware performance</span></p></li></ul><div id=\"youtube2-BJua0yjO5dk\" data-attrs=\"{&quot;videoId&quot;:&quot;BJua0yjO5dk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/BJua0yjO5dk?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=BJua0yjO5dk\">Watch video 2</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch02\">Chapter 2 code</a></p><p>In this lecture, we build a math-answer verifier step by step, from answer extraction to normalization and checking mathematical equivalence. We then use it to evaluate the model on MATH-500.</p><p>We use this verifier to evaluate the base model’s performance on the MATH-500 evaluation dataset.</p><p>However, the verifier also has a second job later in the series: providing the reward signal for reinforcement learning with verifiable rewards (RLVR).</p><p><strong>Topics covered</strong></p><ul><li><p>Intro to verifiers and how they fit into LLM evaluation methods (other methods are covered in the book’s appendix)</p></li><li><p>Reusing answer verification as a reward signal for RLVR (more on that in chapter 6)</p></li><li><p>The verifier flow, including extracting final answers, normalizing answers and checking mathematical equivalence</p></li><li><p>Building an answer grader and an evaluation loop for MATH-500</p></li><li><p>Comparing base and reasoning models on MATH-500</p></li></ul><div id=\"youtube2-JQJ_8_jSAoY\" data-attrs=\"{&quot;videoId&quot;:&quot;JQJ_8_jSAoY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/JQJ_8_jSAoY?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=JQJ_8_jSAoY\">Watch video 3</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch03\">Chapter 3 code</a></p><p>Now we explore ways to improve answers while keeping the model weights fixed. But before implementing specific inference-scaling techniques, we first implement methods to generate diverse answers from the same prompt (this is standard practice in proprietary LLM chatbots, such as ChatGPT).</p><p>Concretely, we implement temperature scaling, multinomial sampling, and top-p filtering to generate diverse responses. Then we combine multiple responses through self-consistency, using majority voting over their final answers.</p><p>We also examine the tradeoff between answer accuracy and the extra computation needed to generate more candidates.</p><p><strong>Topics covered</strong></p><ul><li><p>Comparing how additional compute benefits model performance during training and during inference</p></li><li><p>A gentle intro to inference-scaling through chain-of-thought prompts</p></li><li><p>Implementing temperature scaling and multinomial sampling to generate diverse answers</p></li><li><p>Adding top-p filtering to control the quality of the diverse answers</p></li><li><p>Combining candidate answers through self-consistency, one of the most popular inference scaling techniques</p></li><li><p>Evaluating MATH-500 accuracy against the cost of additional inference compute</p></li></ul><div id=\"youtube2-t5y-kS9nNxU\" data-attrs=\"{&quot;videoId&quot;:&quot;t5y-kS9nNxU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/t5y-kS9nNxU?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=t5y-kS9nNxU\">Watch video 4</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch04\">Chapter 4 code</a></p><p>Building on the previous video, we implement scoring functions to compare multiple answers generated from the same prompt. We can also use these scoring methods to break ties in self-consistency (covered in the previous lecture).</p><p>The scoring methods covered here include computing token and sequence log probabilities (this will also be relevant in the later reinforcement learning chapters). We then implement a self-refinement loop in which the model critiques an answer and attempts a revision.</p><p>The evaluation lets us check how useful those additional steps are for our model.</p><p><strong>Topics covered</strong></p><ul><li><p>Using scoring functions for comparing multiple answers and breaking ties</p></li><li><p>Implementing a simple heuristic scorer</p></li><li><p>Computing token probabilities and sequence likelihoods (also relevant for the following lectures)</p></li><li><p>Using log probabilities for improved numerical stability</p></li><li><p>Building a self-refinement loop for generating critiques and revised answers</p></li><li><p>Evaluating self-refinement on MATH-500</p></li></ul><div id=\"youtube2-TVMyOJ_3Gxo\" data-attrs=\"{&quot;videoId&quot;:&quot;TVMyOJ_3Gxo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/TVMyOJ_3Gxo?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=TVMyOJ_3Gxo\">Watch video 5</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch05\">Chapter 5 code</a></p><p>In this lecture, we move on to implementing a training technique called Reinforcement Learning with Verifiable Rewards (RLVR). We first implement a simplified version of Group Relative Policy Optimization (GRPO), generate groups of responses, score them with our verifier, and use their relative rewards for the model weight updates during training.</p><p><strong>Topics covered</strong></p><ul><li><p>Generating reasoning traces and understanding the relationship between answer lengths and problem-solving abilities</p></li><li><p>Discussion and comparison of two important LLM post-training methods: Reinforcement Learning with Human Feedback (RLHF) and Reinforcement Learning with Verifiable Rewards (RLVR)</p></li><li><p>Turning verifier scores into rewards and relative advantages</p></li><li><p>Computing sequence log probabilities and a simplified GRPO loss</p></li><li><p>Assembling the training loop with logging and checkpoint saves</p></li><li><p>Evaluating checkpoints and checking training stability and memory needs</p></li></ul><div id=\"youtube2-237Hf7Q3lgg\" data-attrs=\"{&quot;videoId&quot;:&quot;237Hf7Q3lgg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/237Hf7Q3lgg?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=237Hf7Q3lgg\">Watch video 6</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch06\">Chapter 6 code</a></p><p>Now that we implemented the training loop in the previous lecture, we can revisit it and analyze the training runs in more detail.</p><p>Concretely, this video adds more training metrics for inspection and analysis, including entropy and advantage statistics, clipped policy ratios, KL loss term values, and formatted rewards.</p><p>We then review the training logs and evaluation results to understand what these additions do and whether additions such as clipped policy ratios and KL loss terms are helpful.</p><p><strong>Topics covered</strong></p><ul><li><p>Running longer training experiments and interpreting their logs</p></li><li><p>Tracking advantages and entropy to understand training behavior</p></li><li><p>Implementing clipping in the policy loss and analyzing its effects</p></li><li><p>Adding a KL loss term and discussing reward hacking</p></li><li><p>Understanding limitations of the simplified KL formulation</p></li><li><p>Implementing format rewards and conditioning them on answer correctness</p></li><li><p>Comparing checkpoints on MATH-500 and exploring further GRPO research</p></li></ul><div id=\"youtube2-VxfUrUrrczs\" data-attrs=\"{&quot;videoId&quot;:&quot;VxfUrUrrczs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/VxfUrUrrczs?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=VxfUrUrrczs\">Watch video 7</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch07\">Chapter 7 code</a></p><p>Finally, we explore another way to train a small reasoning model, that is, learning from answers generated by a stronger (and bigger) teacher model. We discuss different forms of distillation, prepare reasoning data, and implement the supervised training loop.</p><p>We finish this lecture and course by evaluating the distilled model on MATH-500 and comparing the results. This rounds out the series with an alternative to developing reasoning capabilities through reinforcement learning.</p><p><strong>Topics covered</strong></p><ul><li><p>Comparing the different combination and approaches to distillation, including soft and hard distillation, and on-policy and off-policy distillation</p></li><li><p>Creating and collecting teacher-generated answers for the MATH dataset (using DeepSeek R1)</p></li><li><p>Preparing the distillation dataset, including tokenization and training/validation/test splits</p></li><li><p>Computing answer-token log probabilities and understanding the cross-entropy loss</p></li><li><p>Implementing supervised training and tracking training and validation losses</p></li><li><p>Evaluating checkpoints on MATH-500 and comparing distillation results</p></li></ul><div id=\"youtube2-msp69FR5NZs\" data-attrs=\"{&quot;videoId&quot;:&quot;msp69FR5NZs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}\" data-component-name=\"Youtube2ToDOM\"><p><iframe src=\"https://www.youtube-nocookie.com/embed/msp69FR5NZs?rel=0&autoplay=0&showinfo=0&enablejsapi=0\" frameborder=\"0\" loading=\"lazy\" gesture=\"media\" allow=\"autoplay; fullscreen\" allowautoplay=\"true\" allowfullscreen=\"true\" width=\"728\" height=\"409\"></iframe></p></div><p><a href=\"https://www.youtube.com/watch?v=msp69FR5NZs\">Watch video 8</a><span> · </span><a href=\"https://github.com/rasbt/reasoning-from-scratch/tree/main/ch08\">Chapter 8 code</a></p><p>As you watch these lectures, I encourage you to pause occasionally and try a small experiment of your own if something interesting comes to mind.</p><p>For example, feel free to change the sampling settings, inspect a few failed answers, or try variations of different ideas similar to the suggestions in the exercises.</p><p><span>And if you would like the full written walkthrough, figures, and exercises alongside the videos, you can find </span><em>Build a Reasoning Model (From Scratch)</em><span> at </span><a href=\"https://mng.bz/Nwr7\">Manning</a><span> and </span><a href=\"https://amzn.to/4aAKiFY\">Amazon</a><span>.</span></p><p>Thanks for reading and supporting Ahead of AI. I am taking a short break to regenerate, and I look forward to being back with the next round of LLM research articles next month.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!_ebf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!_ebf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 1456w\" sizes=\"auto, 100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!_ebf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg\" width=\"542\" height=\"384.90934065934067\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1034,&quot;width&quot;:1456,&quot;resizeWidth&quot;:542,&quot;bytes&quot;:7503587,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://magazine.sebastianraschka.com/i/221111095?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!_ebf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_ebf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9cbbdff-4cb9-47cd-9679-badef260e2f3_4284x3043.jpeg 1456w\" sizes=\"auto, 100vw\" loading=\"lazy\"></picture></div></a></figure></div><p>In the meantime, happy viewing and tinkering!</p></div></article></div><div><div id=\"discussion\"><h4>Discussion about this post</h4></div><div data-component-name=\"SubscribeFooter\"><h3>Ready for more?</h3></div></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fmagazine.sebastianraschka.com%2Fp%2Fbuilding-reasoning-models\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Over 11 hours of coding videos on evaluation, inference-time scaling, reinforcement learning, and distillation, with Python and PyTorch.","image":"https://substackcdn.com/image/fetch/$s_!1SoS!,w_1200,h_675,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F519db120-1320-411b-adec-a88865345f2c_4083x2916.jpeg","authors":[{"name":"Ahead of AI","url":"https://magazine.sebastianraschka.com/p/building-reasoning-models","avatar":"https://substackcdn.com/image/fetch/$s_!H1CS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F342e39ec-514c-4b4d-8a76-6acf0cbd8248%2Ffavicon.ico"}],"id":"50245138","url":"https://magazine.sebastianraschka.com/p/building-reasoning-models","external_url":"https://news.ycombinator.com/item?id=50245138","date_published":"2026-10-26T15:11:59Z"},{"title":"Oregon Police Are Charging a Local News Outlet $2.5M for Records About One Cop","content_html":"<div class=\"page\" id=\"readability-page-1\"><div> <figure> <img decoding=\"async\" src=\"https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?fit=1436%2C930\" srcset=\"https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=1436 1436w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=300 300w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=768 768w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=1024 1024w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=540 540w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-1.png?w=1000 1000w\" sizes=\"auto, (min-width: 1300px) 650px, (min-width: 800px) 64vw, (min-width: 500px) calc(100vw - 5rem), calc(100vw - 3rem)\" alt width=\"1436\" height=\"930\" loading=\"lazy\"><figcaption> <span>Two members of the Eugene, Oregon, Police Department in a photo posted to the department’s Facebook page on Aug. 26, 2026.</span>&#160;<span>Screenshot: Eugene Police Department via Facebook</span> </figcaption></figure> <div> <p><img src=\"https://theintercept.com/wp-content/uploads/2026/01/lauren-harper-1.png?w=440&h=440&crop=1\" width=\"46\" height=\"46\" alt></p><p><span>Lauren Harper is Freedom of the Press Foundation’s first Daniel Ellsberg Chair on Government Secrecy.</span></p> </div> <p><span>How much does it cost</span> to get more information about a cop who punched someone in the face?</p> <p>If you guessed anything lower than $2.5 million, you’d be wrong — at least according to the city of Eugene, Oregon.</p> <p>In August, the local news outlet <a href=\"https://doublesidedmedia.com/2026/09/30/editorial-the-eugene-police-wants-dsm-to-pay-2-6-million-for-records/\">Double Sided Media</a> filed a public records request for records about police officer Justin Peckels, which focused on potential misconduct between 2018 and 2026. Peckels has been the subject of community complaints, including for <a href=\"https://www.klcc.org/crime-law-justice/2024-05-14/eugene-man-suing-city-after-traffic-stop-leaves-him-with-a-broken-nose\">punching a resident in the face</a> during a traffic stop, making the records vital for oversight and their release clearly in the public interest.</p> <p>The city’s response is beyond belief. In its response to the request on Monday, the Eugene Police Department <a href=\"https://media.freedom.press/media/documents/2026-3444_cost_estimate_2.pdf\">claimed</a> searching for records and processing the request would take <em>at least</em> 44,816 hours of staff time and cost approximately $2,484,599.04. (A separate request by the outlet for similar records concerning a former police officer, Eric Klinko, was met with a comparatively modest estimate of <a href=\"https://media.freedom.press/media/documents/2026-3443_cost_estimate_4.pdf\">$195,869.52</a>, for a grand total of nearly $2.7 million for both requests.)</p> <figure> <img decoding=\"async\" src=\"https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?fit=2542%2C840\" srcset=\"https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=2542 2542w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=300 300w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=768 768w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=1024 1024w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=1536 1536w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=2048 2048w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=540 540w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=1000 1000w, https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-2.18.31-PM.png?w=2400 2400w\" sizes=\"auto, (min-width: 1300px) 650px, (min-width: 800px) 64vw, (min-width: 500px) calc(100vw - 5rem), calc(100vw - 3rem)\" alt width=\"2542\" height=\"840\" loading=\"lazy\"><figcaption> <span>The open invoice by the City of Eugene, Ore. dated Aug. 1, 2026, in response to Double Sided Media’s request for public records relating to a police officer accused of misconduct.</span>&#160;<span>Screenshot: City of Eugene</span> </figcaption></figure> <p>“Once the City receives payment of $2,484,599.04 staff will continue processing your request,” the letter from the department’s public records division read. “If the actual cost of processing your request exceeds the amount you have paid the City, you will be required to pay the difference before the City will provide the records you have requested.”</p> <p>Peckels’s file is either the largest in the world, or city officials have intentionally maintained their databases in such a way as to ensure fulfilling public records requests is prohibitively expensive. The city’s response points, at a minimum, to the latter. It justified the multimillion-dollar price tag by claiming it couldn’t narrow the custodians whose records it would need to search, despite the targeted nature of the request, and maintained it must search <em>all</em> records of <em>all</em> city employees, past and present.</p> <p>By that logic, if someone ever worked in Eugene’s parks and recreation department, their records could contain responsive information about police misconduct, and must be manually pulled and reviewed, one by one.</p>  <p>This goes far beyond incompetence. It’s an intentional effort to make a response artificially voluminous — and cost prohibitive — to intimidate the journalist into dropping it entirely.&#160;</p> <p>Normally, agencies are required to search the specific custodians most likely to possess responsive records, not every groundskeeper or clerk on the city payroll. If the city were acting in good faith, officials would have asked Double Sided Media to help them identify the most likely record-holders, not take it upon themselves to cast a citywide dragnet as its first step.</p> <p>What makes Eugene’s money-grab particularly galling is its technology double standard. While it apparently can’t invest in efficient search software, the police department recently signed a <a href=\"https://lookouteugene-springfield.com/story/latest-news/central-eugene/2025/12/05/eugene-announces-termination-of-flock-contract/\">two-year $342,000</a> contract for <a href=\"https://www.opb.org/article/2025/12/06/eugene-springfield-end-flock-cameras/\">nearly 60 AI-powered Flock</a> automated license plate readers. This project was so secretive that the ACLU of Oregon <a href=\"https://www.aclu-or.org/cases/may-v-city-of-eugene/\">had to sue</a> the city for records about how the cameras were being used and demonstrates, among other inclinations, the city’s eagerness to employ sophisticated software to deploy against residents.&#160;</p> <p>Yet that technological sophistication disappears as soon as a journalist requests public records about the department’s internal accountability process, and simple keyword searches are suddenly cumbersome.&#160;</p> <figure> <blockquote> <p>For small newsrooms, a $2.5 million invoice is effectively a gag order that was never actually about covering costs, but bullying the requester to drop their inquiry.</p> </blockquote> </figure> <p>Troublingly, Eugene’s $2.5 million bill is not an anomaly.</p> <p>In 2015, the Department of Defense told a Freedom of Information Act requester, who was asking for records on tools used to preserve data on seized devices, that fulfilling their request would take 15 million hours and cost <a href=\"https://www.muckrock.com/foi/united-states-of-america-10/hotpluggedin-19767/#file-75693\">$660 million</a>.</p> <p>The same year, the Drug Enforcement Administration told a requester it would cost <a href=\"https://unredacted.com/2015/03/18/unnecessary-freedom-of-information-act-fees/\">$1.46 million</a> for records about the DEA’s role in the search and capture of the Mexican cartel boss Joaquin “El Chapo” Guzman.</p> <p>In 2019, the Army tried to charge $300,000 to <a href=\"https://www.ewg.org/release/army-backs-down-foia-waives-300k-fee-pfas-contamination-data\">release military base water test results</a> for the presence of toxic chemicals. The Army agreed to waive the exorbitant fee after facing intense backlash.&#160;</p> <p>The list goes <a href=\"https://www.eff.org/deeplinks/2025/03/ten-years-foilies\">on and on</a>.</p>  <p>Luckily, records requesters seeking federal documents have a defense against these capricious invoices. Recent <a href=\"https://foia.blogs.archives.gov/2017/02/01/lets-talk-about-fees/\">FOIA amendments</a> aim to ensure if an agency misses its response deadlines, it can’t charge most fees.&#160;</p> <p>At the local level, however, these protections disintegrate. While Oregon grants agencies the discretion to reduce fees when the disclosure would <a href=\"https://www.rcfp.org/open-government-guide/oregon/#3-fee-issues\">benefit the public</a>, agencies routinely ignore these provisions.</p> <p>For small newsrooms like Double Sided Media, a $2.5 million invoice is effectively a gag order that was never actually about covering costs, but bullying the requester to drop their inquiry (all while Eugene Police Department launches <a href=\"https://doublesidedmedia.com/2025/08/15/eugene-police-debuts-own-press/\">its own “press” initiative</a> to document its policing). It also sets the precedent for using this chilling tactic on any journalist or watchdog as it sees fit.&#160;</p> <p>Double Sided Media is rightly appealing the fee estimate, and it should prevail. But cities like Eugene will continue these efforts unless lawmakers across the country force agencies to adopt fee caps, mandate public-interest fee waivers for journalists, and require agencies to procure software that allows them to respond to records requests in an efficient and timely manner.</p> <p>Until then, police departments will likely continue to issue multimillion-dollar ransoms for their records — weaponizing the public’s right to know into another avenue for police to operate with impunity.</p> </div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Ftheintercept.com%2F2026%2F10%2F01%2Foregon-police-misconduct-public-records-cost-fee%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Eugene-based Double Sided Media requested police officer Justin Peckels’s records. The city slapped the publication with an exorbitant fee.","image":"https://theintercept.com/wp-content/uploads/2026/10/Screenshot-2026-10-01-at-4.14.38-PM-e1790885738599.png?fit=1436%2C718&w=1200&h=800","authors":[{"name":"The Intercept","url":"https://theintercept.com/2026/10/01/oregon-police-misconduct-public-records-cost-fee/","avatar":"https://theintercept.com/wp-content/themes/intercept/assets/icons/favicon.ico"}],"id":"50234232","url":"https://theintercept.com/2026/10/01/oregon-police-misconduct-public-records-cost-fee/","external_url":"https://news.ycombinator.com/item?id=50234232","date_published":"2026-10-25T18:04:11Z"},{"id":"50237485","url":"https://www.reuters.com/live/brazil-election-live-lula-bolsonaro-face-off-presidential-runoff-2026-10-25/","external_url":"https://news.ycombinator.com/item?id=50237485","title":"Lula wins election after final votes tallied","date_published":"2026-10-26T00:31:07Z"},{"title":"Meta Ignores Brazilian Court Order to End Bolsonaro Favoritism","content_html":"<div class=\"page\" id=\"readability-page-1\"><div><article><div dir=\"auto\"><p><em>by Otávio Rosso</em></p><p>Sleeping Giants Brasil and the organization CTRL+Z sent new evidence to the Superior Electoral Court on Monday. The groups say it points to possible unequal treatment by Meta of the campaigns of President Luiz Inácio Lula da Silva, of the Workers’ Party, and Sen. Flávio Bolsonaro, of the Liberal Party.</p><div><figure><a target=\"_blank\" href=\"https://substackcdn.com/image/fetch/$s_!CdTr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg\" data-component-name=\"Image2ToDOM\"><div><picture><source type=\"image/webp\" srcset=\"https://substackcdn.com/image/fetch/$s_!CdTr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 1456w\" sizes=\"100vw\"><img src=\"https://substackcdn.com/image/fetch/$s_!CdTr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg\" width=\"1157\" height=\"626\" data-attrs=\"{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:626,&quot;width&quot;:1157,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:147951,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.panamericandispatch.org/i/221181602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}\" alt srcset=\"https://substackcdn.com/image/fetch/$s_!CdTr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CdTr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg 1456w\" sizes=\"100vw\" fetchpriority=\"high\"></picture></div></a></figure></div><p>The groups argue that Instagram and WhatsApp tools keep showing results that would favor the Liberal Party candidate. They also say the tools link Lula to derogatory content. This continues despite an electoral court order that Meta ensure equal conditions for both candidates.</p><p><span>Journalist Mônica Bergamo </span><a href=\"https://www1.folha.uol.com.br/colunas/monicabergamo/2026/10/entidades-apontam-novos-indicios-de-tratamento-desigual-da-meta-a-lula-e-flavio-no-tse.shtml\">broke the story today in </a><em><a href=\"https://www1.folha.uol.com.br/colunas/monicabergamo/2026/10/entidades-apontam-novos-indicios-de-tratamento-desigual-da-meta-a-lula-e-flavio-no-tse.shtml\">Folha de S.Paulo</a></em><span>. According to her report, the organizations filed a petition addressed to Superior Electoral Court Justice Marco Aurélio Bellizze, who is overseeing the court caset. They asked him to order the alleged irregularities fixed within 24 hours. They also want Meta to explain how it ranks search results and produces answers with artificial intelligence. And they ask the court to enforce the daily fine of R$500,000 (about $99,000) it already set.</span></p><p>The new records involve searches for animated GIFs, the ordering of hashtags and answers from Meta AI, the artificial intelligence system built into WhatsApp. The organizations say the examples reinforce their suspicion that the platforms do not apply equivalent criteria to the two presidential campaigns.</p><p><strong>Image searches put Flávio Bolsonaro in the spotlight</strong></p><p>The petition describes a GIF search on WhatsApp for the word “brasil.” The first result was an image of Flávio Bolsonaro. It showed his ticket number and identified his running mate.</p><p>According to the records sent to the court, the same result appeared on three separate accounts. The groups use this to ask whether its top position comes from systematic ranking criteria.</p><p>A similar check on Instagram also showed images of the senator among the first results. Users who searched for “brasil” found three images of Flávio Bolsonaro in the top positions. The only mention of President Lula was his name in writing, with no photo.</p><p>The two organizations say the difference deserves an explanation. Search and recommendation tools can increase the exposure of certain candidates on social media. They are not claiming that they have proven bias in Meta, choosing instead to posit the question to the Superior Electoral Court.</p><p><strong>Lula linked to derogatory content</strong></p><p>Another set of examples ties Lula to negative terms in searches on Meta platforms.</p><p>On WhatsApp, a GIF search for the word “ladrão” (thief) returned a caricature of the president in a striped uniform, a reference to prison dress. Another result carried the message “Supporting the Workers’ Party is a mental illness.”</p><p>On Instagram, a search for the same word showed a GIF reading “Vote 13.” That is the Workers’ Party election number, tied to Lula’s candidacy.</p><p>For Sleeping Giants Brasil and CTRL+Z, these results point to an imbalance in how political references are shown to users. The imbalance stands out against the visibility of content favorable to Flávio Bolsonaro.</p><p>The petition also challenges how Instagram orders hashtags. A search for “lula” offered “#lulaladrão” (Lula thief) as the first suggestion, ahead of other terms about the president. A search for “bolsonaro” placed the critical hashtag “#bolsonaronuncamais” (Bolsonaro never again) among its last suggestions.</p><p>The groups cite the difference in position as another reason to investigate the relevance criteria the platform uses.</p><p>The issue is not only whether content for or against the candidates exists. It is mainly how automated systems organize that information and present it to the public.</p><p><strong>Meta AI also questioned</strong></p><p>The organizations included a test of Meta AI, the artificial intelligence tool offered to WhatsApp users. According to the petition, two people asked the system to pick a number between 1 and 25. They gave no instructions and made no reference to the election.</p><p>In one attempt, the AI answered 13. In the other, it answered 22. Those are the party ballot numbers of Lula and Flávio Bolsonaro, respectively.</p><p>The groups question the coincidence. They ask for an explanation of the parameters the system uses to form its answers.</p><p>The episode alone does not allow a conclusion that the tool answered out of electoral preference. Still, the organizations list the test among the elements that, in their view, demand more transparency about how the company’s artificial intelligence features work.</p><p><strong>Electoral court demands compliance and threatens to double fine</strong></p><p>The new records arrive as the electoral court takes a harder line with Meta.</p><p>Justice Bellizze had already ordered the company to apply identical criteria to the campaigns of Lula and Flávio Bolsonaro. He also ordered Meta to prove it was following the measures.</p><p>On Friday, the full court upheld the justice’s decision. It reinforced the company’s duty to ensure equal treatment of the candidates.</p><p>On Sunday, Bellizze again demanded action. He gave the company a new deadline of 24 hours to show it had met part of the court’s requirements.</p><p>The justice also warned that the daily fine, first set at R$500,000 (about $99,000), could rise to R$1 million (about $198,000) if noncompliance continues.</p><p>The new petition from Sleeping Giants Brasil and CTRL+Z aims to add to the case just as the court demands more detailed explanations from the company.</p><p>The groups want Meta to do more than fix the problems they identified. They also want it to disclose the criteria that decide the order of images, hashtag suggestions and answers produced by artificial intelligence.</p><p><strong>Lula campaign has already gone to electoral court</strong></p><p>The dispute began with complaints from Lula’s campaign about how Meta’s digital platforms work.</p><p>The president’s representatives pointed to limits on the circulation of content about his candidacy. They also cited differences in how the company’s tools behave compared with tools tied to his opponent.</p><p>The claims led the electoral court to demand measures to ensure equal treatment of the candidates.</p><p>Meta has denied deliberately favoring any candidate. It blamed the earlier problems on technical failures.</p><p><em>Folha de S.Paulo</em><span> contacted the company about the new records filed Monday. Meta had not responded by the time of publication.</span></p><p>The lack of a specific response leaves open the explanations for the mechanisms behind the results the organizations found.</p><p><strong>Groups call protest at Meta headquarters in São Paulo</strong></p><p>Besides the legal action, Sleeping Giants Brasil and CTRL+Z planned a demonstration outside Meta’s headquarters in São Paulo at 5 p.m. Monday.</p><p>The event is called “Meta, Hands Off Our Election.” The organizations say it will be peaceful.</p><p>Participants plan to hand a notice to the company’s director in Brazil. They want action on the suspicions of unequal treatment of the candidacies.</p><p>The mobilization increases pressure on Meta on two fronts. In court, the groups seek correction of the alleged irregularities and sanctions. In public debate, they demand transparency about the algorithms used during the presidential race.</p><p><em>This article first appeared in </em><span>Brasil 247</span><em>, was translated with express consent from the editor-in-chief by </em><span>Panamerican Dispatch</span><em><span>, and can be read in its </span><a href=\"https://www.brasil247.com/brasil/entidades-denunciam-novos-indicios-de-favorecimento-a-flavio-bolsonaro-pela-meta/\">original Portuguese here</a><span>. </span></em></p></div></article></div><div><div id=\"discussion\"><h4>Discussion about this post</h4></div><div data-component-name=\"SubscribeFooter\"><h3>Ready for more?</h3></div></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fwww.panamericandispatch.org%2Fp%2Fmeta-ignores-brazilian-court-order\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"Sleeping Giants and CTRL-Z sent evidence to Brazil’s Superior Electoral Court today showing Meta AI continues to spontaneously link Lula to negative content","image":"https://substackcdn.com/image/fetch/$s_!CdTr!,w_1200,h_675,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d3b04ca-0141-4aca-81e2-f64fd77e8555_1157x626.jpeg","authors":[{"name":"Panamerican Dispatch","url":"https://www.panamericandispatch.org/p/meta-ignores-brazilian-court-order","avatar":"https://substackcdn.com/image/fetch/$s_!53tM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb83a182-e7d9-4c23-ad09-dbab527f57db%2Ffavicon.ico"}],"id":"50229587","url":"https://www.panamericandispatch.org/p/meta-ignores-brazilian-court-order","external_url":"https://news.ycombinator.com/item?id=50229587","date_published":"2026-10-25T09:00:40Z"},{"id":"50248124","url":"https://openai.com/index/introducing-gpt-6-1-terra/","external_url":"https://news.ycombinator.com/item?id=50248124","title":"GPT-6.1 Terra","date_published":"2026-10-26T18:01:17Z"},{"title":"Elon Musk Just Gave Europe a Reason to Replace American Technology","content_html":"<div class=\"page\" id=\"readability-page-1\"><div> <p><span>I’ve been in London for the last month and have heard policymakers react to the wake up call Elon Musk just delivered.&#160;</span></p> <hr> <p><span>The decision of the U.S. to shut off intelligence and throttle the military version of <a href=\"https://www.nytimes.com/2026/10/21/world/europe/starshield-starlink-ukraine.html\" target=\"_blank\" rel=\"noopener\">Starlink called Starshield</a> to Ukraine may have been a blip in the news in the US, but it has sent tremors across Europe.</span></p> <p><span>For years doomsayers in the UK and Europe were worried about the U.S. having a kill switch in weapon systems and critical commercial technology that could disconnect them at will. Most people, including me, thought that it was a paranoid fantasy.</span></p> <p><span>Until it happened. Seemingly on a whim of a single individual, (<a href=\"https://www.wsj.com/world/ukraine-starlink-elon-musk-trump-dbc49193\" target=\"_blank\" rel=\"noopener\">according to the Wall Street Journal</a>) Elon Musk personally ordered the restrictions, and the effect was to tilt Russia’s war against Ukraine in favor of the Russians. This wasn’t an articulated U.S. foreign policy nor was it an announced act of the U.S. government. <a href=\"https://www.wsj.com/world/ukraine-says-starlink-isnt-working-despite-trumps-promise-to-restore-it-c3609d3d\" target=\"_blank\" rel=\"noopener\">From news accounts</a> it appears to have been a personal decision of an American CEO acting unilaterally. </span></p> <p><b>Blowback<br> </b><span>For whatever reason, whether it was to satisfy a request from the White House or some personal animosity to the Ukrainians, </span><span>from Europe’s perspective, that’s almost beside the point. An American company operating critical military infrastructure was able to degrade the capability of an American partner in the middle of a war. Without warning.</span></p> <p><span>The message heard loud and clear here in Europe was that </span><i><span>the U.S. is an unreliable security and technology partner willing to throw any partner under the bus, at any time, for any reason</span></i><span>.</span></p> <p><span>The conversations I’ve heard have included, “what happens if other U.S. CEOs – Microsoft, OpenAI or Anthropic, Oracle, Palantir, or Google – decide to restrict/limit or deny access to their products? What capabilities would Europe lose if enterprise software and/or AI across Europe goes dark?” This was a laughable scenario until this week. To a lot of European decision makers, it is no longer outside the realm of possibility.</span></p> <p><span>The lesson that was brought home was that no nation, Europe or elsewhere, can continue to outsource its national sovereignty and security by depending solely on US data systems or intelligence.</span></p> <p><b>Unintended Consequences<br> </b>Besides the political ramifications, the business ones are going to come home to roost. If every U.S. vendor is now a kill-switch risk, the allied market for that whole ecosystem shrinks. As it sinks into the European countries that the U.S, can simply shut off any technology, over time they will find and build alternatives. In the years ahead, this may cost American companies tens if not hundreds of billions of lost revenue.</p> <p><span>Europe has been debating digital sovereignty for years. Up to this year, the idea of cloning the capabilities of the best U.S. products seemed like an insurmountable problem. And some, like low-cost access to space, still are. But today AI collapses the cost of creating sovereign software at exactly the time that geopolitical risk is increasing customers’ willingness to switch. AI makes recreating the features, functions and compatibility of Microsoft Office, Oracle, Salesforce, Palantir, Anduril, et al. within reach. AI puts it well within the capabilities of most nations.&#160;</span></p> <p>The U.S. spent decades establishing itself as the world’s indispensable technology supplier. A substantial part of that advantage depended on customers believing American technology would remain reliable and available.</p> <p>Going forward a U.S. founder selling into European defense or government now needs an answer to “who holds the switch” before the first meeting; and European founders just got sovereignty as a sellable feature.</p> <p><span>What was done in a fit of pique will cost the U.S. both leadership and jobs.</span><br> </p> <p> Filed under: <a href=\"https://steveblank.com/category/national-security/\" rel=\"category tag\">National Security</a>, <a href=\"https://steveblank.com/category/teaching/\" rel=\"category tag\">Teaching</a> | </p> </div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fsteveblank.com%2F2026%2F10%2F24%2Feurope-gets-a-wake-up-call%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"I’ve been in London for the last month and have heard policymakers react to the wake up call Elon Musk just delivered.  The decision of the U.S. to shut off intelligence and throttle the military v…","image":"https://s0.wp.com/_si/?t=eyJpbWciOiJodHRwczpcL1wvczAud3AuY29tXC9pXC9ibGFuay5qcGciLCJ0eHQiOiJTdGV2ZSBCbGFuayIsInRlbXBsYXRlIjoiaGlnaHdheSIsImZvbnQiOiIiLCJibG9nX2lkIjo2NTk5NTg5fQ.-efmxdtN_YlMwMyz4RgR-akCDYfNNsBU6laamcldxGAMQ","authors":[{"name":"Steve Blank","url":"https://steveblank.com/2026/10/24/europe-gets-a-wake-up-call/","avatar":"https://s0.wp.com/i/webclip.png"}],"id":"50220913","url":"https://steveblank.com/2026/10/24/europe-gets-a-wake-up-call/","external_url":"https://news.ycombinator.com/item?id=50220913","date_published":"2026-10-24T13:09:28Z"},{"title":"OBS Studio 33","content_html":"<div class=\"page\" id=\"readability-page-1\"><div data-pjax=\"true\" data-test-selector=\"body-content\" data-view-component=\"true\"><h2>33.0 New Features</h2> <ul> <li>Updated CEF from 127/6533 to 150/7871 [WizardCM] (<a href=\"https://github.com/obsproject/obs-studio/pull/13900\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13900/hovercard\">#13900</a>) <ul> <li>This is a massive update to the underlying framework used for browser sources and docks from the July 2024 release to September 2026</li> <li>All of this work is on the backend and should be invisible to users. Please be sure to report any new weirdness or problems you run into with browser sources!</li> </ul> </li> <li>Complete overhaul to plugin loading [FiniteSingularity/PatTheMav] (<a href=\"https://github.com/obsproject/obs-studio/pull/13594\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13594/hovercard\">#13594</a>) <ul> <li>First-party plugins are now in a new folder named core</li> <li>Third-party plugins have an updated installation location and folder structure</li> <li>Existing third-party plugins will continue to load from the legacy locations until OBS Studio 34.0</li> <li>More information is available in our <a href=\"https://obsproject.com/kb/legacy-plugin-locations\" rel=\"nofollow\">knowledge base article</a></li> </ul> </li> <li>Improved how source snapping works in the preview [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/12298\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/12298/hovercard\">#12298</a>) <ul> <li>New visual indicator added</li> <li>Sources now snap along the entire axis instead of only when directly touching</li> <li>Sources no longer snap to hidden sources</li> </ul> </li> <li>Improved behavior of spinboxes for number values [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/12337\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/12337/hovercard\">#12337</a>) <ul> <li>Typing is no longer mysteriously blocked in some situations</li> <li>Numbers are no longer cut off in some situations</li> <li>Values now update only after pressing Enter and Enter does not close the window</li> <li>Holding Shift + Up/Down now advances multiple steps at a time</li> <li>Dragging the cursor inside the input but outside the text itself now works properly</li> </ul> </li> <li>Enabled NVENC on Arm64 [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13827\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13827/hovercard\">#13827</a>)</li> </ul> <h2>33.0 Changes</h2> <ul> <li>Added a check for encoders being missing when loading a profile [derrod] (<a href=\"https://github.com/obsproject/obs-studio/pull/11340\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/11340/hovercard\">#11340</a>)</li> <li>Added support for newest NVIDIA Broadcast SDKs for NVIDIA Audio Effects and Video Effects [pkviet] (<a href=\"https://github.com/obsproject/obs-studio/pull/13838\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13838/hovercard\">#13838</a>)</li> <li>Added hotkeys for controlling audio monitoring of a source [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/13599\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13599/hovercard\">#13599</a>)</li> <li>Changed Safe Mode to not start WebSocket Server [FiniteSingularity/RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13984\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13984/hovercard\">#13984</a>)</li> <li>Fixed issues with groups in Studio Mode [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/11092\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/11092/hovercard\">#11092</a>) <ul> <li>Fixed moving sources inside a group causing them to glitch out in Program</li> <li>Fixed moving sources inside a group showing up live in Program</li> </ul> </li> <li>Adjusted naming of Window Capture methods on Windows [Penwy] (<a href=\"https://github.com/obsproject/obs-studio/pull/12047\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/12047/hovercard\">#12047</a>)</li> <li>Improved detection of fullscreen games for Game Capture [Kira-NT] (<a href=\"https://github.com/obsproject/obs-studio/pull/10880\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/10880/hovercard\">#10880</a>)</li> <li>Improved transparency handling for macOS Screen Capture [jcm93] (<a href=\"https://github.com/obsproject/obs-studio/pull/13030\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13030/hovercard\">#13030</a>)</li> <li>Scaled simple output recording audio bitrate by channel count [nickvonkaenel] (<a href=\"https://github.com/obsproject/obs-studio/pull/13311\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13311/hovercard\">#13311</a>)</li> <li>Removed support for Ubuntu 24.04</li> </ul> <h2>33.0 Bug Fixes</h2> <ul> <li>Added a startup error if obs-transitions failed to load [notr1ch] (<a href=\"https://github.com/obsproject/obs-studio/pull/13321\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13321/hovercard\">#13321</a>)</li> <li>Improved file splitting for Hybrid MP4/MOV [derrod] (<a href=\"https://github.com/obsproject/obs-studio/pull/13386\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13386/hovercard\">#13386</a>)</li> <li>Fixed outputs getting stuck running when a bad rescale output resolution is set [suogesi] (<a href=\"https://github.com/obsproject/obs-studio/pull/13375\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13375/hovercard\">#13375</a>)</li> <li>Fixed monitoring icon state getting desynced when using third-party tools or websockets [prgmitchell] (<a href=\"https://github.com/obsproject/obs-studio/pull/13822\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13822/hovercard\">#13822</a>)</li> <li>Fixed a crash on macOS 27.2 when starting OBS Studio [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/14070\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/14070/hovercard\">#14070</a>)</li> <li>Fixed potential crash when shader cache file is invalid [notr1ch] (<a href=\"https://github.com/obsproject/obs-studio/pull/13538\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13538/hovercard\">#13538</a>)</li> <li>Fixed a potential crash on Linux when USB mic is removed [R0te/RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13922\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13922/hovercard\">#13922</a>)</li> <li>Fixed a potential crash when renaming a source with the Add Source window open [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/13800\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13800/hovercard\">#13800</a>)</li> <li>Fixed a potential deadlock during video/audio tasks [exeldro] (<a href=\"https://github.com/obsproject/obs-studio/pull/13579\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13579/hovercard\">#13579</a>)</li> <li>Fixed an issue with B-frame offset calculation in AMF that could cause streams to disconnect [lexano-ivs] (<a href=\"https://github.com/obsproject/obs-studio/pull/13762\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13762/hovercard\">#13762</a>)</li> <li>Fixed PipeWire screencast sources being duplicated in studio mode [tytan652] (<a href=\"https://github.com/obsproject/obs-studio/pull/13673\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13673/hovercard\">#13673</a>)</li> <li>Fixed a potential crash when switching off a newly created profile [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/13182\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13182/hovercard\">#13182</a>)</li> <li>Fixed a source toolbar crash when source type is missing [Penwy] (<a href=\"https://github.com/obsproject/obs-studio/pull/13539\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13539/hovercard\">#13539</a>)</li> <li>Fixed profile import failing on paths with a trailing slash [Ushkalovk] (<a href=\"https://github.com/obsproject/obs-studio/pull/13863\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13863/hovercard\">#13863</a>)</li> </ul> <h2>33.0 Developer Information</h2> <ul> <li>Added frontend event and output signal for replay buffer saving [Penwy] (<a href=\"https://github.com/obsproject/obs-studio/pull/8955\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/8955/hovercard\">#8955</a>)</li> <li>Added guidance regarding the theme system to the top of all theme files [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/13733\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13733/hovercard\">#13733</a>)</li> <li>Added ability to set a file extension filter for OBS_PATH_FILE_SAVE path types [FiniteSingularity] (<a href=\"https://github.com/obsproject/obs-studio/pull/10190\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/10190/hovercard\">#10190</a>)</li> <li>Added obs_frontend_is_safe_mode for first-party plugins <ul> <li>Third-party plugins are not loaded at all in Safe Mode</li> </ul> </li> <li>Added versions to Flatpak plugin extension point [tytan652] (<a href=\"https://github.com/obsproject/obs-studio/pull/13735\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13735/hovercard\">#13735</a>)</li> <li>Added obs_canvas_video_active() to check if the video of a canvas is active [exeldro] (<a href=\"https://github.com/obsproject/obs-studio/pull/13110\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13110/hovercard\">#13110</a>)</li> <li>The minimum supported versions of Visual Studio, Windows SDK, and clang-format have been increased. Previous versions may continue to work, but will no longer be tested/supported. It is recommended that build environments are kept up-to-date with the project's toolchain. <ul> <li>Changed Windows builds to use Visual Studio 2026 and SDK 26100 [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13543\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13543/hovercard\">#13543</a>)</li> <li>Changed clang-format version used to 22.1.3 [PatTheMav] (<a href=\"https://github.com/obsproject/obs-studio/pull/13549\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13549/hovercard\">#13549</a>)</li> </ul> </li> <li>Changed obs_canvas_reset_video() to allow resetting a canvas's video when any other canvas's video is active, but not its own video [exeldro] (<a href=\"https://github.com/obsproject/obs-studio/pull/13110\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13110/hovercard\">#13110</a>)</li> <li>Updated libnsgif to 1.0.0 [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/11178\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/11178/hovercard\">#11178</a>) <ul> <li>This is a breaking change for any plugins using libobs/graphics gs_image_file</li> </ul> </li> <li>Clarified documentation for obs_module_unload [notr1ch] (<a href=\"https://github.com/obsproject/obs-studio/pull/13327\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13327/hovercard\">#13327</a>)</li> <li>Required MbedTLS 3 and exclude 4 or later [tytan652] (<a href=\"https://github.com/obsproject/obs-studio/pull/13799\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13799/hovercard\">#13799</a>)</li> <li>Removed support for FFmpeg 6.x and 7.x [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13964\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13964/hovercard\">#13964</a>)</li> <li>Removed support for Qt 6.4-6.9 [RytoEX] (<a href=\"https://github.com/obsproject/obs-studio/pull/13969\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13969/hovercard\">#13969</a>)</li> <li>Fixed repeated preview enable/disables not working [WarmUpTill] (<a href=\"https://github.com/obsproject/obs-studio/pull/12580\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/12580/hovercard\">#12580</a>)</li> <li>Only emit core signal handlers for public canvases [tt2468] (<a href=\"https://github.com/obsproject/obs-studio/pull/13574\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13574/hovercard\">#13574</a>)</li> <li>Deprecated unused hidden API for sources [derrod] (<a href=\"https://github.com/obsproject/obs-studio/pull/13122\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13122/hovercard\">#13122</a>)</li> <li>Deprecated APIs for audio source monitoring_type [Warchamp7] (<a href=\"https://github.com/obsproject/obs-studio/pull/13599\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/obsproject/obs-studio/pull/13599/hovercard\">#13599</a>) <ul> <li>This is replaced by a new monitoring_enabled boolean</li> </ul> </li> </ul> <h3>Checksums</h3> <figure><pre><code>OBS-Studio-33.0.0-Sources.tar.gz: c1ae3c98c1bb70ebdced33e894a526fcbbbda9bfd95806970a3fc31f74b08f6c OBS-Studio-33.0.0-Ubuntu-26.04-x86_64-dbsym.ddeb: 12045838dfd0202ba26b77fb2e8572f4db27c709b3aabe425ac979ee0532a61c OBS-Studio-33.0.0-Ubuntu-26.04-x86_64.deb: f5844914eadd560314f3a9db020afa7a8afbefb67a26c488f2956dc339704918 OBS-Studio-33.0.0-Windows-arm64-PDBs.zip: e43139f467ccedb4fbb583f09ce64341a7c96b44030181ef57abd1528142b947 OBS-Studio-33.0.0-Windows-arm64.zip: 02c53d7bff3f9c159401da79fc375d7b75b00c9ca62d2b4ec5fc05a575d2fa1f OBS-Studio-33.0.0-Windows-x64-Installer.exe: 3bf55dae6d9db651505828090de74540296c742ed2a94a28cf055cb6ddc6bed3 OBS-Studio-33.0.0-Windows-x64-PDBs.zip: dbda0e1e9967262380e619e071de068809ccae2ccb3f68f52034db9a8276475d OBS-Studio-33.0.0-Windows-x64.zip: 3369a3ecd67b5669a8a08d77357f87cc786d1fba42fbbd1054d841a69f6271a7 OBS-Studio-33.0.0-macOS-Apple-dSYMs.tar.xz: 6b162ccbafc2eaaee3ced192a851eb5d3d616ad8d54125ce5cd701d26e6939bf OBS-Studio-33.0.0-macOS-Apple.dmg: b36f4e9da5f2f17c733ba711c8fe0656d6b0cd573cfe96eeb3e68325cffef739 OBS-Studio-33.0.0-macOS-Intel-dSYMs.tar.xz: 997ba41207e9fd7b045b955561cdd5c32b29f12d98ea3ea5a43de7c9edd8f1c7 OBS-Studio-33.0.0-macOS-Intel.dmg: 8524ff428f038573f8905a206841081d3da9ec607063906f7bbfe38d55810c1c </code></pre></figure></div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fgithub.com%2Fobsproject%2Fobs-studio%2Freleases%2Ftag%2F33.0.0\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"33.0 New Features\n\nUpdated CEF from 127/6533 to 150/7871 [WizardCM] (#13900)\n\nThis is a massive update to the underlying framework used for browser sources and docks from the July 2024 release to S...","image":"https://opengraph.githubassets.com/82c6e9a0e4255bc7370dd6125ccb078791f7b4a2f6b9c5e4b0198d0e7df1ff10/obsproject/obs-studio/releases/tag/33.0.0","authors":[{"name":"GitHub","url":"https://github.com/obsproject/obs-studio/releases/tag/33.0.0","avatar":"https://github.githubassets.com/favicons/favicon.svg"}],"id":"50218430","url":"https://github.com/obsproject/obs-studio/releases/tag/33.0.0","external_url":"https://news.ycombinator.com/item?id=50218430","date_published":"2026-10-24T04:49:58Z"},{"title":"Switzerland. Block by block. At 1:1 scale","content_html":"<div class=\"page\" id=\"readability-page-1\"><div>  <div> <p><img src=\"https://blocks.manifold3d.ch/bilder/held.jpg\" srcset=\"bilder/held-960.jpg 960w, bilder/held.jpg 1920w\" sizes=\"100vw\" width=\"1920\" height=\"1080\" alt=\"Das Matterhorn im ersten Licht, vom Gornergrat aus, in Minecraft\" data-en-alt=\"The Matterhorn at first light, seen from the Gornergrat, in Minecraft\"> </p> <div> <p>Minecraft Java 1.12.2 · Cubic Chunks · swisstopo</p> <h2 data-en=\"Switzerland.<br>Block by block.<br><em>At 1:1 scale.</em>\">Die Schweiz.<br>Block für Block.<br><em>Im Massstab 1:1.</em></h2> <div> <p data-en=\"Every block is one metre. Terrain, glaciers, lakes, forests and dams come from swisstopo’s open geodata. The Matterhorn is exactly as tall and as steep as the real one.\">Jeder Block ist ein Meter. Gelände, Gletscher, Seen, Wälder und Staumauern kommen aus den offenen Geodaten von swisstopo. Das Matterhorn ist genau so hoch und so steil wie das echte.</p> </div> </div> </div>  <div> <p><b data-en=\"41,285\">41'285</b><span data-en=\"km² of country\">km² Landesfläche</span></p> <p><b>1 : 1</b><span data-en=\"one block = one metre\">ein Block = ein Meter</span></p> <p><b data-en=\"4,634\">4'634</b><span data-en=\"blocks to the Dufourspitze\">Blöcke bis zur Dufourspitze</span></p> <p><b>24 GB</b><span data-en=\"all of Switzerland\">die ganze Schweiz</span></p> </div>      <div id=\"von-oben\"> <div> <h2 data-en=\"All of Switzerland from above.\">Die ganze Schweiz von oben.</h2> <p><span data-en=\"One pixel per block\">Ein Pixel je Block</span> </p></div> <p data-en=\"This is the world as it stands in the game, seen from the air, from Lake Geneva to Val Müstair. Move the slider and the real aerial image from swisstopo fades in on top. Click the map to get the teleport command for that spot.\">So steht die Welt im Spiel, aus der Luft gesehen, vom Genfersee bis ins Val Müstair. Schieb den Regler, und das echte Luftbild von swisstopo legt sich darüber. Ein Klick auf die Karte gibt dir den Teleport-Befehl für die Stelle.</p> <p data-en=\"Your browser loads the aerial image directly from swisstopo, only once you move the slider. The dashed frame is the free Jungfrau-Aletsch area. Aerial image, borders and names © swisstopo (SWISSIMAGE, swissBOUNDARIES3D, swissNAMES3D)\">Das Luftbild lädt dein Browser direkt bei swisstopo, erst wenn du den Regler bewegst. Der gestrichelte Rahmen ist der Gratis-Ausschnitt Jungfrau-Aletsch. Luftbild, Grenzen und Namen © swisstopo (SWISSIMAGE, swissBOUNDARIES3D, swissNAMES3D)</p> </div>  <div id=\"download\"> <div> <h2 data-en=\"Try it now.\">Jetzt ausprobieren.</h2> <p><span data-en=\"UNESCO World Heritage\">UNESCO-Weltnaturerbe</span> </p></div> <p data-en=\"The UNESCO World Heritage site Swiss Alps Jungfrau-Aletsch is free to download: Eiger, Mönch and Jungfrau, and the largest glacier in the Alps. If it runs on your computer, all of Switzerland will too. All of Switzerland costs from 15 CHF.\">Das UNESCO-Weltnaturerbe Schweizer Alpen Jungfrau-Aletsch gibt es gratis: Eiger, Mönch und Jungfrau und der grösste Gletscher der Alpen. Läuft es bei dir, läuft auch die ganze Schweiz. Die kostet ab 15 CHF.</p> <div> <article> <span data-en=\"Free · UNESCO World Heritage\">Gratis · UNESCO-Weltnaturerbe</span> <h3>Jungfrau-Aletsch</h3> <figure> <img src=\"https://blocks.manifold3d.ch/bilder/karte-jungfrau-aletsch-960.jpg\" srcset=\"bilder/karte-jungfrau-aletsch-960.jpg 960w, bilder/karte-jungfrau-aletsch.jpg 1600w\" sizes=\"(max-width:900px) 100vw, 40vw\" width=\"960\" height=\"720\" loading=\"lazy\" alt=\"Landeskarte mit dem UNESCO-Gebiet Jungfrau-Aletsch, rot umrandet, und dem Rahmen des Downloads\" data-en-alt=\"National map with the UNESCO area Jungfrau-Aletsch outlined in red, and the frame of the download\"> <figcaption data-en=\"<i class=&quot;rot&quot;></i>UNESCO area <i class=&quot;strich&quot;></i>in the download · Map © swisstopo\"><i></i>UNESCO-Gebiet <i></i>im Download · Karte © swisstopo</figcaption> </figure> <ul> <li><span data-en=\"Area\">Fläche</span><span data-en=\"about 2,400 km², the whole UNESCO area\">ca. 2'400 km², das ganze UNESCO-Gebiet</span></li> <li><span data-en=\"With\">Mit dabei</span><span data-en=\"Eiger, Mönch, Jungfrau, Aletsch, Oeschinensee\">Eiger, Mönch, Jungfrau, Aletsch, Oeschinensee</span></li> <li><span>Download</span><span data-en=\"1.1 GB, ZIP for Prism\">1,1 GB, ZIP für Prism</span></li> <li><span data-en=\"Sign-up\">Anmeldung</span><span data-en=\"none\">keine</span></li> </ul> </article> <article>  <span data-en=\"The full package <span class=&quot;ea&quot;>· Early access, version 2026-10-19</span>\">Das ganze Paket <span>· Early Access, Fassung 2026-10-19</span></span> <h3 data-en=\"All of Switzerland\">Die ganze Schweiz</h3> <p data-en=\"From Chiasso to Schaffhausen, from Lake Geneva to Val Müstair. Mod, texture pack and shaders are included; the game builds the distant view itself on first launch.\">Von Chiasso bis Schaffhausen, vom Genfersee bis ins Val Müstair. Mod, Texturpaket und Shader sind dabei, die Fernsicht baut das Spiel beim ersten Start selbst auf.</p> <ul> <li><span data-en=\"Area\">Fläche</span><span data-en=\"41,285 km²<a class=&quot;fussnote&quot; href=&quot;#kleingedruckt&quot; aria-label=&quot;See small print 2&quot;>2</a>\">41'285 km²<a href=\"https://blocks.manifold3d.ch/#kleingedruckt\" aria-label=\"Siehe Kleingedrucktes 2\">2</a></span></li> <li><span>Download</span><span data-en=\"24 GB, ZIP for Prism\">24 GB, ZIP für Prism</span></li> <li><span data-en=\"Included\">Enthalten</span><span data-en=\"World, mod, textures, shaders\">Welt, Mod, Texturen, Shader</span></li> <li><span>Updates</span><span data-en=\"every later version, free\">jede spätere Fassung, gratis</span></li> <li><span data-en=\"For\">Für</span><span data-en=\"residents of Switzerland\">Wohnsitz in der Schweiz</span></li> </ul> <div> <p><span id=\"stufe-titel\" data-en=\"Your price\">Dein Preis</span></p> <p><a id=\"kaufen\" href=\"https://blocks.manifold3d.ch/#\" data-platzhalter=\"Zahlungslinks von Stripe, je Stufe\">Für 15 CHF kaufen</a></p><p data-en=\"Please try the free Jungfrau-Aletsch area first: it uses the same setup as all of Switzerland, so you can check that it runs on your computer and is what you expect. There are no returns. The world is in early access: playable and still being improved. You pay through Stripe with TWINT, card, Apple Pay or Google Pay. Right after paying you see your licence key, and it also arrives by email; with it you download the world and every later version for free. The <a href=&quot;agb.html#en&quot;>terms of sale</a> apply.\">Probier bitte zuerst den Gratis-Ausschnitt Jungfrau-Aletsch: Er läuft mit demselben Setup wie die ganze Schweiz. So siehst du, ob alles auf deinem Rechner läuft und ob die Welt deinen Erwartungen entspricht. Eine Rückgabe gibt es nicht. Die Welt ist im Early Access: spielbar und wird weiter verbessert. Bezahlt wird über Stripe mit TWINT, Karte, Apple Pay oder Google Pay. Den Lizenzschlüssel siehst du gleich nach dem Bezahlen, und er kommt auch per E-Mail. Damit lädst du die Welt und jede spätere Fassung gratis. Es gelten die <a href=\"https://blocks.manifold3d.ch/agb.html\">AGB</a>.</p> <p><a href=\"https://download.manifold-blocks.workers.dev/\" data-en=\"Already bought? To the download page →\">Schon gekauft? Zur Download-Seite →</a> </p></div> </article> </div>  <div id=\"kleingedruckt\"> <p><span data-en=\"The small print for all of Switzerland\">Kleingedrucktes zur ganzen Schweiz</span></p><ol> <li data-en=\"<b>Demanding.</b> The world is built while you play: wherever you go for the first time, the game builds the blocks from the world package. That takes a powerful computer with 16 GB of memory, and on slower ones it takes longer. All of Switzerland has been tested on a Windows PC (AMD Ryzen 7 7800X3D, NVIDIA RTX 4070, 32 GB) and a MacBook Pro (Apple M1 Max, 64 GB); similar hardware is recommended. The free Jungfrau-Aletsch area shows whether it runs on yours, with the same setup.\"><b>Rechenintensiv.</b> Die Welt entsteht beim Spielen: Wo du zum ersten Mal hinkommst, baut das Spiel die Blöcke aus dem Weltpaket auf. Das braucht einen kräftigen Rechner mit 16&#160;GB Arbeitsspeicher, auf schwächeren dauert es länger. Getestet ist die ganze Schweiz auf einem Windows-PC (AMD Ryzen 7 7800X3D, NVIDIA RTX 4070, 32&#160;GB) und einem MacBook Pro (Apple M1 Max, 64&#160;GB), empfohlen ist ähnliche Hardware. Ob es bei dir läuft, zeigt der Gratis-Ausschnitt Jungfrau-Aletsch mit demselben Setup.</li> <li data-en=\"<b>Border.</b> 41,285 km² is the area of Switzerland. The world, however, fills the whole rectangle around Switzerland, including parts of the neighbouring countries. There, and in places right at the border, the terrain only comes from the Copernicus elevation model with one point every 30 m instead of from swisstopo: coarser and with fewer details. Beyond the border the world is patchy or flat in places, and where building data is missing, trees stand in place of houses, for example near Geneva.\"><b>Grenze.</b> 41'285 km² ist die Fläche der Schweiz. Die Welt füllt aber das ganze Rechteck um die Schweiz, mit Teilen der Nachbarländer. Dort, und stellenweise direkt an der Grenze, kommt das Gelände nur aus dem Höhenmodell Copernicus mit einem Punkt alle 30 m statt von swisstopo: gröber und mit weniger Details. Jenseits der Grenze ist die Welt stellenweise lückenhaft oder flach, und wo Gebäudedaten fehlen, stehen statt Häusern Bäume, etwa bei Genf.</li> <li data-en=\"<b>Not equally detailed everywhere.</b> How much detail a region has depends on the data that exists for it, so it varies from region to region.\"><b>Nicht überall gleich fein.</b> Wie viel Detail eine Gegend hat, hängt von den Daten ab, die es dort gibt, und ist darum von Region zu Region verschieden.</li> <li data-en=\"<b>1:1 scale, not a 1:1 copy.</b> Every block is one metre, and mountains, lakes and valleys are exactly where they are. But the world is built by a program from open data, not by hand. Buildings are simplified, and in places bridges, roads, trees or waters are wrong or missing. The world has been checked by sampling, not metre by metre, so there can be patchy, flat or wrong spots anywhere. If you spot a mistake, write to me; it helps me improve later versions.\"><b>Massstab 1:1, kein Abbild 1:1.</b> Jeder Block ist ein Meter, und Berge, Seen und Täler liegen genau dort, wo sie sind. Gebaut hat die Welt aber ein Programm aus offenen Daten, nicht jemand von Hand. Gebäude sind vereinfacht, und stellenweise stimmen Brücken, Strassen, Bäume oder Gewässer nicht oder fehlen. Geprüft ist die Welt mit Stichproben, nicht Meter für Meter: Überall kann es Stellen geben, die lückenhaft, flach oder falsch sind. Siehst du einen Fehler, schreib mir. Das hilft mir, spätere Fassungen zu verbessern.</li> </ol> <p data-en=\"You pay for the licence to the world package, the world calculated from geodata. Mod, texture pack and shaders are free and come just the same with the free Jungfrau-Aletsch area.\">Bezahlt wird die Lizenz für das Weltpaket, also die aus Geodaten gerechnete Welt. Mod, Texturpaket und Shader sind gratis und kommen genauso mit dem Gratis-Ausschnitt Jungfrau-Aletsch.</p> <p data-en=\"The <a href=&quot;agb.html#en&quot;>terms of sale</a> are binding, especially section 5.\">Verbindlich sind die <a href=\"https://blocks.manifold3d.ch/agb.html\">AGB</a>, vor allem Ziffer 5.</p> </div> </div>  <div id=\"anleitung\"> <div> <h2 data-en=\"Ten minutes to the Alps.\">In zehn Minuten in den Alpen.</h2> <p><span data-en=\"Setup\">Anleitung</span> </p></div> <div> <div> <h3>Prism Launcher</h3> <p data-en=\"Download the free Prism Launcher from prismlauncher.org and sign in with your Microsoft account.\">Lade den kostenlosen Prism Launcher von prismlauncher.org und melde dich mit deinem Microsoft-Konto an.</p> </div> <div> <h3 data-en=\"Import the ZIP\">ZIP importieren</h3> <p data-en=\"In Prism, click <code>Add Instance → Import</code> and choose the downloaded ZIP. Prism fetches Forge and Java 8 by itself.\">In Prism auf <code>Instanz hinzufügen → Importieren</code> und die heruntergeladene ZIP wählen. Forge und Java 8 lädt Prism selbst.</p> </div> <div> <h3 data-en=\"Create the world\">Welt anlegen</h3> <p data-en=\"Start the instance, then <code>Singleplayer → Create New World → More World Options</code>, and click <code>World Type</code> until it shows <code>generator.schweiz</code>. You start in the middle of the area. The first visit to a place takes a few minutes.\">Die Instanz starten, dann <code>Einzelspieler → Neue Welt → Weitere Weltoptionen</code> und auf <code>Welttyp</code> klicken, bis <code>generator.schweiz</code> dasteht. Du startest in der Mitte des Gebiets. Der erste Besuch eines Ortes dauert ein paar Minuten.</p> </div> <div> <h3 data-en=\"Shaders, optional\">Shader, freiwillig</h3> <p data-en=\"For the light in the videos: download <a href=&quot;https://optifine.net/downloads&quot; rel=&quot;noopener&quot;>OptiFine 1.12.2 HD U F5</a> (section “Minecraft 1.12.2”, under “Show all versions”) and put it in the instance’s <code>mods</code> folder. The Manifold shaders are already selected.\">Für das Licht aus den Videos: <a href=\"https://optifine.net/downloads\" rel=\"noopener\">OptiFine 1.12.2 HD U F5</a> laden (Abschnitt «Minecraft 1.12.2», unter «Show all versions») und in den Ordner <code>mods</code> der Instanz legen. Der Manifold-Shader ist schon eingestellt.</p> </div> </div> <div> <p><span data-en=\"Game\">Spiel</span><b data-en=\"Minecraft Java Edition, purchased, on Windows, macOS or Linux\">Minecraft Java Edition, gekauft, auf Windows, macOS oder Linux</b></p> <p><span data-en=\"Memory\">Arbeitsspeicher</span><b data-en=\"16 GB, of which the game gets 8 GB\">16&#160;GB, davon bekommt das Spiel 8&#160;GB</b></p> <p><span data-en=\"Disk space\">Speicherplatz</span><b data-en=\"About 2 GB for Jungfrau-Aletsch, 60 GB for all of Switzerland\">Etwa 2&#160;GB für Jungfrau-Aletsch, 60&#160;GB für die ganze Schweiz</b></p> </div> </div>  <div id=\"unterwegs\"> <div> <h2 data-en=\"Find your way around.\">Unterwegs in der Schweiz.</h2> <p><span data-en=\"Teleport and keys\">Teleport und Tasten</span> </p></div> <p data-en=\"Every place on the Swiss national map is in the game exactly where it is in reality. Copy a command, open the chat with <code>T</code> and paste it.\">Jeder Ort auf der Landeskarte liegt im Spiel genau dort, wo er in Wirklichkeit liegt. Befehl kopieren, im Spiel mit <code>T</code> den Chat öffnen und einfügen.</p> <div> <div> <h3 data-en=\"Viewpoints in Jungfrau-Aletsch\">Aussichtspunkte in Jungfrau-Aletsch</h3> <ul> <li> <p><b data-en=\"Konkordiaplatz\">Konkordiaplatz</b><span data-en=\"Where four ice streams meet\">Wo vier Eisströme zusammenfliessen</span></p> <code>/tp 167500 3498 152800 135 13</code> </li> <li> <p><b data-en=\"Aletsch Glacier from the Eggishorn\">Aletschgletscher vom Eggishorn</b><span data-en=\"The glacier in its long curve\">Der Gletscher in seinem Bogen</span></p> <code>/tp 170300 2928 157500 144 2</code> </li> <li> <p><b data-en=\"Jungfrau\">Jungfrau</b><span data-en=\"On the summit, 4,158 m, looking north\">Auf dem Gipfel, 4'158 m, Blick nach Norden</span></p> <code>/tp 160188 4164 145928 -180 4</code> </li> <li> <p><b data-en=\"Eiger north face\">Eiger-Nordwand</b><span data-en=\"In front of the face, 3 km away\">Vor der Wand, 3 km entfernt</span></p> <code>/tp 159300 2548 139700 -68 -10</code> </li> <li> <p><b data-en=\"Männlichen\">Männlichen</b><span data-en=\"Eiger, Mönch and Jungfrau side by side\">Eiger, Mönch und Jungfrau nebeneinander</span></p> <code>/tp 158462 2238 137496 -32 -6</code> </li> <li> <p><b data-en=\"Lauterbrunnen Valley\">Lauterbrunnental</b><span data-en=\"Above the village, up the valley\">Über dem Dorf, talaufwärts</span></p> <code>/tp 156004 898 139088 -4 -3</code> </li> <li> <p><b data-en=\"Oeschinensee\">Oeschinensee</b><span data-en=\"From above the north shore\">Von oben, über dem Nordufer</span></p> <code>/tp 141800 2008 149400 -38 11</code> </li> </ul> </div> <div> <h3 data-en=\"Pick a place on the map\">Ort auf der Karte wählen</h3> <p><img src=\"https://blocks.manifold3d.ch/bilder/karte-jungfrau-aletsch-960.jpg\" srcset=\"bilder/karte-jungfrau-aletsch-960.jpg 960w, bilder/karte-jungfrau-aletsch.jpg 1600w\" sizes=\"(max-width:900px) 100vw, 45vw\" width=\"960\" height=\"720\" loading=\"lazy\" draggable=\"false\" alt=\"Landeskarte von Jungfrau-Aletsch zum Anklicken\" data-en-alt=\"Clickable national map of Jungfrau-Aletsch\"> </p> <p data-en=\"Click inside the dashed frame: that is what the download contains. Map © swisstopo\">Klick in den gestrichelten Rahmen: Das steckt im Download. Karte © swisstopo</p> <div> <p><code id=\"tp-ergebnis\">/tp 160188 4161 145928</code> </p> <p id=\"rechner-hinweis\" data-en=\"Example: the summit of the Jungfrau.\">Beispiel: der Gipfel der Jungfrau.</p> </div> <details> <summary data-en=\"Or with coordinates from map.geo.admin.ch\">Oder mit Koordinaten von map.geo.admin.ch</summary> <ol> <li data-en=\"Open <a href=&quot;https://map.geo.admin.ch&quot; rel=&quot;noopener&quot;>map.geo.admin.ch</a> and right-click the place.\">Auf <a href=\"https://map.geo.admin.ch/\" rel=\"noopener\">map.geo.admin.ch</a> mit der rechten Maustaste auf den Ort klicken.</li> <li data-en=\"Copy the line <i>CH1903+ / LV95</i> and paste it here. Add the height shown there, too.\">Die Zeile <i>CH1903+ / LV95</i> kopieren und hier einfügen. Die angezeigte Höhe gleich dazu.</li> </ol> <p><label><span data-en=\"LV95 coordinates\">LV95-Koordinaten</span> </label> <label><span data-en=\"Height in metres\">Höhe in Metern</span> </label> </p> <p data-en=\"The formula: <code>x = East − 2,480,000</code>, <code>z = 1,300,000 − North</code>, <code>y</code> = height above sea level.\">Die Formel: <code>x = Ost − 2'480'000</code>, <code>z = 1'300'000 − Nord</code>, <code>y</code> = Höhe über Meer.</p> </details> <h3 data-en=\"Keys\">Tasten</h3> <dl> <p><dt><kbd>I</kbd> <kbd>U</kbd></dt><dd data-en=\"Fly faster or slower: 1×, 2×, 5×, 10×, 20×, 50×, 100×, up to about 1 km per second. From 20× the real blocks lag behind and you only see the distant view below you until you slow down.\">Schneller oder langsamer fliegen: 1×, 2×, 5×, 10×, 20×, 50×, 100×, bis gut 1 km pro Sekunde. Ab 20× kommen die echten Blöcke nicht mehr nach, unter dir ist nur Fernsicht, bis du bremst.</dd></p> <p><dt><kbd>J</kbd></dt><dd data-en=\"Distant view on or off\">Fernsicht ein und aus</dd></p> <p><dt><kbd>K</kbd></dt><dd data-en=\"Switch the mountain haze in the distance\">Bergluft, den Dunst in der Ferne, umschalten</dd></p> <p><dt><kbd>F3</kbd></dt><dd data-en=\"Coordinates; y is the height above sea level in metres\">Koordinaten; y ist die Höhe über Meer in Metern</dd></p> </dl> </div> </div> </div>  <div id=\"fragen\"> <details> <summary data-en=\"Does it run on Bedrock, consoles or phones?\">Läuft das auf Bedrock, Konsole oder Handy?</summary> <p data-en=\"No, only on Minecraft Java Edition for Windows, macOS and Linux. The world needs the Cubic Chunks mod, which only exists for Java.\">Nein, nur auf Minecraft Java Edition für Windows, macOS und Linux. Die Welt braucht den Mod Cubic Chunks, und den gibt es nur für Java.</p> </details> <details> <summary data-en=\"Why Minecraft 1.12.2 and not the latest version?\">Warum Minecraft 1.12.2 und nicht die neuste Fassung?</summary> <p data-en=\"Vanilla Minecraft is at most 384 blocks tall. Switzerland ranges from 193 m at Lago Maggiore to 4,634 m on the Dufourspitze. Cubic Chunks lifts that limit, and it runs stably on 1.12.2.\">Normales Minecraft ist höchstens 384 Blöcke hoch. Die Schweiz reicht von 193 m am Lago Maggiore bis 4'634 m auf der Dufourspitze. Cubic Chunks hebt diese Grenze auf, und Cubic Chunks läuft stabil auf 1.12.2.</p> </details> <details> <summary data-en=\"Where does the data come from?\">Woher kommen die Daten?</summary> <p data-en=\"From the open geodata of swisstopo, the Swiss Federal Office of Topography: swissALTI3D for the terrain, swissTLM3D for water, forest, dams and avalanche barriers. The data has been free to use since 2021.\">Aus den offenen Geodaten des Bundesamts für Landestopografie swisstopo: swissALTI3D für das Gelände, swissTLM3D für Gewässer, Wald, Staumauern und Lawinenverbau. Die Daten sind seit 2021 frei nutzbar.</p> </details> <details> <summary data-en=\"What does all of Switzerland cost?\">Was kostet die ganze Schweiz?</summary> <p data-en=\"15 CHF, or more if you like. Every later update is included: with your licence key you always get the newest version. Jungfrau-Aletsch stays free, without sign-up.\">15 CHF, oder mehr, wenn du willst. Jedes spätere Update ist dabei: Mit deinem Lizenzschlüssel holst du dir immer die neuste Fassung. Jungfrau-Aletsch bleibt gratis, ohne Anmeldung.</p> </details> <details> <summary data-en=\"Is the world finished?\">Ist die Welt schon fertig?</summary> <p data-en=\"Not yet, it is in early access. All of Switzerland is playable, but not yet everywhere the way I want it: water and rock faces are to look nicer, gaps at the border and below Lago Maggiore are to be closed, and an updater is to install new versions by itself. You download every later version for free with your licence key. There is no date for any of this.\">Noch nicht, sie ist im Early Access. Die ganze Schweiz ist spielbar, aber noch nicht überall so, wie ich sie haben will: Wasser und Felswände sollen schöner werden, Lücken an der Grenze und unter dem Lago Maggiore sollen verschwinden, und ein Updater soll neue Fassungen selbst einspielen. Jede spätere Fassung lädst du mit deinem Lizenzschlüssel gratis. Einen Termin dafür gibt es nicht.</p> </details> <details> <summary data-en=\"Can I return the world?\">Kann ich die Welt zurückgeben?</summary> <p data-en=\"No, and there is no refund, not even if it runs poorly on your computer. So please try the free Jungfrau-Aletsch area first: it uses exactly the same setup as all of Switzerland. If you run into a problem, write to me anyway, and I will help where I can.\">Nein, und eine Rückerstattung gibt es auch nicht, selbst wenn sie auf deinem Rechner schlecht läuft. Probier darum zuerst den Gratis-Ausschnitt Jungfrau-Aletsch: Er läuft mit genau demselben Setup wie die ganze Schweiz. Hast du ein Problem, schreib mir trotzdem, ich helfe, wo ich kann.</p> </details> <details> <summary data-en=\"Can I buy from abroad?\">Kann ich aus dem Ausland kaufen?</summary> <p data-en=\"No. For legal reasons I sell all of Switzerland only to people who live in Switzerland. At checkout you therefore enter an address in Switzerland and confirm that you live here. Where you happen to be when buying doesn’t matter. The free Jungfrau-Aletsch area can be downloaded from anywhere.\">Nein. Die ganze Schweiz verkaufe ich aus rechtlichen Gründen nur an Leute, die in der Schweiz wohnen. Im Checkout gibst du darum eine Adresse in der Schweiz an und bestätigst deinen Wohnsitz. Wo du beim Kaufen gerade bist, spielt keine Rolle. Den Gratis-Ausschnitt Jungfrau-Aletsch kannst du von überall laden.</p> </details> <details> <summary data-en=\"Can I play with friends?\">Kann ich mit Freunden zusammen spielen?</summary> <p data-en=\"Yes, on your own Forge server running the same world. Every player still needs the package on their own computer, because the distant view is read locally. A guide is coming.\">Ja, über einen eigenen Forge-Server mit derselben Welt. Jeder Spieler braucht trotzdem das Paket auf dem eigenen Rechner, weil die Fernsicht lokal gelesen wird. Eine Anleitung folgt.</p> </details> </div>  <div id=\"danke\"> <p data-en=\"With the Summit tier, these people have signed the summit register and make it possible for me to take real time for Switzerland in Minecraft.\">Mit der Stufe Gipfel haben sich diese Menschen ins Gipfelbuch eingetragen und machen möglich, dass ich mir richtig Zeit für die Schweiz in Minecraft nehmen kann.</p>  <ul id=\"gipfelbuch\"> <li><b>C&amp;N+L Kühne</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>OoSITDoO</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>LawlessLizard</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>Xium &amp; Brot van Klot</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>Aditotoro</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>Andrew &amp; Katie Vieyra</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> <li><b>Stefan Gonçalves</b><time datetime=\"2026-10-26\" data-en=\"26 Oct. 2026\">26. Okt. 2026</time></li> </ul> </div>   <div id=\"quellen\"> <div> <h2 data-en=\"Data sources.\">Datenquellen.</h2> <p><span data-en=\"Open data\">Offene Daten</span> </p></div> <p data-en=\"The world is built entirely from open data of the Swiss Confederation, the cantons and research institutions, and beyond the border from Copernicus. Thank you to everyone who collects and publishes it.\">Die Welt ist vollständig aus offenen Daten von Bund, Kantonen und Forschung gebaut, jenseits der Grenze aus Copernicus. Danke an alle, die sie erheben und veröffentlichen.</p> <div> <div> <h3 data-en=\"Federal Office of Topography swisstopo\">Bundesamt für Landestopografie swisstopo</h3> <ul> <li><span>swissALTI3D</span><span data-en=\"Terrain\">Gelände</span></li> <li><span>swissSURFACE3D</span><span data-en=\"Height of forest and trees\">Höhe von Wald und Bäumen</span></li> <li><span>swissBATHY3D</span><span data-en=\"Lake beds\">Seegrund</span></li> <li><span>swissTLM3D</span><span data-en=\"Water, forest, roads, railways, bridges, dams, avalanche barriers, single trees\">Gewässer, Wald, Strassen, Bahnen, Brücken, Staumauern, Lawinenverbau, Einzelbäume</span></li> <li><span>swissBUILDINGS3D</span><span data-en=\"Buildings\">Gebäude</span></li> <li><span>SWISSIMAGE</span><span data-en=\"Debris and snow on the glaciers\">Schutt und Schnee auf den Gletschern</span></li> <li><span>GeoCover, Lithologische Karte 1:500'000</span><span data-en=\"Bedrock and loose rock\">Gestein und Lockergestein</span></li> </ul> <p data-en=\"Source: Federal Office of Topography swisstopo. Open data, commercial use permitted.\">Quelle: Bundesamt für Landestopografie swisstopo. Offene Daten, kommerzielle Nutzung erlaubt.</p> </div> <div> <h3 data-en=\"GLAMOS and ETH Zurich\">GLAMOS und ETH Zürich</h3> <ul> <li><span>GLAMOS, Swiss Glacier Inventory 1850, 1931, 1973, 2010, 2016, 2023, doi.glamos.ch</span><span data-en=\"Glacier outlines, debris on the ice\">Gletscherflächen, Schutt auf dem Eis</span></li> <li><span>Grab 2020, Swiss Glacier Thickness – Release 2020, ETH Zürich, doi:10.3929/ethz-b-000434697</span><span data-en=\"Ice thickness\">Eisdicke</span></li> </ul> <p data-en=\"Licence: <a href=&quot;https://creativecommons.org/licenses/by/4.0/deed.en&quot;>CC BY 4.0</a>. Modified: converted into blocks.\">Lizenz: <a href=\"https://creativecommons.org/licenses/by/4.0/deed.de\">CC BY 4.0</a>. Verändert: in Blöcke umgerechnet.</p> </div> <div> <h3 data-en=\"Federal Office for the Environment FOEN and WSL\">Bundesamt für Umwelt BAFU und WSL</h3> <ul> <li><span>Waldmischungsgrad LFI, BAFU</span><span data-en=\"Broadleaf and conifer forest\">Laub- und Nadelwald</span></li> <li><span>Price, Kolecka, Huber, Rüetschi, Nussbaumer, Ginzler 2024, The Habitat Map of Switzerland v1_1 2024, EnviDat, doi:10.16904/envidat.515</span><span data-en=\"Meadows, heaths, scree, vineyards, fields\">Wiesen, Heiden, Geröll, Reben, Äcker</span></li> <li><span>Price, Huber, Nussbaumer, Ginzler 2023, The Habitat Map of Switzerland: A Remote Sensing, Composite Approach for a High Spatial and Thematic Resolution Product, Remote Sensing 15(3), 643, doi:10.3390/rs15030643</span><span data-en=\"Habitat map, method\">Lebensraumkarte, Methode</span></li> </ul> <p data-en=\"Forest mix: source: Federal Office for the Environment FOEN, open use. Habitat map: WSL Data Policy.\">Waldmischungsgrad: Quelle: Bundesamt für Umwelt BAFU, freie Nutzung. Lebensraumkarte: WSL Data Policy.</p> </div> <div> <h3 data-en=\"Cantons, via geodienste.ch\">Kantone, über geodienste.ch</h3> <ul> <li><span>Amtliche Vermessung</span><span data-en=\"Land cover and single objects\">Bodenbedeckung und Einzelobjekte</span></li> <li><span>Landwirtschaftliche Nutzungsflächen</span><span data-en=\"Fields and crops\">Felder und Kulturen</span></li> </ul> <p data-en=\"Official cadastral survey of Switzerland. Source: Amtliche Vermessung (AV), Canton of Graubünden, 13.10.2026. Source: Amt für Landwirtschaft (AFL), Canton of Schwyz. This cadastral survey information is provided without warranty and has no legal effect; only extracts certified by the surveyor are binding.\">Amtliche Vermessung Schweiz. Quelle: Amtliche Vermessung (AV), Kanton Graubünden, 13.10.2026. Quelle: Amt für Landwirtschaft (AFL), Kanton Schwyz. Diese Informationen der amtlichen Vermessung erfolgen ohne Gewähr und haben keinerlei Rechtswirkung. Verbindlich sind einzig die vom Nachführungsgeometer erstellten und beglaubigten Auszüge.</p> </div> <div> <h3 data-en=\"City of Zurich, Grün Stadt Zürich\">Stadt Zürich, Grün Stadt Zürich</h3> <ul> <li><span>Baumkataster</span><span data-en=\"Trees in the city of Zurich\">Bäume in der Stadt Zürich</span></li> </ul> <p data-en=\"Open use.\">Freie Nutzung.</p> </div> <div> <h3 data-en=\"Copernicus, European Union and ESA\">Copernicus, Europäische Union und ESA</h3> <ul> <li><span>Copernicus DEM GLO-30</span><span data-en=\"Terrain beyond the border, 30 m grid\">Gelände jenseits der Grenze, 30-m-Raster</span></li> </ul> <p data-en=\"Produced using Copernicus WorldDEM-30 © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018 provided under COPERNICUS by the European Union and ESA; all rights reserved. The organisations in charge of the Copernicus programme by law or by delegation do not incur any liability for any use of the Copernicus WorldDEM-30.\">Produced using Copernicus WorldDEM-30 © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018 provided under COPERNICUS by the European Union and ESA; all rights reserved. Die Organisationen, die von Gesetzes wegen oder im Auftrag für das Programm Copernicus zuständig sind, übernehmen keinerlei Haftung für die Nutzung des Copernicus WorldDEM-30.</p> </div> </div> </div> </div></div>\n<img src=\"https://readable.news/api/telemetry?url=https%3A%2F%2Fblocks.manifold3d.ch%2F\" width=\"1\" height=\"1\" alt=\"\">","excerpt":"41'285 km², ein Block pro Meter, aus swisstopo-Daten.","authors":[{"name":"Blocks","url":"https://blocks.manifold3d.ch/","avatar":"https://blocks.manifold3d.ch/favicon.ico"}],"id":"50240922","url":"https://blocks.manifold3d.ch/","external_url":"https://news.ycombinator.com/item?id=50240922","date_published":"2026-10-26T08:46:09Z"}]}