<?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[Gena's logs]]></title><description><![CDATA[Gena's logs]]></description><link>https://blog.genk.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Apr 2026 23:43:52 GMT</lastBuildDate><atom:link href="https://blog.genk.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Small Side Quest: Building a Simple Web App in Python]]></title><description><![CDATA[As a former iOS developer who’s now a senior manager, I’ve been feeling a bit trapped lately — not by the work itself, but by how little hands-on building I get to do anymore. I’ve always wanted to play more with web technologies, so few months ago d...]]></description><link>https://blog.genk.dev/small-side-quest-building-a-simple-web-app-in-python</link><guid isPermaLink="true">https://blog.genk.dev/small-side-quest-building-a-simple-web-app-in-python</guid><category><![CDATA[nicegui]]></category><category><![CDATA[python web development]]></category><category><![CDATA[web dev]]></category><dc:creator><![CDATA[Gennadi Iosad]]></dc:creator><pubDate>Tue, 31 Dec 2024 22:00:00 GMT</pubDate><content:encoded><![CDATA[<p>As a former iOS developer who’s now a senior manager, I’ve been feeling a bit trapped lately — not by the work itself, but by how little hands-on building I get to do anymore. I’ve always wanted to play more with web technologies, so few months ago decided to take a few hours and build something simple as an exercise.</p>
<hr />
<h3 id="heading-the-idea">The Idea</h3>
<p>My goal was to create a <strong>simple web app</strong> that would allow me to go through the entire process—from coding to deployment—without getting stuck on the app's logic. I wanted something easy to build but that would let me explore all the related aspects.</p>
<p>So the idea is that the user selects a topic, receives a random set of questions from a question bank, and at the end, gets a score along with feedback explaining any incorrect answers and how to improve.</p>
<p>To keep things straightforward, I used static JSON files as question banks, with one file for each topic. When the app starts, it lists all available topics</p>
<h3 id="heading-why-python">Why Python</h3>
<p>I know Python reasonably well, though it’s not something I use every day at work. Since I’m not really fluent in JavaScript, Python felt like the right balance between familiarity and learning opportunity.</p>
<p>But even then, I had to catch up on a lot of modern Python development practices; the last time I worked with Python, it was a mix of using <code>pipenv</code>, <code>pyenv</code>, <code>venv</code>, <code>poetry</code>, etc.—pretty terrible. So I checked again on how to set up a proper development environment in VS Code with <code>launch.json</code>, and just use <code>uv</code> along with linters like <code>black</code>, and <code>ruff</code>.</p>
<p><code>uv</code> has its own quirks with options like <code>--all-extras</code>, <code>uv sync --frozen</code>, and unexpected behaviors with <code>uv run</code> but still it’s much much better than it was before <code>uv</code>.</p>
<p>It's surprising how long it took for the industry to develop good tools for one of the most widely used languages in the world, but now, in my opinion, it's very usable and reasonably straight forward.</p>
<h3 id="heading-working-with-data">Working with data</h3>
<p>Loading JSON files became a little side project where I learned <strong>Pydantic</strong>, and once I understood it, it made validation and data handling very easy.</p>
<h3 id="heading-ui-with-nicegui">UI with NiceGUI</h3>
<p>For the frontend, I chose <strong>NiceGUI</strong> — someone at work mentioned it to me after I’d had some frustrating experiences with Streamlit in the past. I remember that in Streamlit, some simple things (like controlling one dropdown based on another) could get unnecessarily complicated.</p>
<p>NiceGUI worked surprisingly well for my case. It let me build a clean, interactive UI directly in Python without touching JavaScript.</p>
<p>Because of it, I also ended up learning a bit about <strong>Tailwind CSS</strong>. At first, I found the concept counterintuitive, but once I read more about what problem it solves — especially in larger teams where consistency matters — I was really impressed by its design.</p>
<h3 id="heading-a-bit-about-docker">A Bit About Docker</h3>
<p>Writing the <code>Dockerfile</code> was another mini-adventure. I had some shallow understanding from before, but this time I dove deeper — learning about how <strong>layers</strong> work, and how to make builds faster and cleaner. It was a good reminder of how much thought goes into the tools we now take for granted. The uv website has a good explanation on how to build Docker images with it.</p>
<h3 id="heading-wrapping-up">Wrapping Up</h3>
<p>The whole thing was small, but it was exactly what I wanted — just <strong>two evening sessions</strong> of hands-on building that gave me a full end-to-end experience. I already knew most of the concepts but wanted to explore them more deeply, so I deliberately kept my use of ChatGPT contained. For most of the topics, I used it only to learn, and for everything else (like Makefile, README, helper scripts, etc.) I used it in a more extensive way. It made the project feel like genuine, focused practice rather than automation just to get it to work.</p>
<p>The result is on <a target="_blank" href="https://github.com/giosad/trivia-quizzes-app/tree/main">github</a>.</p>
]]></content:encoded></item></channel></rss>