<?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: Ali Raza</title>
    <description>The latest articles on DEV Community by Ali Raza (@aliirz).</description>
    <link>https://dev.to/aliirz</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%2F360533%2F9ac51469-8688-4fc1-a7f8-9b8150938feb.jpg</url>
      <title>DEV Community: Ali Raza</title>
      <link>https://dev.to/aliirz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aliirz"/>
    <language>en</language>
    <item>
      <title>I built a file transfer tool that can’t spy on you even if it wanted to</title>
      <dc:creator>Ali Raza</dc:creator>
      <pubDate>Thu, 26 Mar 2026 10:50:55 +0000</pubDate>
      <link>https://dev.to/aliirz/i-built-a-file-transfer-tool-that-cant-spy-on-you-even-if-it-wanted-to-2p39</link>
      <guid>https://dev.to/aliirz/i-built-a-file-transfer-tool-that-cant-spy-on-you-even-if-it-wanted-to-2p39</guid>
      <description>&lt;p&gt;I got tired of explaining privacy policies to people.&lt;/p&gt;

&lt;p&gt;Every time I needed to send a file to someone, I had to pick a service and implicitly trust it. Trust that it wasn’t reading my files. Trust that it wasn’t training a model on my documents. Trust that when it said “we don’t look at your stuff” it actually meant it.&lt;/p&gt;

&lt;p&gt;I couldn’t verify any of that. Neither could you.&lt;br&gt;
So I built phntm.sh. And I want to be honest about what it is, what it isn’t, and where it’s still rough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;Zero-knowledge means the server genuinely cannot read your files. Not “won’t.” Cannot.&lt;/p&gt;

&lt;p&gt;Here’s how it works. When you drop a file into phntm, your browser generates a 256-bit AES key. The file gets encrypted client-side with AES-256-GCM before a single byte leaves your machine. Only the ciphertext goes to the server. The decryption key gets embedded in the URL fragment, the part after the #.&lt;/p&gt;

&lt;p&gt;Here’s the important bit. Browsers never include the fragment in HTTP requests. It’s in the spec. RFC 3986. When you share a phntm link, the recipient’s browser downloads the ciphertext and decrypts it locally using the key from the fragment. My server never sees the key. Ever.&lt;/p&gt;

&lt;p&gt;I store noise. Without the key, the ciphertext is mathematically useless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open source
&lt;/h2&gt;

&lt;p&gt;Because “trust us” is not an architecture.&lt;/p&gt;

&lt;p&gt;I open-sourced both the web app and the CLI so you can verify the claims yourself. Don’t take my word for it. Read the crypto layer. Check that the key never gets sent anywhere. That’s the only honest thing to do when you’re making security claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rough edges, and I mean it
&lt;/h2&gt;

&lt;p&gt;I’m being honest here because this is build in public, not a product launch.&lt;/p&gt;

&lt;p&gt;The encryption buffers the whole file in memory. For large files that’s a problem. I know. It’s on the list.&lt;/p&gt;

&lt;p&gt;The CLI flag parsing is basic. I rolled it myself instead of using a library, which was a good learning exercise but means it’s not as robust as it should be.&lt;/p&gt;

&lt;p&gt;I had Vercel Analytics on the page. A commenter flagged it and they were right to. The RFC holds. browsers don't send fragments in HTTP requests. But Vercel Analytics reads location.href client-side, which includes the hash, and POSTs it to their endpoint. That's a problem when the hash is your decryption key.&lt;/p&gt;

&lt;p&gt;Fixed with a beforeSend hook that strips the fragment before the event fires. Lesson learned: audit every third party script when you're making security claims, including the ones you added without thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it’s good for right now
&lt;/h2&gt;

&lt;p&gt;Sending a file to someone who doesn’t have any tools installed. They get a link, they click it, it decrypts in their browser, it downloads. No account. No app. No signup.&lt;/p&gt;

&lt;p&gt;The file self-destructs when the timer expires. Nothing to breach after that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building this
&lt;/h2&gt;

&lt;p&gt;I built the CLI in Go as my first real Go project. Not a tutorial project. Something I’d actually use.&lt;/p&gt;

&lt;p&gt;The thing that made Go’s I/O model click for me was wrapping io.Reader to build a progress bar. The HTTP client does io.Copy and the bar updates itself as bytes flow through. Small thing but it changed how I think about composability.&lt;/p&gt;

&lt;p&gt;The whole CLI is stdlib-only. No external deps. That was a deliberate choice and also a good constraint for learning.&lt;/p&gt;

&lt;p&gt;Where it lives&lt;br&gt;
&lt;a href="https://phntm.sh" rel="noopener noreferrer"&gt;https://phntm.sh&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/aliirz/phntm.sh" rel="noopener noreferrer"&gt;https://github.com/aliirz/phntm.sh&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/aliirz/phntm-cli" rel="noopener noreferrer"&gt;https://github.com/aliirz/phntm-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome. Especially on the crypto layer.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Weekend Warrior Epidemic</title>
      <dc:creator>Ali Raza</dc:creator>
      <pubDate>Wed, 23 Oct 2024 15:02:01 +0000</pubDate>
      <link>https://dev.to/aliirz/the-weekend-warrior-epidemic-1lp8</link>
      <guid>https://dev.to/aliirz/the-weekend-warrior-epidemic-1lp8</guid>
      <description>&lt;p&gt;The weekend warrior – a mythical creature feared by startups everywhere. You know them: the founders who insist on releasing software updates, shipping new features, or pushing out big announcements on a Saturday afternoon.&lt;/p&gt;

&lt;p&gt;It may seem like a harmless habit to some, but trust me, it's a recipe for disaster. I don't think you should release it on a weekend. Here is why:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Anatomy of a Weekend Release
&lt;/h2&gt;

&lt;p&gt;So, what makes a weekend release? Is it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Releasing new features or software updates?&lt;/li&gt;
&lt;li&gt;Announcing big news or partnerships?&lt;/li&gt;
&lt;li&gt;Shipping out a critical patch to fix a major bug?&lt;/li&gt;
&lt;li&gt;Something else entirely?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever it is, it's usually happening on a Saturday afternoon – when everyone's supposed to be relaxing and having fun (not you, the founder).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Risks of Weekend Releases
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Founders who release on weekends are often sacrificing precious time with their loved ones for the sake of work. Burnout is real, people! Don't make your team suffer for your ambition.&lt;/li&gt;
&lt;li&gt;With reduced testing windows, bugs and issues can slip through the cracks, leaving a bad taste in customers' mouths.&lt;/li&gt;
&lt;li&gt;Who wants to test out new features on a Saturday? Nobody! Make sure your users are comfortable and supported before launching something new.&lt;/li&gt;
&lt;li&gt;Weekend releases bring increased support requests from frustrated users. You didn't think you'd be getting 200 emails at 3 a.m., did you?&lt;/li&gt;
&lt;li&gt;When the founder is always "on," it can create an unhealthy work-life balance for your team members. They'll start to feel like they're working overtime without a break.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Consequences of Weekend Warrior Syndrome
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Delayed releases: Don't push out if something's not ready. It's better to be late than to risk hurting your users.&lt;/li&gt;
&lt;li&gt;Lost momentum: Regular weekend releases can create an expectation that you're always "on" and available. This can make it difficult to plan for future milestones or take breaks when needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Breaking the Weekend Warrior Cycle
&lt;/h2&gt;

&lt;p&gt;So, how do you break free from this toxic cycle? Here are a few tips:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Communicate with your team&lt;/strong&gt;: Let them know what's coming up and when.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule release windows&lt;/strong&gt;: Plan ahead and choose the best days for everyone (not just weekends).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test early and often&lt;/strong&gt;: Reduce the likelihood of releasing bugs or issues by testing throughout the week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take breaks and prioritize self-care&lt;/strong&gt;: Remember, you're human too! Take time to relax and recharge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While the urge to release can sometimes be overwhelming, remember that your team's well-being is as important as your company's success. Don't let the weekend warrior epidemic sabotage your startup – take control of your schedule and prioritize what matters most: your users and your team.&lt;/p&gt;

&lt;p&gt;So, plan a Sunday Funday (minus the coding). Your company – and your sanity – will thank you.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>webdev</category>
      <category>release</category>
    </item>
    <item>
      <title>Up and running with TimescaleDB</title>
      <dc:creator>Ali Raza</dc:creator>
      <pubDate>Tue, 07 Apr 2020 19:28:43 +0000</pubDate>
      <link>https://dev.to/aliirz/up-and-running-with-timescaledb-15oa</link>
      <guid>https://dev.to/aliirz/up-and-running-with-timescaledb-15oa</guid>
      <description>&lt;p&gt;I've been getting into time-series databases over the past few months. I got into playing with TimescaleDB and was super impressed with its capabilities. One of the important things to understand is that TimescaleDB is just Postgres at its core which means technically TimescaleDB is an extension. Following is my usual MO to quickly run an instance of TimescaleDB.&lt;/p&gt;

&lt;p&gt;Getting a docker container up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; timescaledb &lt;span class="nt"&gt;-p&lt;/span&gt; 5434:5434 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password timescale/timescaledb:latest-pg11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connecting to said docker container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; timescaledb psql &lt;span class="nt"&gt;-U&lt;/span&gt; postgres

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creating your database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt; &lt;span class="n"&gt;tstutorial&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connecting to your new database:&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="se"&gt;\c&lt;/span&gt; tstutorial
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding the TimescaleDB extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;timescaledb&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Now you have a dockerized TimescaleDB instance up and running.&lt;/p&gt;

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