<?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>Forem: Florian</title>
    <description>The latest articles on Forem by Florian (@digeratis).</description>
    <link>https://forem.com/digeratis</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%2F3635382%2F89c8724f-38c7-426c-87b2-33af7e231b2a.png</url>
      <title>Forem: Florian</title>
      <link>https://forem.com/digeratis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/digeratis"/>
    <language>en</language>
    <item>
      <title>Week 8 of 40 – Giving CatAtlas a Real Identity (and Tests)</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sun, 04 Jan 2026 00:29:02 +0000</pubDate>
      <link>https://forem.com/digeratis/week-8-of-40-giving-catatlas-a-real-identity-and-tests-2h3d</link>
      <guid>https://forem.com/digeratis/week-8-of-40-giving-catatlas-a-real-identity-and-tests-2h3d</guid>
      <description>&lt;h3&gt;
  
  
  Objective of the week
&lt;/h3&gt;

&lt;p&gt;Strengthen the CatAtlas foundation by introducing a &lt;strong&gt;real identity layer&lt;/strong&gt; and a new dimension of data, while adding automated tests for the first time.&lt;/p&gt;

&lt;p&gt;The goal was to move beyond individual sightings and start modeling &lt;strong&gt;cats as entities&lt;/strong&gt;, supported by AI-assisted summaries and backed by tests so the system can evolve safely.&lt;/p&gt;




&lt;h3&gt;
  
  
  What I built
&lt;/h3&gt;

&lt;p&gt;This week I extended CatAtlas in several important ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduced an explicit &lt;strong&gt;Cat identity&lt;/strong&gt; (&lt;code&gt;cats&lt;/code&gt; table) separate from sightings
&lt;/li&gt;
&lt;li&gt;Turned entries into true &lt;strong&gt;sightings&lt;/strong&gt;, optionally linked to a cat
&lt;/li&gt;
&lt;li&gt;Added &lt;strong&gt;photo support&lt;/strong&gt; (via photo URLs for now)
&lt;/li&gt;
&lt;li&gt;Built a &lt;strong&gt;GenAI-style cat profile&lt;/strong&gt; that aggregates multiple sightings into a single, readable description
&lt;/li&gt;
&lt;li&gt;Added &lt;strong&gt;automated tests&lt;/strong&gt; using &lt;code&gt;pytest&lt;/code&gt; and FastAPI’s &lt;code&gt;TestClient&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CatAtlas now has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;facts (sightings),&lt;/li&gt;
&lt;li&gt;identities (cats),&lt;/li&gt;
&lt;li&gt;derived knowledge (AI enrichment and profiles),&lt;/li&gt;
&lt;li&gt;and guardrails (tests).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Why separating &lt;strong&gt;observations&lt;/strong&gt; from &lt;strong&gt;identity&lt;/strong&gt; is critical in AI-assisted systems
&lt;/li&gt;
&lt;li&gt;How to evolve a database schema incrementally without breaking existing data
&lt;/li&gt;
&lt;li&gt;How to introduce a new data dimension (photos) without overengineering uploads
&lt;/li&gt;
&lt;li&gt;How GenAI-style features often start as &lt;strong&gt;aggregation + templating&lt;/strong&gt;, not models
&lt;/li&gt;
&lt;li&gt;How to write integration-style tests against real FastAPI endpoints
&lt;/li&gt;
&lt;li&gt;How to make a codebase safer to change by testing behavior, not implementation
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What was hard / surprising
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Managing TypeScript and backend contracts as the data model grew
&lt;/li&gt;
&lt;li&gt;Understanding where identity decisions should live in the system
&lt;/li&gt;
&lt;li&gt;Debugging test import paths and environment-specific database behavior
&lt;/li&gt;
&lt;li&gt;Realizing how quickly complexity increases once entities relate to each other
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest challenge wasn’t writing code — it was keeping the &lt;strong&gt;mental model clean&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  What I’ll do next week
&lt;/h3&gt;

&lt;p&gt;Next week, I want to build on this foundation by making CatAtlas more &lt;strong&gt;visual and interactive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Possible directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real photo uploads instead of URLs,&lt;/li&gt;
&lt;li&gt;basic UI flows for assigning sightings to cats,&lt;/li&gt;
&lt;li&gt;or preparing the system for actual vision-based matching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The focus will stay on &lt;strong&gt;structure first, intelligence second&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>devjournal</category>
      <category>testing</category>
    </item>
    <item>
      <title>Week 7 from 40 – Making AI Features Feel Real</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Fri, 02 Jan 2026 20:50:15 +0000</pubDate>
      <link>https://forem.com/digeratis/-week-7-from-40-making-ai-features-feel-real-4a2k</link>
      <guid>https://forem.com/digeratis/-week-7-from-40-making-ai-features-feel-real-4a2k</guid>
      <description>&lt;h2&gt;
  
  
  Objective of the week
&lt;/h2&gt;

&lt;p&gt;Moving from simple coding practices to making first ideas real by creating a page to publish feral cat sightings. I moved from isolated sightings to &lt;strong&gt;identity and relationships&lt;/strong&gt; by introducing a first version of same-cat matching.&lt;/p&gt;

&lt;p&gt;The goal was not accurate identification, but to learn how to &lt;strong&gt;suggest possible matches&lt;/strong&gt; using simple, explainable logic based on text descriptions and locations.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I extended &lt;strong&gt;CatAtlas&lt;/strong&gt; with a “same-cat matching v0” feature.&lt;/p&gt;

&lt;p&gt;Each cat sighting can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trigger a matching process,&lt;/li&gt;
&lt;li&gt;receive a ranked list of possible matches,&lt;/li&gt;
&lt;li&gt;and display simple explanations for why two sightings might refer to the same cat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns the app from a list of entries into an &lt;strong&gt;emerging network of related sightings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/codespaces?repository_id=1122410808" rel="noopener noreferrer"&gt;https://github.com/codespaces?repository_id=1122410808&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live site:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://orange-disco-pj4g9w4w46prh96pw-5173.app.github.dev/" rel="noopener noreferrer"&gt;https://orange-disco-pj4g9w4w46prh96pw-5173.app.github.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru5v0g7q96nri8coutnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru5v0g7q96nri8coutnf.png" alt=" " width="800" height="692"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Designing similarity-based matching instead of binary identification
&lt;/li&gt;
&lt;li&gt;Working with arrays of objects to compute scores and rankings
&lt;/li&gt;
&lt;li&gt;Introducing explainable “reasons” for AI-like decisions
&lt;/li&gt;
&lt;li&gt;Managing additional per-item UI state in React
&lt;/li&gt;
&lt;li&gt;Thinking in terms of relationships between records, not just records themselves
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What was hard / surprising
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Deciding where matching logic belongs (backend vs frontend)
&lt;/li&gt;
&lt;li&gt;Tuning similarity thresholds so results feel useful, not noisy
&lt;/li&gt;
&lt;li&gt;Placing derived UI blocks correctly inside React list rendering
&lt;/li&gt;
&lt;li&gt;Realizing how quickly complexity grows once entities relate to each other
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I’ll do next week
&lt;/h2&gt;

&lt;p&gt;Next week, I want to strengthen the CatAtlas foundation further by introducing a &lt;strong&gt;new dimension of data&lt;/strong&gt;, such as photos or a more explicit “cat identity” concept.&lt;/p&gt;

&lt;p&gt;The focus will be on adding structure carefully, without jumping too early into heavy AI or computer vision.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devjournal</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Week 6 from 40 – Making AI Features Feel Real</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Tue, 30 Dec 2025 17:45:45 +0000</pubDate>
      <link>https://forem.com/digeratis/-week-6-from-40-making-ai-features-feel-real-33e2</link>
      <guid>https://forem.com/digeratis/-week-6-from-40-making-ai-features-feel-real-33e2</guid>
      <description>&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;This week was about turning an “AI demo” into something that behaves like a real product.&lt;/p&gt;

&lt;p&gt;I extended the analysis feature so results are &lt;strong&gt;persisted and cached&lt;/strong&gt; instead of being recomputed every time. This meant adding a new database table, thinking about derived data, and introducing concepts like hashing, upserts, and cache validation.&lt;/p&gt;

&lt;p&gt;What stood out most was that the hard part wasn’t the analysis logic itself — it was designing the &lt;strong&gt;data flow and contracts&lt;/strong&gt; so frontend, backend, and storage stay in sync.&lt;/p&gt;

&lt;p&gt;The app now survives restarts with both entries and their analyses intact, which makes the system feel stable and intentional. It’s a small step, but an important shift from “toy AI feature” to “engineering an AI capability.”&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to persist and cache AI-derived data instead of recomputing it
&lt;/li&gt;
&lt;li&gt;Why hashing is useful to detect meaningful changes in input text
&lt;/li&gt;
&lt;li&gt;How to design “analyze once, reuse many times” workflows
&lt;/li&gt;
&lt;li&gt;How frontend types and backend contracts must evolve together
&lt;/li&gt;
&lt;li&gt;That AI engineering is as much about data and state as it is about models
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What was hard / surprising / confusing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keeping frontend and backend response models in sync
&lt;/li&gt;
&lt;li&gt;Understanding when to recompute analysis vs return cached results
&lt;/li&gt;
&lt;li&gt;Dealing with TypeScript errors caused by small schema mismatches
&lt;/li&gt;
&lt;li&gt;Debugging issues that were about &lt;strong&gt;process and state&lt;/strong&gt;, not code syntax
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I’ll do next week
&lt;/h2&gt;

&lt;p&gt;Next week, I want to build on this foundation by introducing a &lt;strong&gt;more realistic AI component&lt;/strong&gt; — either by integrating a real model/API or by adding evaluation and comparison between different analysis approaches.&lt;/p&gt;

&lt;p&gt;The focus will stay on architecture and learning, not on building something “impressive.”&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>backend</category>
      <category>devjournal</category>
      <category>ai</category>
    </item>
    <item>
      <title>Week 5 of 40 adding my first “AI-like” endpoint</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Mon, 29 Dec 2025 00:10:41 +0000</pubDate>
      <link>https://forem.com/digeratis/week-4-of-40-adding-my-first-ai-like-endpoint-c38</link>
      <guid>https://forem.com/digeratis/week-4-of-40-adding-my-first-ai-like-endpoint-c38</guid>
      <description>&lt;h1&gt;
  
  
  Week 5 – Learning by Getting Stuck (and Unstuck)
&lt;/h1&gt;

&lt;p&gt;This week was less about adding new features and more about &lt;strong&gt;understanding the mechanics&lt;/strong&gt; of modern development environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;The objective this week was to add my first &lt;strong&gt;AI-style capability&lt;/strong&gt; to the existing full-stack application and, more importantly, to understand how frontend, backend, and development environments interact in practice.&lt;/p&gt;

&lt;p&gt;Rather than focusing on a complex model, the goal was to learn the &lt;strong&gt;integration pattern&lt;/strong&gt;: defining an API contract, exposing a new endpoint, calling it from the UI, and rendering the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I extended my Learning Log application with a new &lt;strong&gt;analysis endpoint&lt;/strong&gt; on the backend and an &lt;strong&gt;Analyze&lt;/strong&gt; button in the frontend.&lt;/p&gt;

&lt;p&gt;The backend now accepts text and returns a structured response (summary, tags, sentiment). The frontend triggers this analysis per entry and displays the result directly below the item. While the analysis itself is simple, the architecture mirrors how real AI-powered features are built and integrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;While adding my first “AI-like” endpoint and integrating it into the frontend, I ran into a series of issues that all boiled down to one thing: &lt;strong&gt;environment and process management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I had questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does &lt;code&gt;uvicorn&lt;/code&gt; say &lt;em&gt;“address already in use”&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;Why do I see two processes listening on the same port?&lt;/li&gt;
&lt;li&gt;Why does &lt;code&gt;npm&lt;/code&gt; complain about &lt;code&gt;package.json&lt;/code&gt; when I just want to restart the backend?&lt;/li&gt;
&lt;li&gt;Where is my frontend actually running, and how do I even find its URL?&lt;/li&gt;
&lt;li&gt;What does “restart the frontend” really mean in Codespaces?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uvicorn --reload&lt;/code&gt; starts &lt;strong&gt;two processes&lt;/strong&gt; (watcher + worker), and sometimes both need to be stopped
&lt;/li&gt;
&lt;li&gt;Ports don’t magically free themselves; knowing how to inspect and kill processes matters
&lt;/li&gt;
&lt;li&gt;In Codespaces, nothing is “local” in the way my intuition expected — ports must be exposed and URLs discovered
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly:&lt;br&gt;&lt;br&gt;
The hard part wasn’t writing code — it was building the right &lt;strong&gt;mental model&lt;/strong&gt; of what runs where and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;This week felt slow and occasionally frustrating, but it was incredibly valuable. Each “why is this broken?” question turned into a small piece of foundational knowledge I’ll reuse constantly.&lt;/p&gt;

&lt;p&gt;Progress didn’t look like more features — it looked like fewer mysteries.&lt;/p&gt;

&lt;p&gt;On to the next week.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>ai</category>
      <category>learning</category>
      <category>api</category>
    </item>
    <item>
      <title>Week 4_b of 40 – Adding Persistence with SQLite</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sat, 27 Dec 2025 22:24:02 +0000</pubDate>
      <link>https://forem.com/digeratis/week-4b-adding-persistence-with-sqlite-1hh1</link>
      <guid>https://forem.com/digeratis/week-4b-adding-persistence-with-sqlite-1hh1</guid>
      <description>&lt;h2&gt;
  
  
  What I did
&lt;/h2&gt;

&lt;p&gt;As a stretch goal for Week 4, I extended my FastAPI backend with &lt;strong&gt;SQLite persistence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of keeping entries only in memory, the backend now stores them in a local SQLite database. This means data &lt;strong&gt;survives backend restarts&lt;/strong&gt;, which already makes the app feel much more “real”.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to use Python’s built-in &lt;code&gt;sqlite3&lt;/code&gt; module
&lt;/li&gt;
&lt;li&gt;How to create tables automatically on app startup
&lt;/li&gt;
&lt;li&gt;How to replace in-memory lists with SQL queries&lt;/li&gt;
&lt;li&gt;How important restart testing is when working on backend persistence
&lt;/li&gt;
&lt;li&gt;How frontend and backend can remain unchanged while storage evolves
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was a great reminder that good interfaces (HTTP APIs) allow you to change internals without breaking clients.&lt;/p&gt;




&lt;h2&gt;
  
  
  What was interesting
&lt;/h2&gt;

&lt;p&gt;The most satisfying moment was restarting the backend, refreshing the frontend, and seeing the data still there.&lt;br&gt;&lt;br&gt;
Small win, I know I know — but an important milestone.&lt;/p&gt;




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

&lt;p&gt;Next week or more likely tomorrow, I’ll build on this setup and start adding &lt;strong&gt;“smart” behavior&lt;/strong&gt; on top of the API, moving closer to AI-driven functionality.&lt;/p&gt;

</description>
      <category>python</category>
      <category>database</category>
      <category>backend</category>
      <category>sql</category>
    </item>
    <item>
      <title>Week 4 of 40 – First Full-Stack App with React, TypeScript, and Python</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Fri, 26 Dec 2025 20:55:07 +0000</pubDate>
      <link>https://forem.com/digeratis/week-4-of-40-first-full-stack-app-with-react-typescript-and-python-bpp</link>
      <guid>https://forem.com/digeratis/week-4-of-40-first-full-stack-app-with-react-typescript-and-python-bpp</guid>
      <description>&lt;h2&gt;
  
  
  Objective of the week
&lt;/h2&gt;

&lt;p&gt;The goal of this week was to take the next real step toward full-stack development.&lt;/p&gt;

&lt;p&gt;Until now, everything lived either in a static page or entirely in the frontend. This week I wanted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build my &lt;strong&gt;first backend API&lt;/strong&gt; using Python
&lt;/li&gt;
&lt;li&gt;Connect a &lt;strong&gt;React + TypeScript frontend&lt;/strong&gt; to that API
&lt;/li&gt;
&lt;li&gt;Get frontend and backend to talk to each other
&lt;/li&gt;
&lt;li&gt;Learn the basics of working with &lt;strong&gt;GitHub Codespaces&lt;/strong&gt; and the terminal
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I built a small &lt;strong&gt;Learning Log&lt;/strong&gt; application with a clear separation between frontend and backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python + &lt;strong&gt;FastAPI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Endpoints to:

&lt;ul&gt;
&lt;li&gt;create entries&lt;/li&gt;
&lt;li&gt;list entries&lt;/li&gt;
&lt;li&gt;toggle a “favorite” flag&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Automatic API documentation via Swagger&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Swagger UI:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://orange-disco-pj4g9w4w46prh96pw-8000.app.github.dev/docs" rel="noopener noreferrer"&gt;https://orange-disco-pj4g9w4w46prh96pw-8000.app.github.dev/docs&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React + TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Fetches data from the backend API&lt;/li&gt;
&lt;li&gt;Displays entries&lt;/li&gt;
&lt;li&gt;Allows creating new entries and marking them as favorites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend UI:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://orange-disco-pj4g9w4w46prh96pw-5173.app.github.dev/" rel="noopener noreferrer"&gt;https://orange-disco-pj4g9w4w46prh96pw-5173.app.github.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the first project in this challenge where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the frontend depends on a backend,&lt;/li&gt;
&lt;li&gt;data flows over HTTP,&lt;/li&gt;
&lt;li&gt;and things break if URLs, ports, or environments are wrong.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;This week was packed with fundamentals that I had either forgotten or never really learned properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to work with the &lt;strong&gt;terminal&lt;/strong&gt; again:

&lt;ul&gt;
&lt;li&gt;navigating folders&lt;/li&gt;
&lt;li&gt;activating virtual environments&lt;/li&gt;
&lt;li&gt;running servers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;The basics of &lt;strong&gt;GitHub Codespaces&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;it’s a real Linux machine in the cloud&lt;/li&gt;
&lt;li&gt;processes stop when you close it&lt;/li&gt;
&lt;li&gt;ports must be explicitly exposed&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;How &lt;strong&gt;FastAPI&lt;/strong&gt; works:

&lt;ul&gt;
&lt;li&gt;defining request and response models&lt;/li&gt;
&lt;li&gt;automatic Swagger documentation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;How a frontend talks to a backend using:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;environment variables&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Why frontend apps need a configurable &lt;strong&gt;API base URL&lt;/strong&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This week made it very clear that modern development is less about syntax and more about &lt;strong&gt;understanding the system as a whole&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What was hard / surprising / confusing
&lt;/h2&gt;

&lt;p&gt;Quite a few things 😅 — and that’s exactly why this week mattered.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I initially treated things in &lt;code&gt;requirements.txt&lt;/code&gt; like terminal commands
&lt;/li&gt;
&lt;li&gt;I repeatedly forgot to activate the Python virtual environment
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uvicorn: command not found&lt;/code&gt; taught me a lot about how environments really work
&lt;/li&gt;
&lt;li&gt;Understanding &lt;strong&gt;where&lt;/strong&gt; my code was running vs &lt;strong&gt;where&lt;/strong&gt; my browser was running took time
&lt;/li&gt;
&lt;li&gt;The concept of forwarded ports in Codespaces was new and unintuitive at first
&lt;/li&gt;
&lt;li&gt;Knowing &lt;em&gt;which URL&lt;/em&gt; the frontend should call (and why &lt;code&gt;localhost&lt;/code&gt; doesn’t work here) was confusing
&lt;/li&gt;
&lt;li&gt;Forgetting to restart the frontend after changing &lt;code&gt;.env&lt;/code&gt; caused a lot of head-scratching
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, the hardest part wasn’t coding — it was &lt;strong&gt;mental models&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what runs where,&lt;/li&gt;
&lt;li&gt;what talks to what,&lt;/li&gt;
&lt;li&gt;and what needs to be restarted when something changes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I’ll do next week
&lt;/h2&gt;

&lt;p&gt;For Week 5, I want to build on this exact architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep React + TypeScript on the frontend
&lt;/li&gt;
&lt;li&gt;Keep Python on the backend
&lt;/li&gt;
&lt;li&gt;Add the first &lt;strong&gt;“smart” behavior&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;something that processes text&lt;/li&gt;
&lt;li&gt;analyzes, summarizes, or enriches entries
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This will be my first step toward &lt;strong&gt;AI-adjacent functionality&lt;/strong&gt;, built on top of the foundations laid this week.&lt;/p&gt;

&lt;p&gt;Week 4 was slower, more frustrating, and more educational than the previous ones — which is probably a good sign.&lt;/p&gt;

</description>
      <category>fullstack</category>
      <category>python</category>
      <category>showdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Week 2 of 40 – My Idea Log &amp; Randomizer</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sat, 29 Nov 2025 23:03:23 +0000</pubDate>
      <link>https://forem.com/digeratis/week-2-of-40-my-idea-log-randomizer-4hlk</link>
      <guid>https://forem.com/digeratis/week-2-of-40-my-idea-log-randomizer-4hlk</guid>
      <description>&lt;p&gt;&lt;strong&gt;Objective of the week&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The goal this week was to take a small step forward in complexity while staying within a familiar environment. After getting comfortable with GitHub Pages in Week 1, I wanted to:&lt;/li&gt;
&lt;li&gt;Build something slightly more interactive than a static page&lt;/li&gt;
&lt;li&gt;Practice using browser storage so the app could remember things&lt;/li&gt;
&lt;li&gt;Keep reinforcing the basic workflow: create → commit → deploy → reflect&lt;/li&gt;
&lt;li&gt;Continue building confidence without disappearing down a perfection rabbit hole&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I built&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This week I created a tiny Idea Log &amp;amp; Randomizer web app.&lt;/li&gt;
&lt;li&gt;It lets me: Add ideas with a title and short description&lt;/li&gt;
&lt;li&gt;Store ideas in localStorage so they persist across refreshes&lt;/li&gt;
&lt;li&gt;Display all ideas in a simple list&lt;/li&gt;
&lt;li&gt;Pick a random idea with one click&lt;/li&gt;
&lt;li&gt;Everything is plain HTML + CSS + JavaScript, deployed again with GitHub Pages.&lt;/li&gt;
&lt;li&gt;URL: &lt;a href="https://florianhoeppner.github.io/w40-week02-idea-log/" rel="noopener noreferrer"&gt;https://florianhoeppner.github.io/w40-week02-idea-log/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What was hard / surprising / confusing&lt;/strong&gt;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I’ll do next week&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For Week 3, I want to introduce the next layer of complexity&lt;/li&gt;
&lt;li&gt;Start using TypeScript instead of plain JavaScript&lt;/li&gt;
&lt;li&gt;Build a small UI using React&lt;/li&gt;
&lt;li&gt;Keep the functionality simple&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>devjournal</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Week 1 of 40 – Static Idea of the Week</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sat, 29 Nov 2025 22:47:46 +0000</pubDate>
      <link>https://forem.com/digeratis/week-1-of-40-static-idea-of-the-week-49hn</link>
      <guid>https://forem.com/digeratis/week-1-of-40-static-idea-of-the-week-49hn</guid>
      <description>&lt;p&gt;&lt;strong&gt;Objective of the week&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wanted to get familiar with the environment I’ll be working and releasing in&lt;/li&gt;
&lt;li&gt;Just needed to get something started without any big purpose&lt;/li&gt;
&lt;li&gt;Figure out where to store my code, how to deploy, and write a blog pos
t&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I built&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I built a static HTML page with a simple piece of JavaScript&lt;/li&gt;
&lt;li&gt;When the page loads, it picks a random idea and displays it&lt;/li&gt;
&lt;li&gt;URL: &lt;a href="https://florianhoeppner.github.io/w40-week01/" rel="noopener noreferrer"&gt;https://florianhoeppner.github.io/w40-week01/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What was hard / surprising / confusing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I tried creating three files (index, CSS, script) in Replit and deploying from there&lt;/li&gt;
&lt;li&gt;The Replit AI agent wasn’t helpful, so after a few attempts I switched to GitHub instead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I’ll do next week&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a dialog box and some interaction, still using HTML and JavaScript&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Getting Back</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sat, 29 Nov 2025 00:25:08 +0000</pubDate>
      <link>https://forem.com/digeratis/getting-back-3aec</link>
      <guid>https://forem.com/digeratis/getting-back-3aec</guid>
      <description>&lt;p&gt;When I was 15, I wrote my first programs on a C64. Later came Pascal, PHP, Java, JSP, and even a phase working with COBOL and JCL on OS/390 in a bank. For many years, writing software was a big part of my life — until I slowly drifted away into building PowerPoints instead of building products.&lt;/p&gt;

&lt;p&gt;Lately, with so much happening in tech, I realized how much I miss the fun of creating things, experimenting, and working on my own ideas. That’s when I came across the 40 ideas in 40 weeks challenge. It immediately clicked. Maybe this is exactly what I need: shipping small ideas quickly, avoiding the perfection trap, and learning by delivering every single week.&lt;/p&gt;

&lt;p&gt;My goal is simple: small but finished.&lt;/p&gt;

&lt;p&gt;My Starting Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Languages: TypeScript + Python&lt;/li&gt;
&lt;li&gt;Frontend: React + component library&lt;/li&gt;
&lt;li&gt;Backend: Serverless functions (Vercel / Netlify)&lt;/li&gt;
&lt;li&gt;Database: Supabase (Postgres + Auth)&lt;/li&gt;
&lt;li&gt;Hosting: Vercel / Netlify&lt;/li&gt;
&lt;li&gt;Tools: VS Code, GitHub, CI from GitHub to Vercel/Netlify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weekly Plan&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick one idea&lt;/li&gt;
&lt;li&gt;Build a minimal but real version&lt;/li&gt;
&lt;li&gt;Publish: demo, GitHub link, or blog post&lt;/li&gt;
&lt;li&gt;Reflect: What was the objective? What did I learn?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m excited — and a bit nervous if I can allocate enough time — but mostly ready to rediscover the joy of building. Let’s get started.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>learning</category>
      <category>career</category>
      <category>challenge</category>
    </item>
  </channel>
</rss>
