<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ares Chen</title>
    <description>The latest articles on DEV Community by Ares Chen (@chenxizhang).</description>
    <link>https://dev.to/chenxizhang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3935818%2F0106f939-49e5-4e45-a95b-8291b0b1ac11.jpeg</url>
      <title>DEV Community: Ares Chen</title>
      <link>https://dev.to/chenxizhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chenxizhang"/>
    <language>en</language>
    <item>
      <title>Upload prize images directly from your device</title>
      <dc:creator>Ares Chen</dc:creator>
      <pubDate>Sun, 17 May 2026 06:02:48 +0000</pubDate>
      <link>https://dev.to/chenxizhang/upload-prize-images-directly-from-your-device-5dm5</link>
      <guid>https://dev.to/chenxizhang/upload-prize-images-directly-from-your-device-5dm5</guid>
      <description>&lt;p&gt;If you've ever set up a draw and stalled at the "prize image URL" field, this one is for you.&lt;/p&gt;

&lt;p&gt;For years, Lucky Draw Bot has required a &lt;strong&gt;publicly accessible image URL&lt;/strong&gt; for the prize picture. That made sense technically, but it created two very real problems for the people actually trying to run a draw:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You had to host the image somewhere public first.&lt;/strong&gt; Find an image host, upload, make it actually public, verify it's reachable from the outside, copy the link back. For a one-minute "let's draw a Surface Pro for the team" moment, that's far too many steps — and a lot of people simply gave up at this point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "just paste a public image URL" workaround invited copyright trouble.&lt;/strong&gt; Hot-linking a Google Images result or someone's blog photo is convenient until it isn't. It's not really yours to use, the link can break, and you can end up with someone else's watermark in your draw.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This has been the &lt;strong&gt;single most requested feature&lt;/strong&gt; in our feedback inbox for a long time. Today, it's live — and it solves both problems at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;p&gt;You can now attach a prize image &lt;strong&gt;straight from your device&lt;/strong&gt; — laptop, desktop, or phone — directly in the draw setup card. Two flavors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick a file from your device&lt;/strong&gt; (PNG/JPEG, up to 1024×1024).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste a screenshot.&lt;/strong&gt; If you just took a screenshot or copied an image to the clipboard, paste it in directly. The bot will upload it to a container reserved for the current draw, fill the image URL back into the form, and you're done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No public URL needed. No third-party image host. No "is this link actually accessible from the outside?" guessing. No copyright gray area from hot-linking someone else's image.&lt;/p&gt;

&lt;p&gt;Here's how the full flow looks now.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start a draw as usual
&lt;/h3&gt;

&lt;p&gt;Mention the bot in any Teams channel to kick things off.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8eoqmdoombqoyake95mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8eoqmdoombqoyake95mg.png" alt="Starting a lucky draw from Microsoft Teams" width="800" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Open the edit form
&lt;/h3&gt;

&lt;p&gt;You'll see the familiar setup card — prize, number of prizes, draw time, and the image field. Notice the new &lt;strong&gt;Upload from device&lt;/strong&gt; button right next to the image URL input.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foe1jqrq6cxs67sjzy8pk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foe1jqrq6cxs67sjzy8pk.png" alt="Draw setup form with the new Upload from device button" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pick a file — or paste a screenshot
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Upload from device&lt;/strong&gt;, choose a PNG or JPEG (up to 1024×1024), and you'll get a quick preview. You can also just &lt;strong&gt;paste&lt;/strong&gt; a screenshot from the clipboard at this step — no need to save it as a file first. Happy with the preview? Hit &lt;strong&gt;Upload&lt;/strong&gt;. Want a different one? &lt;strong&gt;Choose another&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik9wfobu8hxk6u6laswc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fik9wfobu8hxk6u6laswc.png" alt="Previewing the selected prize image before uploading" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The image URL is filled in for you
&lt;/h3&gt;

&lt;p&gt;Once the upload completes, the bot stores the image in a container scoped to &lt;strong&gt;this specific draw&lt;/strong&gt; and drops the resulting URL right back into the form for you. You don't have to copy, paste, or host anything yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jg41y4wt8spwot0y3ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jg41y4wt8spwot0y3ye.png" alt="Prize image URL automatically populated after upload" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Start the draw — the image just works
&lt;/h3&gt;

&lt;p&gt;Hit &lt;strong&gt;Start&lt;/strong&gt;, and the prize card shows up in the channel with your image rendered exactly as expected. Teammates tap &lt;strong&gt;I am in&lt;/strong&gt; and you're off.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz0chghryjrtxky8yyc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz0chghryjrtxky8yyc7.png" alt="Published draw card showing the uploaded prize image" width="764" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy: only this draw can see the image
&lt;/h2&gt;

&lt;p&gt;Short answer: &lt;strong&gt;the image is private to your draw, and we delete it when the draw is archived.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The longer answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploaded images are stored in a container that is &lt;strong&gt;scoped to the current draw&lt;/strong&gt;. They are only served as part of that draw's prize card — to the people who can already see the draw in Teams.&lt;/li&gt;
&lt;li&gt;They are &lt;strong&gt;not&lt;/strong&gt; placed in any public gallery, &lt;strong&gt;not&lt;/strong&gt; listed anywhere, and &lt;strong&gt;not&lt;/strong&gt; reachable by anyone browsing the bot's domain or trying to guess URLs.&lt;/li&gt;
&lt;li&gt;Other organizations, other channels, and other users cannot enumerate or access your uploaded images.&lt;/li&gt;
&lt;li&gt;When the draw is &lt;strong&gt;archived&lt;/strong&gt;, the associated image is &lt;strong&gt;automatically deleted&lt;/strong&gt; along with it. No lingering files, no shadow copies sitting around forever — once the draw's lifecycle ends, the image is gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: it behaves the way you'd hope a private upload would behave. The fact that the prize image &lt;em&gt;appears&lt;/em&gt; inside an adaptive card doesn't mean the underlying file is exposed beyond that draw — it isn't. And once you don't need it anymore, neither do we.&lt;/p&gt;

&lt;p&gt;If you still prefer to host images yourself (corporate CDN, brand assets you legally own, etc.), the original &lt;strong&gt;URL field is unchanged&lt;/strong&gt; and works exactly as before. Upload-from-device is an addition, not a replacement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this took a while
&lt;/h2&gt;

&lt;p&gt;The original design deliberately leaned on customers' own image hosting so that we could keep the bot fully &lt;strong&gt;free&lt;/strong&gt; and avoid running a storage and bandwidth bill on top of an already-free product. Over time, two things changed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The community was very clear that "find a public URL first" was the #1 blocker for casual, spur-of-the-moment draws — and that the public-URL workaround was pushing people into copyright gray areas they didn't want to be in.&lt;/li&gt;
&lt;li&gt;We worked out a hosting setup, with &lt;strong&gt;per-draw scoped storage and automatic cleanup on archive&lt;/strong&gt;, that lets us offer private image uploads &lt;strong&gt;without&lt;/strong&gt; changing the "Lucky Draw Bot is free" promise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So here we are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it now
&lt;/h2&gt;

&lt;p&gt;The new &lt;strong&gt;Upload from device&lt;/strong&gt; button is rolling out to all tenants. Open any channel where Lucky Draw Bot is installed, start a draw, and look for the button next to the image URL field. If you don't see it yet, give it a few minutes — Teams takes a moment to refresh the card.&lt;/p&gt;

&lt;p&gt;As always, if you bump into anything weird, or you have ideas for the &lt;em&gt;next&lt;/em&gt; most-wanted feature, drop a note to &lt;a href="mailto:xia_tony@hotmail.com"&gt;&lt;/a&gt;&lt;a href="mailto:xia_tony@hotmail.com"&gt;xia_tony@hotmail.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy drawing.&lt;/p&gt;

&lt;p&gt;— Ares Chen&lt;/p&gt;




&lt;h2&gt;
  
  
  About Lucky Draw Bot
&lt;/h2&gt;

&lt;p&gt;Lucky Draw Bot is a free Microsoft Teams app that runs fair, transparent prize draws inside any channel — for weekly kudos, conference giveaways, retros, onboarding icebreakers, and more. Microsoft 365 App Award winner, used by ~10,000 organizations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install from Microsoft AppSource: &lt;a href="https://marketplace.microsoft.com/en-us/product/WA200000091" rel="noopener noreferrer"&gt;https://marketplace.microsoft.com/en-us/product/WA200000091&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website &amp;amp; docs: &lt;a href="https://luckydraw.daomar.dev" rel="noopener noreferrer"&gt;https://luckydraw.daomar.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Feedback: &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>microsoftteams</category>
      <category>productivity</category>
      <category>devlog</category>
      <category>release</category>
    </item>
  </channel>
</rss>
