<?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: TiniDrop</title>
    <description>The latest articles on DEV Community by TiniDrop (tinidrop).</description>
    <link>https://dev.to/tinidrop</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.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F15061%2Fdf068964-5098-4d58-b754-6ec7beea332d.png</url>
      <title>DEV Community: TiniDrop</title>
      <link>https://dev.to/tinidrop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tinidrop"/>
    <language>en</language>
    <item>
      <title>Stop attaching your pitch deck. Send a secure view-only link instead</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sun, 08 Nov 2026 18:27:12 +0000</pubDate>
      <link>https://dev.to/tinidrop/stop-attaching-your-pitch-deck-send-a-secure-view-only-link-instead-4g1c</link>
      <guid>https://dev.to/tinidrop/stop-attaching-your-pitch-deck-send-a-secure-view-only-link-instead-4g1c</guid>
      <description>&lt;p&gt;You finish the deck. You hit send. The PDF leaves as an attachment.&lt;/p&gt;

&lt;p&gt;Now three things are true at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You do not know if they opened it
&lt;/li&gt;
&lt;li&gt;An old version can live forever in someone’s inbox
&lt;/li&gt;
&lt;li&gt;Anyone they forward it to gets a full copy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not fundraising. That is hoping.&lt;/p&gt;

&lt;p&gt;This guide shows a cleaner habit used by teams that treat the deck like a &lt;strong&gt;secure handoff&lt;/strong&gt;, not a file dump: upload once → share a &lt;strong&gt;view-only link&lt;/strong&gt; → see who opened it → follow up with context.&lt;/p&gt;

&lt;p&gt;I built this loop into &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; because I kept losing control of the PDF the moment it left the email. The steps below work whether you use TiniDrop or any secure link tool — the point is the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick guide
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upload the pitch deck (PDF)
&lt;/li&gt;
&lt;li&gt;Turn on view-only + optional password / expiry
&lt;/li&gt;
&lt;li&gt;Copy the secure link
&lt;/li&gt;
&lt;li&gt;Send the link (not the file)
&lt;/li&gt;
&lt;li&gt;Check opens, then follow up with a specific note
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why a secure link beats an attachment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Control stays with you.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
An attachment is a clone. A link is a door you can tighten: view-only, password, expiry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You see signal, not silence.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Opens and time on page tell you who is actually reading — so you stop chasing cold silence and start following warm opens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One source of truth.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Update the file behind the same link when numbers change. You are not hunting “final_v7_REALLY_final.pdf” across threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Professional for the recipient.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
They open in the browser. No 12 MB attachment blocked by IT. No “can you resend?”&lt;/p&gt;

&lt;p&gt;DocSend and Papermark popularized this pattern for a reason. The product category is the same idea: &lt;strong&gt;secure document intelligence&lt;/strong&gt; — share the file as a link, keep the original, see who engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Upload the deck
&lt;/h2&gt;

&lt;p&gt;Export a clean PDF (one deck, not a ZIP of drafts).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in at &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drop the PDF on the upload area
&lt;/li&gt;
&lt;li&gt;Wait for the share link
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Free is enough to try the loop. Paid plans unlock longer retention, larger files, and API upload if you automate exports later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Make the link secure
&lt;/h2&gt;

&lt;p&gt;Before you paste the URL into an investor email, tighten it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View-only&lt;/strong&gt; — they can read in the browser; they do not walk away with your “source” file as the default habit
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt; — useful for a cold intro or a sensitive round; send the password in a separate message
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expiry&lt;/strong&gt; — match the round. If the raise has a date, the link can too
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You still cannot stop screenshots. You &lt;em&gt;can&lt;/em&gt; stop blindly shipping the original into every inbox forever.&lt;/p&gt;

&lt;p&gt;That is the “secure” part people actually feel: fewer uncontrolled copies, clearer access window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Create separate links when it matters
&lt;/h2&gt;

&lt;p&gt;One link for the whole world is fine for a soft preview.&lt;/p&gt;

&lt;p&gt;For a real raise, prefer &lt;strong&gt;one link per firm or per partner&lt;/strong&gt; when you can. Then engagement maps to a conversation, not a mystery open.&lt;/p&gt;

&lt;p&gt;Same idea DocSend users rely on: the link is the unit of tracking, not the email pixel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Send the link, not the PDF
&lt;/h2&gt;

&lt;p&gt;In the email:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One short paragraph on why you are reaching out
&lt;/li&gt;
&lt;li&gt;The secure link
&lt;/li&gt;
&lt;li&gt;One clear ask (15-minute call, intro, feedback on slide X)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid burying the link under five attachments. The deck &lt;em&gt;is&lt;/em&gt; the link.&lt;/p&gt;

&lt;p&gt;Example shape (adapt freely):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi Name — sharing our seed deck as a secure view-only link (not an attachment). Happy to walk through the traction slide live if useful:&lt;br&gt;&lt;br&gt;
&lt;a href="https://tinidrop.com/view/%E2%80%A6" rel="noopener noreferrer"&gt;https://tinidrop.com/view/…&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Open to a 15-min call next week?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5 — Read the opens, then follow up like a human
&lt;/h2&gt;

&lt;p&gt;After you send:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check whether the link was opened
&lt;/li&gt;
&lt;li&gt;Note time on page if you have it
&lt;/li&gt;
&lt;li&gt;Follow up with something specific — not “just checking if you got this”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Good follow-ups sound like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Saw you spent time on the go-to-market section — happy to send the deeper funnel notes.”
&lt;/li&gt;
&lt;li&gt;“If the deck is still in the pile, the one-pager on unit economics is slide 8.”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad follow-ups sound like calendar spam with zero signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices that actually sell the round
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Personalize the wrapper, not the vanity URL.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The email is personal. The link is secure and trackable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protect what is sensitive.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Financials, customer names, unreleased product — password + expiry are cheap insurance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not confuse Git with a handoff.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Investors are not cloning your repo. Clients are not joining your Notion. A secure link is the right tool for a finished PDF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep the stack out of the story.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Founders buy outcomes: control, opens, fewer awkward resends — not infrastructure brand names.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is a link safer than emailing a PDF?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Safer for &lt;em&gt;control&lt;/em&gt;. You decide view-only, password, and expiry. An attachment is an uncontrolled copy the second it leaves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can recipients open it without an account?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes — they open the link in a browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if they forward the link?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Treat the URL like a door. Password + expiry limit the blast radius. For high-stakes rooms, use a tighter access pattern and shorter expiry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I update the deck after sending?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Replace the file behind the same share when your product allows it — or send a fresh link and retire the old one with expiry. Never leave “old numbers” living as an attachment forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this only for pitch decks?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Same loop works for proposals, board packs, client PDFs, and small HTML/ZIP previews. The habit is identical: link, not attachment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start here
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drop your deck
&lt;/li&gt;
&lt;li&gt;Turn on the secure settings you need
&lt;/li&gt;
&lt;li&gt;Paste the link into the next investor email
&lt;/li&gt;
&lt;li&gt;Follow the opens, not the silence
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I am Santosh, co-founder of TiniDrop in Würzburg. We build &lt;strong&gt;secure document intelligence&lt;/strong&gt; for modern teams — share a file with a link, track who opened it, keep it view-only. If your last raise still ran on attachments, say what you send (deck, data room PDF, client proposal) in the comments and we can compare notes on the handoff.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>Replace email attachments in CI — upload a ZIP from GitHub Actions and get a shareable link</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sun, 08 Nov 2026 18:14:25 +0000</pubDate>
      <link>https://dev.to/tinidrop/replace-email-attachments-in-ci-upload-a-zip-from-github-actions-and-get-a-shareable-link-a8i</link>
      <guid>https://dev.to/tinidrop/replace-email-attachments-in-ci-upload-a-zip-from-github-actions-and-get-a-shareable-link-a8i</guid>
      <description>&lt;p&gt;Your CI already builds the artifact.&lt;/p&gt;

&lt;p&gt;Then someone pastes it into Slack as a 40 MB attachment — or opens a throwaway Google Drive link that expires next week with no signal that anyone opened it.&lt;/p&gt;

&lt;p&gt;If the person on the other end is not living in GitHub Releases, you need a &lt;strong&gt;handoff link&lt;/strong&gt;: one URL, browser-readable, optional password/expiry, and a simple “was it opened?” check.&lt;/p&gt;

&lt;p&gt;This post walks through a practical pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build a ZIP (or PDF) in GitHub Actions
&lt;/li&gt;
&lt;li&gt;Upload it with one authenticated &lt;code&gt;curl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Post the share URL back on the PR (or into Slack)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I use &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; for the share step because that is what we built for this exact loop — but the workflow shape is the same idea wherever you land the file: &lt;strong&gt;artifact in CI → link out → humans click a URL, not a binary.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When this beats GitHub Releases (and email)
&lt;/h2&gt;

&lt;p&gt;Use a share link when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The recipient is a &lt;strong&gt;client, investor, or teammate who is not cloning repos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You are shipping a &lt;strong&gt;finished ZIP / PDF / HTML preview&lt;/strong&gt;, not ongoing source&lt;/li&gt;
&lt;li&gt;You want a lightweight “did they open it?” signal after the PR merges&lt;/li&gt;
&lt;li&gt;You might want a &lt;strong&gt;password or expiry&lt;/strong&gt; on that one URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep Releases for versioned open-source downloads. Use a link for the human handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub repo with Actions enabled
&lt;/li&gt;
&lt;li&gt;A ZIP (or PDF) produced by your job — &lt;code&gt;dist.zip&lt;/code&gt;, &lt;code&gt;site.zip&lt;/code&gt;, &lt;code&gt;deck.pdf&lt;/code&gt;, etc.
&lt;/li&gt;
&lt;li&gt;A TiniDrop account on &lt;strong&gt;Solo or Pro&lt;/strong&gt; (API keys live under Dashboard → Settings → API keys)
&lt;/li&gt;
&lt;li&gt;An API key stored as a GitHub Actions secret — never in the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generate the key once in the dashboard. Name it something like &lt;code&gt;github-actions-ci&lt;/code&gt;. Copy it only at creation time.&lt;/p&gt;

&lt;p&gt;Add a repository secret:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;TINIDROP_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Value: the key (starts with &lt;code&gt;td_&lt;/code&gt; if you created it recently)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Minimal upload from your laptop (sanity check)
&lt;/h2&gt;

&lt;p&gt;Before wiring Actions, prove the API from your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://tinidrop.com/api/upload &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: &lt;/span&gt;&lt;span class="nv"&gt;$TINIDROP_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@dist.zip"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response includes a shareable &lt;code&gt;url&lt;/code&gt; (and a &lt;code&gt;slug&lt;/code&gt;). Shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a8k2mx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://tinidrop.com/view/a8k2mx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"original_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist.zip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"size_bytes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1843200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open that &lt;code&gt;url&lt;/code&gt; in a private window. If it loads, you are ready for CI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; API upload is for Solo / Pro. Free-plan uploads go through the browser (bot check). Put the key in CI secrets and rotate it if it ever leaks — same hygiene as any deploy token.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Actions: upload after build
&lt;/h2&gt;

&lt;p&gt;Here is a job that builds, zips, uploads, and prints the link.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Share build as link&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;share&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;# replace with your real build&lt;/span&gt;
          &lt;span class="s"&gt;mkdir -p dist&lt;/span&gt;
          &lt;span class="s"&gt;echo "&amp;lt;h1&amp;gt;Preview&amp;lt;/h1&amp;gt;" &amp;gt; dist/index.html&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Zip artifact&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cd dist &amp;amp;&amp;amp; zip -r ../dist.zip .&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload to TiniDrop&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;upload&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TINIDROP_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TINIDROP_API_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;set -euo pipefail&lt;/span&gt;
          &lt;span class="s"&gt;RESP=$(curl -sS -X POST https://tinidrop.com/api/upload \&lt;/span&gt;
            &lt;span class="s"&gt;-H "x-api-key: ${TINIDROP_API_KEY}" \&lt;/span&gt;
            &lt;span class="s"&gt;-F "file=@dist.zip")&lt;/span&gt;
          &lt;span class="s"&gt;echo "$RESP" | tee upload.json&lt;/span&gt;
          &lt;span class="s"&gt;URL=$(echo "$RESP" | jq -r '.url')&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "$URL" ] || [ "$URL" = "null" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Upload failed — check API key and plan"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
          &lt;span class="s"&gt;echo "url=$URL" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;
          &lt;span class="s"&gt;echo "Share URL: $URL"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Summary&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "### Build ready" &amp;gt;&amp;gt; "$GITHUB_STEP_SUMMARY"&lt;/span&gt;
          &lt;span class="s"&gt;echo "[Open share link](${{ steps.upload.outputs.url }})" &amp;gt;&amp;gt; "$GITHUB_STEP_SUMMARY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A green check on &lt;code&gt;main&lt;/code&gt; (or manual dispatch)
&lt;/li&gt;
&lt;li&gt;A clickable link in the Actions &lt;strong&gt;job summary&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No attachment bouncing through email size limits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bonus: comment the link on the pull request
&lt;/h2&gt;

&lt;p&gt;Useful when reviewers are not watching the Actions tab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PR preview link&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;synchronize&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;preview&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build + zip&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;mkdir -p dist &amp;amp;&amp;amp; cp -R public/* dist/ || true&lt;/span&gt;
          &lt;span class="s"&gt;# your build here…&lt;/span&gt;
          &lt;span class="s"&gt;cd dist &amp;amp;&amp;amp; zip -r ../preview.zip .&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;upload&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TINIDROP_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TINIDROP_API_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;RESP=$(curl -sS -X POST https://tinidrop.com/api/upload \&lt;/span&gt;
            &lt;span class="s"&gt;-H "x-api-key: ${TINIDROP_API_KEY}" \&lt;/span&gt;
            &lt;span class="s"&gt;-F "file=@preview.zip")&lt;/span&gt;
          &lt;span class="s"&gt;URL=$(echo "$RESP" | jq -r '.url')&lt;/span&gt;
          &lt;span class="s"&gt;echo "url=$URL" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Comment on PR&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/github-script@v7&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;const url = '${{ steps.upload.outputs.url }}';&lt;/span&gt;
            &lt;span class="s"&gt;github.rest.issues.createComment({&lt;/span&gt;
              &lt;span class="s"&gt;owner: context.repo.owner,&lt;/span&gt;
              &lt;span class="s"&gt;repo: context.repo.repo,&lt;/span&gt;
              &lt;span class="s"&gt;issue_number: context.issue.number,&lt;/span&gt;
              &lt;span class="s"&gt;body: `### Preview ready\n\nOpen the share link (view in browser):\n${url}`&lt;/span&gt;
            &lt;span class="s"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reviewers click once. They do not need a GitHub package download or a local unzip ritual.&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF decks and client ZIPs
&lt;/h2&gt;

&lt;p&gt;Same pattern, different artifact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pitch / proposal PDF&lt;/strong&gt; — export in CI or commit the latest PDF, upload, send the link before the call
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client deliverable ZIP&lt;/strong&gt; — zip the folder after &lt;code&gt;npm run build&lt;/code&gt;, upload, paste into email
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML prototype&lt;/strong&gt; — zip a folder that contains &lt;code&gt;index.html&lt;/code&gt;; the share link opens in the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you send it, check whether it was opened, then follow up with a specific next step — not “just checking if you got this.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardening checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Secret is &lt;code&gt;TINIDROP_API_KEY&lt;/code&gt; in GitHub — never in YAML
&lt;/li&gt;
&lt;li&gt;[ ] Key is Solo/Pro; rotate if a fork PR could have read it (prefer environment secrets with approval for forks)
&lt;/li&gt;
&lt;li&gt;[ ] Fail the job if &lt;code&gt;.url&lt;/code&gt; is missing — do not silently “succeed” with a broken handoff
&lt;/li&gt;
&lt;li&gt;[ ] For sensitive rounds, set &lt;strong&gt;password&lt;/strong&gt; and &lt;strong&gt;expiry&lt;/strong&gt; on the link from the dashboard after upload
&lt;/li&gt;
&lt;li&gt;[ ] Do not treat a share link as a substitute for Git — source stays in the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do recipients need an account?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. They open the link in a browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this a replacement for GitHub Releases?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Releases win for public versioned downloads. This wins for fast, private-ish handoffs to non-Git audiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What file types?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
PDF, ZIP, HTML/HTM, and common images. Keep the ZIP for small static previews; keep Git for real collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do I start without CI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt; → drop a file → copy the link. Wire Actions once the manual loop feels right.&lt;/p&gt;




&lt;p&gt;I am Santosh, co-founder of TiniDrop (Würzburg). If your team still pastes build ZIPs into Slack as attachments, say what you ship in the comments — CI preview, client ZIP, or deck — and we can compare notes on the handoff.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>github</category>
    </item>
    <item>
      <title>How to share a ZIP or PDF with a link (and upload via API)</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Wed, 14 Oct 2026 15:02:23 +0000</pubDate>
      <link>https://dev.to/tinidrop/view-only-document-links-design-notes-from-building-a-shareable-file-viewer-5ga9</link>
      <guid>https://dev.to/tinidrop/view-only-document-links-design-notes-from-building-a-shareable-file-viewer-5ga9</guid>
      <description>&lt;p&gt;You finish a build. You have a ZIP, a PDF deck, or a small HTML folder. Someone needs it &lt;em&gt;today&lt;/em&gt; — a client, a teammate, a reviewer.&lt;/p&gt;

&lt;p&gt;Opening a Git repo for that is overkill. Emailing a 40 MB attachment is how files get lost in spam and forwards.&lt;/p&gt;

&lt;p&gt;Here is a practical &lt;strong&gt;how-to&lt;/strong&gt;: turn the file into a link, optionally see if it was opened, and (if you automate builds) upload it with a short API call.&lt;/p&gt;

&lt;p&gt;I built this flow into &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; because I kept hitting the same wall as a founder in Würzburg: the work was done, the handoff was the painful part.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a link beats Git (and email)
&lt;/h2&gt;

&lt;p&gt;Use a share link when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The other person is not living in GitHub&lt;/li&gt;
&lt;li&gt;You are handing off a finished ZIP / PDF / prototype, not an ongoing repo&lt;/li&gt;
&lt;li&gt;You want a simple “did they open it?” signal&lt;/li&gt;
&lt;li&gt;You might want a password or an expiry on that one link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep Git for real source control. Use a link for the handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to share a file in three steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt; and sign in (a free account is enough to try).&lt;/li&gt;
&lt;li&gt;Drop your PDF, ZIP, HTML, or image onto the upload area.&lt;/li&gt;
&lt;li&gt;Copy the link. Send &lt;strong&gt;that&lt;/strong&gt; in email, Slack, or Teams — not the attachment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The recipient opens it in the browser. You keep the original file.&lt;/p&gt;

&lt;p&gt;That is the whole loop for most people. No deploy pipeline. No “please make a GitHub account.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: password and expiry
&lt;/h2&gt;

&lt;p&gt;For a deal round or a client preview, tighten the link:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a password if the URL might get forwarded&lt;/li&gt;
&lt;li&gt;Set an expiry if the round has an end date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need enterprise software for that. You need a link that matches the conversation you are having.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: upload from a script (API)
&lt;/h2&gt;

&lt;p&gt;If your artifact already exists after CI, skip the UI and upload from a shell step.&lt;/p&gt;

&lt;p&gt;Generate an API key from your TiniDrop dashboard (available on Solo / Pro), then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://tinidrop.com/api/upload &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@dist.zip"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON response includes a shareable URL. Example shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# pseudo: capture URL from the response, then notify&lt;/span&gt;
&lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://tinidrop.com/api/upload &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: &lt;/span&gt;&lt;span class="nv"&gt;$TINIDROP_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@dist.zip"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.url'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Build ready: &lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nightly build ZIPs&lt;/li&gt;
&lt;li&gt;Client-ready PDF exports after a docs job&lt;/li&gt;
&lt;li&gt;Distributing a small static preview without opening a new repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put the key in your CI secrets. Never commit it. Rotate it if it leaks — same hygiene as any other token.&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF decks: send a link, then follow up with context
&lt;/h2&gt;

&lt;p&gt;Pitch decks and proposals die in attachment land. A cleaner habit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload the PDF&lt;/li&gt;
&lt;li&gt;Send the link before the call&lt;/li&gt;
&lt;li&gt;After the call, check whether it was opened&lt;/li&gt;
&lt;li&gt;Follow up with a specific next step — not “just checking if you got this”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You still cannot stop screenshots. You &lt;em&gt;can&lt;/em&gt; stop blindly shipping the original into every inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  ZIP of a small site
&lt;/h2&gt;

&lt;p&gt;Got a folder with &lt;code&gt;index.html&lt;/code&gt;? Zip it, upload, share the link. Handy for prototypes and client previews when “clone this repo” is the wrong ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do recipients need an account?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. They open the link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this a replacement for GitHub Releases?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No. Releases win for ongoing open-source versioning. This wins for fast handoffs and non-Git audiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about huge files?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Start on free for small ZIPs/PDFs. Step up a plan when you need larger uploads or longer-lived links. Pricing is on &lt;a href="https://tinidrop.com/pricing" rel="noopener noreferrer"&gt;tinidrop.com/pricing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do I start?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt; → drop a file → copy the link. Wire the API later if your builds are already automated.&lt;/p&gt;




&lt;p&gt;I am Santosh, co-founder of TiniDrop. If attachments keep failing your workflow — CI artifacts, client ZIPs, pitch decks — say what you are sending in the comments and we can compare notes.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Document rooms that tell you who opened the file</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sat, 03 Oct 2026 16:12:49 +0000</pubDate>
      <link>https://dev.to/tinidrop/document-rooms-that-tell-you-who-opened-the-file-4j9</link>
      <guid>https://dev.to/tinidrop/document-rooms-that-tell-you-who-opened-the-file-4j9</guid>
      <description>&lt;p&gt;A data room used to mean a vendor, a week of setup, and a folder tree nobody wanted to maintain.&lt;/p&gt;

&lt;p&gt;Founders still need the same job: put the important files in one place, send one link, know who went in.&lt;/p&gt;

&lt;p&gt;That is a &lt;strong&gt;document room&lt;/strong&gt;. Not a second Dropbox. A room with a pulse.&lt;/p&gt;

&lt;h2&gt;
  
  
  One room. Many files. One story.
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; a room holds the files for a deal, a hire, a client, or a round.&lt;/p&gt;

&lt;p&gt;You do not email five attachments and hope they land in the same thread. You send the room. The other side opens what they need. You see which files they opened, how long they stayed, and whether they came back.&lt;/p&gt;

&lt;p&gt;That changes the follow-up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They spent twelve minutes on the model and skipped the deck → talk numbers.&lt;/li&gt;
&lt;li&gt;They never opened the NDA → do not pitch the product yet.&lt;/li&gt;
&lt;li&gt;They returned twice after the call → they are still in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Controls that belong on the link, not in a PDF
&lt;/h2&gt;

&lt;p&gt;Rooms only work if the link is not a zip of copies.&lt;/p&gt;

&lt;p&gt;On a TiniDrop room you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep files &lt;strong&gt;view-only&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;password the link&lt;/li&gt;
&lt;li&gt;expire access when the process ends&lt;/li&gt;
&lt;li&gt;separate who can see which file&lt;/li&gt;
&lt;li&gt;watch activity instead of guessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The file never has to leave. The room can be unplugged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Not "enterprise content platforms."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a founder sending a round&lt;/li&gt;
&lt;li&gt;an agency handing a delivery&lt;/li&gt;
&lt;li&gt;a lawyer sharing a draft&lt;/li&gt;
&lt;li&gt;a hiring manager sending a take-home that should not leak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have more than one file and you care who opened it, you already have a room. You are just running it in Gmail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one deal
&lt;/h2&gt;

&lt;p&gt;Pick the next process that would hurt if the files leaked or sat unread.&lt;/p&gt;

&lt;p&gt;Put them in a room. Send the link. Watch what happens after you send.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>View-only sharing — they can read it. They don't get the original.</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sat, 03 Oct 2026 16:06:27 +0000</pubDate>
      <link>https://dev.to/tinidrop/view-only-sharing-they-can-read-it-they-dont-get-the-original-25d7</link>
      <guid>https://dev.to/tinidrop/view-only-sharing-they-can-read-it-they-dont-get-the-original-25d7</guid>
      <description>&lt;p&gt;Most "secure sharing" still gives the other person a file.&lt;/p&gt;

&lt;p&gt;They click. The browser downloads. Now there are two copies. Then twenty, if they forward it.&lt;/p&gt;

&lt;p&gt;View-only sharing is the opposite idea: &lt;strong&gt;the document renders in the browser. The original stays with you.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What view-only actually does
&lt;/h2&gt;

&lt;p&gt;On &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt;, view-only means we hide the download control on the shared link (Solo and above). The recipient reads the PDF in the viewer. They do not get a one-click &lt;code&gt;.pdf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What it does &lt;strong&gt;not&lt;/strong&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stop a screenshot&lt;/li&gt;
&lt;li&gt;stop someone photographing the screen&lt;/li&gt;
&lt;li&gt;stop a determined person with developer tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone who claims otherwise is selling you a feeling. We would rather be precise.&lt;/p&gt;

&lt;p&gt;View-only is for the common case: a founder, a lawyer, an agency client, a hiring manager. People who will not reverse-engineer your viewer. People who &lt;em&gt;will&lt;/em&gt; hit Download if you put the button there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the viewer has to be the product
&lt;/h2&gt;

&lt;p&gt;If the fallback is "download to open," view-only is fake.&lt;/p&gt;

&lt;p&gt;The link has to open a real reading experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDFs in the browser&lt;/li&gt;
&lt;li&gt;HTML and ZIP sites as a live page&lt;/li&gt;
&lt;li&gt;images without a save prompt as the first action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the share is a session, not a file transfer. Analytics attach to that session. Password and expiry attach to that session. You can kill the link without asking anyone to delete an attachment they already have.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I turn it on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;fundraising decks&lt;/li&gt;
&lt;li&gt;unreleased product specs&lt;/li&gt;
&lt;li&gt;contractor briefs&lt;/li&gt;
&lt;li&gt;anything I would regret seeing in a Slack screenshot tomorrow with my filename on it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I want a signature, I do not use view-only as the close. I send an agreement on the same file. Read, then sign. Still one link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the difference
&lt;/h2&gt;

&lt;p&gt;Upload a PDF you would normally attach. Share the link. Turn download off.&lt;/p&gt;

&lt;p&gt;They can read it. They don't get the original.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>What happens after you send the deck</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:59:31 +0000</pubDate>
      <link>https://dev.to/tinidrop/what-happens-after-you-send-the-deck-4o8p</link>
      <guid>https://dev.to/tinidrop/what-happens-after-you-send-the-deck-4o8p</guid>
      <description>&lt;p&gt;You send the pitch. Then you wait.&lt;/p&gt;

&lt;p&gt;Was it opened? Did they skim slide one and bounce? Did they come back at 11pm and sit on the financials?&lt;/p&gt;

&lt;p&gt;Email cannot tell you. Drive "anyone with the link" cannot tell you. WhatsApp definitely cannot tell you.&lt;/p&gt;

&lt;p&gt;Silence is not a signal. Silence is missing data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The file is not the product. The session is.
&lt;/h2&gt;

&lt;p&gt;A shared document has a life after send:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first open&lt;/li&gt;
&lt;li&gt;time on page&lt;/li&gt;
&lt;li&gt;which pages they actually read&lt;/li&gt;
&lt;li&gt;whether they came back&lt;/li&gt;
&lt;li&gt;whether they downloaded a copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the conversation. The PDF is just the medium.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; records that session on every shared link. You see when someone opened it. On higher plans you see page-level time, email alerts when they show up, and who came through a personalised link.&lt;/p&gt;

&lt;p&gt;You follow up because they read it — or you stop chasing because they did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  A link you can unplug
&lt;/h2&gt;

&lt;p&gt;Attachments cannot be recalled. Links can.&lt;/p&gt;

&lt;p&gt;If the round closed, the contractor finished, or the wrong person got the URL, you expire it. You password it. You turn download off.&lt;/p&gt;

&lt;p&gt;View-only is not a vault. A determined person can still photograph a screen. Treat it as friction: enough that a casual forward does not hand over the original.&lt;/p&gt;

&lt;p&gt;That is the correct security model for a deck, not theatre.&lt;/p&gt;

&lt;h2&gt;
  
  
  After you send, you should know
&lt;/h2&gt;

&lt;p&gt;The product thesis is one sentence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share a file. See who opened it. Keep it view-only.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything else — rooms, signatures, watermarks — is that sentence under more pressure.&lt;/p&gt;

&lt;p&gt;If you send work that matters, stop treating "delivered" as "read."&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I stopped attaching the file. I send a link instead.</title>
      <dc:creator>TiniDrop</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:58:31 +0000</pubDate>
      <link>https://dev.to/tinidrop/i-stopped-attaching-the-file-i-send-a-link-instead-54ec</link>
      <guid>https://dev.to/tinidrop/i-stopped-attaching-the-file-i-send-a-link-instead-54ec</guid>
      <description>&lt;p&gt;Every important file I sent used to leave as an attachment.&lt;/p&gt;

&lt;p&gt;Pitch deck. Proposal. Contract. A ZIP of a prototype.&lt;/p&gt;

&lt;p&gt;The other person got a copy. I lost the original the moment I hit send. If they forwarded it, I would never know. If they never opened it, I would sit in the dark and follow up anyway.&lt;/p&gt;

&lt;p&gt;That is a bad way to run a deal. It is also how almost everyone still shares work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attachment is the product leaving the building
&lt;/h2&gt;

&lt;p&gt;An email attachment is not a share. It is a handoff.&lt;/p&gt;

&lt;p&gt;Once the PDF sits in someone else's Downloads folder, you cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;see whether they opened it&lt;/li&gt;
&lt;li&gt;see how long they stayed&lt;/li&gt;
&lt;li&gt;stop a casual download&lt;/li&gt;
&lt;li&gt;take the link back if the round moved on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can send a newer version. They will still have the old one. You can write "confidential" on slide one. That does not make the file confidential.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;TiniDrop&lt;/a&gt; for the moment after send — the part most tools ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  One link. The file stays with you.
&lt;/h2&gt;

&lt;p&gt;The workflow is intentionally small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drop a PDF, ZIP, HTML page, or image.&lt;/li&gt;
&lt;li&gt;Get a short link.&lt;/li&gt;
&lt;li&gt;Share the link. Not the file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The recipient opens it in the browser. You keep the original.&lt;/p&gt;

&lt;p&gt;On paid plans you can turn the link &lt;strong&gt;view-only&lt;/strong&gt;, add a password, set expiry, and see who opened it. Free is enough to feel the difference: a live URL in seconds, a view count, no infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I refused to build
&lt;/h2&gt;

&lt;p&gt;I did not want another "all-in-one workspace."&lt;/p&gt;

&lt;p&gt;Founders do not need a CMS to send a deck. Agencies do not need a VPS to show a client a page. Students do not need Git to host an HTML assignment.&lt;/p&gt;

&lt;p&gt;They need a clean URL, a viewer that actually renders, and a way to know the other side showed up.&lt;/p&gt;

&lt;p&gt;TiniDrop is document intelligence for that moment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Share&lt;/strong&gt; — a link instead of an attachment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track&lt;/strong&gt; — opens, time on page, return visits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt; — view-only, password, expiry, document rooms&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Upload something you would normally attach.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinidrop.com" rel="noopener noreferrer"&gt;tinidrop.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the link feels better than the attachment, you already understand the product.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
