<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Building Cozy Weather]]></title><description><![CDATA[Building Cozy Weather]]></description><link>https://blog.cozyweather.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 23:46:11 GMT</lastBuildDate><atom:link href="https://blog.cozyweather.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[AI has entered the chat]]></title><description><![CDATA[🚀 Built a Full Stack App with GitHub Copilot – Lessons Learned
I put GitHub Copilot to the test by generating a full-stack project—a .NET Web API and an Angular frontend. The results? A mix of efficiency and reminders that best practices and pattern...]]></description><link>https://blog.cozyweather.com/ai-has-entered-the-chat</link><guid isPermaLink="true">https://blog.cozyweather.com/ai-has-entered-the-chat</guid><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sun, 23 Feb 2025 14:24:24 GMT</pubDate><content:encoded><![CDATA[<p>🚀 <strong>Built a Full Stack App with GitHub Copilot – Lessons Learned</strong></p>
<p>I put GitHub Copilot to the test by generating a full-stack project—a .NET Web API and an Angular frontend. The results? A mix of efficiency and reminders that <strong>best practices and patterns still matter</strong>.</p>
<p>💡 <strong>Observations:</strong><br />✅ Copilot will generate the simplest implementation unless you prompt it with clear, structured instructions.<br />✅ Without guidance, it might use <strong>incompatible syntax</strong>.<br />✅ Everything in one file? Yep, it put the entire C# API in <code>Program.cs</code> and the Angular app in <code>AppComponent</code>.<br />✅ It <strong>passed objects around directly in the API</strong>, skipping best practices like DTOs.<br />✅ It <strong>applied inline styles</strong> in the Angular template instead of using proper CSS or component styling.<br />✅ The <strong>CSS it generated had duplicate entries for the same class</strong>, leading to unnecessary bloat.<br />✅ It actually <strong>walked me through setting up CI/CD with GitHub Actions</strong> and how to <strong>configure a DigitalOcean Droplet</strong> for deployment.</p>
<p><strong>The takeaway?</strong> AI-assisted coding is powerful, but <strong>best practices, patterns, and SOLID principles still matter</strong>. We need to understand the tools, refine our prompts, and guide AI to build maintainable solutions.</p>
<p>🔧 Keep learning. Keep improving. AI won’t replace good developers—it will amplify the ones who know how to use it effectively.</p>
<p>#AI #GitHubCopilot #DotNet #Angular #SoftwareEngineering #GitHubActions #DevOps #DigitalOcean #KeepLearning</p>
<p>Check out the revamped site: <a target="_blank" href="https://cozyweather.com">https://cozyweather.com</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1741001566968/d5ec226e-da22-4945-8380-1f1dcb782cb9.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Maps revisited]]></title><description><![CDATA[I've been thinking about maps a lot lately.  How can we visualize feels like weather in an intuitive way?  
I've landed on using something like Uber's Hexagonal Hierarchical Spatial Index (H3) to aggregate weather data and then classify each hexagon ...]]></description><link>https://blog.cozyweather.com/maps-revisited</link><guid isPermaLink="true">https://blog.cozyweather.com/maps-revisited</guid><category><![CDATA[Software Engineering]]></category><category><![CDATA[Geospatial]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Wed, 06 Apr 2022 23:18:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649286845072/28ACsK8Zb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've been thinking about maps a lot lately.  How can we visualize feels like weather in an intuitive way?  </p>
<p>I've landed on using something like Uber's <a target="_blank" href="https://eng.uber.com/h3/">Hexagonal Hierarchical Spatial Index (H3)</a> to aggregate weather data and then classify each hexagon as feeling freezing, cold, cool, perfect, warm, hot, swampy, or scorching - for the whole globe - based on your "personalized feels like" profile.</p>
<p>At a high level, I'm thinking:</p>
<ul>
<li>according to the user's current bounding box / zoom level (what you see on the map) call out to a service to individually get near real-time temp, wind speed, humidity, etc intensity grids</li>
<li>aggregate these grids to intermediate output H3 cells</li>
<li>apply an algorithm to the H3 intermediate output cells to calculate "personalized feels like" values for each cell, outputting the final feels like cells</li>
</ul>
<p>In other words, raw weather grids -&gt; transformed into aggregated hexagons -&gt; matrix math across each weather factor (temp, wind, etc) for each location = final feels like weather hexagons.</p>
<p>Not sure how I'm going to do that in real-time from a technical standpoint.  But that's the fun in this :D</p>
]]></content:encoded></item><item><title><![CDATA[More than just a landing page]]></title><description><![CDATA[The initial basic design is starting to gel a little bit.  Just keeping it simple for starters with:

Social sign on
Current weather map
Ability to create your own weather profile
View detailed and personalized weather forecasts

Check it out at http...]]></description><link>https://blog.cozyweather.com/more-than-just-a-landing-page</link><guid isPermaLink="true">https://blog.cozyweather.com/more-than-just-a-landing-page</guid><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sun, 19 Dec 2021 01:22:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1639876743640/T6ewXbf1_.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The initial basic design is starting to gel a little bit.  Just keeping it simple for starters with:</p>
<ul>
<li>Social sign on</li>
<li>Current weather map</li>
<li>Ability to create your own weather profile</li>
<li>View detailed and personalized weather forecasts</li>
</ul>
<p>Check it out at https://cozyweather.com/</p>
]]></content:encoded></item><item><title><![CDATA[Cost management]]></title><description><![CDATA[On October 4th, I enabled a monitoring service that automatically pings the website every hour and reports back to me if the site is down. I didn't anticipate that this would drive up Azure App Services costs so much. Who knew!? 

I could reduce the ...]]></description><link>https://blog.cozyweather.com/cost-management</link><guid isPermaLink="true">https://blog.cozyweather.com/cost-management</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Azure]]></category><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sat, 13 Nov 2021 15:06:37 GMT</pubDate><content:encoded><![CDATA[<p>On October 4th, I enabled a monitoring service that automatically pings the website every hour and reports back to me if the site is down. I didn't anticipate that this would drive up Azure App Services costs so much. Who knew!? </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636815704691/1I67U6tw7.png" alt="image.png" /></p>
<p>I could reduce the costs in a number of different ways.  Probably the easiest is by scaling down the service plan that the site is running on to have fewer resources.</p>
<p>The chart below shows that I was getting pretty similar charges for US east and central last month (the donut chart in the bottom middle), which is surprising to me.  I thought my scale out settings were set to only run one node, so I expected to only see charges for US east.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636815191019/fXCitVNdG.png" alt="costs.png" /></p>
<p>After digging into a little more, I'm thinking the load from the new monitoring service wasn't the source of the increased costs.  I think I made some other inadvertent change to the service around the same time, that made a second node spin up in US central.  Not good!  </p>
<p>This is corrected now and I'm only seeing charges for US east now.  I've added a hard budget for the Azure subscription and have setup email alerts at 75% and 95% of the budget, so I shouldn't get any surprises going forward.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636815065743/32cNjxgzm.png" alt="costs-barchart.png" /></p>
<p>I think it's time to setup infrastructure automation with Terraform[1] to keep tighter control on what's deployed and to reduce point-and-click mistakes. </p>
<p>Lesson learned!</p>
<p>[1] https://docs.microsoft.com/en-us/azure/developer/terraform/overview</p>
]]></content:encoded></item><item><title><![CDATA[Weather data!]]></title><description><![CDATA[I evaluated a few weather data providers [1], and I'm going to get started with Open Weather  (OW).  I might swap out this for a different data provider at some point later on.  So I'll factor this in when building a weather service in code, to not d...]]></description><link>https://blog.cozyweather.com/weather-data</link><guid isPermaLink="true">https://blog.cozyweather.com/weather-data</guid><category><![CDATA[Startups]]></category><category><![CDATA[app development]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sun, 07 Nov 2021 13:25:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636289848563/cY1Dm9GZq.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I evaluated a few weather data providers [1], and I'm going to get started with Open Weather  (OW).  I might swap out this for a different data provider at some point later on.  So I'll factor this in when building a weather service in code, to not directly couple the data model to OW's API, but I'll get back to that later.</p>
<p>OW provides global weather coverage and offers a free tier.  "One Call API"[2] is the only API I could find offered by OW at the free tier that provides hourly forecast data. At some point I might upgrade to a higher tier, which will unlock other APIs, but this API will be good enough for now to get started.  </p>
<p>I don't love how you have to call the One Call API with lat/long rather than a place name, because that means I'm going to have to geocode the user's location (Washington, D.C. -&gt; 38.9072, 77.0369), but I can get over that.</p>
<p>The main data points I'm interested in right now include:</p>
<ul>
<li>current / hourly / daily: <ul>
<li>temp</li>
<li>cloud cover %</li>
<li>windspeed</li>
<li>humidity</li>
<li>precipitation</li>
<li>weather description (partially sunny, rainy, etc)</li>
</ul>
</li>
<li>sunrise time</li>
<li>sunset time</li>
<li>severe weather alerts</li>
</ul>
<p>These data points will form the foundation that we can build on to create <em>personal temperature profiles</em>™ later on :)</p>
<p>[1] https://medium.com/@Ari_n/8-weather-api-alternatives-now-that-darksky-is-shutting-down-42a5ac395f93</p>
<p>[2] https://openweathermap.org/api/one-call-api</p>
]]></content:encoded></item><item><title><![CDATA[New landing page]]></title><description><![CDATA[A new landing page is live at https://cozyweather.com
Putting this together made me realize that at some point I need to get serious about thinking about a theme and style guide... things that a designer would normally do.  But in the meantime, the s...]]></description><link>https://blog.cozyweather.com/new-landing-page</link><guid isPermaLink="true">https://blog.cozyweather.com/new-landing-page</guid><category><![CDATA[Startups]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Angular]]></category><category><![CDATA[NativeScript]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sun, 31 Oct 2021 02:01:08 GMT</pubDate><content:encoded><![CDATA[<p>A new landing page is live at https://cozyweather.com</p>
<p>Putting this together made me realize that at some point I need to get serious about thinking about a theme and style guide... things that a designer would normally do.  But in the meantime, the site is just going to be a little embarrassing and cringey :)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1635645272243/J-tP320B6.png" alt="coming-soon.png" /></p>
]]></content:encoded></item><item><title><![CDATA[Non profit?]]></title><description><![CDATA[I’ve been thinking a lot about monetization, allocation of time and effort, and taxes lately.
This whole project started out as an educational endeavor.  I noticed that Microsoft gives out a pretty healthy Azure cloud benefits budget to nonprofit org...]]></description><link>https://blog.cozyweather.com/non-profit</link><guid isPermaLink="true">https://blog.cozyweather.com/non-profit</guid><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Wed, 20 Oct 2021 21:32:26 GMT</pubDate><content:encoded><![CDATA[<p>I’ve been thinking a lot about monetization, allocation of time and effort, and taxes lately.</p>
<p>This whole project started out as an educational endeavor.  I noticed that Microsoft gives out a pretty healthy Azure cloud benefits budget to nonprofit organizations for free.  What if I open sourced the project, dropped the ads, set up a non profit, and personally contributed charitable donations to it?  🤔</p>
<p>Weather for the people, not for profit!</p>
]]></content:encoded></item><item><title><![CDATA[Requirements]]></title><description><![CDATA[It’s hard for me to switch mental context between problem thinking and solution thinking.  Design thinking and building thinking.
It seems like I’d be able to sit down and bang out v1 of my app, but it’s really not that simple.
How do you take a high...]]></description><link>https://blog.cozyweather.com/requirements</link><guid isPermaLink="true">https://blog.cozyweather.com/requirements</guid><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Sat, 09 Oct 2021 14:38:20 GMT</pubDate><content:encoded><![CDATA[<p>It’s hard for me to switch mental context between problem thinking and solution thinking.  Design thinking and building thinking.</p>
<p>It seems like I’d be able to sit down and bang out v1 of my app, but it’s really not that simple.</p>
<p>How do you take a high level idea and break it down into tangible requirements?  One way is to capture use cases.  I took a pretty interesting course through Udemy which was basically a refresher of other software requirements classes I’ve taken before.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633787840897/cf2xwzZCBH.jpeg" alt="UC-a3f20082-5625-4da5-8914-7fe66ada14a5.jpg" /></p>
<p>I love the idea of just thinking through a user journey or scenario and capturing a high level summary.  Another concept they went into is performing an event-response analysis to find requirements.</p>
<p>I just jotted down a few things of the top of my mind to capture areas I need to go back and break down in more detail.  Some of these might never make it into v1. And there might be others that I haven’t uncovered yet.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1633787902355/xpJEvYurc.jpeg" alt="unnamed.jpg" /></p>
<p>I’m starting a 4 week UX design class through Coursera / Google soon. It should be interesting (and very new for me) to take some of these ideas and get them down onto a mobile canvas.</p>
<p>https://www.coursera.org/professional-certificates/google-ux-design</p>
]]></content:encoded></item><item><title><![CDATA[Baby steps]]></title><description><![CDATA[Basic infrastructure is in place!  I'm using this CleanArchitecture template as the basis of the project.  It's running here: https://cozyweather.com/
Next steps include retooling the front end to run a NativeScript project rather than just plain Ang...]]></description><link>https://blog.cozyweather.com/baby-steps</link><guid isPermaLink="true">https://blog.cozyweather.com/baby-steps</guid><category><![CDATA[side project]]></category><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Tue, 05 Oct 2021 01:38:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1633397814818/KipOPgULu.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Basic infrastructure is in place!  I'm using this <a target="_blank" href="https://github.com/jasontaylordev/CleanArchitecture">CleanArchitecture</a> template as the basis of the project.  It's running here: <a target="_blank" href="https://cozyweather.com/">https://cozyweather.com/</a></p>
<p>Next steps include retooling the front end to run a <a target="_blank" href="https://nativescript.org/">NativeScript</a> project rather than just plain Angular.</p>
]]></content:encoded></item><item><title><![CDATA[Hello world 👋]]></title><description><![CDATA[Taking the plunge and testing the waters with "indie hacking" (nights/weekends). Going to partner with my kids to build a mobile app (NativeScript + Angular + .net core + Azure). Based on the forecasted temperature range, the app will tell you in a s...]]></description><link>https://blog.cozyweather.com/hello-world</link><guid isPermaLink="true">https://blog.cozyweather.com/hello-world</guid><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Building Cozy Weather]]></dc:creator><pubDate>Wed, 01 Sep 2021 09:01:21 GMT</pubDate><content:encoded><![CDATA[<p>Taking the plunge and testing the waters with "indie hacking" (nights/weekends). Going to partner with my kids to build a mobile app (NativeScript + Angular + .net core + Azure). Based on the forecasted temperature range, the app will tell you in a simple way how many layers of clothes would be appropriate. My kids wear shorts on days where it's below freezing, so this should be interesting :)</p>
<p>Process can be a pain. And with a solo project? I guess I could skip process completely and just go. Or I could just go with process I'm familiar with. But hey, I'm working on building a new kind of weather app to jump start professional development, so why not try a new process while I'm at it? Enter "Lean Startup".</p>
<p>Interestingly the Lean Startup agile technique is only coming in as being used by 1% of all respondents in the "<a target="_blank" href="https://stateofagile.com/#ufh-i-661275008-15th-state-of-agile-report/7027494">State of Agile Report</a> ."</p>
<p>When looking around online for tactics on "how" to work with this technique, it's not so straightforward. The official website seemed to be more about selling books than sharing hands-on tips <a target="_blank" href="http://theleanstartup.com/">http://theleanstartup.com/</a>. I don't know, maybe I didn't dig deeply enough?</p>
<p>I did find that Atlassian acknowledges Lean Startup, but only very superficially <a target="_blank" href="https://www.atlassian.com/software/jira/align/lpm">https://www.atlassian.com/software/jira/align/lpm</a>.</p>
<p>All good -- I'm just going to roll with it.</p>
<p>For the weather app I'm working on, I documented plan A using leanstack. It's really interesting because in a few minutes of discussion with my son, I discovered that plan A isn't going to work. He told me that he wouldn't use the app as I had envisioned it. We dove into the problem space and went through pain points together:</p>
<ul>
<li>everyone has their own comfort zone (what feels cold to me might not feel cold to him) so he doesn't want to wear a coat just because someone <em>or something</em> told him to</li>
<li>forecasts can be hard to understand</li>
<li>mornings are busy</li>
</ul>
<p>What he told me next really surprised me:</p>
<ul>
<li>needs to feel like a game; must be fun with leveling up</li>
<li>needs to be customizable</li>
<li>graphics are important</li>
</ul>
<p>Wait a second, I thought we were building a weather app and now we're building a game?! I'll have to think on that, but one thing that really stood out to me here was the idea of personal temperature profiles. If HE built his own profile, he might trust it and learn to associate the somewhat abstract concept of a temperature number with a feeling of hot or cold. This is starting to feel more like a science class learning tool than a weather app...</p>
<p>It seems like there might be two parallel tracks emerging:</p>
<ul>
<li>hammer out the concepts with the concierge MVP model (not actually building the app, to begin with, but rather manually figuring out what the app needs to do)</li>
<li>put basic infrastructure in place (select architecture, setup basic project template, setup cicd pipeline, plug-in analytics tooling, plug-in feature flipper tooling, etc) </li>
</ul>
<p>Then once those are basically in place:</p>
<ul>
<li>build the minimum feature set to get the app up and going</li>
<li>then finally continue to iterate as described here: <a target="_blank" href="https://www.ycombinator.com/library/62-how-to-build-product-as-a-small-startup">https://www.ycombinator.com/library/62-how-to-build-product-as-a-small-startup</a></li>
</ul>
<p>It's actually been harder to get to this point than I thought it would be, but this has been pretty fun so far :)</p>
]]></content:encoded></item></channel></rss>