Articles

Browse all AI articles. Use filters to narrow down results.

Showing 26201 to 26220 of 30135 entries.

Most Recent Articles

Simon Willison Weblog
aisimon willison weblogopenaichatgptclaudeanthropicllmragagentagents

<p>I just released <a href="https://llm.datasette.io/en/latest/changelog.html#a0-2026-04-28">LLM 0.32a0</a>, an alpha release of my <a href="https://llm.datasette.io/">LLM</a> Python library and CLI tool for accessing LLMs, with some consequential changes that I've been working towards for quite a while.</p> <p>Previous versions of LLM modeled the world in terms of prompts and responses. Send the model a text prompt, get back a text response.</p> <pre><span class="pl-k">import</span> <span class="pl-s1">llm</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Capital of France?"</span>) <span class="pl-en">print</span>(<span class="pl-s1">response</span>.<span class="pl-c1">text</span>())</pre> <p>This made sense when I started working on the library back in April 2023. A lot has changed since then!</p> <p>LLM provides an abstraction over thousands of different models via its <a href="https://llm.datasette.io/en/stable/plugins/index.html">plugin system</a>. The original abstraction - of text input that returns text output - was no longer able to represent everything I needed it to.</p> <p>Over time LLM itself has grown <a href="https://simonwillison.net/2024/Oct/29/llm-multi-modal/">attachments</a> to handle image, audio, and video input, then <a href="https://simonwillison.net/2025/Feb/28/llm-schemas/">schemas</a> for outputting structured JSON, then <a href="https://simonwillison.net/2025/May/27/llm-tools/">tools</a> for executing tool calls. Meanwhile LLMs kept evolving, adding reasoning support and the ability to return images and all kinds of other interesting capabilities.</p> <p>LLM needs to evolve to better handle the diversity of input and output types that can be processed by today's frontier models.</p> <p>The 0.32a0 alpha has two key changes: model inputs can be represented as a sequence of messages, and model responses can be composed of a stream of differently typed parts.</p> <h4 id="prompts-as-a-sequence-of-messages">Prompts as a sequence of messages</h4> <p>LLMs accept input as text, but ever since ChatGPT demonstrated the value of a two-way conversational interface, the most common way to prompt them has been to treat that input as a sequence of conversational turns.</p> <p>The first turn might look like this:</p> <pre><code>user: Capital of France? assistant: </code></pre> <p>(The model then gets to fill out the reply from the assistant.)</p> <p>But each subsequent turn needs to replay the entire conversation up to that point, as a sort of screenplay:</p> <pre><code>user: Capital of France? assistant: Paris user: Germany? assistant: </code></pre> <p>Most of the JSON APIs from the major vendors follow this pattern. Here's what the above looks like using the OpenAI chat completions API, which has been widely imitated by other providers:</p> <div class="highlight highlight-source-shell"><pre>curl https://api.openai.com/v1/chat/completions \ -H <span class="pl-s"><span class="pl-pds">"</span>Authorization: Bearer <span class="pl-smi">$OPENAI_API_KEY</span><span class="pl-pds">"</span></span> \ -H <span class="pl-s"><span class="pl-pds">"</span>Content-Type: application/json<span class="pl-pds">"</span></span> \ -d <span class="pl-s"><span class="pl-pds">'</span>{</span> <span class="pl-s"> "model": "gpt-5.5",</span> <span class="pl-s"> "messages": [</span> <span class="pl-s"> {</span> <span class="pl-s"> "role": "user",</span> <span class="pl-s"> "content": "Capital of France?"</span> <span class="pl-s"> },</span> <span class="pl-s"> {</span> <span class="pl-s"> "role": "assistant",</span> <span class="pl-s"> "content": "Paris"</span> <span class="pl-s"> },</span> <span class="pl-s"> {</span> <span class="pl-s"> "role": "user",</span> <span class="pl-s"> "content": "Germany?"</span> <span class="pl-s"> }</span> <span class="pl-s"> ]</span> <span class="pl-s"> }<span class="pl-pds">'</span></span></pre></div> <p>Prior to 0.32, LLM modeled these as conversations:</p> <pre><span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">conversation</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">conversation</span>() <span class="pl-s1">r1</span> <span class="pl-c1">=</span> <span class="pl-s1">conversation</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Capital of France?"</span>) <span class="pl-en">print</span>(<span class="pl-s1">r1</span>.<span class="pl-c1">text</span>()) <span class="pl-c"># Outputs "Paris"</span> <span class="pl-s1">r2</span> <span class="pl-c1">=</span> <span class="pl-s1">conversation</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Germany?"</span>) <span class="pl-en">print</span>(<span class="pl-s1">r2</span>.<span class="pl-c1">text</span>()) <span class="pl-c"># Outputs "Berlin"</span></pre> <p>This worked if you were building a conversation with the model from scratch, but it didn't provide a way to feed in a previous conversation from the start. This made tasks like building an emulation of the OpenAI chat completions API much harder than they should have been.</p> <p>The <code>llm</code> CLI tool worked around this through a custom mechanism for persisting and inflating conversations using SQLite, but that never became a stable part of the LLM API - and there are many places you might want to use the Python library without committing to SQLite as the storage layer.</p> <p>The new alpha now supports this:</p> <pre><span class="pl-k">import</span> <span class="pl-s1">llm</span> <span class="pl-k">from</span> <span class="pl-s1">llm</span> <span class="pl-k">import</span> <span class="pl-s1">user</span>, <span class="pl-s1">assistant</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s1">messages</span><span class="pl-c1">=</span>[ <span class="pl-en">user</span>(<span class="pl-s">"Capital of France?"</span>), <span class="pl-en">assistant</span>(<span class="pl-s">"Paris"</span>), <span class="pl-en">user</span>(<span class="pl-s">"Germany?"</span>), ]) <span class="pl-en">print</span>(<span class="pl-s1">response</span>.<span class="pl-c1">text</span>())</pre> <p>The <code>llm.user()</code> and <code>llm.assistant()</code> functions are new builder functions designed to be used within that <code>messages=[]</code> array.</p> <p>The previous <code>prompt=</code> option still works, but LLM upgrades it to a single-item messages array behind the scenes.</p> <p>You can also now <em>reply</em> to a response, as an alternative to building a conversation:</p> <pre><span class="pl-s1">response2</span> <span class="pl-c1">=</span> <span class="pl-s1">response</span>.<span class="pl-c1">reply</span>(<span class="pl-s">"How about Hungary?"</span>) <span class="pl-en">print</span>(<span class="pl-s1">response2</span>) <span class="pl-c"># Default __str__() calls .text()</span></pre> <h4 id="streaming-parts">Streaming parts</h4> <p>The other major new interface in the alpha concerns streaming results back from a prompt.</p> <p>Previously, LLM supported streaming like this:</p> <pre><span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Generate an SVG of a pelican riding a bicycle"</span>) <span class="pl-k">for</span> <span class="pl-s1">chunk</span> <span class="pl-c1">in</span> <span class="pl-s1">response</span>: <span class="pl-en">print</span>(<span class="pl-s1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>)</pre> <p>Or this async variant:</p> <pre><span class="pl-k">import</span> <span class="pl-s1">asyncio</span> <span class="pl-k">import</span> <span class="pl-s1">llm</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_async_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Generate an SVG of a pelican riding a bicycle"</span>) <span class="pl-k">async</span> <span class="pl-k">def</span> <span class="pl-en">run</span>(): <span class="pl-k">async</span> <span class="pl-k">for</span> <span class="pl-s1">chunk</span> <span class="pl-c1">in</span> <span class="pl-s1">response</span>: <span class="pl-en">print</span>(<span class="pl-s1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-s1">asyncio</span>.<span class="pl-c1">run</span>(<span class="pl-en">run</span>())</pre> <p>Many of today's models return mixed types of content. A prompt run against Claude might return reasoning output, then text, then a JSON request for a tool call, then more text content.</p> <p>Some models can even execute tools on the server-side, for example OpenAI's <a href="https://developers.openai.com/api/docs/guides/tools-code-interpreter?lang=curl">code interpreter tool</a> or Anthropic's <a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-search-tool">web search</a>. This means the results from the model can combine text, tool calls, tool outputs and other formats.</p> <p>Multi-modal output models are starting to emerge too, which can return images or even <a href="https://developers.openai.com/api/docs/guides/audio#add-audio-to-your-existing-application">snippets of audio</a> intermixed into that streaming response.</p> <p>The new LLM alpha models these as a stream of typed message parts. Here's what that looks like as a Python API consumer:</p> <pre><span class="pl-k">import</span> <span class="pl-s1">asyncio</span> <span class="pl-k">import</span> <span class="pl-s1">llm</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">prompt</span> <span class="pl-c1">=</span> <span class="pl-s">"invent 3 cool dogs, first talk about your motivations"</span> <span class="pl-k">def</span> <span class="pl-en">describe_dog</span>(<span class="pl-s1">name</span>: <span class="pl-smi">str</span>, <span class="pl-s1">bio</span>: <span class="pl-smi">str</span>) <span class="pl-c1">-&gt;</span> <span class="pl-smi">str</span>: <span class="pl-s">"""Record the name and biography of a hypothetical dog."""</span> <span class="pl-k">return</span> <span class="pl-s">f"<span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">name</span><span class="pl-kos">}</span></span>: <span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">bio</span><span class="pl-kos">}</span></span>"</span> <span class="pl-k">def</span> <span class="pl-en">sync_example</span>(): <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>( <span class="pl-s1">prompt</span>, <span class="pl-s1">tools</span><span class="pl-c1">=</span>[<span class="pl-s1">describe_dog</span>], ) <span class="pl-k">for</span> <span class="pl-s1">event</span> <span class="pl-c1">in</span> <span class="pl-s1">response</span>.<span class="pl-c1">stream_events</span>(): <span class="pl-k">if</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"text"</span>: <span class="pl-en">print</span>(<span class="pl-s1">event</span>.<span class="pl-c1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">elif</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"tool_call_name"</span>: <span class="pl-en">print</span>(<span class="pl-s">f"<span class="pl-cce">\n</span>Tool call: <span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">event</span>.<span class="pl-c1">chunk</span><span class="pl-kos">}</span></span>("</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">elif</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"tool_call_args"</span>: <span class="pl-en">print</span>(<span class="pl-s1">event</span>.<span class="pl-c1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">async</span> <span class="pl-k">def</span> <span class="pl-en">async_example</span>(): <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_async_model</span>(<span class="pl-s">"gpt-5.5"</span>) <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>( <span class="pl-s1">prompt</span>, <span class="pl-s1">tools</span><span class="pl-c1">=</span>[<span class="pl-s1">describe_dog</span>], ) <span class="pl-k">async</span> <span class="pl-k">for</span> <span class="pl-s1">event</span> <span class="pl-c1">in</span> <span class="pl-s1">response</span>.<span class="pl-c1">astream_events</span>(): <span class="pl-k">if</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"text"</span>: <span class="pl-en">print</span>(<span class="pl-s1">event</span>.<span class="pl-c1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">elif</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"tool_call_name"</span>: <span class="pl-en">print</span>(<span class="pl-s">f"<span class="pl-cce">\n</span>Tool call: <span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">event</span>.<span class="pl-c1">chunk</span><span class="pl-kos">}</span></span>("</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">elif</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"tool_call_args"</span>: <span class="pl-en">print</span>(<span class="pl-s1">event</span>.<span class="pl-c1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-en">sync_example</span>() <span class="pl-s1">asyncio</span>.<span class="pl-c1">run</span>(<span class="pl-en">async_example</span>())</pre> <p>Sample output (from just the first sync example):</p> <blockquote> <p><code>My motivation: create three memorable dogs with distinct “cool” styles—one cinematic, one adventurous, and one charmingly chaotic—so each feels like they could star in their own story.</code><br /> <code>Tool call: describe_dog({"name": "Nova Jetpaw", "bio": "A sleek silver-gray whippet who wears tiny aviator goggles and loves sprinting along moonlit beaches. Nova is fearless, elegant, and rumored to outrun drones just for fun."}</code><br /> <code>Tool call: describe_dog({"name": "Mochi Thunderbark", "bio": "A fluffy corgi with a dramatic black-and-gold bandana and the confidence of a rock star. Mochi is short, loud, loyal, and leads a neighborhood 'security patrol' made entirely of squirrels."}</code><br /> <code>Tool call: describe_dog({"name": "Atlas Snowfang", "bio": "A massive white husky with ice-blue eyes and a backpack full of trail snacks. Atlas is calm, heroic, and always knows the way home—even during blizzards, fog, or confusing camping trips."}</code></p> </blockquote> <p>At the end of the response you can call <code>response.execute_tool_calls()</code> to actually run the functions that were requested, or send a <code>response.reply()</code> to have those tools called and their return values sent back to the model:</p> <pre><span class="pl-en">print</span>(<span class="pl-s1">response</span>.<span class="pl-c1">reply</span>(<span class="pl-s">"Tell me about the dogs"</span>))</pre> <p>This new mechanism for streaming different token types means the CLI tool can now display "thinking" text in a different color from the text in the final response. The thinking text goes to stderr so it won't affect results that are piped into other tools.</p> <p>This example uses Claude Sonnet 4.6 (with an updated streaming event version of the <a href="https://github.com/simonw/llm-anthropic">llm-anthropic</a> plugin) as Anthropic's models return their reasoning text as part of the response:</p> <div class="highlight highlight-source-shell"><pre>llm -m claude-sonnet-4.6 <span class="pl-s"><span class="pl-pds">'</span>Think about 3 cool dogs then describe them<span class="pl-pds">'</span></span> \ -o thinking_display 1</pre></div> <p><img src="https://static.simonwillison.net/static/2026/claude-thinking-llm.gif" alt="Animated demo. Starts with ~/dev/scratch/llm-anthropic % uv run llm -m claude-sonnet-4.6 'Think about 3 cool dogs then describe them' -o thinking_display 1 - the text then streams in grey: The user wants me to think about 3 cool dogs and then describe them. Let me come up with 3 interesting, cool dogs and describe them. Then switches to regular color text for the output that describes the dogs." style="max-width: 100%;" /></p> <p>You can suppress the output of reasoning tokens using the new <code>-R/--no-reasoning</code> flag. Surprisingly that ended up being the only CLI-facing change in this release.</p> <h4 id="a-mechanism-for-serializing-and-deserializing-responses">A mechanism for serializing and deserializing responses</h4> <p>As mentioned earlier, LLM has quite inflexible code at the moment for persisting conversations to SQLite. I've added a new mechanism in 0.32a0 that should provide Python API users a way to roll their own alternative:</p> <pre><span class="pl-s1">serializable</span> <span class="pl-c1">=</span> <span class="pl-s1">response</span>.<span class="pl-c1">to_dict</span>() <span class="pl-c"># serializable is a JSON-style dictionary</span> <span class="pl-c"># store it anywhere you like, then inflate it:</span> <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-v">Response</span>.<span class="pl-c1">from_dict</span>(<span class="pl-s1">serializable</span>)</pre> <p>The dictionary this returns is actually a <code>TypedDict</code> defined in the new <a href="https://github.com/simonw/llm/blob/main/llm/serialization.py">llm/serialization.py</a> module.</p> <h4 id="what-s-next-">What's next?</h4> <p>I'm releasing this as an alpha so I can upgrade various plugins and exercise the new design in real world environments for a few days. I expect the stable 0.32 release will be very similar to this alpha, unless alpha testing reveals some design flaw in the way I've put this all together.</p> <p>There's one remaining large task: I'd like to redesign the SQLite logging system to better capture the more finely grained details that are returned by this new abstraction.</p> <p>Ideally I'd like to model this as a graph, to best support situations like an OpenAI-style chat completions API where the same conversations are constantly extended and then repeated with every prompt. I want to be able to store those without duplicating them in the database.</p> <p>I'm undecided as to whether that should be a feature in 0.32 or I should hold it for 0.33.</p> <p>Tags: <a href="https://simonwillison.net/tags/projects">projects</a>, <a href="https://simonwillison.net/tags/python">python</a>, <a href="https://simonwillison.net/tags/ai">ai</a>, <a href="https://simonwillison.net/tags/annotated-release-notes">annotated-release-notes</a>, <a href="https://simonwillison.net/tags/generative-ai">generative-ai</a>, <a href="https://simonwillison.net/tags/llms">llms</a>, <a href="https://simonwillison.net/tags/llm">llm</a></p>

Simon Willison Weblog
aisimon willison weblogllm

llm 0.32a0

<p><strong>Release:</strong> <a href="https://github.com/simonw/llm/releases/tag/0.32a0">llm 0.32a0</a></p> <p>See <a href="https://simonwillison.net/2026/Apr/29/llm/">the annotated release notes</a>.</p> <p>Tags: <a href="https://simonwillison.net/tags/llm">llm</a></p>

Business Insider
newsbusiness insiderragvisionsafety

I'm glad I escaped my cult leader husband

By Maggie Cai,Ju Shardlow,Jessica Orwig

A recent photo of Decker with her newborn. Courtesy of Briell Decker. Briell Decker grew up in the Fundamentalist Church of Jesus Christ of Latter-Day Saints. When she was 18, she married the FLDS leader Warren Jeffs. She was his 65th wife. Decker escaped after multiple attempts in 2012. She now helps other survivors rebuild their lives. This as-told-to essay is based on a conversation with Briell Decker, 40, a former member of the Fundamentalist Church of Jesus Christ of Latter-Day Saints, and the 65th wife of its former leader, Warren Jeffs. She married Jeffs in 2004 at 18 in an arranged marriage. It has been edited for length and clarity. I was born and raised in the FLDS faith. From the time I was a child, my days were structured around religious instruction. I spent at least four hours a day in sermons — in the morning with my family, at school, after lunch, and again before bed. I believed everything I was told by my parents and Warren Jeffs, who became the prophet for the FLDS in 2002 and was presented as the closest person to God on Earth. Growing up, no one asked me what I wanted to be, it was expected that I would become "a mother in Zion." The Yearning for Zion Ranch was the main FLDS compound in Texas. At 18, my father wrote a letter and recommended me for marriage to Warren Jeffs. I said yes, even though I was afraid and did not love him. Briell Decker grew up in the FLDS faith. Courtesy of Briell Decker Women could technically refuse marriage, but the consequences could be severe. Losing your family, your community, and your place in the church was always a possibility. Looking back at that moment when I agreed to marry Jeffs, it felt like standing on the edge of a cliff without a way to turn around. Jeffs had a way of making everything he did seem right, even when it was wrong. He used The Book of Mormon to justify his actions. That's what makes me believe the FLDS was a cult. (Multiple organizations, documentaries, and other former FLDS members have also described the FLDS as a cult.) Some of Warren Jeffs' many wives. Decker is in the second row from the top, fifth from the left. newspapers.com Once, I was brought into one of Jeffs' group sessions (aka orgies). He was bringing underage brides into the room with adult wives, and it was a very bad situation. I did not want to be part of it, and afterward, I asked for more time to adjust so I wouldn't have to go back. I never had to. I was married to Jeffs for two years before he went to prison, and I remained in the FLDS as part of his group for many years until I escaped in 2012. I never consummated the marriage. Control shaped everything — where I lived, what I ate, and how I thought Old photo of a young Briell Decker during her time in the FLDS. Courtesy of Briell Decker Jeffs controlled nearly every part of my life and the lives of everyone in the church. For example, he had the titles of everyone's houses in a legal trust and used that to control housing. He decided where people lived, and could move families at any time. The women in his family, including me, weren't allowed to leave our homes freely. We couldn't go outside. Food, which Jeffs selected for us, was brought to the house. And in some places, there were cameras and caretakers watching us. There was really no exit route. Over time, restrictions tightened, especially in the mid-2000s when Jeffs was under police investigation. We got rid of televisions and internet access. I think that was to help hide the truth from the people. I tried to escape again and again, but each attempt made it harder Warren Jeffs at the proceedings during his trial in 2007. Steve Marcus-Pool/Getty Images I tried to escape about 10 times before I succeeded. The more I tried, the tighter the control around me became. In one early attempt, I made contact with the police and thought I might be able to leave for good. But they told me they wanted to place me in a shelter that was near the FLDS compound, and that didn't feel safe to me. It was my first time trying to explain what was happening, and I didn't know how to communicate why being that close to the compound still felt dangerous. I ended up going back to my family in the FLDS in Short Creek, an area along the Arizona-Utah border, because I couldn't see how the police's plan was going to work. After that, I started trying to plan more quietly. I would look through phone books or try to figure out where I could go, but I was often seen before I could get far. People were expected to report anything suspicious, so it didn't take much for someone to notice. At one point, after I tried to leave, the room I was in was physically altered. They put screws into the window so it wouldn't open fully, and they turned the doorknob around so I couldn't unlock it from the inside. Even calling for help was risky. In some areas, calling 911 could connect you to people affiliated with the FLDS, so it didn't feel like a safe option. There wasn't a clear path to outside support, and I didn't have access to information that could help me navigate it. The day I escaped The Yearning for Zion Ranch compound in Eldorado, Texas. Mike Terry/Deseret Morning News/Getty Images On May 23, 2012, I escaped. That morning, I tried to leave and was caught on the main roads and brought back. Later that day, I was in a room and I noticed that one of the screws on the window was loose. I found some scissors and worked at it until it came completely loose. Eventually, the screw broke. Someone in the house noticed and tried to stop me, but I kept going. I climbed out the window and ran. This time, I avoided the main roads. I went through back paths and a creek until I reached a house of former FLDS members who had turned against the church. By the end of the day, they had driven me out of town to safety. Leaving was only the beginning A recent photo of Decker with her newborn. Courtesy of Briell Decker. After I left the FLDS, I stayed in shelters and worked to rebuild basic parts of my life. I changed my name and my Social Security number. I opened my first bank account. I eventually got married again — this time by choice — and began building a life that was mine. I saw the ocean for the first time on my honeymoon in Santa Monica, something I never thought I would experience. Later, I saw the Statue of Liberty, which felt especially meaningful because it represents freedom, and I was finally free. I eventually learned that I had rights to Jeffs' 45-room property in Short Creek. I applied for ownership in February 2016 and was awarded the house later that year. I started giving free tours in it to raise awareness and connect with people who might help turn it into something bigger. Through those connections, I partnered with a nonprofit called the Dream Center, which agreed to take over operations and turn the property into a recovery center. Today, it serves as a place where people — especially those from the FLDS and other polygamous groups — can find housing, support, and resources as they rebuild their lives. Warren Jeffs was sentenced in 2011 to life in prison plus 20 years for sexually assaulting two underage girls, unrelated to Briell Decker. His defense — led by several attorneys — argued that his religious freedom had been violated. Read the original article on Business Insider

Business Insider
newsbusiness insiderragpolicy

Last fall, when the Trump administration took issue with Jimmy Kimmel, Disney took him off the air for several days. This time around, Kimmel has continued to broadcast. Randy Holmes/Disney via Getty Images The second round of Trump administration attacks on Disney, ABC, and Jimmy Kimmel has played out differently than the one we saw last fall. This time, Kimmel has stayed on the air. And Disney says it doesn't think Trump's FCC will take away its broadcast licenses. But Trump's threats will still weigh on new Disney CEO Josh D'Amaro, which is the point. The federal government says it's going to review ABC's broadcast licenses — a move that came a day after Donald and Melania Trump both called on ABC to punish Jimmy Kimmel. What does that mean for Kimmel and everything else that airs on ABC? For now, nothing. But that doesn't mean it doesn't matter. Unlike last fall, when Donald Trump and his administration also went after Kimmel, his show remains on the air. (Kimmel responded directly to the Trumps during his Monday night show, but didn't reference the license review during his Tuesday night monologue.) Everything else on ABC remains unchanged. And if you zoom out, there are decent odds that things stay that way. Media and legal observers think Disney, which owns ABC, has a strong legal case against Trump's Federal Communications Commission, which is telling Disney it needs to renew its licenses for the eight broadcast stations it owns now, instead of waiting until 2028 when they're officially due for review. It would be difficult, they say, for the FCC to permanently revoke those licenses in a way that would withstand court challenges. And Brendan Carr, the Trump-appointed head of the FCC, knows all of that. But he also knows that using his power to drag Disney and ABC into a regulatory and legal fight is the whole point. The end result doesn't matter as much as the signal it sends. As Tom Wheeler, who held Carr's job during the Obama administration, told the Guardian, that signal is pretty clear: "There's a message to every licensee of the FCC that says, 'I can do this to you too.'" It's a message that Carr has been broadcasting for some time, with his repeated assertions that broadcast licenses aren't a right and can be revoked. Ditto his existing investigations into Disney and Comcast, which are, in theory, about their previous embrace of DEI policies. Yes, there's a theoretical chance that Carr's orders and investigations will eventually lead Disney or Comcast to lose broadcast licenses. That would be bad for both, though not catastrophic, because owning broadcast stations isn't core to either company's business. (Contrary to what Donald Trump often suggests, big media companies don't own a single overriding license that lets them distribute programming — it's individual broadcast stations that have licenses. Some of those stations are owned by big broadcasters like ABC, but the majority are owned by outside companies.) But that still means Disney will have to spend time and money pushing back against the federal government. The bigger problem for Disney, or any other media company in the Trump administration's sights, is that losing a license is just one bad outcome the administration could engineer. For instance, the FCC could try to pressure other broadcast station owners not to carry Disney's programming, which is effectively what Carr was pushing last fall, when he applauded Sinclair and Nexstar, two very big station groups, for their decision to temporarily drop Kimmel. And the administration can also weigh in, or threaten to, when it comes to other things media companies want to do. It blessed Larry and David Ellison's purchase of Paramount, for instance, only after the Ellisons had agreed to steps like appointing an ombudsman with conservative credentials to monitor complaints about CBS News. Which is why any real changes the investigation spurs may never result in some kind of documented, formal change about the way Disney or ABC does business. You may simply have to wonder why ABC canceled a particular show or promoted another one. Is that something they would have done if Donald Trump weren't in office? We're two days into this one, and so far, there's no sign that new Disney CEO Josh D'Amaro has made any moves to appease Trump and Carr. Kimmel is still on the air, and Disney has put out a statement saying it deserves to keep its licenses and assumes it will. (I've asked Carr and Disney if they have anything else to add.) The problem is we don't really know what the real effect this pressure has — just that it's something D'Amaro and his employees have to think about, at the very least. And that's something that should worry anyone who cares about the government's influence on what we watch. Read the original article on Business Insider

Business Insider
newsbusiness insidergoogleragvisionsafety

Jasmine Bhatti is the CEO of Navi Nurses. Caitlin O'Hara for BI Jasmine Bhatti's alternative to traditional home health has grown an average of 80% year over year. She says the keys to her growth has been using fractional staff and delaying full-time hires. Navi Nurses hit $7 million in revenue last year. This as-told-to essay is based on a conversation with Jasmine Bhatti, CEO of Navi Nurses. It has been edited for length and clarity. Since I was in college, I always knew I wanted to make an impact in healthcare at a big level. At the time, my grandmother was diagnosed with cancer and needed 24/7 care. I learned through her experience that there were major gaps in the current home health system. I became a nurse and was reminded of this problem again. So many of my patients would pull at my scrubs and ask if they could pay for me to come home and support them. Bhatti started pitching herself in local Facebook groups in late 2020. Caitlin O'Hara for BI That was the seed of Navi Nurses, a premium, nurse-led alternative to the limited home health services offered by insurance companies. People I looked to for business advice told me the next step would be to validate my vision and prove that people would be willing to pay for this, so that's what I've been doing for the past five years: We hit $7 million in revenue last year while building a model that benefits nurses and patients. I sold my services before I had everything figured out Early on, I heard the founders of the mattress company Tuft & Needle share how they sold their concept online before they had one mattress made. That really stuck with me. Even though I didn't have a team yet and was still working full-time at the hospital, I had a clear vision for what I could create. I started pitching myself in local Facebook groups in late 2020. Within a month, I landed my first few clients. The business went from three nurses who could pick up shifts to a team of 20+ nurses who could work around the clock. Caitlin O'Hara for BI I looked for other spaces where I could meet my target customer, and started volunteering at a community organization that allowed people with home healthcare needs to borrow medical equipment. That was where I met our third client — a woman who needed 24/7 care for three months, which changed everything for me. That client helped me accelerate my team, going from three nurses who could pick up shifts to a team of 20+ nurses who could work around the clock to support her. The money allowed me to walk away from the hospital and turn this into a full-time endeavor in April of 2021. From there, we've grown almost entirely by word of mouth, only starting to run our first Google Ads in January of this year. Fractional staff has been instrumental, but I needed an in-house team to really push forward Outside of our contract nurses, my internal staff remained lean for most of our growth — we had only two employees at the end of 2024, and finished 2025 with 17. A part-time chief of staff helped Bhatti structure the team and manage the hiring process. Caitlin O'Hara for BI Before I could afford to hire people full-time, I relied heavily on fractional support to fill voids in my expertise, and still do for some roles. Even 10 hours a week of their guidance helped me keep pushing things forward. Our part-time chief of staff was especially instrumental because she had built a company before and could anticipate things I couldn't. Her guidance allowed me to structure the team and manage the hiring process even when she wasn't the one executing every single task. That said, when it came to building our custom patient management software, bringing that work in-house turned out to be one of the most important decisions I've made. Having a team that stays closely connected to our nurses and patients has been transformative, allowing us to move faster and more quickly adapt to changes that arose. Outside funding would help us grow faster, but my values are more important Besides a few grants, my business has been entirely bootstrapped, which I've wrestled with at times. If someone gave me $50 million tomorrow, we could reach more people faster — but at what cost? Bhatti said she wants to expand Navi Nurses beyond Arizona. Caitlin O'Hara for BI A study published late last year found that hospitals bought by private equity have higher emergency department mortality rates. Yes, profitability is important, but I'm not willing to do that at the expense of the quality of the nurse or the patient. I never want to partner with someone who doesn't put the human being first. Ultimately, I don't think I would change anything about how we've grown. We've grown an average of 80% year over year, and it already feels like things are constantly breaking. If we'd grown faster, I don't think it would have been done as thoughtfully as it was. Right now, we're working towards expanding beyond Arizona — eventually, I'd love for us to be an international company. Navi Nurses had 17 employees in 2025. Caitlin O'Hara for BI Looking back, I'd tell my younger self to just keep getting back up: Things will not always go the way you had hoped, but they'll go the way you need them to be. Read the original article on Business Insider

Product Hunt
startupproduct huntagent

PandaProbe

By Sina Tayebati

Discussion | Link

Product Hunt
startupproduct hunt

Crin AI

By Pravinraj M

Discussion | Link

Techmeme
techtechmeme

Dominic-Madori Davis / TechCrunch: Pursuit, which uses AI to scan public data to help companies find and win government contracts, raised a $22M seed led by OpenGov co-founder Mike Rosengarten  —  Mike Vichich grew up in Michigan.  His family, he recalls, dedicated their lives to public service.

Techmeme
techtechmeme

Charlotte Trueman / DatacenterDynamics: OpenLight, which designs custom application-specific photonic chips, raised $50M in a Series A extension, after raising $34M in August 2025  —  Startup designs custom application-specific photonic chips  —  OpenLight has raised an additional $50 million in an extended Series A funding round …