<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web on Landry Zetam - Tech Blog</title><link>https://blog.landryzetam.net/tags/web/</link><description>Recent content in Web on Landry Zetam - Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 08 Aug 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.landryzetam.net/tags/web/index.xml" rel="self" type="application/rss+xml"/><item><title>Building an Oura Ring Health Dashboard with Streamlit</title><link>https://blog.landryzetam.net/posts/oura-dashboard/</link><pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate><guid>https://blog.landryzetam.net/posts/oura-dashboard/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Oura Dashboard is a Streamlit-based web application deployed in the Fako cluster that provides interactive visualization of health data collected from the Oura Ring. It connects to the PostgreSQL database populated by the Oura Collector service and presents comprehensive health insights through charts, graphs, and analytics. The dashboard is secured with OAuth2 authentication and provides personalized health tracking capabilities for sleep, activity, readiness, and heart rate metrics.&lt;/p>
&lt;h2 id="key-features">Key Features&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Interactive Visualizations&lt;/strong>: Real-time charts and graphs using Streamlit&lt;/li>
&lt;li>&lt;strong>Comprehensive Metrics&lt;/strong>: Sleep, activity, readiness, and HRV analytics&lt;/li>
&lt;li>&lt;strong>OAuth2 Authentication&lt;/strong>: Secure access with OAuth2 proxy&lt;/li>
&lt;li>&lt;strong>PostgreSQL Integration&lt;/strong>: Direct database queries for data&lt;/li>
&lt;li>&lt;strong>Responsive Design&lt;/strong>: Mobile-friendly interface&lt;/li>
&lt;li>&lt;strong>Health Trends&lt;/strong>: Long-term pattern analysis&lt;/li>
&lt;li>&lt;strong>Custom Reports&lt;/strong>: Exportable health summaries&lt;/li>
&lt;li>&lt;strong>Real-time Updates&lt;/strong>: Auto-refresh capabilities&lt;/li>
&lt;/ul>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;h3 id="components">Components&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Streamlit App&lt;/strong>: Python-based web dashboard&lt;/li>
&lt;li>&lt;strong>OAuth2 Proxy&lt;/strong>: Authentication layer&lt;/li>
&lt;li>&lt;strong>Service&lt;/strong>: ClusterIP on port 8501&lt;/li>
&lt;li>&lt;strong>Ingress&lt;/strong>: HTTPS access with authentication&lt;/li>
&lt;li>&lt;strong>External Secrets&lt;/strong>: AWS Secrets Manager integration&lt;/li>
&lt;li>&lt;strong>Database Connection&lt;/strong>: PostgreSQL read access&lt;/li>
&lt;/ol>
&lt;h3 id="resource-requirements">Resource Requirements&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Memory&lt;/strong>: 256Mi (request), 512Mi (limit)&lt;/li>
&lt;li>&lt;strong>CPU&lt;/strong>: 100m (request), 500m (limit)&lt;/li>
&lt;li>&lt;strong>Storage&lt;/strong>: EmptyDir for temporary data&lt;/li>
&lt;li>&lt;strong>Port&lt;/strong>: 8501 (Streamlit default)&lt;/li>
&lt;/ul>
&lt;h2 id="configuration">Configuration&lt;/h2>
&lt;h3 id="environment-settings">Environment Settings&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Value&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>DATABASE_NAME&lt;/code>&lt;/td>
&lt;td>&lt;code>app&lt;/code>&lt;/td>
&lt;td>PostgreSQL database&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>DAYS_TO_BACKFILL&lt;/code>&lt;/td>
&lt;td>&lt;code>7&lt;/code>&lt;/td>
&lt;td>Default data range&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>LOG_LEVEL&lt;/code>&lt;/td>
&lt;td>&lt;code>INFO&lt;/code>&lt;/td>
&lt;td>Application logging&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>API_TIMEOUT&lt;/code>&lt;/td>
&lt;td>&lt;code>30&lt;/code>&lt;/td>
&lt;td>Query timeout&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="oauth2-configuration">OAuth2 Configuration&lt;/h3>
&lt;p>Protected by OAuth2 proxy for secure access:&lt;/p></description></item><item><title>From GitHub Notes to Production Blog</title><link>https://blog.landryzetam.net/posts/hugo-blogging/</link><pubDate>Thu, 07 Aug 2025 00:00:00 +0000</pubDate><guid>https://blog.landryzetam.net/posts/hugo-blogging/</guid><description>&lt;h2 id="why-this-guide-exists">Why This Guide Exists&lt;/h2>
&lt;p>I&amp;rsquo;ve been doing a lot of dev work, research and hadn&amp;rsquo;t really thought about sharing the knowledge without having to learn frontend development or maintain complex code. I knew I had a bunch of markdown GitHub notes and thought they could be used as a baseline to catch up on all my lack of documentation. Then I found Hugo.&lt;/p>
&lt;p>This guide covers the entire workflow of creating a Hugo blog, containerizing it, and deploying it to Kubernetes - all without writing a single line of frontend code (html, css, js).&lt;/p></description></item></channel></rss>