<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>theJournal | Alberto Duran</title>
    <link>https://albertoduran.com/thejournal/</link>
    <description>Technical write-ups and project vaults by Alberto Duran on software architecture, AWS, Python, AI agents, and how this site is built.</description>
    <language>en</language>
    <atom:link href="https://albertoduran.com/thejournal/rss.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Tue, 29 Sep 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>Serverless VOD part two, an admin API and a public vault</title>
      <link>https://albertoduran.com/thejournal/aws_serverless_vod_manager/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/aws_serverless_vod_manager/</guid>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <description>How the video pipeline gained a Cognito-protected manager page, an HTTP API, a CORS fix only production could expose, and a public player.</description>
      <category>aws</category>
      <category>serverless</category>
      <category>api-gateway</category>
      <category>cognito</category>
      <category>cors</category>
    </item>
    <item>
      <title>Building albertoduran.com</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How albertoduran.com is built as a static-first Astro platform that compiles MDX, diagrams, and charts into inspectable files.</description>
      <category>astro</category>
      <category>architecture</category>
      <category>bloomwright</category>
      <category>cloudflare</category>
    </item>
    <item>
      <title>The publication compiler</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Writing an article is really compiling one. The path a candidate MDX file takes from schema, through policy and routing, to a rendered page.</description>
      <category>mdx</category>
      <category>content</category>
      <category>astro</category>
    </item>
    <item>
      <title>The schema, and what it refuses</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/content_model/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/content_model/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The live Zod schema every publication satisfies, the glob that hides partials, and the one field the schema accepts but the page never shows.</description>
      <category>content</category>
      <category>mdx</category>
      <category>astro</category>
    </item>
    <item>
      <title>Code fences as an authoring API</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/fences/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/fences/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why an author writes a fenced block instead of importing a component, how parity is guaranteed, and when to reach for the component after all.</description>
      <category>mdx</category>
      <category>daisyui</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Drafts, vaults, order, and read time</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/manifest_policy/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/manifest_policy/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The manifest is where publication policy lives. Draft scoping, the invariants a vault must satisfy, image inheritance, ordering, and the read-time formula.</description>
      <category>content</category>
      <category>astro</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Satteri, the component map, and highlighting</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/mdx_pipeline/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/mdx_pipeline/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The Markdown processor, why the fence integration registers before mdx, how Markdown elements become components, and how code gets two themes.</description>
      <category>mdx</category>
      <category>astro</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Static paths and the article shell</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/authoring/routing/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/authoring/routing/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How a catch-all route turns published entries into a finite list of pages, and the shell of sidebars, dock, and overlays that surrounds every article.</description>
      <category>astro</category>
      <category>content</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The packages behind the site</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why albertoduran stopped owning its UI kit and render engines, and how it now consumes them as two versioned packages.</description>
      <category>bloomwright</category>
      <category>architecture</category>
      <category>astro</category>
    </item>
    <item>
      <title>What extraction actually cost</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/costs/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/costs/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The counterweight to the extraction story: duplicated CSS (since retired), git-ref versioning, source-shipped compilation, and two build-only bugs.</description>
      <category>bloomwright</category>
      <category>css</category>
      <category>architecture</category>
    </item>
    <item>
      <title>bloomwright-mdx, extraction and glue</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/mdx_layer/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/mdx_layer/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The integration that turns code fences into rendered output, why it registers before mdx, and why it no longer renders Mermaid itself.</description>
      <category>bloomwright</category>
      <category>mdx</category>
      <category>astro</category>
    </item>
    <item>
      <title>The three inversions</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/seams/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/seams/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Extraction worked because three decisions moved from the packages to the app: what publishes, where bytes are cached, and who renders.</description>
      <category>bloomwright</category>
      <category>architecture</category>
      <category>mermaid</category>
    </item>
    <item>
      <title>bloomwright-ui as a component kit</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/ui_components/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/ui_components/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The four component families, the pure logic layer that keeps fences and components identical, and why icons ship as props.</description>
      <category>bloomwright</category>
      <category>daisyui</category>
      <category>css</category>
    </item>
    <item>
      <title>bloomwright-ui as a render core</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/bloomwright/ui_render_core/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/bloomwright/ui_render_core/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How a package that was meant to stay a dependency-free leaf deliberately reversed course and absorbed build-time rendering.</description>
      <category>bloomwright</category>
      <category>mermaid</category>
      <category>echarts</category>
    </item>
    <item>
      <title>The visual system after extraction</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>What the app still owns of its look, what bloomwright-ui now owns, and where the line between them falls after the UI kit moved out.</description>
      <category>css</category>
      <category>daisyui</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Live data at build time</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/build_time_data/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/build_time_data/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Consuming an unstable third-party source during the build, validating it like any other content, and letting the browser finish the one job the build cannot.</description>
      <category>astro</category>
      <category>content</category>
      <category>runtime</category>
    </item>
    <item>
      <title>The ordered stylesheet</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/css_architecture/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/css_architecture/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>One global stylesheet imported in eleven numbered stages, the DaisyUI parts it opts into, and how the duplicated partials from the extraction were retired.</description>
      <category>css</category>
      <category>daisyui</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Project pages and the profile</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/portfolio_surfaces/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/portfolio_surfaces/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The surfaces outside the journal: project landing pages that act as vault front doors, and the recruiter-facing profile built from typed data.</description>
      <category>astro</category>
      <category>architecture</category>
      <category>content</category>
    </item>
    <item>
      <title>The runtime boundary, split across repos</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/progressive_enhancement/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/progressive_enhancement/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Every browser enhancement improves a baseline that already renders. The custom elements that do it now ship from two repositories, and why failures stay local.</description>
      <category>runtime</category>
      <category>astro</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Moving through an article</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/reading_navigation/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/reading_navigation/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The app-owned reading experience: heading tracking with sticky offsets and page edges, the vault explorer tree, and previous-next pagination.</description>
      <category>runtime</category>
      <category>astro</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Themes, tokens, and three deadlines</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/interface/theming/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/interface/theming/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>DaisyUI 5 OKLCH themes and semantic tokens, and the three separate moments a theme has to be correct, each owned by a different layer.</description>
      <category>css</category>
      <category>daisyui</category>
      <category>runtime</category>
    </item>
    <item>
      <title>Four repositories, one artifact</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/platform/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/platform/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The system behind the site: what each repository owns, what is left in the app, and the single static artifact they all serve.</description>
      <category>architecture</category>
      <category>astro</category>
      <category>cloudflare</category>
    </item>
    <item>
      <title>From dist to the reader</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/platform/delivery/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/platform/delivery/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How the static build reaches Cloudflare Workers Static Assets, which caching and security headers it ships, and what the platform handles itself.</description>
      <category>cloudflare</category>
      <category>performance</category>
      <category>architecture</category>
    </item>
    <item>
      <title>What is left in src after extraction</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/platform/repository_shape/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/platform/repository_shape/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The app got smaller when the packages left. A tour of what remains in src, and one publication change traced through the boundaries that stayed.</description>
      <category>architecture</category>
      <category>astro</category>
      <category>bloomwright</category>
    </item>
    <item>
      <title>Working across four repositories</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/platform/workspace/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/platform/workspace/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The Node 22 devcontainer, how github dependencies resolve, and what a source-shipped package asks of the workspace that consumes it.</description>
      <category>astro</category>
      <category>bloomwright</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Nothing renders in the reader&apos;s browser</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How the site turns diagrams and charts into static SVG at build time, and the rule that decides which tool draws what.</description>
      <category>mermaid</category>
      <category>echarts</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The published chart catalog</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/chart_gallery/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/chart_gallery/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Every chart family rendered in a real article, with a note on the question each one answers, so an author can choose by looking at output.</description>
      <category>echarts</category>
      <category>charts</category>
      <category>mdx</category>
    </item>
    <item>
      <title>Charts as static SVG, with optional life</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/echarts/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/echarts/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>How an ECharts options object becomes a server-rendered SVG at build time, how it is cached and emitted, and the five ways it can wake up.</description>
      <category>echarts</category>
      <category>performance</category>
      <category>astro</category>
    </item>
    <item>
      <title>When the renderer is unreachable</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/fallbacks/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/fallbacks/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The provider chain that keeps a render outage from ever crashing a build, and the fixture mode that keeps tests offline.</description>
      <category>mermaid</category>
      <category>cloudflare</category>
      <category>testing</category>
    </item>
    <item>
      <title>The Mermaid pipeline, scan to emit</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/mermaid_pipeline/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/mermaid_pipeline/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The build integration that finds diagrams, batches them, checks a cache, renders the misses, and writes themed SVG assets.</description>
      <category>mermaid</category>
      <category>astro</category>
      <category>performance</category>
    </item>
    <item>
      <title>The render service, end to end</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/render_service/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/render_service/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The full round trip from the build to the Cloudflare Worker and back, what happens inside while the build waits, and two live mismatches.</description>
      <category>mermaid</category>
      <category>cloudflare</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Making a raw SVG safe and themeable</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/svg_transform/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/svg_transform/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The HAST pass that strips scripts, rewrites ids, scopes CSS, and merges light and dark into one asset, plus the palette that survives the network.</description>
      <category>mermaid</category>
      <category>css</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why rendering lives outside the build</title>
      <link>https://albertoduran.com/thejournal/building_albertoduran/rendering/why_a_worker/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/building_albertoduran/rendering/why_a_worker/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>The site deploys to Cloudflare, so why is there a second Cloudflare thing? The four-part answer, and the honest counterweights.</description>
      <category>mermaid</category>
      <category>cloudflare</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AWS serverless video on demand workflow</title>
      <link>https://albertoduran.com/thejournal/aws_serverless_vod/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/aws_serverless_vod/</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
      <description>A serverless AWS pipeline that turns private recordings into HLS playback with MediaConvert, S3, Lambda, EventBridge, and CloudFront.</description>
      <category>aws</category>
      <category>serverless</category>
      <category>video</category>
      <category>cloudfront</category>
    </item>
    <item>
      <title>Is Oracle Stock Undervalued?</title>
      <link>https://albertoduran.com/thejournal/is-oracle-stock-undervalued/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/is-oracle-stock-undervalued/</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
      <description>Oracle trades at a deep discount to its intrinsic value despite high debt and negative free cash flow from AI infrastructure investments</description>
      <category>orcl</category>
      <category>oracle</category>
      <category>stock-analysis</category>
      <category>software-infrastructure</category>
    </item>
    <item>
      <title>Three projects, one pipeline</title>
      <link>https://albertoduran.com/thejournal/three-projects-one-pipeline/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/three-projects-one-pipeline/</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
      <description>How three standalone tools, the Equity Valuation Engine, Equilyze, and Pressroom, turn a stock ticker into a finished article.</description>
      <category>pipeline</category>
      <category>architecture</category>
      <category>local-ai</category>
      <category>composition</category>
    </item>
    <item>
      <title>Run LangChain with Ollama locally</title>
      <link>https://albertoduran.com/thejournal/langchain_ollama/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/langchain_ollama/</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
      <description>Build a local LangChain chat project with Ollama, from environment setup to a working terminal conversation loop.</description>
      <category>langchain</category>
      <category>ollama</category>
      <category>python</category>
      <category>local-ai</category>
    </item>
    <item>
      <title>Equity valuation without the black box</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Years of conservative investing led me to build a Python engine for studying company valuations with visible assumptions, model checks, and limits.</description>
      <category>project</category>
      <category>python</category>
      <category>valuation</category>
    </item>
    <item>
      <title>Assumptions, scenarios, and honest uncertainty</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/assumptions_and_scenarios/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/assumptions_and_scenarios/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Learn how historical signals, configured limits, and scenario policy become Bear, Base, and Bull paths without pretending to predict.</description>
      <category>valuation</category>
      <category>finance</category>
      <category>scenarios</category>
    </item>
    <item>
      <title>How to choose a valuation model</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/choosing_a_valuation_model/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/choosing_a_valuation_model/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Match DCF, multiples, dividends, assets, and reverse DCF to the financial shape of a business before trusting any estimate.</description>
      <category>valuation</category>
      <category>finance</category>
      <category>models</category>
    </item>
    <item>
      <title>DCF and reverse DCF, step by step</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/dcf_and_reverse_dcf/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/dcf_and_reverse_dcf/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Build a discounted cash-flow valuation, inspect its sensitivity, and reverse the calculation to understand market-implied expectations.</description>
      <category>valuation</category>
      <category>dcf</category>
      <category>finance</category>
    </item>
    <item>
      <title>Extending the engine without breaking its contract</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/extending_the_engine/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/extending_the_engine/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Trace the architecture behind data fields, diagnostics, suitability, valuation managers, CLI output, JSON, and tests before adding features.</description>
      <category>python</category>
      <category>architecture</category>
      <category>valuation</category>
    </item>
    <item>
      <title>Your first valuation run</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/first_valuation_run/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/first_valuation_run/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Install the equity valuation engine, run one ticker, and learn to read suitability checks, scenarios, skipped models, and JSON.</description>
      <category>python</category>
      <category>valuation</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Six other ways to value a company</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/other_valuation_models/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/other_valuation_models/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Compare P/E, EV/EBITDA, P/S, ROE, DDM, and NAV through independent examples, and learn why every model needs its own guardrails.</description>
      <category>valuation</category>
      <category>multiples</category>
      <category>finance</category>
    </item>
    <item>
      <title>How to read a valuation result</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/reading_the_results/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/reading_the_results/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Interpret scenario rows, skipped models, the equal-weight composite, model dispersion, and JSON without turning output into a target price.</description>
      <category>valuation</category>
      <category>json</category>
      <category>analysis</category>
    </item>
    <item>
      <title>From market data to usable metrics</title>
      <link>https://albertoduran.com/thejournal/equity_valuation_engine/trusting_the_inputs/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/equity_valuation_engine/trusting_the_inputs/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Follow provider data into StockMetrics, learn what missing-value diagnostics preserve, and see which gaps can still mislead a model.</description>
      <category>python</category>
      <category>valuation</category>
      <category>data-quality</category>
    </item>
    <item>
      <title>Your first MLScraper price watch</title>
      <link>https://albertoduran.com/thejournal/mlscraper/first_price_watch/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/first_price_watch/</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <description>Follow one illustrative Amazon Mexico watch from YAML and URL preview to saved product history, runtime health, and a later price alert.</description>
      <category>python</category>
      <category>scraping</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building a price tracker that expects failure</title>
      <link>https://albertoduran.com/thejournal/mlscraper/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>One missed bargain became MLScraper, a Python service that watches four stores, preserves price history, and treats unreliable pages with care.</description>
      <category>project</category>
      <category>python</category>
      <category>scraping</category>
      <category>fastapi</category>
    </item>
    <item>
      <title>When a store blocks the scraper</title>
      <link>https://albertoduran.com/thejournal/mlscraper/fetching_and_backoff/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/fetching_and_backoff/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Learn how MLScraper chooses HTTP or browser fetching, protects history after incomplete pages, and slows the right scope after failures.</description>
      <category>python</category>
      <category>playwright</category>
      <category>scraping</category>
      <category>operations</category>
    </item>
    <item>
      <title>How a YAML job becomes a store URL</title>
      <link>https://albertoduran.com/thejournal/mlscraper/job_configuration/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/job_configuration/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Learn how MLScraper turns stable job identity and provider options into validated store routes, predictable storage paths, and safe previews.</description>
      <category>python</category>
      <category>configuration</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Operating MLScraper and adding a store</title>
      <link>https://albertoduran.com/thejournal/mlscraper/operations_and_extension/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/operations_and_extension/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Run MLScraper locally, diagnose health and saved state, exercise its offline tests, and extend the provider contract without runtime leaks.</description>
      <category>python</category>
      <category>testing</category>
      <category>operations</category>
      <category>scraping</category>
    </item>
    <item>
      <title>How a product becomes price history</title>
      <link>https://albertoduran.com/thejournal/mlscraper/persistence_and_lifecycle/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/persistence_and_lifecycle/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Follow one stable product identifier through updates, temporary absence, recovery, JSON persistence, and MLScraper price-drop alerts.</description>
      <category>python</category>
      <category>data</category>
      <category>persistence</category>
      <category>state-machines</category>
    </item>
    <item>
      <title>Why every store needs its own adapter</title>
      <link>https://albertoduran.com/thejournal/mlscraper/provider_boundaries/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/provider_boundaries/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Compare four ecommerce page formats and learn how MLScraper isolates store-specific URLs and parsing behind one product contract.</description>
      <category>python</category>
      <category>architecture</category>
      <category>scraping</category>
      <category>adapters</category>
    </item>
    <item>
      <title>What happens during one scrape cycle</title>
      <link>https://albertoduran.com/thejournal/mlscraper/runtime_flow/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/mlscraper/runtime_flow/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>See how FastAPI starts MLScraper, provider loops share concurrency safely, and health turns background work into observable state.</description>
      <category>python</category>
      <category>fastapi</category>
      <category>asyncio</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Automating cloud processor benchmarks with SiliconBoutique</title>
      <link>https://albertoduran.com/thejournal/siliconboutique/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/siliconboutique/</guid>
      <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
      <description>A benchmarking pipeline that runs Online Boutique locally, on GCP, and on AWS, keeps cloud history in BigQuery, and reports in Grafana and HTML.</description>
      <category>benchmarking</category>
      <category>kubernetes</category>
      <category>gcp</category>
      <category>terraform</category>
      <category>observability</category>
    </item>
    <item>
      <title>Designing an AI ops agent from the ground up</title>
      <link>https://albertoduran.com/thejournal/ai_ops_agent/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/ai_ops_agent/</guid>
      <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
      <description>A spec-driven blueprint for an infrastructure AI agent built with LangGraph, Prometheus, and Claude Sonnet, starting from seven markdown files.</description>
      <category>ai-agents</category>
      <category>site-reliability</category>
      <category>langgraph</category>
      <category>spec-driven-development</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>From zero to live GCP benchmarks with SiliconBoutique</title>
      <link>https://albertoduran.com/thejournal/gcp_setup_guide/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/gcp_setup_guide/</guid>
      <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
      <description>Set up a Google Cloud account, configure GitHub Actions OIDC auth, and run your first automated benchmark with SiliconBoutique.</description>
      <category>gcp</category>
      <category>github-actions</category>
      <category>terraform</category>
      <category>iam</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Engineering the Sin Pluma React frontend</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/frontend/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/frontend/</guid>
      <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
      <description>How Sin Pluma&apos;s React SPA is built: Redux state, HOC auth guards, Axios interceptors, a Slate.js rich text editor, and backend integration.</description>
      <category>react</category>
      <category>redux</category>
      <category>slate-js</category>
      <category>frontend</category>
    </item>
    <item>
      <title>A writer&apos;s platform</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>An academic writing platform introduced me to software architecture and placed second among more than 40 projects after I built it on my own.</description>
      <category>project</category>
      <category>software-design</category>
      <category>docker</category>
      <category>python</category>
      <category>react</category>
      <category>sql</category>
    </item>
    <item>
      <title>How Sin Pluma&apos;s architecture fits together</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/architecture/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/architecture/</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>Every service in Sin Pluma, how Docker networks isolate them, the data flows behind key operations, and the design&apos;s strengths and limits.</description>
      <category>architecture</category>
      <category>docker</category>
      <category>microservices</category>
      <category>docker</category>
      <category>python</category>
      <category>react</category>
      <category>sql</category>
    </item>
    <item>
      <title>Designing the Sin Pluma Flask REST API</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/flask_service/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/flask_service/</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>How Sin Pluma&apos;s Flask API is built: app factory, blueprints, the full endpoint list, Marshmallow validation, and MySQL, Redis, and MinIO.</description>
      <category>python</category>
      <category>flask</category>
      <category>rest api</category>
    </item>
    <item>
      <title>High availability with MySQL InnoDB Cluster in Sin Pluma</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/innodb_cluster/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/innodb_cluster/</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>How Sin Pluma runs a three-node MySQL InnoDB Cluster: bootstrap, automatic failover, schema management, and hardening beyond the demo.</description>
      <category>databases</category>
      <category>MySQL</category>
      <category>InnoDB</category>
      <category>cluster</category>
    </item>
    <item>
      <title>JWT in practice: access, refresh, and revocation in Sin Pluma</title>
      <link>https://albertoduran.com/thejournal/sin_pluma/jwt/</link>
      <guid isPermaLink="true">https://albertoduran.com/thejournal/sin_pluma/jwt/</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>Sin Pluma&apos;s JWT implementation end to end: token structure, lifecycle, the Redis blacklist, the Axios refresh queue, and storage trade-offs.</description>
      <category>JWT</category>
      <category>authentication</category>
      <category>security</category>
    </item>
  </channel>
</rss>
