<?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: Sandro Hu</title>
    <description>The latest articles on DEV Community by Sandro Hu (@oranguengineer).</description>
    <link>https://dev.to/oranguengineer</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%2F3902487%2F77dd7589-f340-4f9b-b3f5-82de1cb31461.jpeg</url>
      <title>DEV Community: Sandro Hu</title>
      <link>https://dev.to/oranguengineer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oranguengineer"/>
    <language>en</language>
    <item>
      <title>Building WeRemember in Public — Day 1: Django project setup</title>
      <dc:creator>Sandro Hu</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:37:09 +0000</pubDate>
      <link>https://dev.to/oranguengineer/building-weremember-in-public-day-1-django-project-setup-25ia</link>
      <guid>https://dev.to/oranguengineer/building-weremember-in-public-day-1-django-project-setup-25ia</guid>
      <description>&lt;p&gt;Issue #1 is closed. WeRemember has a running Django server — and every decision made here will affect every line of code that follows, so they're worth documenting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I set up
&lt;/h2&gt;

&lt;p&gt;A minimal but intentional Django project structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/strong&gt; as package manager — fast, modern, handles virtualenv automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.12&lt;/strong&gt; pinned via &lt;code&gt;.python-version&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split settings&lt;/strong&gt; — &lt;code&gt;base.py&lt;/code&gt;, &lt;code&gt;development.py&lt;/code&gt;, &lt;code&gt;production.py&lt;/code&gt; living in &lt;code&gt;config/settings/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;django-environ&lt;/code&gt;&lt;/strong&gt; for environment variables with an &lt;code&gt;APP_&lt;/code&gt; prefix convention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;apps/&lt;/code&gt;&lt;/strong&gt; directory as a placeholder for future Django apps
## The decisions that matter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;uv&lt;/code&gt; instead of &lt;code&gt;pip&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One tool for everything — dependencies, virtualenv, Python version.&lt;br&gt;&lt;br&gt;
No more &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;python -m venv&lt;/code&gt;, &lt;code&gt;source .venv/bin/activate&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Just &lt;code&gt;uv add&lt;/code&gt; and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why split settings from day one?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It costs almost nothing now and saves a painful refactor later.&lt;br&gt;&lt;br&gt;
&lt;code&gt;manage.py&lt;/code&gt; defaults to &lt;code&gt;development&lt;/code&gt;, &lt;code&gt;wsgi.py&lt;/code&gt; defaults to &lt;code&gt;production&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Switch environments with &lt;code&gt;DJANGO_SETTINGS_MODULE&lt;/code&gt; — no code changes needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why the &lt;code&gt;APP_&lt;/code&gt; prefix?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;SECRET_KEY&lt;/code&gt; and &lt;code&gt;DEBUG&lt;/code&gt; are common variable names. Prefixing with &lt;code&gt;APP_&lt;/code&gt;&lt;br&gt;&lt;br&gt;
avoids collisions with system or shell variables and makes it immediately&lt;br&gt;&lt;br&gt;
clear what belongs to WeRemember.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;config/&lt;/code&gt; instead of &lt;code&gt;we_remember/&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Django's &lt;code&gt;startproject&lt;/code&gt; creates a folder with the project name.&lt;br&gt;&lt;br&gt;
Renaming it to &lt;code&gt;config/&lt;/code&gt; separates configuration from application code —&lt;br&gt;&lt;br&gt;
a common convention that makes the structure easier to navigate.&lt;/p&gt;

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

&lt;p&gt;Issue #2: full application containerization.&lt;br&gt;&lt;br&gt;
Django production-ready with Gunicorn and Docker — with a health check endpoint and a smoke test to verify it all works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Post #2 of the WeRemember build-in-public series.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Short updates on &lt;a href="https://x.com/OranguEngineer" rel="noopener noreferrer"&gt;X&lt;/a&gt; | Articles on &lt;a href="https://dev.to/OranguEngineer"&gt;dev.to&lt;/a&gt; | Code on &lt;a href="https://github.com/OranguEngineer/we-remember" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>django</category>
      <category>python</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Building WeRemember in Public — Day 0: Why I'm building it and where it starts</title>
      <dc:creator>Sandro Hu</dc:creator>
      <pubDate>Tue, 28 Apr 2026 19:33:43 +0000</pubDate>
      <link>https://dev.to/oranguengineer/building-weremember-in-public-day-0-why-another-calendar-app-39f7</link>
      <guid>https://dev.to/oranguengineer/building-weremember-in-public-day-0-why-another-calendar-app-39f7</guid>
      <description>&lt;p&gt;I've tried a lot of calendar tools. They all work. None of them feel right.&lt;/p&gt;

&lt;p&gt;Not because they're broken — but because they're built like infrastructure. Grids, boxes, alerts. They remind you that something exists, but they don't help you stay on top of what actually matters. Using them feels like filing paperwork, not managing your life.&lt;/p&gt;

&lt;p&gt;I wanted something that felt more like a smart friend and less like a database with a UI.&lt;/p&gt;

&lt;p&gt;So I started building it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ideas that shape every decision
&lt;/h2&gt;

&lt;p&gt;I'm tired of tools that remind me &lt;em&gt;that&lt;/em&gt; something exists without helping me understand &lt;em&gt;why&lt;/em&gt; it matters. I want semantic search not because it's a cool feature — but because "dentist" and "annual checkup" are the same thing and no calendar I've used treats them that way.&lt;/p&gt;

&lt;p&gt;I don't want to chase information across five different apps to prepare for a meeting or remember a deadline. The plugin system exists for exactly that reason: bring the context to the calendar, not the other way around. Your tools should talk to each other so you don't have to be the middleman.&lt;/p&gt;

&lt;p&gt;And when WeRemember reminds you of something, it shouldn't sound like a system alert. A job interview tomorrow deserves a different message than a dentist appointment. A friend who remembers your life doesn't just ping you — they say the right thing at the right moment. That's the tone I'm going for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Day 0 actually looks like
&lt;/h2&gt;

&lt;p&gt;No Django yet. Just three files: a README, a license, and a &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That order is intentional.&lt;/p&gt;

&lt;p&gt;The README came first because writing &lt;em&gt;why&lt;/em&gt; the project exists before touching any code forces clarity. If you can't explain it in a paragraph, you don't understand it well enough to build it yet.&lt;/p&gt;

&lt;p&gt;The license is AGPL-3.0 — not MIT. MIT lets anyone take your code, close it, and run it as a SaaS without giving anything back. AGPL closes that gap: modify WeRemember and run it as a service, and you must release your changes. For an open-source SaaS, that's not a detail — it's the point.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.gitignore&lt;/code&gt; is invisible work. But without it, the first real commit becomes a mess of &lt;code&gt;__pycache__&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt; files you spend an hour untangling.&lt;/p&gt;

&lt;p&gt;Small things. Intentional ones.&lt;/p&gt;

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

&lt;p&gt;Django project setup — &lt;code&gt;uv&lt;/code&gt;, split settings, environment conventions. The foundation that makes everything else possible cleanly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Post #1 of the WeRemember build-in-public series.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Short updates on &lt;a href="https://x.com/OranguEngineer" rel="noopener noreferrer"&gt;X&lt;/a&gt; | Articles on &lt;a href="https://dev.to/OranguEngineer"&gt;dev.to&lt;/a&gt; | Code on &lt;a href="https://github.com/OranguEngineer/we-remember" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>saas</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
