<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://kelvinwong.ca/">
  <title>Kelvin Wong&#39;s Blog</title>
  <subtitle>Thoughts on Django and Web Development</subtitle>
  <link href="https://kelvinwong.ca/feed.xml" rel="self"/>
  <link href="https://kelvinwong.ca/"/>
  <updated>2026-07-26T00:00:00Z</updated>
  <id>https://kelvinwong.ca/</id>
  <author>
    <name>Kelvin Wong</name>
    <email>code@kelvinwong.ca</email>
  </author>
  <entry>
    <title>Keep User Files Private in Django 6.0</title>
    <link href="https://kelvinwong.ca/blog/2026/keep-user-files-private-in-django-6-0/"/>
    <updated>2026-04-30T00:00:00Z</updated>
    <id>https://kelvinwong.ca/blog/2026/keep-user-files-private-in-django-6-0/</id>
    <content type="html">Use FileField for protected downloads: a walkthrough using CreateView and ListView.</content>
  </entry>
  <entry>
    <title>How To Stop Your Vibe-Coded Django App From Breaking</title>
    <link href="https://kelvinwong.ca/blog/2026/how-to-stop-your-vibe-coded-django-app-from-breaking/"/>
    <updated>2026-06-10T00:00:00Z</updated>
    <id>https://kelvinwong.ca/blog/2026/how-to-stop-your-vibe-coded-django-app-from-breaking/</id>
    <content type="html">Traction on a broken vibe-coded app is actually an awesome problem to have.</content>
  </entry>
  <entry>
    <title>Django User Avatar Upload Tutorial: Complete ImageField Guide For Django 6.0</title>
    <link href="https://kelvinwong.ca/blog/2026/django-user-avatar-upload-tutorial-complete-imagefield-guide-for-django-6-0/"/>
    <updated>2026-07-26T00:00:00Z</updated>
    <id>https://kelvinwong.ca/blog/2026/django-user-avatar-upload-tutorial-complete-imagefield-guide-for-django-6-0/</id>
    <content type="html">Trying to figure out why your Django image uploads aren&#39;t working? Here&#39;s my complete solution.</content>
  </entry>
</feed>
