TheJournal.

Writing about technical challenges, life lessons, and the things that keep me overthinking. Like a blog, but with a cooler name.

62Publications
8h 13mTotal read time
Building albertoduran.com
6 mins read
Vault

Building albertoduran.com

How albertoduran.com is built as a static-first Astro platform that compiles MDX, diagrams, and charts into inspectable files.

#astro#architecture#bloomwright
AWS serverless video on demand workflow
14 mins read

AWS serverless video on demand workflow

A practical look at a serverless AWS video pipeline that turns private recordings into HLS playback through MediaConvert, S3, Lambda, EventBridge, and CloudFront.

#aws#serverless#video
Is Oracle Stock Undervalued?
11 mins read

Is Oracle Stock Undervalued?

Oracle trades at a deep discount to its intrinsic value despite high debt and negative free cash flow from AI infrastructure investments

#orcl#oracle#stock-analysis
Three projects, one pipeline
6 mins read

Three projects, one pipeline

How three standalone tools, the Equity Valuation Engine, Equilyze, and Pressroom, turn a stock ticker into a finished article.

#pipeline#architecture#local-ai
Run LangChain with Ollama locally
12 mins read

Run LangChain with Ollama locally

Build a local LangChain chat project with Ollama, from environment setup to a working terminal conversation loop.

#langchain#ollama#python
Equity valuation without the black box
10 mins read
Vault

Equity valuation without the black box

Years of conservative investing led me to build a Python engine for studying company valuations with visible assumptions, model checks, and limits.

#project#python#valuation
Building a price tracker that expects failure
11 mins read
Vault

Building a price tracker that expects failure

One missed bargain became MLScraper, a Python service that watches four stores, preserves price history, and treats unreliable pages with care.

#project#python#scraping
Automating cloud processor benchmarks with SiliconBoutique
16 mins read

Automating cloud processor benchmarks with SiliconBoutique

A unified benchmarking pipeline that deploys Online Boutique locally, on GCP, and on AWS, collects metrics, persists cloud history to BigQuery, and serves results in Grafana and a portable HTML dashboard.

#benchmarking#kubernetes#gcp
Designing an AI ops agent from the ground up
30 mins read

Designing an AI ops agent from the ground up

A spec-driven blueprint for building infrastructure intelligence with LangGraph, Prometheus, and Claude Sonnet. Learn how seven markdown files become a working AI agent.

#ai-agents#site-reliability#langgraph
From zero to live GCP benchmarks with SiliconBoutique
21 mins read

From zero to live GCP benchmarks with SiliconBoutique

A complete walkthrough for setting up a Google Cloud account, configuring GitHub Actions OIDC auth, and running your first automated benchmark with SiliconBoutique.

#gcp#github-actions#terraform
A writer's platform
9 mins read
Vault

A writer's platform

An academic writing platform introduced me to software architecture and placed second among 40 projects after I built it on my own.

#project#software-design#docker
The publication compiler
3 mins readIn Building albertoduran.com

The publication compiler

Writing an article is really compiling one. The path a candidate MDX file takes from schema, through policy and routing, to a rendered page.

#mdx#content#astro
The schema, and what it refuses
3 mins readIn Building albertoduran.com

The schema, and what it refuses

The live Zod schema every publication satisfies, the glob that hides partials, and the one field the schema accepts but the page never shows.

#content#mdx#astro
Code fences as an authoring API
4 mins readIn Building albertoduran.com

Code fences as an authoring API

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.

#mdx#daisyui#bloomwright
Drafts, vaults, order, and read time
4 mins readIn Building albertoduran.com

Drafts, vaults, order, and read time

The manifest is where publication policy lives. Draft scoping, the invariants a vault must satisfy, image inheritance, ordering, and the read-time formula.

#content#astro#architecture
Satteri, the component map, and highlighting
4 mins readIn Building albertoduran.com

Satteri, the component map, and highlighting

The Markdown processor, why the fence integration registers before mdx, how Markdown elements become components, and how code gets two themes.

#mdx#astro#bloomwright
Static paths and the article shell
4 mins readIn Building albertoduran.com

Static paths and the article shell

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.

#astro#content#architecture
The packages behind the site
5 mins readIn Building albertoduran.com

The packages behind the site

Why albertoduran stopped owning its UI kit and render engines, and how it now consumes them as two versioned packages.

#bloomwright#architecture#astro
What extraction actually cost
6 mins readIn Building albertoduran.com

What extraction actually cost

The honest counterweight to the extraction story: duplicated CSS, git-ref versioning, source-shipped compilation, and two bugs only the real build found.

#bloomwright#css#architecture
bloomwright-mdx, extraction and glue
6 mins readIn Building albertoduran.com

bloomwright-mdx, extraction and glue

The integration that turns code fences into rendered output, why it registers before mdx, and why it no longer renders Mermaid itself.

#bloomwright#mdx#astro
The three inversions
7 mins readIn Building albertoduran.com

The three inversions

Extraction worked because three decisions moved from the packages to the app: what publishes, where bytes are cached, and who renders.

#bloomwright#architecture#mermaid
bloomwright-ui as a component kit
7 mins readIn Building albertoduran.com

bloomwright-ui as a component kit

The four component families, the pure logic layer that keeps fences and components identical, and why icons ship as props.

#bloomwright#daisyui#css
bloomwright-ui as a render core
6 mins readIn Building albertoduran.com

bloomwright-ui as a render core

How a package that was meant to stay a dependency-free leaf deliberately reversed course and absorbed build-time rendering.

#bloomwright#mermaid#echarts
The visual system after extraction
3 mins readIn Building albertoduran.com

The visual system after extraction

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.

#css#daisyui#bloomwright
Live data at build time
5 mins readIn Building albertoduran.com

Live data at build time

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.

#astro#content#runtime
The ordered stylesheet and its duplication
4 mins readIn Building albertoduran.com

The ordered stylesheet and its duplication

One global stylesheet imported in ten numbered stages, the DaisyUI parts it opts into, and the duplicated partials the extraction left behind.

#css#daisyui#bloomwright
Project pages and the profile
4 mins readIn Building albertoduran.com

Project pages and the profile

The surfaces outside the journal: project landing pages that act as vault front doors, and the recruiter-facing profile built from typed data.

#astro#architecture#content
The runtime boundary, split across repos
4 mins readIn Building albertoduran.com

The runtime boundary, split across repos

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.

#runtime#astro#bloomwright
Moving through an article
4 mins readIn Building albertoduran.com

Moving through an article

The app-owned reading experience: heading tracking with sticky offsets and page edges, the vault explorer tree, and previous-next pagination.

#runtime#astro#architecture
Themes, tokens, and three deadlines
4 mins readIn Building albertoduran.com

Themes, tokens, and three deadlines

DaisyUI 5 OKLCH themes and semantic tokens, and the three separate moments a theme has to be correct, each owned by a different layer.

#css#daisyui#runtime
Four repositories, one artifact
3 mins readIn Building albertoduran.com

Four repositories, one artifact

The system behind the site: what each repository owns, what is left in the app, and the single static artifact they all serve.

#architecture#astro#cloudflare
From dist to the reader
4 mins readIn Building albertoduran.com

From dist to the reader

How the static build reaches Cloudflare Workers Static Assets, the caching and security headers it ships, and where configuration ends and platform capability begins.

#cloudflare#performance#architecture
What is left in src after extraction
4 mins readIn Building albertoduran.com

What is left in src after extraction

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.

#architecture#astro#bloomwright
Working across four repositories
4 mins readIn Building albertoduran.com

Working across four repositories

The Node 22 devcontainer, how github dependencies resolve, and what a source-shipped package asks of the workspace that consumes it.

#astro#bloomwright#architecture
Nothing renders in the reader's browser
3 mins readIn Building albertoduran.com

Nothing renders in the reader's browser

How the site turns diagrams and charts into static SVG at build time, and the rule that decides which tool draws what.

#mermaid#echarts#architecture
The published chart catalog
8 mins readIn Building albertoduran.com

The published chart catalog

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.

#echarts#charts#mdx
Charts as static SVG, with optional life
4 mins readIn Building albertoduran.com

Charts as static SVG, with optional life

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.

#echarts#performance#astro
When the renderer is unreachable
4 mins readIn Building albertoduran.com

When the renderer is unreachable

The provider chain that keeps a render outage from ever crashing a build, and the fixture mode that keeps tests offline.

#mermaid#cloudflare#testing
The Mermaid pipeline, scan to emit
4 mins readIn Building albertoduran.com

The Mermaid pipeline, scan to emit

The build integration that finds diagrams, batches them, checks a cache, renders the misses, and writes themed SVG assets.

#mermaid#astro#performance
The render service, end to end
5 mins readIn Building albertoduran.com

The render service, end to end

The full round trip from the build to the Cloudflare Worker and back, what happens inside while the build waits, and two live mismatches.

#mermaid#cloudflare#architecture
Making a raw SVG safe and themeable
5 mins readIn Building albertoduran.com

Making a raw SVG safe and themeable

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.

#mermaid#css#architecture
Why rendering lives outside the build
4 mins readIn Building albertoduran.com

Why rendering lives outside the build

The site deploys to Cloudflare, so why is there a second Cloudflare thing? The four-part answer, and the honest counterweights.

#mermaid#cloudflare#architecture
Assumptions, scenarios, and honest uncertainty
10 mins readIn Equity valuation without the black box

Assumptions, scenarios, and honest uncertainty

Learn how historical signals, configured limits, and scenario policy become Bear, Base, and Bull paths without pretending to predict.

#valuation#finance#scenarios
How to choose a valuation model
11 mins readIn Equity valuation without the black box

How to choose a valuation model

Match DCF, multiples, dividends, assets, and reverse DCF to the financial shape of a business before trusting any estimate.

#valuation#finance#models
DCF and reverse DCF, step by step
11 mins readIn Equity valuation without the black box

DCF and reverse DCF, step by step

Build a discounted cash-flow valuation, inspect its sensitivity, and reverse the calculation to understand market-implied expectations.

#valuation#dcf#finance
Extending the engine without breaking its contract
10 mins readIn Equity valuation without the black box

Extending the engine without breaking its contract

Trace the architecture behind data fields, diagnostics, suitability, valuation managers, CLI output, JSON, and tests before adding features.

#python#architecture#valuation
Your first valuation run
11 mins readIn Equity valuation without the black box

Your first valuation run

Install the equity valuation engine, run one ticker, and learn to read suitability checks, scenarios, skipped models, and JSON.

#python#valuation#tutorial
Six other ways to value a company
11 mins readIn Equity valuation without the black box

Six other ways to value a company

Compare P/E, EV/EBITDA, P/S, ROE, DDM, and NAV through independent examples, and learn why every model needs its own guardrails.

#valuation#multiples#finance
How to read a valuation result
11 mins readIn Equity valuation without the black box

How to read a valuation result

Interpret scenario rows, skipped models, the equal-weight composite, model dispersion, and JSON without turning output into a target price.

#valuation#json#analysis
From market data to usable metrics
10 mins readIn Equity valuation without the black box

From market data to usable metrics

Follow provider data into StockMetrics, learn what missing-value diagnostics preserve, and see which gaps can still mislead a model.

#python#valuation#data-quality
Your first MLScraper price watch
12 mins readIn Building a price tracker that expects failure

Your first MLScraper price watch

Follow one illustrative Amazon Mexico watch from YAML and URL preview to saved product history, runtime health, and a later price alert.

#python#scraping#tutorial
When a store blocks the scraper
10 mins readIn Building a price tracker that expects failure

When a store blocks the scraper

Learn how MLScraper chooses HTTP or browser fetching, protects history after incomplete pages, and slows the right scope after failures.

#python#playwright#scraping
How a YAML job becomes a store URL
11 mins readIn Building a price tracker that expects failure

How a YAML job becomes a store URL

Learn how MLScraper turns stable job identity and provider options into validated store routes, predictable storage paths, and safe previews.

#python#configuration#scraping
Operating MLScraper and adding a store
10 mins readIn Building a price tracker that expects failure

Operating MLScraper and adding a store

Run MLScraper locally, diagnose health and saved state, exercise its offline tests, and extend the provider contract without runtime leaks.

#python#testing#operations
How a product becomes price history
10 mins readIn Building a price tracker that expects failure

How a product becomes price history

Follow one stable product identifier through updates, temporary absence, recovery, JSON persistence, and MLScraper price-drop alerts.

#python#data#persistence
Why every store needs its own adapter
10 mins readIn Building a price tracker that expects failure

Why every store needs its own adapter

Compare four ecommerce page formats and learn how MLScraper isolates store-specific URLs and parsing behind one product contract.

#python#architecture#scraping
What happens during one scrape cycle
11 mins readIn Building a price tracker that expects failure

What happens during one scrape cycle

See how FastAPI starts MLScraper, provider loops share concurrency safely, and health turns background work into observable state.

#python#fastapi#asyncio
Engineering the Sin Pluma React frontend
11 mins readIn A writer's platform

Engineering the Sin Pluma React frontend

A detailed look at how Sin Pluma's React SPA is structured: Redux state, HOC-based auth guards, Axios interceptors, Slate.js rich text editor, and backend service integration patterns.

#react#redux#slate-js
How Sin Pluma's architecture fits together
8 mins readIn A writer's platform

How Sin Pluma's architecture fits together

A detailed walkthrough of every service in the Sin Pluma system, how Docker networks isolate them, the data flows behind key operations, and the architectural strengths and constraints.

#architecture#docker#microservices
Designing the Sin Pluma Flask REST API
10 mins readIn A writer's platform

Designing the Sin Pluma Flask REST API

How Sin Pluma's Flask API is structured: the app factory pattern, blueprint organization, full endpoint inventory, Marshmallow validation, and integrations with MySQL, Redis, and MinIO.

#python#flask#rest api
High availability with MySQL InnoDB Cluster in Sin Pluma
10 mins readIn A writer's platform

High availability with MySQL InnoDB Cluster in Sin Pluma

How Sin Pluma bootstraps a three-node MySQL InnoDB Cluster, handles automatic failover, manages the schema, and what production hardening looks like beyond the demo environment.

#databases#MySQL#InnoDB
JWT in practice: access, refresh, and revocation in Sin Pluma
10 mins readIn A writer's platform

JWT in practice: access, refresh, and revocation in Sin Pluma

A detailed walkthrough of Sin Pluma's JWT implementation: token structure, full lifecycle, the Redis blacklist, the Axios refresh queue, storage trade-offs, and security best practices.