<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: vercel</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/vercel.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-06-26T01:41:32+00:00</updated><author><name>Simon Willison</name></author><entry><title>New sandboxes from Cloudflare and Vercel</title><link href="https://simonwillison.net/2025/Jun/26/sandboxes/#atom-tag" rel="alternate"/><published>2025-06-26T01:41:32+00:00</published><updated>2025-06-26T01:41:32+00:00</updated><id>https://simonwillison.net/2025/Jun/26/sandboxes/#atom-tag</id><summary type="html">
    &lt;p&gt;Two interesting new products for running code in a sandbox today.&lt;/p&gt;
&lt;p&gt;Cloudflare &lt;a href="https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/"&gt;launched their Containers product&lt;/a&gt; in open beta, and added &lt;a href="https://developers.cloudflare.com/changelog/2025-06-24-announcing-sandboxes/"&gt;a new Sandbox library&lt;/a&gt; for Cloudflare Workers that can run commands in a "secure, container-based environment":&lt;/p&gt;
&lt;div class="highlight highlight-source-js"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;getSandbox&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;"@cloudflare/sandbox"&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;sandbox&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;getSandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;env&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;Sandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-s"&gt;"my-sandbox"&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;output&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;sandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;exec&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;"ls"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-s"&gt;"-la"&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vercel shipped a similar feature, introduced in &lt;a href="https://vercel.com/changelog/run-untrusted-code-with-vercel-sandbox"&gt;Run untrusted code with Vercel Sandbox&lt;/a&gt;, which enables code that looks like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-js"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-v"&gt;Sandbox&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;"@vercel/sandbox"&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;sandbox&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-v"&gt;Sandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;create&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-s1"&gt;sandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;writeFiles&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;[&lt;/span&gt;
    &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-c1"&gt;path&lt;/span&gt;: &lt;span class="pl-s"&gt;"script.js"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;stream&lt;/span&gt;: &lt;span class="pl-v"&gt;Buffer&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;from&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;result&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;text&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
  &lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-s1"&gt;sandbox&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;runCommand&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-c1"&gt;cmd&lt;/span&gt;: &lt;span class="pl-s"&gt;"node"&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;args&lt;/span&gt;: &lt;span class="pl-kos"&gt;[&lt;/span&gt;&lt;span class="pl-s"&gt;"script.js"&lt;/span&gt;&lt;span class="pl-kos"&gt;]&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;stdout&lt;/span&gt;: &lt;span class="pl-s1"&gt;process&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;stdout&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;stderr&lt;/span&gt;: &lt;span class="pl-s1"&gt;process&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;stderr&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In both cases a major intended use-case is safely executing code that has been created by an LLM.&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/sandboxing"&gt;sandboxing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cloudflare"&gt;cloudflare&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vercel"&gt;vercel&lt;/a&gt;&lt;/p&gt;



</summary><category term="sandboxing"/><category term="ai"/><category term="cloudflare"/><category term="generative-ai"/><category term="llms"/><category term="vercel"/></entry><entry><title>Quoting Jared Palmer</title><link href="https://simonwillison.net/2025/Feb/7/jared-palmer/#atom-tag" rel="alternate"/><published>2025-02-07T06:39:38+00:00</published><updated>2025-02-07T06:39:38+00:00</updated><id>https://simonwillison.net/2025/Feb/7/jared-palmer/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://twitter.com/jaredpalmer/status/1887641997932175597"&gt;&lt;p&gt;Confession: we've been hiding parts of &lt;a href="https://v0.dev/"&gt;v0&lt;/a&gt;'s responses from users since September. Since the launch of DeepSeek's web experience and its positive reception, we realize now that was a mistake. From now on, we're also showing v0's full output in every response. This is a much better UX because it feels faster and it teaches end users how to prompt more effectively.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://twitter.com/jaredpalmer/status/1887641997932175597"&gt;Jared Palmer&lt;/a&gt;, VP of AI at Vercel&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ux"&gt;ux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-engineering"&gt;prompt-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vercel"&gt;vercel&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/deepseek"&gt;deepseek&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-in-china"&gt;ai-in-china&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-to-app"&gt;prompt-to-app&lt;/a&gt;&lt;/p&gt;



</summary><category term="ux"/><category term="ai"/><category term="prompt-engineering"/><category term="generative-ai"/><category term="llms"/><category term="vercel"/><category term="deepseek"/><category term="ai-in-china"/><category term="prompt-to-app"/></entry><entry><title>Leaked system prompts from Vercel v0</title><link href="https://simonwillison.net/2024/Nov/25/leaked-system-prompts-from-vercel-v0/#atom-tag" rel="alternate"/><published>2024-11-25T21:17:44+00:00</published><updated>2024-11-25T21:17:44+00:00</updated><id>https://simonwillison.net/2024/Nov/25/leaked-system-prompts-from-vercel-v0/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2-fly-4-ai/V0-system-prompt"&gt;Leaked system prompts from Vercel v0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;a href="https://v0.dev/"&gt;v0&lt;/a&gt; is Vercel's entry in the increasingly crowded LLM-assisted development market - chat with a bot and have that bot build a full application for you.&lt;/p&gt;
&lt;p&gt;They've been iterating on it &lt;a href="https://vercel.com/blog/announcing-v0-generative-ui"&gt;since launching in October last year&lt;/a&gt;, making it one of the most mature products in this space.&lt;/p&gt;
&lt;p&gt;Somebody leaked the system prompts recently. Vercel CTO Malte Ubl &lt;a href="https://twitter.com/cramforce/status/1860436022347075667"&gt;said this&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When &lt;a href="https://twitter.com/v0"&gt;@v0&lt;/a&gt; first came out we were paranoid about protecting the prompt with all kinds of pre and post processing complexity.&lt;/p&gt;
&lt;p&gt;We completely pivoted to let it rip. A prompt without the evals, models, and especially UX is like getting a broken ASML machine without a manual&lt;/p&gt;
&lt;/blockquote&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-engineering"&gt;prompt-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-injection"&gt;prompt-injection&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vercel"&gt;vercel&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/evals"&gt;evals&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-to-app"&gt;prompt-to-app&lt;/a&gt;&lt;/p&gt;



</summary><category term="ai"/><category term="prompt-engineering"/><category term="prompt-injection"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="vercel"/><category term="evals"/><category term="prompt-to-app"/></entry><entry><title>Skew protection in Vercel</title><link href="https://simonwillison.net/2024/Mar/20/skew-protection-in-vercel/#atom-tag" rel="alternate"/><published>2024-03-20T14:06:38+00:00</published><updated>2024-03-20T14:06:38+00:00</updated><id>https://simonwillison.net/2024/Mar/20/skew-protection-in-vercel/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://vercel.com/docs/deployments/skew-protection"&gt;Skew protection in Vercel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Version skew is a name for the bug that occurs when your user loads a web application and then unintentionally keeps that browser tab open across a deployment of a new version of the app. If you’re unlucky this can lead to broken behaviour, where a client makes a call to a backend endpoint that has changed in an incompatible way.&lt;/p&gt;

&lt;p&gt;Vercel have an ingenious solution to this problem. Their platform already makes it easy to deploy many different instances of an application. You can now turn on “skew protection” for a number of hours which will keep older versions of your backend deployed.&lt;/p&gt;

&lt;p&gt;The application itself can then include its desired deployment ID in a x-deployment-id header, a __vdpl cookie or a ?dpl= query string parameter.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/vercel_changes/status/1770280131250286851"&gt;Vercel changes&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/frontend"&gt;frontend&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/zero-downtime"&gt;zero-downtime&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vercel"&gt;vercel&lt;/a&gt;&lt;/p&gt;



</summary><category term="frontend"/><category term="zero-downtime"/><category term="vercel"/></entry></feed>