<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Néstor&apos;s Blog</title><description>Writing about software architecture, functional programming, and systems design.</description><link>https://nstlopez.com/</link><item><title>Federation of Specialists: From Module Federation to AI Orchestration</title><link>https://nstlopez.com/talks/cityjs-london-federation-specialists/</link><guid isPermaLink="true">https://nstlopez.com/talks/cityjs-london-federation-specialists/</guid><description>A CityJS London talk connecting federated UI architecture with production AI systems built from specialized agents.</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Frontend teams already learned how to split monoliths without breaking product experience. AI systems are going through a similar shift.&lt;/p&gt;
&lt;p&gt;This talk traces the move from federated UI and composable runtime systems to a federation of AI specialists. It focuses on why production AI works better when agents have clear roles, controlled tools, workflow hooks, shared collaboration context, and policy boundaries.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://london.cityjsconf.org/&quot;&gt;Event source&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Module Federation in Practice: Microfrontends Across Frameworks and Bundlers</title><link>https://nstlopez.com/talks/cityjs-london-module-federation-workshop/</link><guid isPermaLink="true">https://nstlopez.com/talks/cityjs-london-module-federation-workshop/</guid><description>A CityJS London workshop introducing Module Federation across different frameworks and bundlers.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A practical workshop on using Module Federation across different frameworks and bundlers.&lt;/p&gt;
&lt;p&gt;The session compares implementation approaches, shows how Module Federation supports microfrontends and adjacent architecture patterns, and explains how Zephyr Cloud simplifies orchestration for federated applications.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://guild.host/events/free-workshop-module-cb7v1o&quot;&gt;Event source&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Superpositioned Infrastructure and Distributed JavaScript</title><link>https://nstlopez.com/talks/js-monthly-london-superpositioned-infrastructure/</link><guid isPermaLink="true">https://nstlopez.com/talks/js-monthly-london-superpositioned-infrastructure/</guid><description>A JS Monthly London meetup talk on superpositioned infrastructure and distributed JavaScript with Module Federation.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Serverless reduced operational burden, but it never fully removed infrastructure. This meetup talk explores superpositioned infrastructure and how Module Federation turns distributed JavaScript into a runtime-defined system.&lt;/p&gt;
&lt;p&gt;The central idea is to decouple compute and code so services can compose dynamically instead of being tied to one fixed deployment surface.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://guild.host/presentations/superpositioned-infraestructure-24qvel&quot;&gt;Event source&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Federated Systems at Scale with Zephyr Cloud</title><link>https://nstlopez.com/talks/senors-at-scale-federated-systems/</link><guid isPermaLink="true">https://nstlopez.com/talks/senors-at-scale-federated-systems/</guid><description>A Señors at Scale conversation on Module Federation, edge deployments, reverse tree shaking, and federated MCP servers.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/TCPSZ0ADhz0?si=P1Nj9-tgY9FFl6sj&quot;
title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A conversation with Dan Neciu and Zack Chapple about deploying federated frontends globally, the operational model behind Zephyr Cloud, and how Module Federation maps to edge delivery.&lt;/p&gt;
&lt;p&gt;We cover Zephyr&apos;s build-to-edge workflow, reverse tree shaking, local development workflows for microfrontends, federated MCP servers for enterprise AI orchestration, and the Node.js module unloading work needed for better server-side hot reloading.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://neciudan.dev/senors-at-scale&quot;&gt;Episode source&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Service as a Software</title><link>https://nstlopez.com/blog/service-as-software/</link><guid isPermaLink="true">https://nstlopez.com/blog/service-as-software/</guid><description>SaaS sold you seats and dashboards. Service as a Software sells you the finished result, with software taking over more of the operational loop.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ok, so. Here&apos;s the weird part: I think the next big software category might look like &lt;strong&gt;less software&lt;/strong&gt;, not more.&lt;/p&gt;
&lt;p&gt;The obvious story is &quot;AI will make SaaS better.&quot; Sure, probably. But I don&apos;t think that&apos;s the interesting story.&lt;/p&gt;
&lt;p&gt;The interesting story is that the &lt;strong&gt;contract&lt;/strong&gt; is starting to change.&lt;/p&gt;
&lt;p&gt;For the last twenty years, the playbook was clean: find a painful business workflow, wrap it in a dashboard, sell seats, add admin controls, add reporting, and call it a category. Salesforce did this for CRM. Zendesk did it for support. NetSuite did it for finance. The customer wasn&apos;t buying completed work. They were buying the &lt;strong&gt;cockpit&lt;/strong&gt; for doing the work themselves.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Service as a Software&lt;/code&gt; flips that. The pitch is no longer &quot;here&apos;s the interface, your team handles the rest.&quot; The pitch is closer to &quot;send us the task, we&apos;ll send back the result.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s not a feature change. That&apos;s a business model and trust boundary change.&lt;/p&gt;
&lt;p&gt;SaaS sells &lt;strong&gt;outputs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This new thing tries to sell &lt;strong&gt;outcomes&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The Old Magic Was That the Human Was Still the Runtime&lt;/h2&gt;
&lt;p&gt;Classic SaaS was such a good business because the software improved the workflow without actually taking responsibility for the final step. It made people faster, more organized, more measurable, less error-prone. But the human operator was still the one closing the loop.&lt;/p&gt;
&lt;p&gt;That detail mattered a lot.&lt;/p&gt;
&lt;p&gt;It explains why seat-based pricing fit so naturally. More operators meant more value. More value meant more licenses. It was still, at heart, a &lt;strong&gt;tool business&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You can see this pretty much everywhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the CRM creates and organizes the lead&lt;/li&gt;
&lt;li&gt;the support system tags and routes the ticket&lt;/li&gt;
&lt;li&gt;the finance product assembles the invoice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the software stops one level short of the actual business promise. Someone still has to decide, approve, send, reconcile, follow up, or clean up the weird edge case from Thursday afternoon.&lt;/p&gt;
&lt;p&gt;That&apos;s the part getting eaten.&lt;/p&gt;
&lt;h2&gt;The Category Shift Is Not AI Features, It&apos;s Operational Ownership&lt;/h2&gt;
&lt;p&gt;This is where I think people flatten the whole thing into &quot;AI SaaS&quot;, which is a bit too neat.&lt;/p&gt;
&lt;p&gt;Adding a chatbot to the sidebar is not the shift. Autocomplete isn&apos;t the shift either. Even a very good copilot may not be the shift.&lt;/p&gt;
&lt;p&gt;The shift happens when the software starts absorbing enough of the &lt;strong&gt;operational loop&lt;/strong&gt; that the customer relates to it more like a service provider than a tool vendor.&lt;/p&gt;
&lt;p&gt;Not &quot;help my team do this.&quot;&lt;/p&gt;
&lt;p&gt;More like &quot;just get this done.&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s the center-of-gravity move.&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;output&lt;/strong&gt; is what the product produces: a record, a draft, a classification, a generated invoice.&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;outcome&lt;/strong&gt; is what the customer was actually trying to buy: the meeting got booked, the refund got processed, the ticket got resolved, the books got closed without drama.&lt;/p&gt;
&lt;p&gt;SaaS made operators better at producing outputs.&lt;/p&gt;
&lt;p&gt;Service as a Software tries to own enough of the path to the outcome that the customer stops thinking in clicks and starts thinking in completed work.&lt;/p&gt;
&lt;h2&gt;What This Looks Like When You Zoom All the Way In&lt;/h2&gt;
&lt;p&gt;Take invoice processing.&lt;/p&gt;
&lt;p&gt;In the SaaS version, the pitch is familiar: here is a cleaner queue for your AP team, better search, better approval flows, maybe some OCR so the PDFs stop being awful. Still useful. Still software. Still your team doing the job.&lt;/p&gt;
&lt;p&gt;In the Service as a Software version, the promise gets much more specific:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ingest the invoice from email or vendor portal&lt;/li&gt;
&lt;li&gt;extract line items and tax fields&lt;/li&gt;
&lt;li&gt;match it against the PO and vendor record&lt;/li&gt;
&lt;li&gt;push straight-through cases into the ERP&lt;/li&gt;
&lt;li&gt;route the suspicious 6% to a human with context attached&lt;/li&gt;
&lt;li&gt;keep an audit trail for every decision&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Same workflow. Very different product.&lt;/p&gt;
&lt;p&gt;The thing being sold is no longer &quot;finance software.&quot; It&apos;s closer to &quot;we help you close AP without staffing every step manually.&quot;&lt;/p&gt;
&lt;p&gt;And once you frame it that way, a bunch of product decisions invert.&lt;/p&gt;
&lt;h2&gt;The Interface Gets Demoted and the Invisible System Gets Promoted&lt;/h2&gt;
&lt;p&gt;In classic SaaS, the dashboard is the star. You demo the UI. You count active seats. You brag about time spent in product (well, maybe not publicly, but you know what I mean).&lt;/p&gt;
&lt;p&gt;In this model, the ideal reaction is almost the opposite:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nice, I barely had to open it&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s a very different success condition.&lt;/p&gt;
&lt;p&gt;The visible app gets thinner. The invisible machinery gets much more important:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;li&gt;retries&lt;/li&gt;
&lt;li&gt;confidence thresholds&lt;/li&gt;
&lt;li&gt;escalation paths&lt;/li&gt;
&lt;li&gt;audit logs&lt;/li&gt;
&lt;li&gt;human review queues&lt;/li&gt;
&lt;li&gt;fallback logic for when the model gets weird&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because the work is the product now, not the screen.&lt;/p&gt;
&lt;h2&gt;The Real Moat Is Not the Answer, It&apos;s Owning the Miss&lt;/h2&gt;
&lt;p&gt;This is the part I keep coming back to.&lt;/p&gt;
&lt;p&gt;The hard part is not generating something plausible. Models are increasingly good at that. The hard part is being &lt;strong&gt;on the hook&lt;/strong&gt; when the result is wrong.&lt;/p&gt;
&lt;p&gt;A normal SaaS vendor can still say, in effect, &quot;we provide the controls; your team decides what to do.&quot; A Service as a Software company has to say something much scarier:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;yes, we&apos;ll do the work&lt;/p&gt;
&lt;p&gt;and yes, we own what happens when it goes sideways&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s why I don&apos;t think the moat here is &quot;we have access to model X.&quot;&lt;/p&gt;
&lt;p&gt;The moat is everything around the model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;confidence calibration&lt;/li&gt;
&lt;li&gt;exception routing&lt;/li&gt;
&lt;li&gt;rollback and replay&lt;/li&gt;
&lt;li&gt;compliance posture&lt;/li&gt;
&lt;li&gt;auditability&lt;/li&gt;
&lt;li&gt;good human handoff when automation should stop pretending&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words: operational taste, turned into software.&lt;/p&gt;
&lt;p&gt;That&apos;s the asset.&lt;/p&gt;
&lt;h2&gt;If You Want to Build This, Usage Metrics Stop Being the Main Story&lt;/h2&gt;
&lt;p&gt;This also changes how these companies should probably be measured.&lt;/p&gt;
&lt;p&gt;If your product is still basically software, you care about seats, time in app, feature adoption, expansion by team, all the usual stuff.&lt;/p&gt;
&lt;p&gt;If your product is drifting toward service, the better questions start sounding more operational:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what percentage goes straight through without human touch?&lt;/li&gt;
&lt;li&gt;where do failures cluster?&lt;/li&gt;
&lt;li&gt;how quickly do exceptions get resolved?&lt;/li&gt;
&lt;li&gt;how legible is the audit trail?&lt;/li&gt;
&lt;li&gt;can a customer trust the handoff when the system says &quot;I don&apos;t know&quot;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s why this category feels so awkward to people looking at it through a pure SaaS lens. The product metrics start blending into service metrics. The app becomes part software, part operations console, part policy engine, part accountability surface.&lt;/p&gt;
&lt;p&gt;Messy category. Real shift.&lt;/p&gt;
&lt;h2&gt;Software as a Service Was an Abstraction Win; This Is the Next One&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Software as a Service&lt;/code&gt; took us from installing boxed software to renting capabilities over the network. Huge abstraction win. One of the best business-model upgrades the industry ever got.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Service as a Software&lt;/code&gt; feels like the next step. Not because dashboards are dead. They aren&apos;t. And not because every workflow should be fully automated. Absolutely not.&lt;/p&gt;
&lt;p&gt;But because more buyers are going to ask a much simpler question:&lt;/p&gt;
&lt;p&gt;Do I want another tool for my team?&lt;/p&gt;
&lt;p&gt;Or do I want this problem mostly gone?&lt;/p&gt;
&lt;p&gt;That seems like the real shift.&lt;/p&gt;
&lt;p&gt;The companies that matter in the next wave won&apos;t just build nicer admin panels with better AI affordances. They&apos;ll build systems that quietly eat repetitive service businesses from the inside, one workflow at a time.&lt;/p&gt;
&lt;p&gt;I don&apos;t think we fully have the language for this category yet.&lt;/p&gt;
&lt;p&gt;But I think this is the layer that matters.&lt;/p&gt;
</content:encoded></item><item><title>Bad Apple on Module Federation</title><link>https://nstlopez.com/projects/bad-apple-module-federation/</link><guid isPermaLink="true">https://nstlopez.com/projects/bad-apple-module-federation/</guid><description>A ridiculous and surprisingly performant experiment: Bad Apple split into 5,258 microfrontends and streamed frame by frame through Module Federation Runtime.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This one started the same way a lot of dumb fun ideas start: with me wondering whether something that absolutely should not exist could still be made to work.&lt;/p&gt;
&lt;p&gt;So I gave &lt;code&gt;5.3-codex&lt;/code&gt; a ridiculous prompt and asked it to turn &lt;strong&gt;Bad Apple&lt;/strong&gt; into a &lt;strong&gt;Module Federation&lt;/strong&gt; experiment. Not a normal one either. I wanted the whole thing broken into tiny pieces and loaded through a single runtime like the most unreasonable version of a microfrontend demo possible.&lt;/p&gt;
&lt;p&gt;The result was &lt;strong&gt;5,258 microfrontends&lt;/strong&gt; being loaded and unloaded at a steady &lt;strong&gt;24fps&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What surprised me was not that it rendered a couple frames and then exploded. What surprised me was that it just kept going. No weird collapse halfway through, no immediate stutter-fest, no runtime tantrum. It just kept up with every boundary and played through like this was somehow a perfectly normal thing to do.&lt;/p&gt;
&lt;p&gt;That is why I like this project so much. It is half joke, half stress test, and half me being unable to leave a terrible idea alone once I realize it might actually work.&lt;/p&gt;
&lt;p&gt;&amp;lt;div
class=&quot;relative w-full overflow-hidden rounded-lg shadow-lg&quot;
style=&quot;padding-top: 56.25%;&quot;&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;absolute inset-0 h-full w-full&quot;
src=&quot;https://www.youtube.com/embed/NHIAULEsbRg&quot;
title=&quot;Bad Apple on Module Federation&quot;
loading=&quot;lazy&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you want to watch the full thing, the demo is on &lt;a href=&quot;https://www.youtube.com/watch?v=NHIAULEsbRg&quot;&gt;YouTube&lt;/a&gt;. If you want to inspect the mess, the code is on &lt;a href=&quot;https://github.com/Nsttt/bad-apple-module-federation&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Superpositioned Infrastructure: Build Anywhere, Deploy Everywhere</title><link>https://nstlopez.com/talks/cityjs-singapore-superpositioned-infrastructure/</link><guid isPermaLink="true">https://nstlopez.com/talks/cityjs-singapore-superpositioned-infrastructure/</guid><description>A CityJS Singapore talk on overlay infrastructure, Module Federation, and decoupling artifacts from fixed machines.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This talk explores a simple idea: &quot;serverless&quot; did not remove servers, it mostly hid where artifacts land. Building on lessons from Module Federation and Zephyr, I argue for overlay infrastructure where services are not pinned to fixed nodes and can materialize exactly where they are needed.&lt;/p&gt;
&lt;p&gt;I cover single-node and multi-node overlays, decoupling the filesystem from computation, and what becomes possible when CI can stream work into any environment instead of targeting one predefined place.&lt;/p&gt;
&lt;p&gt;The goal is less orchestration, fewer hard infrastructure boundaries, and a path toward intent-driven systems.&lt;/p&gt;
</content:encoded></item><item><title>Module Federation and Infrastructure Superposition</title><link>https://nstlopez.com/talks/coruna-wtf-module-federation-infrastructure-superposition/</link><guid isPermaLink="true">https://nstlopez.com/talks/coruna-wtf-module-federation-infrastructure-superposition/</guid><description>A CoruñaWTF talk on using Module Federation beyond microfrontends, toward deployment models where services materialize where they are needed.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This session looks at Module Federation as more than a microfrontend pattern: a deployment model that can reduce the operational weight of shipping software and move infrastructure closer to a dynamic, request-shaped system.&lt;/p&gt;
&lt;p&gt;I start from the limits of classic serverless: servers still exist, regions are still fixed enough to matter, and deployment pipelines can become heavier than expected. From there, the talk explores infrastructure superposition, where services stay dynamic and materialize where they are needed instead of being pinned to a single deployment surface.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.es/e/entradas-module-federation-y-la-infraestructura-de-superposicion-1978936047991&quot;&gt;Event source&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>The Four Chips of AI Supremacy</title><link>https://nstlopez.com/blog/four-layer-ai-moat/</link><guid isPermaLink="true">https://nstlopez.com/blog/four-layer-ai-moat/</guid><description>Why AI power is decided by four layers, compute, data centers, models, and distribution, and why most companies are renters, not owners.</description><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What if every AI company is playing a game with four rules they didn&apos;t write?&lt;/p&gt;
&lt;p&gt;There&apos;s a framework going around among people who actually build AI systems. Not the evangelists, but the engineers watching their training budgets vanish. It says the AI race isn&apos;t about who has the best model. It&apos;s about who owns four infrastructure layers that decide who really runs this space.&lt;/p&gt;
&lt;p&gt;Here are the four &quot;chips.&quot; Not literal silicon, but the four layers of power every AI company ends up depending on.&lt;/p&gt;
&lt;h2&gt;Chip 1: The Silicon (The Compute Layer)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The first &quot;AI accelerator&quot; many of us touched wasn&apos;t a data center card, it was a tiny USB stick doing edge inference on a NAS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the foundation: Tensor Processing Units, the hardware that runs the math. While everyone obsesses over Nvidia&apos;s latest GPU, the real power move is owning the whole compute stack. TPUs aren&apos;t just accelerators. They&apos;re the physical foundation that decides how fast you train and how much it costs to run models. Whoever owns this decides who can even afford to build the big models.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; If you don&apos;t control your silicon, you&apos;re paying rent to someone who does. Every AI company is either designing chips (Google, Amazon, Meta), buying them at scale (OpenAI via Microsoft), or getting squeezed by both. Your model is only as good as the compute you can access, and the price you pay for it.&lt;/p&gt;
&lt;h2&gt;Chip 2: The Data Centers (The Physical Layer)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Physical power is capital plus concrete: land rights, power contracts, cooling, and backbone fiber, not just racks in someone else&apos;s building.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is where power gets physical. Data centers aren&apos;t just buildings with servers. They&apos;re about who has the money and power to actually build them. The key detail: GCP is profitable today, and those profits fund tomorrow&apos;s expansion. No investor rounds, no begging for cash. It just keeps growing on its own.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Training a big model costs around $100 million in compute. If you don&apos;t own the data centers, you&apos;re not just paying for electricity. You&apos;re funding your competitor&apos;s expansion. Every dollar you spend on AWS, Azure, or GCP makes them stronger for the next training run. You become a customer of your own rival.&lt;/p&gt;
&lt;h2&gt;Chip 3: The Models (The Intelligence Layer)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Models feel like the crown jewel, but they&apos;re the most perishable asset in the stack. Every breakthrough has an 18 month half life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the layer everyone thinks matters most. But here&apos;s the trap: models don&apos;t last. Gemini is impressive today, but it&apos;ll be obsolete in 18 months. What matters isn&apos;t the model itself, but the ability to keep making better ones forever. Duplex in 2018 proves they solved core LLM challenges years before the &quot;AI boom.&quot; They just didn&apos;t ship it until the market forced their hand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Building a better model than GPT-4 is a temporary win. Building the system that produces better models indefinitely, that&apos;s what actually matters. Every AI company is either building that system or hoping their current model&apos;s lead lasts long enough to raise the next round.&lt;/p&gt;
&lt;h2&gt;Chip 4: The Distribution (The Reach Layer)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The switch that matters is the one that reaches users: billions of phones, browsers, inboxes, or endpoints ready for an update.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the layer that wins the game. You don&apos;t need distribution deals when you have 2.5 billion devices waiting for updates. While OpenAI needs Microsoft&apos;s enterprise sales team and API partnerships, others can flip a switch and their AI is in every pocket, browser, and email client overnight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; The best AI model in the world is worthless if no one uses it. Distribution is the difference between a research paper and a product. Every AI company without their own way to get to users is just a feature waiting to be absorbed or replaced.&lt;/p&gt;
&lt;h2&gt;The Uncomfortable Truth&lt;/h2&gt;
&lt;p&gt;Here&apos;s what the framework reveals: every AI company is stuck in this four chip system. You&apos;re either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renting the first two chips (compute and data centers) from Nvidia or Amazon&lt;/li&gt;
&lt;li&gt;Fighting it out on the third chip (models) in a race you can&apos;t sustain alone&lt;/li&gt;
&lt;li&gt;Begging for access to the fourth chip (distribution) from those who own the platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even the most hyped AI labs are just third chip companies paying rent on the first two and praying their distribution partners don&apos;t change the terms.&lt;/p&gt;
&lt;h2&gt;How One Company Stacks All Four Chips&lt;/h2&gt;
&lt;p&gt;Let&apos;s look at what happens when you actually own the whole stack: Google.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chip 1, Compute:&lt;/strong&gt; They&apos;ve been making TPUs for seven generations. They control everything from the compiler to the networking, so they can tune power, speed, and cost together instead of waiting for an OEM to update firmware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chip 2, Physical:&lt;/strong&gt; They treat data centers like products. They pick sites for cheap power and build with cash flow, not investor money. Because GCP is already profitable, every training run a customer buys funds the next building, which makes everything cheaper. That cycle is hard to catch from the outside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chip 3, Intelligence:&lt;/strong&gt; Their research pipeline is a conveyor belt: foundational work (BERT, Transformer) → big models (Gemini) → specialized versions (Med-PaLM) → product features (Workspace, Pixel). The whole organization is built to ship the &lt;em&gt;next&lt;/em&gt; model, not just defend the current one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chip 4, Reach:&lt;/strong&gt; This is the checkmate piece. Android, Chrome, Gmail, Maps, YouTube, and the Play Store give them billions of ready to update devices. Server side rollout (Search, Ads) plus client updates means new AI features can land in days without asking anyone&apos;s permission.&lt;/p&gt;
&lt;h2&gt;The Real Moat&lt;/h2&gt;
&lt;p&gt;The insight isn&apos;t that any single company is invincible. It&apos;s that real AI power requires all four chips working together. You can be the best at one layer, but without the other three, you&apos;re a specialist in a generalist&apos;s world.&lt;/p&gt;
&lt;p&gt;The four chips don&apos;t care about your model&apos;s benchmark scores. They care about who owns the stack. And right now, most AI companies are just tenants.&lt;/p&gt;
</content:encoded></item><item><title>Lessons from a Keyboard Basher</title><link>https://nstlopez.com/talks/cifp-rodolfo-ucha-ensenanzas/</link><guid isPermaLink="true">https://nstlopez.com/talks/cifp-rodolfo-ucha-ensenanzas/</guid><description>Lessons from a keyboard basher: my path into tech and practical guidance for students to land their first roles.</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A candid session with students at CIFP Rodolfo Ucha. I walk through my career path—the wins and mistakes that opened doors—and how they can replicate it: what to learn first, how to build a portfolio that shows real skills, where to find opportunities, and what to prioritize in interviews. I also cover why collaborating with community, writing about what you learn, and choosing projects that tell a clear story to employers makes such a big difference.&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/tWHILmP0P6s&quot;
title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Microfrontends deployments in 10ms with Zephyr Cloud</title><link>https://nstlopez.com/talks/gsas-module-federation-zephyr/</link><guid isPermaLink="true">https://nstlopez.com/talks/gsas-module-federation-zephyr/</guid><description>Deploying microfrontends at memory-access speed</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;10 milliseconds. That&apos;s not a build time—it&apos;s a production deployment. At Zephyr Cloud, we reimagined microfrontend delivery from first principles, building a platform where frontend updates ship at the speed of memory access. This talk reveals how we layer Module Federation with our edge-native runtime to achieve sub-second deployments, the pipeline architecture that makes &apos;push to prod&apos; instantaneous, and the safety mechanisms that empower teams to move fast without the traditional risks. Learn how we eliminated the infrastructure tax on frontend releases and what it takes to make millisecond deployments production-ready.&lt;/p&gt;
</content:encoded></item><item><title>From Light Bulbs to AI Agents</title><link>https://nstlopez.com/blog/from-light-bulbs-to-agents/</link><guid isPermaLink="true">https://nstlopez.com/blog/from-light-bulbs-to-agents/</guid><description>Turns out the Internet of Agents just needs the same boring stack we trusted to keep the porch light on.</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Remember debugging MQTT topics for smart-home gateways?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kitchen/temp&lt;/code&gt; → 21.5 °C&lt;/li&gt;
&lt;li&gt;&lt;code&gt;garage/door&lt;/code&gt; → closed…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason we loved MQTT back then was dead-simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One broker, n-many clients&lt;/li&gt;
&lt;li&gt;Pub/sub decouples who talks to whom&lt;/li&gt;
&lt;li&gt;Wildcards + retained messages give discovery for free&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my opinion, those same three super-powers turn out to be exactly what large-scale AI systems are crying for today.&lt;/p&gt;
&lt;p&gt;When every micro-service, RAG pipeline, and LLM wrapper can show up, disappear, or change price in seconds, you need a routing layer that is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stateless on the broker side&lt;/li&gt;
&lt;li&gt;Embeddable in fire-walled environments&lt;/li&gt;
&lt;li&gt;Able to notify 500k nodes in sub-linear time&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sound familiar? It&apos;s called &lt;code&gt;MQTT&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;The Problem No One Tells You About &quot;AI Orchestration&quot;&lt;/h2&gt;
&lt;p&gt;Classic tool-chaining frameworks are stuck in the HTTP era:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A central router holds open connections to every worker → &lt;em&gt;file descriptor explosion&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&quot;Who can do what?&quot; becomes a never-ending polling loop → &lt;em&gt;rate-limit hell&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Exactly-once and redelivery? DIY retries, exponential back-off, circuit-breakers… all in &lt;em&gt;your&lt;/em&gt; code base&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We fixed these pains for thermostats years ago by moving to MQTT.&lt;/p&gt;
&lt;p&gt;It&apos;s about time to apply the same medicine to language models and vector stores.&lt;/p&gt;
&lt;h2&gt;Agent Resumés As Retained Topics&lt;/h2&gt;
&lt;p&gt;Publishing a sensor value is old news. Publish an agent&apos;s capabilities the same way:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agents/{agentId}/resume&lt;/code&gt; ← retained JSON:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;skills&quot;: [&quot;sql-optimiser&quot;, &quot;nl2chart&quot;],
  &quot;cost&quot;: { &quot;usd&quot;: 0.02, &quot;p95_ms&quot;: 350 },
  &quot;region&quot;: &quot;eu-central-1&quot;,
  &quot;accredit&quot;: [&quot;ISO27001&quot;, &quot;gdpr&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any orchestrator (or CLI) that subscribes to &lt;code&gt;agents/+/resume&lt;/code&gt; builds a real-time registry without HTTP calls, without polling, without a single line of server code.&lt;/p&gt;
&lt;h2&gt;Task Requests Fly Over Wildcards&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;A client publishes a complex request to &lt;code&gt;tasks/{uuid}/request&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Capable agents auto-reply with proposed sub-task DAGs onto &lt;code&gt;tasks/{uuid}/proposal/+/&lt;/code&gt;&lt;br /&gt;
&lt;em&gt;(wildcard plus means anyone can read, but only proposal-owner can write)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The orchestrator chooses the merged DAG and publishes individual assignments under &lt;code&gt;tasks/{uuid}/assign/{agentId}&lt;/code&gt; with QoS 2&lt;/li&gt;
&lt;li&gt;Results come back via &lt;code&gt;tasks/{uuid}/output/{stepId}&lt;/code&gt; – again retained, so late-join nodes never miss state&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because MQTT has three built-in QoS levels, the &lt;em&gt;exactly-once&lt;/em&gt; path for critical steps costs you one flag, not a weekend of re-write.&lt;/p&gt;
&lt;h2&gt;Scaling To 100k Clients Without Boiling the Broker&lt;/h2&gt;
&lt;p&gt;Eclipse Mosquitto 2.x already demonstrated 200k+ concurrent connections on a $5 VM. Memory usage per idle client? &amp;lt;4 kB.&lt;/p&gt;
&lt;p&gt;Publish payload for a capability update or intermediate JSON result is typically under 2 kB, smaller than the average JPEG thumbnail we once pushed for camera snapshots.&lt;/p&gt;
&lt;p&gt;If your broker handled 100k temperature sensors, it will handle 100k agents without breaking a sweat.&lt;/p&gt;
&lt;h2&gt;Security &amp;amp; Compliance Out-of-the-Box&lt;/h2&gt;
&lt;p&gt;Topic ACLs support wildcards, so a hospital can forbid any agent advertising &lt;code&gt;gdpr=false&lt;/code&gt; from subscribing to PHI topics:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pattern readwrite +/gdpr/false/#
pattern deny +/patient-data/#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add X.509 client certs and you&apos;ve got mutual TLS plus topic-level policy enforcement, all broker-native.&lt;/p&gt;
&lt;h2&gt;From the Edge to the Cloud With Shared Subscriptions&lt;/h2&gt;
&lt;p&gt;Need a GPU-heavy task but the edge device is a Pi? Create a shared subscription group:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$share/gpu/tasks/+/heavy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cloud nodes join the group, messages are load-balanced among them yet still replied to over the original task UUID.&lt;/p&gt;
&lt;h3&gt;Another personal example&lt;/h3&gt;
&lt;p&gt;A video encoding job came in while I was traveling with just my laptop. My home server cluster was idle but my laptop battery was running low.&lt;/p&gt;
&lt;p&gt;I prefixed the topic:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$share/media/encode/+/video
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The home servers in the same share group picked up the encoding task, my laptop stayed cool and quiet, and the processed video was ready when I got back online.&lt;/p&gt;
&lt;p&gt;Shared subscriptions are MQTT’s built-in load balancer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No HA-proxy of any kind&lt;/li&gt;
&lt;li&gt;No Kubernetes service mesh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just a dollar sign.&lt;/p&gt;
&lt;h2&gt;What You Must Actually Reconfigure&lt;/h2&gt;
&lt;p&gt;Nothing. Your favourite broker (Mosquitto, EMQX, HiveMQ, Nanomq) already supports every pattern above.&lt;/p&gt;
&lt;p&gt;All that changes is perspective:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retained messages → the single source of truth&lt;/li&gt;
&lt;li&gt;Wildcards → declarative queries&lt;/li&gt;
&lt;li&gt;QoS levels → reliability without code&lt;/li&gt;
&lt;li&gt;ACLs → policy enforcement at wire-speed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Take from someone who already speaks MQTT&lt;/h2&gt;
&lt;p&gt;Today the &quot;things&quot; are no longer light bulbs, they&apos;re containerised LLMs that spin up in Ohio, complain about GPU quota, then vanish.&lt;/p&gt;
&lt;p&gt;The chatter is still:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;birth message → “I exist, here’s what I can do”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;telemetry → “this is my current cost, latency, license”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;command → “execute sub-task 7”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;last-will → “I died, don’t route to me”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your old topic patterns already cover 90% of that lifecycle.&lt;/p&gt;
&lt;p&gt;The only new ingredient is intent: instead of °C you publish embeddings, instead of toggling a relay you toggle a 4-bit quantised model.&lt;/p&gt;
&lt;p&gt;Turns out the Internet of Agents just needs the same boring stack we trusted to keep the porch light on.&lt;/p&gt;
</content:encoded></item><item><title>My Bizarre Dev Adventure: Atlanta to Austin Arc</title><link>https://nstlopez.com/blog/my-bizarre-dev-adventure/</link><guid isPermaLink="true">https://nstlopez.com/blog/my-bizarre-dev-adventure/</guid><description>Two months across America hitting conferences, debugging prod mid-pitch, and collecting stories from Atlanta to Austin.</description><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you&apos;re mentioned or shown in this article and would like to be removed, send me a message over at &lt;a href=&quot;https://x.com/nstlopez&quot;&gt;@nstlopez&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So I just spent almost two months traveling across the US, hitting conferences, meeting customers, and somehow managing to live-debug production code mid-pitch. Let me take you through this &lt;em&gt;absolutely wild&lt;/em&gt; journey that started with a customs interrogation and ended with me shooting guns in Texas for the first time.&lt;/p&gt;
&lt;h2&gt;Atlanta: The Great Luggage Swap &amp;amp; RenderATL&lt;/h2&gt;
&lt;h3&gt;Day 1: Welcome to America lmao&lt;/h3&gt;
&lt;p&gt;Left Madrid, landed in Atlanta. Got through customs clean, then &lt;em&gt;plot twist&lt;/em&gt;, got stopped halfway out. They put me in a room for 30 minutes. Asked what happened and they told me &quot;we can&apos;t tell you, goodbye&quot;. &lt;strong&gt;Welcome to America&lt;/strong&gt;, I guess?&lt;/p&gt;
&lt;p&gt;My boss &lt;a href=&quot;https://x.com/Zackary_Chapple&quot;&gt;Zack Chapple&lt;/a&gt; picked me up and immediately took me to &lt;strong&gt;Costco&lt;/strong&gt;. Yes, &lt;em&gt;Costco&lt;/em&gt;. First stop in America. Bought some pecans that made it all the way back to Spain (they were incredible, btw). After Chinese food and meeting his wonderful family, we headed downstairs to unpack.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s where it gets &lt;em&gt;hilarious&lt;/em&gt;: &lt;strong&gt;IT WASN&apos;T MY LUGGAGE&lt;/strong&gt;. Same exact suitcase, shape, color, everything, but someone else&apos;s entire life inside. And apparently, the one I accidentally grabbed was a &lt;em&gt;rush order&lt;/em&gt; (urgent baggage). Whoops. We hustled back to the airport at midnight, apologized profusely, got mine back. Crisis averted.&lt;/p&gt;
&lt;h3&gt;Day 2-4: RenderATL Madness&lt;/h3&gt;
&lt;p&gt;Next day we also picked up a shiny new &lt;strong&gt;Apple M4 Max&lt;/strong&gt;. Sweet.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Day two kicked off in properly American fashion: &lt;strong&gt;Wendy&apos;s Breakfast Baconator&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then straight to RenderATL where I finally met my coworkers &lt;a href=&quot;https://x.com/swalker326&quot;&gt;Shane&lt;/a&gt;, &lt;a href=&quot;https://x.com/zmzlois&quot;&gt;Lois&lt;/a&gt;, and &lt;a href=&quot;https://www.linkedin.com/in/sika-noxolo-24070017/&quot;&gt;Sika&lt;/a&gt; in person. Also &lt;a href=&quot;https://x.com/Zaeboi222&quot;&gt;Xavier&lt;/a&gt; and &lt;a href=&quot;https://x.com/ptahdunbar&quot;&gt;Ptah&lt;/a&gt; from Southern Glazer&apos;s, and &lt;a href=&quot;https://www.linkedin.com/in/joannier-pinales/&quot;&gt;Joannier&lt;/a&gt; from Microsoft.&lt;/p&gt;
&lt;p&gt;First day was mostly networking, but I got to meet &lt;a href=&quot;https://x.com/lucamezzalira&quot;&gt;Luca Mezzalira&lt;/a&gt;, &lt;em&gt;the&lt;/em&gt; microfrontends guy. We hit up the Makeswift and BigCommerce booth and met &lt;a href=&quot;https://x.com/saniyusuf&quot;&gt;Sani Yusuf&lt;/a&gt;, who knew Zephyr from the early days when the company was starting.&lt;/p&gt;
&lt;p&gt;Day two was an absolute blast. Went around all the booths meeting with the Cloudflare, Google, Vercel, Netlify, and Figma people. All super nice!&lt;/p&gt;
&lt;p&gt;The speakers&apos; dinner was where things got &lt;em&gt;interesting&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Me getting drunk at the dinner lmao&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Met &lt;a href=&quot;https://x.com/ericwendel_&quot;&gt;Eric Wendel&lt;/a&gt; (we&apos;d met before in Madrid but neither of us remembered, classic)&lt;/li&gt;
&lt;li&gt;Finally met my long-time friend &lt;a href=&quot;https://x.com/trashh_dev&quot;&gt;Chris (TrashDev)&lt;/a&gt; from Netflix in person&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/FrancescoCiull4&quot;&gt;Francesco Ciulla&lt;/a&gt; and I geeked out about Rust and the dynamic tree-shaking stuff we&apos;re cooking at Zephyr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/jchris&quot;&gt;J Chris Anderson&lt;/a&gt; from &lt;a href=&quot;https://vibes.diy/&quot;&gt;Vibes.diy&lt;/a&gt; blew my mind by creating and deploying apps &lt;em&gt;from his phone&lt;/em&gt; on the spot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After-party queue was insane, wrapping around the building. Shane, Chris, Lois, and I said &quot;screw it&quot; and went for a walk instead. Shane spots some guy and goes: &lt;em&gt;&quot;Dude, that&apos;s a fucking actor.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IT WAS &lt;a href=&quot;https://en.wikipedia.org/wiki/Michael_Pe%C3%B1a&quot;&gt;MICHAEL PEÑA&lt;/a&gt;&lt;/strong&gt; from The Martian and Shooter. Got a pic and everything.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We ended up at a Japanese place for ramen, then stumbled into a hotel room party hosted by &lt;a href=&quot;https://x.com/ryandotfurrer&quot;&gt;Ryan Furrer&lt;/a&gt; and &lt;a href=&quot;https://x.com/iamwix&quot;&gt;Chris Nowicki&lt;/a&gt;. Free drinks, great conversations, perfect night.&lt;/p&gt;
&lt;h3&gt;The Cloudflare Incident™&lt;/h3&gt;
&lt;p&gt;Day three at Render was &lt;em&gt;comedy gold&lt;/em&gt;. While working from our coworking space with Xavier, Luca, Zack, and Joannier, &lt;strong&gt;Cloudflare had a massive outage&lt;/strong&gt;. Watching Luca and Joannier frantically checking internal Amazon and Microsoft channels to see if it was global was hilarious.&lt;/p&gt;
&lt;p&gt;Back at the conference, &lt;em&gt;everyone&lt;/em&gt; crowded around the Cloudflare booth demanding answers. Then we found out it was actually &lt;strong&gt;GCP&apos;s fault&lt;/strong&gt;, so the entire mob migrated to Google&apos;s booth. I&apos;ve never seen anything like it.&lt;/p&gt;
&lt;p&gt;Met the absolute legend &lt;a href=&quot;https://x.com/ken_wheeler&quot;&gt;Ken Wheeler&lt;/a&gt; at the Netlify booth. Most charismatic person I&apos;ve ever met, hands down. Caught Zack Chapple&apos;s microfrontends talk (really solid), then tried &lt;strong&gt;bison meat&lt;/strong&gt; for the first time at dinner while Ken entertained everyone with his stories.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Last RenderATL day: early demos with &lt;a href=&quot;https://x.com/ollermi&quot;&gt;Miguel&lt;/a&gt; from Makeswift and &lt;a href=&quot;https://www.linkedin.com/in/alitas-dev/&quot;&gt;Ali Tas&lt;/a&gt; from PayPal about Zephyr.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;First-ever &lt;strong&gt;Waffle House&lt;/strong&gt; experience (another American checkbox ✓).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Caught talks from Xavier and Lois.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Later that night, I hit another party where I met tons of people including &lt;a href=&quot;https://www.linkedin.com/in/roytanjx/&quot;&gt;Roy Tan&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/sterlingchapman/&quot;&gt;Sterling Chapman&lt;/a&gt;, &lt;a href=&quot;https://x.com/shashiwhocodes&quot;&gt;Shashi Lo&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/dgoetzcodes.bsky.social&quot;&gt;Dillon Goetz&lt;/a&gt;, and &lt;a href=&quot;https://x.com/ArrowoodTech&quot;&gt;Ethan Arrowood&lt;/a&gt;. Stayed until past midnight just talking tech and life.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Bonus Atlanta day: breakfast with Chris and friends including &lt;a href=&quot;https://x.com/typesafeui&quot;&gt;TypeSafeUI&lt;/a&gt; and &lt;a href=&quot;https://x.com/MaxKless&quot;&gt;Max Kless&lt;/a&gt; from Nx. Later, Max, Lois, and I hung out with &lt;a href=&quot;https://x.com/StalkAltan&quot;&gt;Altan Stalker&lt;/a&gt;, another Nx engineer, exploring Atlanta.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Miami: Gators, Cuban Food, and Southern Glazer&apos;s&lt;/h2&gt;
&lt;h3&gt;First Day in Florida&lt;/h3&gt;
&lt;p&gt;Flight to Miami. Amazing Uber driver gave me life advice the whole ride. King, if you&apos;re reading this, you rock.&lt;/p&gt;
&lt;p&gt;Pulled up to my hotel and there&apos;s a &lt;strong&gt;fucking alligator&lt;/strong&gt; just chilling at the entrance. &lt;em&gt;Of course&lt;/em&gt; there is. Welcome to Florida. We all stood around for 15 minutes until animal control relocated it. Sad I didn&apos;t get any pictures.&lt;/p&gt;
&lt;p&gt;The Cuban food and juice shops in Miami? &lt;em&gt;Incredible&lt;/em&gt;. I&apos;m still dreaming about those fresh juices.&lt;/p&gt;
&lt;h3&gt;SGWS Office Week&lt;/h3&gt;
&lt;p&gt;First day at Southern Glazer&apos;s offices: sat with &lt;a href=&quot;https://www.linkedin.com/in/javieroropesa/&quot;&gt;Javier Oropesa&lt;/a&gt; diagramming Zephyr architecture and explaining our infrastructure implementation in detail. Later met &lt;a href=&quot;https://www.linkedin.com/in/jeffandvik/&quot;&gt;Jeff&lt;/a&gt; to discuss Module Federation specifics.&lt;/p&gt;
&lt;p&gt;That evening, finally met coworker &lt;a href=&quot;https://www.linkedin.com/in/kellyhull/&quot;&gt;Kelly Hull&lt;/a&gt; in person. Dinner at a Cuban place nearby.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Day two brought the whole crew: Zack arrived along with Xavier and Ptah. Argentinian steakhouse for lunch (amazing meat).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Then my &lt;strong&gt;first Chinese hot pot&lt;/strong&gt; that night. Loved it so much I ended up having hot pot in multiple cities after this.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;We left with the Hard Rock Hotel lighting up the entire Miami sky behind us.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Spent the next days deep in planning: Zephyr + SGWS architecture, CDN optimization, infrastructure decisions. Met &lt;a href=&quot;https://www.linkedin.com/in/hrayr-mirzoyan/&quot;&gt;Hrayr Mirzoyan&lt;/a&gt;, one of their architects who became an instant friend.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/JordanPowell88&quot;&gt;Jordan Powell&lt;/a&gt; from Nx joined us and we improved their CI times with Nx caching. Always satisfying watching those build times drop. Wrapped the week clearing knowledge silos and making sure everyone understood Zephyr&apos;s full capabilities.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Kelly and I found a Spanish restaurant one night that had all the provincial shields of Spain on the walls. Nice touch for a homesick Spaniard.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Weekend in Brickell: changed hotels, walked around Miami, did touristy stuff, bought clothes in the crazy heat. Massive thanks to Hrayr who took an entire day to show me around Miami: beaches, neighborhoods, the whole Miami lifestyle. You&apos;re the best, man.&lt;/p&gt;
&lt;h2&gt;New York: Vercel Ship &amp;amp; Everything Else&lt;/h2&gt;
&lt;h3&gt;Empire State Views to Spotify Offices&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;First stop: offices with a &lt;em&gt;perfect&lt;/em&gt; Empire State view. Ended up talking about &lt;strong&gt;Ember.js&lt;/strong&gt; (throwback!) and speedran &lt;a href=&quot;https://github.com/ZephyrCloudIO/zephyr-examples/tree/main/examples/ember-vite&quot;&gt;a plugin to make it deployable to Zephyr&lt;/a&gt;. Still got it.&lt;/p&gt;
&lt;p&gt;Spotify offices at the World Trade Center. Gorgeous views, amazing space. Had great conversations with &lt;a href=&quot;https://x.com/ilyamkin&quot;&gt;Ilya Lyamkin&lt;/a&gt; from the Backstage.io team.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Hit a Callstack React Native meetup where I met CEO &lt;a href=&quot;https://x.com/foxthecoach&quot;&gt;Kris Lis&lt;/a&gt; and cofounder &lt;a href=&quot;https://x.com/grabbou&quot;&gt;Mike Grabowski&lt;/a&gt;, amongst other people from Callstack. Super nice people, great energy.&lt;/p&gt;
&lt;h3&gt;Vercel Ship&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Vercel Ship 2025&lt;/strong&gt; was an absolute &lt;em&gt;vibe&lt;/em&gt;. They know how to throw a conference. Met up with my friend &lt;a href=&quot;https://x.com/javivelasco&quot;&gt;Javi&lt;/a&gt; (who I knew from before), and also met &lt;a href=&quot;https://x.com/rauchg&quot;&gt;Guillermo&lt;/a&gt; and &lt;a href=&quot;https://x.com/malteubl&quot;&gt;Malte&lt;/a&gt;. Got this cool pin with an NFC tag that I still carry around.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Worked from a coworking spot with &lt;a href=&quot;https://x.com/yagiznizipli&quot;&gt;Yagiz&lt;/a&gt; from Cloudflare, addressing some infrastructure questions we had.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Later I hit a LightningAI meetup and rooftop drinks where I met &lt;a href=&quot;https://x.com/jorgesancha&quot;&gt;Jorge Sancha from Tinybird&lt;/a&gt;, one of the few Spanish startups killing it internationally.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Also hung out with &lt;a href=&quot;https://x.com/TheWuster935&quot;&gt;Derek&lt;/a&gt; and took him to this amazing Galician restaurant in NYC. Always fun sharing Spanish culture with friends, especially when you&apos;re thousands of miles from home.&lt;/p&gt;
&lt;p&gt;Rest of NYC was pure tourism. Hit all the spots, ate all the food, walked until my feet hurt.&lt;/p&gt;
&lt;h2&gt;Seattle: Module Federation Deep Dives &amp;amp; July 4th&lt;/h2&gt;
&lt;p&gt;Landed in Seattle and immediately met up with &lt;a href=&quot;https://x.com/ScriptedAlchemy&quot;&gt;Zack Jackson&lt;/a&gt;, creator of Module Federation and infra architect at ByteDance. We spent &lt;em&gt;days&lt;/em&gt; together going deep on everything: distributed backends, JavaScript engines, and this wild idea about superpositioned infrastructure technology with Web3/blockchain elements. I&apos;ll write about that separately because it deserves its own post.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Quick visit to ByteDance offices, tourism around Seattle, and then &lt;strong&gt;July 4th at Gas Works Park&lt;/strong&gt; watching fireworks. Pretty epic way to experience American Independence Day.&lt;/p&gt;
&lt;h3&gt;The Tweet-Worthy Moment&lt;/h3&gt;
&lt;p&gt;The next week, while visiting a customer, I was mid-pitch demonstrating Zephyr when I spotted an issue in their docs. The customer challenged me directly: &quot;If Zephyr is that fast and good, prove it. Show us.&quot; So I did. Without missing a beat, I found the issue, patched it IN PROD, and kept going with the demo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/ScriptedAlchemy/status/1943557725889188123&quot;&gt;Zack tweeted about it&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The longest part was that I&apos;d never used that codebase before and had to find the problem. The patch was live before the commit hook even finished. Sometimes you just gotta ship.&lt;/p&gt;
&lt;p&gt;Also took a stroll through the Microsoft campus, saw all the Minecraft stuff in the offices. Really cool to see where the magic happens.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;San Francisco: The Gang&apos;s All Here&lt;/h2&gt;
&lt;p&gt;Quick office tours, then met our interns at True Ventures: shoutout to &lt;a href=&quot;https://x.com/nitinkanchi&quot;&gt;Nitin&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/james-duong-261242225/&quot;&gt;James&lt;/a&gt;, and &lt;a href=&quot;https://www.linkedin.com/in/miles-kennedy-4162352a3/&quot;&gt;Miles&lt;/a&gt;. You guys rock!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cluely.com/&quot;&gt;Cluely&lt;/a&gt; offices were absolutely stunning. Loved the vibe and energy there with &lt;a href=&quot;https://x.com/im_roy_lee&quot;&gt;Roy Lee&lt;/a&gt; and the team.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;At Cloudflare SF, got my photo with the &lt;strong&gt;iconic lava lamp wall&lt;/strong&gt; (bucket list ✓) and talked more infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Later, met &lt;a href=&quot;https://x.com/gary_qz&quot;&gt;Gary Qi&lt;/a&gt; from the Trae team back at True Ventures. Super chill guy.&lt;/p&gt;
&lt;h3&gt;An Evening at Theo&apos;s&lt;/h3&gt;
&lt;p&gt;The night at &lt;a href=&quot;https://x.com/t3dotgg&quot;&gt;Theo&apos;s&lt;/a&gt; place was a &lt;em&gt;&quot;meet your heroes&quot;&lt;/em&gt; kind of evening. Theo was super friendly and taught us a crazy amount of information about content creation and cameras. I enjoyed every last bit of it.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Also met &lt;a href=&quot;https://x.com/r_marked&quot;&gt;Mark&lt;/a&gt; in person finally, we only talked a couple of times over Discord. Caught up with &lt;a href=&quot;https://x.com/bmdavis419&quot;&gt;Ben&lt;/a&gt; (we&apos;d met before but neither could remember from where LOL). Chatted with &lt;a href=&quot;https://x.com/whosamberella&quot;&gt;Amber&lt;/a&gt; from Trae and &lt;a href=&quot;https://x.com/itseieio&quot;&gt;@itseieio&lt;/a&gt;, creator of &lt;a href=&quot;https://onemillioncheckboxes.com&quot;&gt;onemillioncheckboxes.com&lt;/a&gt;. Big fan btw.&lt;/p&gt;
&lt;h2&gt;Austin: The Final Stop&lt;/h2&gt;
&lt;p&gt;Left SF at around 4 AM super sleep deprived even though we had slept a couple hours. Landed in Austin at 1 AM (love those late flights). Next day, straight to Cloudflare&apos;s Austin office to work and randomly bumped into friends who happened to be there.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Met &lt;a href=&quot;https://x.com/dok2001&quot;&gt;Dane&lt;/a&gt;, Cloudflare&apos;s CTO and had some really exciting conversations about infrastructure and future possibilities. Super nice guy. It just so happens that the Makeswift team was there at the same exact time so we spent some time with them too.&lt;/p&gt;
&lt;p&gt;Also met with my long time friend &lt;a href=&quot;https://x.com/0ximjosh&quot;&gt;Josh&lt;/a&gt; from Manifold Labs. He took me for lunch to a really cool place. Cheers mate.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Before flying home, I went to a shooting range for the first time in my life. Adrenaline rush like nothing else. Very Texas way to end a very American trip.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thanks to everyone who shared their time, knowledge, food, and last-minute party access. The tech community is incredible, and meeting so many online friends IRL was surreal.&lt;/p&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://zephyr-cloud.io&quot;&gt;Zephyr&lt;/a&gt; for making this entire adventure possible. Without this amazing opportunity, none of these stories would exist. Grateful to work for a company that believes in building relationships and experiencing the world firsthand.&lt;/p&gt;
&lt;p&gt;Until next time! 🚀&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S. - Still thinking about those Miami juice shops and that first hot pot experience. Some things just hit different when you&apos;re 5,000 miles from home.&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>IoT Gateway</title><link>https://nstlopez.com/projects/iotgw/</link><guid isPermaLink="true">https://nstlopez.com/projects/iotgw/</guid><description>A comprehensive platform engineered to simplify the deployment, management, and monitoring of Industrial IoT infrastructures with zero-touch provisioning and real-time observability</description><pubDate>Sat, 24 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over the past few months, I&apos;ve been working with Raimon and Oriol on something we&apos;re really excited about - IoT Gateway. It&apos;s an industrial IoT platform that completely changes how you deploy and manage edge systems. Let me walk you through what we built and why I think it&apos;s pretty special.&lt;/p&gt;
&lt;h2&gt;The Problem We Set Out to Solve&lt;/h2&gt;
&lt;p&gt;If you&apos;ve ever deployed IoT systems in industrial settings, you know the pain. You&apos;re constantly juggling USB drives, manually configuring each device, and praying everything stays connected. When something breaks at 2 AM (and it always does), you&apos;re either driving to the site or walking someone through complex troubleshooting steps over the phone.&lt;/p&gt;
&lt;p&gt;We wanted to fix this. Our goal was simple: make deploying and managing industrial IoT systems as easy as spinning up a cloud server. No USB drives, no manual configuration, just plug it in and it works.&lt;/p&gt;
&lt;h2&gt;How We Made It Happen&lt;/h2&gt;
&lt;p&gt;The magic starts with network boot. When you power on a device, it doesn&apos;t need any local OS or configuration. Instead, it boots directly from the network using iPXE. This might sound complex, but here&apos;s what actually happens:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Device powers on and asks for an IP address&lt;/li&gt;
&lt;li&gt;Our DHCP server responds with network boot instructions&lt;/li&gt;
&lt;li&gt;Device downloads a lightweight live environment&lt;/li&gt;
&lt;li&gt;System automatically configures itself based on your requirements&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The beauty is that this works with pretty much any x86-64 hardware that supports network boot - no special equipment needed.&lt;/p&gt;
&lt;h2&gt;The Architecture That Makes It Work&lt;/h2&gt;
&lt;p&gt;Let me break down how we architected this thing. We divided everything into four main parts:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Provisioning System&lt;/strong&gt; handles getting new devices online. We built this on top of iPXE and Clonezilla because they&apos;re rock-solid and work everywhere. When a device boots, it loads our custom environment that includes everything needed to configure the system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Control System&lt;/strong&gt; is where the configuration magic happens. We use Ansible Forms (which dynamically generates web interfaces from Ansible playbooks) combined with Git for version control. This means you get a nice UI for configuration, but everything is still code under the hood. Every change is tracked, reversible, and reproducible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Application Layer&lt;/strong&gt; runs your actual workloads. We went with Docker containers managed by Dockge because it gives you flexibility without complexity. Need to run Node-RED for automation flows? MQTT brokers for device communication? Custom applications? Just define them in a compose file and deploy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Monitoring Stack&lt;/strong&gt; keeps tabs on everything. We integrated Grafana&apos;s entire ecosystem - Alloy for collection, Mimir for metrics, Loki for logs. This gives you enterprise-grade observability without the enterprise price tag.&lt;/p&gt;
&lt;h2&gt;What Makes Our Approach Different&lt;/h2&gt;
&lt;p&gt;Instead of building yet another monolithic platform, we focused on composability. Everything is modular - you can use just the provisioning system, or add monitoring, or go all-in with the complete stack.&lt;/p&gt;
&lt;p&gt;We also made some opinionated choices that I think pay off:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenWRT as the base OS&lt;/strong&gt;: It&apos;s tiny (100MB!), battle-tested, and designed for embedded systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitOps everywhere&lt;/strong&gt;: Every configuration is in Git, making disaster recovery trivial&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layer 2 VPN support&lt;/strong&gt;: We use ZeroTier in bridge mode, which means you can extend your network to non-IP industrial devices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network-based recovery&lt;/strong&gt;: If something breaks, you can restore from backup without touching the device&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-World Implementation Details&lt;/h2&gt;
&lt;p&gt;Let me share some implementation details that make this work in practice.&lt;/p&gt;
&lt;p&gt;For MQTT, we set up a hierarchical broker system. Each edge location runs Mosquitto locally for low-latency communication. Then we bridge selected topics to a central EMQX broker. This gives you the best of both worlds - local automation keeps working even if the internet dies, but you still get centralized visibility.&lt;/p&gt;
&lt;p&gt;The backup system was interesting to implement. We use Duplicati with a clever twist - backups are stored remotely (S3, cloud storage, wherever), but restoration happens through the same network boot system used for provisioning. Device won&apos;t boot? No problem - it&apos;ll automatically load the recovery environment and restore itself.&lt;/p&gt;
&lt;p&gt;For configuration management, Ansible Forms turned out to be a game-changer. Instead of writing web interfaces, we just write Ansible playbooks. The UI generates itself based on the playbook structure. Change a variable? Add a new package? Just update the playbook and the UI adapts automatically.&lt;/p&gt;
&lt;h2&gt;Performance and Practical Considerations&lt;/h2&gt;
&lt;p&gt;Here&apos;s what you can expect in real deployments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Systems boot in under 30 seconds from cold start&lt;/li&gt;
&lt;li&gt;The base image is around 100MB, with typical runtime memory usage around 512MB&lt;/li&gt;
&lt;li&gt;We&apos;ve tested up to 10,000 MQTT messages per second on modest hardware&lt;/li&gt;
&lt;li&gt;Full system backups complete in under 5 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These numbers matter because industrial sites often have limited bandwidth and older hardware. We optimized for these constraints from day one.&lt;/p&gt;
&lt;h2&gt;The Security Story&lt;/h2&gt;
&lt;p&gt;Security in industrial environments is tricky. You need strong protection but can&apos;t break existing workflows. Here&apos;s how we handle it:&lt;/p&gt;
&lt;p&gt;Every device gets a unique ZeroTier identity and joins encrypted networks. No VPN configuration needed - it just works. The firewall runs in default-deny mode with explicit rules for allowed traffic. All management interfaces require authentication, and secrets are encrypted at rest.&lt;/p&gt;
&lt;p&gt;For compliance, every configuration change is tracked in Git with full audit trails. Backups are AES-256 encrypted before leaving the device. System updates are atomic and can be rolled back if something goes wrong.&lt;/p&gt;
&lt;h2&gt;See It In Action&lt;/h2&gt;
&lt;p&gt;I&apos;ve recorded a series of videos walking through each component of IoT Gateway. These demos show real deployments and actual workflows - no marketing fluff, just how things actually work.&lt;/p&gt;
&lt;h3&gt;Infrastructure &amp;amp; Networking&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Network Architecture Overview&lt;/strong&gt; - Here&apos;s how we implement ZeroTier VPN with bridged networking for OT device connectivity&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/6T7rvnrf6K4&quot;
title=&quot;Network Architecture Overview&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;System Provisioning&lt;/strong&gt; - Watch the iPXE network boot process and base image deployment in action&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/aq3I2qahD7U&quot;
title=&quot;System Provisioning&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt; - This shows how Ansible Forms provides the UI for centralized system configuration&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/nD3MafF8zLU&quot;
title=&quot;Configuration Management&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Operations &amp;amp; Recovery&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Backup and Restore&lt;/strong&gt; - Our automated backup process with network-based restoration&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/Jz8XUtylkBI&quot;
title=&quot;Backup and Restore&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Live Rescue System&lt;/strong&gt; - Remote debugging capabilities through the Clonezilla live environment&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/XLT-ElDg0NM&quot;
title=&quot;Live Rescue System&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;System Management Interface&lt;/strong&gt; - Tour of OpenWRT LuCI, web terminal (ttyd), and SSH access&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/e-h6pZ5Qd1U&quot;
title=&quot;System Management Interface&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Application Stack&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Container Orchestration&lt;/strong&gt; - Docker stack management with GitOps and Dockge&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/kQc9rAQwNEE&quot;
title=&quot;Container Orchestration&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observability Platform&lt;/strong&gt; - How we integrate Grafana Alloy for logs, metrics, and OpenTelemetry support&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/44clHt8Mp8M&quot;
title=&quot;Observability Platform&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Service Monitoring&lt;/strong&gt; - Uptime Kuma deployment with Grafana integration&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/cBWgi_J1zM8&quot;
title=&quot;Service Monitoring&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Data &amp;amp; Integration&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Backup Telemetry&lt;/strong&gt; - Duplicati with Telegraf metrics collection to InfluxDB&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/rWEDQd0qn2c&quot;
title=&quot;Backup Telemetry&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;MQTT Architecture&lt;/strong&gt; - Setting up Mosquitto to EMQX bidirectional bridge configuration&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/mgSjszDx8S8&quot;
title=&quot;MQTT Architecture&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Flow Automation&lt;/strong&gt; - Node-RED with Git-based flow management&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/P1uduhdSG1o&quot;
title=&quot;Flow Automation&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Development&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Base Image Creation&lt;/strong&gt; - The Ansible-driven OpenWRT image build process&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/bW0RQB9-xr4&quot;
title=&quot;Base Image Creation&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Core Team&lt;/h2&gt;
&lt;p&gt;IoT Gateway is developed and maintained by Industry 4.0 Systems:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raimon Figueras&lt;/strong&gt; - System Architecture&lt;br /&gt;
&lt;strong&gt;Nestor Lopez&lt;/strong&gt; - Platform Development&lt;br /&gt;
&lt;strong&gt;Oriol Rius&lt;/strong&gt; - Industrial Integration&lt;/p&gt;
&lt;p&gt;If you&apos;re dealing with industrial IoT deployments and tired of the traditional approaches, give IoT Gateway a try. We built this because we needed it ourselves, and I think you might find it useful too.&lt;/p&gt;
&lt;p&gt;For technical details and deployment guides, visit the &lt;a href=&quot;https://github.com/i40sys/iotgw&quot;&gt;GitHub repository&lt;/a&gt; or contact the team at &lt;a href=&quot;mailto:iotgw@industry40.systems&quot;&gt;iotgw@industry40.systems&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Feel free to reach out if you have questions or want to discuss industrial IoT architectures. I&apos;m always happy to talk shop about edge computing, automation, and making industrial systems less painful to manage.&lt;/p&gt;
</content:encoded></item><item><title>Edge-Native Deployments with Zephyr Cloud</title><link>https://nstlopez.com/talks/zephyr-commitconf/</link><guid isPermaLink="true">https://nstlopez.com/talks/zephyr-commitconf/</guid><description>How to implement ultra-fast Module Federation deployments with Zephyr Cloud across web surfaces and shared modules.</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/Sv16bA3ISX8?si=sdalMQYNKRXgIaw9&quot;
title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Breaking SQLite Boundaries with libSQL</title><link>https://nstlopez.com/talks/lareiraconf/</link><guid isPermaLink="true">https://nstlopez.com/talks/lareiraconf/</guid><description>A Lareira Conf 2025 presentation on how libSQL extends SQLite capabilities with replication, WebAssembly support, and multi-tenant solutions.</description><pubDate>Sat, 22 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;iframe
class=&quot;w-full&quot;
height=&quot;450&quot;
src=&quot;https://www.youtube.com/embed/y9XqIwtP9Tw?si=ai7PxNTM4iSKlKxP&quot;
title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Revolutionizing WordPress: Headless Architecture with Next.js, GraphQL and Vercel</title><link>https://nstlopez.com/talks/wordpress-ferrol/</link><guid isPermaLink="true">https://nstlopez.com/talks/wordpress-ferrol/</guid><description>An exploration of how to transform WordPress into a modern headless architecture using Next.js, GraphQL and Vercel to create fast and scalable websites.</description><pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate><content:encoded>An exploration of how to transform WordPress into a modern headless architecture using Next.js, GraphQL and Vercel to create fast and scalable websites.</content:encoded></item><item><title>RadioVoz Interview on Technology Trends</title><link>https://nstlopez.com/talks/radio-voz-interview/</link><guid isPermaLink="true">https://nstlopez.com/talks/radio-voz-interview/</guid><description>A radio interview about technology trends, career paths in software development, and advice for newcomers to the tech industry.</description><pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;iframe
src=&quot;https://www.ivoox.com/player_ej_143332327_6_1.html?c1=04347c&quot;
width=&quot;100%&quot;
height=&quot;200&quot;
frameborder=&quot;0&quot;
allowfullscreen=&quot;&quot;
scrolling=&quot;no&quot;
loading=&quot;lazy&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>My Planetary Datacenter I: Architecture</title><link>https://nstlopez.com/blog/my-planetary-datacenter/</link><guid isPermaLink="true">https://nstlopez.com/blog/my-planetary-datacenter/</guid><description>Explore my homelab ‘Planetary Datacenter’ where ZeroTier networking, MacVLAN tricks, VLAN segmentation, and GPU passthrough combine for a global, DIY cloud.</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to the first post in what I’m calling my &lt;strong&gt;&lt;em&gt;“Planetary Datacenter”&lt;/em&gt;&lt;/strong&gt; series. Essentially, I’ve got a &lt;strong&gt;homelab&lt;/strong&gt; that I’ve been tinkering with for a while, &lt;strong&gt;building&lt;/strong&gt;, &lt;strong&gt;refining&lt;/strong&gt;, and sometimes &lt;em&gt;breaking it (on purpose!)&lt;/em&gt; to learn how to make it better. Now, I’m ready to share everything I’ve learned so far.&lt;/p&gt;
&lt;p&gt;I jokingly refer to my setup as a &lt;strong&gt;&lt;em&gt;“Planetary Datacenter”&lt;/em&gt;&lt;/strong&gt; because it stretches beyond just my house. Thanks to &lt;em&gt;clever networking&lt;/em&gt; and tools like &lt;a href=&quot;https://docs.zerotier.com/&quot;&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;&lt;/a&gt;, I can place services just about anywhere on the globe (hence &lt;strong&gt;&lt;em&gt;“planetary”&lt;/em&gt;&lt;/strong&gt;) and still have them communicate as if they were right next to each other on my local LAN. If you’re into homelabs, networking, or just curious about how to structure your own multi-machine environment, &lt;em&gt;stick around&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I’ll walk you through all of it.&lt;/p&gt;
&lt;h2&gt;What is the &lt;em&gt;“Planetary Datacenter”&lt;/em&gt; anyway?&lt;/h2&gt;
&lt;p&gt;I first introduced this idea at a &lt;strong&gt;CNCF Galicia&lt;/strong&gt; talk, where I discussed how I use &lt;a href=&quot;https://docs.zerotier.com/&quot;&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;&lt;/a&gt; and &lt;a href=&quot;https://www.wireguard.com/&quot;&gt;&lt;strong&gt;WireGuard&lt;/strong&gt;&lt;/a&gt; to interconnect various machines. Over time, I realized that combining ZeroTier with my local hardware gave me a pretty powerful setup: everything in one &lt;em&gt;“big” virtual LAN&lt;/em&gt;, accessible anywhere.&lt;/p&gt;
&lt;p&gt;So, if you picture your typical data center with racks and servers, now shrink it down to something you can manage in your living room or home office, then &lt;em&gt;magically&lt;/em&gt; extend it worldwide. That’s basically the idea.&lt;/p&gt;
&lt;h3&gt;Why bother with something this complex?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning &amp;amp; Fun:&lt;/strong&gt; I love &lt;em&gt;experimenting&lt;/em&gt;. Homelabs are a great way to learn networking, virtualization, and new software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Centralizing Services:&lt;/strong&gt; With this setup, I can keep my personal data and services under &lt;em&gt;my&lt;/em&gt; control, especially stuff like media servers, backups, and specialized containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Planet-Wide Access:&lt;/strong&gt; I can spin up a new service on a VPS, at home, or in a cloud provider. As soon as I hook it up to my &lt;a href=&quot;https://docs.zerotier.com/&quot;&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;&lt;/a&gt; network, it feels like it’s right there on my LAN. And in a worst case scenario, migrating can be done with a &lt;em&gt;click of a button&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Physical Infrastructure at Home&lt;/h2&gt;
&lt;p&gt;I’ll start by breaking down the hardware so you know what I’m working with.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;ISP Router &amp;amp; Ubiquiti hardware&lt;/h3&gt;
&lt;p&gt;My ISP router is basically acting as a &lt;strong&gt;pass-through device&lt;/strong&gt;. I’ve set it up with DMZ mode pointing straight to my &lt;a href=&quot;https://ui.com/&quot;&gt;&lt;strong&gt;&lt;em&gt;UDM Pro Max&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;. The UDM is the &lt;em&gt;nerve center&lt;/em&gt; of my home network. It handles VLANs, firewall rules, and all the fancy Unifi-based management. If you’re familiar with the Unifi ecosystem, you know it’s pretty user-friendly yet powerful enough to do some advanced stuff if you know how to hack it enough.&lt;/p&gt;
&lt;h3&gt;Switches &amp;amp; Access Points&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;USW 16 PoE Switch&lt;/strong&gt;: Handles both power (PoE) for devices like Wi-Fi access points and general switching duties.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;U7 Pro AP&lt;/strong&gt;: My main Wi-Fi access point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;USW Mini&lt;/strong&gt;: A &lt;em&gt;tiny&lt;/em&gt; switch I use for some client machines (like my Mac and a Windows machine).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Main Machines&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NAS &lt;a href=&quot;https://www.truenas.com/truenas-scale/&quot;&gt;TrueNAS Scale&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU/RAM&lt;/strong&gt;: Intel i5-7600K, 16GB RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 1×1TB SSD for the OS + 4×16TB HDD in a ZFS &lt;em&gt;“striped mirrors”&lt;/em&gt; arrangement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Role&lt;/strong&gt;: Holds all my data, shared mainly over &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7862.html&quot;&gt;&lt;em&gt;NFSv4.2&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MS01 &lt;a href=&quot;https://www.proxmox.com&quot;&gt;Proxmox Server&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU/RAM&lt;/strong&gt;: Intel i9-13900H, 32GB RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 2×1TB NVME in &lt;em&gt;RAID1&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Special Trick&lt;/strong&gt;: I fitted it with a &lt;em&gt;modified Intel ARC A380 GPU&lt;/em&gt; for hardware transcoding (swapped in a smaller heatsink from an ARC A310).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Role&lt;/strong&gt;: Runs &lt;strong&gt;Proxmox&lt;/strong&gt;, which hosts multiple VMs for all sorts of services (media, networking, Portainer, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;VLANs &amp;amp; Wi-Fi Networks&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VLANs&lt;/strong&gt; (or &lt;em&gt;Virtual LANs&lt;/em&gt;) let me split up my network into smaller segments, keeping different types of traffic isolated from each other. Here’s what I have:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LAN&lt;/strong&gt;: The &lt;em&gt;default network&lt;/em&gt; for my local machines and most VMs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Guests&lt;/strong&gt;: For visitors, restricted access, minimal privileges.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IoT&lt;/strong&gt; &amp;amp; &lt;strong&gt;IoT Private&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;IoT&lt;/em&gt;: For general smart bulbs, plugs, and devices that &lt;em&gt;do&lt;/em&gt; need internet access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;IoT Private&lt;/em&gt;: For devices that are strictly local (no external communication needed).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surveillance&lt;/strong&gt;: Dedicated for &lt;em&gt;cameras&lt;/em&gt;. They don’t need broad network access or the internet, so this VLAN keeps them isolated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Services&lt;/strong&gt; &amp;amp; &lt;strong&gt;DMZ&lt;/strong&gt;: These VLANs exist in the UDM Pro config but are primarily used in conjunction with &lt;strong&gt;ZeroTier&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Wi-Fi Networks&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal&lt;/strong&gt; (Main Wi-Fi): Tied to my LAN VLAN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal Guest&lt;/strong&gt;: Segregated, on the Guest VLAN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal IoT&lt;/strong&gt;: A 2.4GHz-only SSID for IoT devices. It uses &lt;em&gt;pre-shared keys&lt;/em&gt; for network segregation based on SSID password.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal IoT&lt;/strong&gt;: For IoT devices that uses the internet somehow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal IoT Private&lt;/strong&gt;: For local-only IoT devices with no internet access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cardinal Surveillance&lt;/strong&gt;: For camera devices, same concept as the private one but as a separate VLAN.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The Role of ZeroTier&lt;/h3&gt;
&lt;p&gt;I create two VLANs in &lt;strong&gt;ZeroTier&lt;/strong&gt;, &lt;strong&gt;VLAN 2&lt;/strong&gt; (Services) and &lt;strong&gt;VLAN 3&lt;/strong&gt; (DMZ), then I bridge them back into my local Services and DMZ VLANs on the &lt;strong&gt;UDM Pro&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This bridging is done via some &lt;em&gt;custom scripts&lt;/em&gt; and the UDM’s “persistence” system. Because ZeroTier operates at &lt;strong&gt;Layer 2&lt;/strong&gt;, it&apos;s not just simple routing, it&apos;s effectively replicating the broadcast domain. It might be a bit of a hack, but it allows ZeroTier traffic to flow in and out of my local VLANs as if they were physically plugged in.&lt;/p&gt;
&lt;p&gt;Additionally, ZeroTier includes a powerful rules engine. This allows me to define custom firewall-like policies, such as disallowing certain VLAN-tagged traffic, restricting specific ports, or enforcing IP-based rules, directly within the ZeroTier network. That means I can shape traffic based on my exact security needs while still giving devices full Layer 2 connectivity when appropriate.&lt;/p&gt;
&lt;h2&gt;Why ZeroTier Is at the Core&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt; basically gives me an &lt;em&gt;encrypted overlay network&lt;/em&gt; that all my devices, home-based, in the cloud, or in someone else’s data center can connect to. It creates a &lt;em&gt;“planetary virtual switch,”&lt;/em&gt; letting me hand out IP addresses on VLAN 2 (for general services) or VLAN 3 (for internet-exposed services).&lt;/p&gt;
&lt;p&gt;For example, if I spin up a VPS in some random location, I just install the &lt;strong&gt;ZeroTier&lt;/strong&gt; client, join my ZeroTier network, and give it an IP in VLAN 2 or VLAN 3 and &lt;strong&gt;boom&lt;/strong&gt;, it’s as if it’s plugged into my home switch. That’s the &lt;em&gt;“planetary”&lt;/em&gt; part!&lt;/p&gt;
&lt;p&gt;I self-host the &lt;strong&gt;ZeroTier controller&lt;/strong&gt; instead of relying on the official ZeroTier infrastructure. Since ZeroTier is open-source, I can run my own controller node on my &lt;strong&gt;Network VM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To make management easy, I use a &lt;em&gt;community-built UI&lt;/em&gt; that gives me a web dashboard for seeing which devices are connected, assigning IP addresses, and approving or denying new join requests. It’s &lt;em&gt;containerized&lt;/em&gt; using a &lt;em&gt;Docker MacVLAN&lt;/em&gt; trick we will talk later about, so it’s directly available on VLAN 2 without any weird network hoops.&lt;/p&gt;
&lt;p&gt;This approach also ensures I’m in &lt;em&gt;full control&lt;/em&gt; of my environment: if the official ZeroTier services ever go down, I’m still good to go, and I can customize every aspect of my network as I see fit.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;TrueNAS &amp;amp; Proxmox&lt;/h2&gt;
&lt;h3&gt;TrueNAS Scale&lt;/h3&gt;
&lt;p&gt;On my &lt;strong&gt;NAS&lt;/strong&gt;, I’m not using many of TrueNAS’s built-in virtualization features. Instead, it’s mostly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;: A few major datasets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network&lt;/strong&gt;: I install &lt;strong&gt;ZeroTier&lt;/strong&gt; directly on TrueNAS to ensure it can talk to other machines over the overlay network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: The 1TB SSD is for the OS, and the 4×16TB EXOS drives are in &lt;em&gt;ZFS striped mirrors&lt;/em&gt;. This gives a nice balance of capacity, speed, and redundancy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also have a direct &lt;strong&gt;SFP+&lt;/strong&gt; connection between my NAS and the Proxmox server (&lt;strong&gt;MS01&lt;/strong&gt;) for faster data transfers. That means all my VMs can access &lt;em&gt;NFS&lt;/em&gt; shares at &lt;em&gt;10GbE speeds&lt;/em&gt;, which is super handy for big data or media workflows.&lt;/p&gt;
&lt;h3&gt;Why NFSv4.2?&lt;/h3&gt;
&lt;p&gt;I’m using &lt;strong&gt;NFSv4.2&lt;/strong&gt; mainly because it builds on earlier versions while adding a bunch of super handy extras. Here’s a quick rundown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NFSv3&lt;/strong&gt; has been around forever and is rock-solid, but it doesn’t include modern security or integrated locking (it relies on separate protocols like NLM).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFSv4&lt;/strong&gt; unified the protocol, locking, and security into one standard, making life easier and reducing extra sideband protocols.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFSv4.1&lt;/strong&gt; introduced &lt;strong&gt;Parallel NFS (pNFS)&lt;/strong&gt;, which lets you read and write data in parallel across multiple servers for better performance when you need to scale out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFSv4.2&lt;/strong&gt; takes it all a step further with features like &lt;strong&gt;server-side copy&lt;/strong&gt;, improved sparse file handling, and extended attributes. This makes it especially handy for virtualization and container workloads where you need faster data movement without pounding your network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, &lt;strong&gt;NFSv4.2&lt;/strong&gt; gives me a modern, flexible, and efficient setup, perfect for my homelab needs.&lt;/p&gt;
&lt;h3&gt;Proxmox Server Node (MS01)&lt;/h3&gt;
&lt;p&gt;This is my “big” server with an &lt;strong&gt;i9-13900H&lt;/strong&gt; and &lt;strong&gt;32GB of RAM&lt;/strong&gt;. I also popped in a &lt;em&gt;custom Intel ARC A380 GPU&lt;/em&gt; for hardware transcoding (like Jellyfin) because Intel excels at that. Here are some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Microcode Patches&lt;/strong&gt;: If you’re using a &lt;em&gt;new-gen&lt;/em&gt; Intel CPU, you might need microcode patches to avoid weird performance or stability issues. &lt;a href=&quot;https://github.com/community-scripts/ProxmoxVE/blob/main/misc/microcode.sh&quot;&gt;Here&apos;s the Proxmox microcode script if you want to have a look at it&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GPU Passthrough&lt;/strong&gt;: &lt;a href=&quot;https://pve.proxmox.com/wiki/PCI(e)_Passthrough&quot;&gt;Proxmox&lt;/a&gt; makes it pretty straightforward. You just enable &lt;em&gt;Intel IOMMU&lt;/em&gt; in the grub config, load the vfio modules, and pass the GPU through to whichever VM needs it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;VMs&lt;/strong&gt;: I run four main VMs. Portainer, Network, Media, and Misc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;VM setup&lt;/h2&gt;
&lt;p&gt;One of the &lt;strong&gt;key pieces&lt;/strong&gt; of this setup is a &lt;em&gt;Docker MacVLAN interface&lt;/em&gt; approach that allows my containers to attach &lt;em&gt;directly&lt;/em&gt; to the ZeroTier VLAN interfaces.&lt;br /&gt;
It keeps &lt;em&gt;host&lt;/em&gt; networking simpler and gives each container a dedicated IP isolated to the ZeroTier VLAN.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;How it works&lt;/h3&gt;
&lt;p&gt;In Docker, I create a &lt;a href=&quot;https://docs.docker.com/network/macvlan/&quot;&gt;&lt;strong&gt;MacVLAN interface&lt;/strong&gt;&lt;/a&gt; bound to the &lt;strong&gt;ZeroTier interface&lt;/strong&gt;. That way, each container in that network appears on the ZeroTier VLAN with its own MAC address (and IP) instead of piggybacking on the host OS. This method isolates container traffic &lt;em&gt;cleanly&lt;/em&gt; from the VM’s main interface, which helps when bridging or routing across different VLANs.&lt;/p&gt;
&lt;h3&gt;Portainer VM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Runs on &lt;strong&gt;Ubuntu 24&lt;/strong&gt; nothing fancy installed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker + &lt;a href=&quot;https://docs.portainer.io/&quot;&gt;&lt;strong&gt;Portainer&lt;/strong&gt;&lt;/a&gt; so I can have a nice web UI for managing all my containers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Network VM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Also &lt;strong&gt;Ubuntu 24&lt;/strong&gt;, but here’s where I keep &lt;em&gt;network-related&lt;/em&gt; containers:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ztnet.network/&quot;&gt;&lt;strong&gt;ZTNET&lt;/strong&gt;&lt;/a&gt; a cool community-built ZeroTier controller UI (&lt;strong&gt;built with the T3 Stack!!&lt;/strong&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://pi-hole.net/&quot;&gt;&lt;strong&gt;Pi-hole&lt;/strong&gt;&lt;/a&gt; for my private DNS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nginxproxymanager.com/&quot;&gt;&lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt;&lt;/a&gt; reverse proxy for my services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://goauthentik.io/&quot;&gt;&lt;strong&gt;Authentik&lt;/strong&gt;&lt;/a&gt; my identity provider, or IdP.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media VM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is my &lt;em&gt;entertainment hub&lt;/em&gt;. It has the full &lt;strong&gt;*Arr&lt;/strong&gt; suite. If you have no idea what that is, &lt;a href=&quot;https://wiki.servarr.com/&quot;&gt;take a look at the wiki.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GPU passthrough is set up here, so &lt;strong&gt;Jellyfin&lt;/strong&gt; can do hardware transcoding with the &lt;strong&gt;Intel ARC&lt;/strong&gt; card.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All config folders and downloads get mapped to the &lt;strong&gt;NAS’s&lt;/strong&gt; NFS shares, so everything is in one &lt;em&gt;central spot&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hardlinks &amp;amp; NFS&lt;/h3&gt;
&lt;p&gt;I’m using &lt;strong&gt;hardlinks&lt;/strong&gt; so that I can have a file appear in multiple places (like the &lt;em&gt;“downloads”&lt;/em&gt; folder and the final &lt;em&gt;“TV Shows”&lt;/em&gt; folder) without doubling the storage cost.&lt;/p&gt;
&lt;p&gt;You just have to be consistent with your paths in &lt;strong&gt;Docker Compose&lt;/strong&gt;, &lt;strong&gt;NFS shares&lt;/strong&gt; and your &lt;strong&gt;*Arr apps&lt;/strong&gt;, so everything references the same &lt;em&gt;“root”&lt;/em&gt; mount point.&lt;/p&gt;
&lt;h3&gt;Misc VM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A catch-all for &lt;em&gt;small projects&lt;/em&gt; or services that aren’t big enough to warrant their own machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;GitOps and Docker Compose&lt;/h2&gt;
&lt;p&gt;I’m a huge fan of &lt;strong&gt;Docker Compose&lt;/strong&gt; because it’s easy, fast, and reproducible. I keep a &lt;em&gt;Git repo&lt;/em&gt; with all my Compose files and volumes declared. If I ever blow away a VM or want to spin up a new environment, I just clone the repo and run &lt;strong&gt;docker compose up&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Why Portainer?&lt;/h3&gt;
&lt;p&gt;I like to pair this &lt;em&gt;Git-based workflow&lt;/em&gt; with &lt;a href=&quot;https://www.portainer.io/&quot;&gt;Portainer&lt;/a&gt; because it gives me a &lt;strong&gt;simple, intuitive UI&lt;/strong&gt; on top of my Docker environment. While &lt;strong&gt;Docker Compose&lt;/strong&gt; keeps everything &lt;em&gt;version-controlled&lt;/em&gt; and &lt;em&gt;scriptable&lt;/em&gt;, &lt;strong&gt;Portainer&lt;/strong&gt; ties it together with a &lt;strong&gt;dashboard&lt;/strong&gt; that shows all my containers, volumes, networks, and logs in one place.&lt;/p&gt;
&lt;p&gt;It even has built-in &lt;strong&gt;GitOps-style features&lt;/strong&gt;, like pulling changes directly &lt;em&gt;every so often&lt;/em&gt; from your repo or using &lt;strong&gt;webhooks&lt;/strong&gt;, so you can keep everything &lt;em&gt;updated automatically&lt;/em&gt;. That means I don’t have to drop into the &lt;em&gt;CLI&lt;/em&gt; just to check container statuses or tweak settings. I can do it all from my &lt;strong&gt;browser&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you know of any other tools that offer a &lt;strong&gt;similar UI-driven approach&lt;/strong&gt; and integrate well with &lt;em&gt;GitOps&lt;/em&gt;, &lt;a href=&quot;https://x.com/nstlopez&quot;&gt;&lt;strong&gt;let me know&lt;/strong&gt;&lt;/a&gt;! I’m always on the lookout for &lt;strong&gt;alternatives&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Why not LXC?&lt;/h3&gt;
&lt;p&gt;While &lt;a href=&quot;https://linuxcontainers.org/&quot;&gt;&lt;strong&gt;LXC&lt;/strong&gt;&lt;/a&gt; can be more lightweight and can potentially yield &lt;em&gt;better performance&lt;/em&gt;, it’s just trickier to &lt;em&gt;replicate&lt;/em&gt; consistently. If you know a way to make &lt;strong&gt;LXC&lt;/strong&gt; more &lt;em&gt;reproducible&lt;/em&gt;, I’d love to hear it! Hit me up on &lt;a href=&quot;https://x.com/nstlopez&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, hooking up &lt;strong&gt;NFS&lt;/strong&gt; inside an LXC can get messy with permission issues and restricted container access.&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;Docker Compose&lt;/strong&gt;, I can easily &lt;em&gt;map volumes&lt;/em&gt; from my &lt;strong&gt;NAS&lt;/strong&gt; (especially the config volumes) and keep the setup modular.&lt;/p&gt;
&lt;h2&gt;Coming Up Next&lt;/h2&gt;
&lt;p&gt;This was just the &lt;em&gt;general overview&lt;/em&gt;. In future posts, I’ll dive deeper into specifics like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UDM Pro VLAN Bridging&lt;/strong&gt;: Exactly how I got ZeroTier VLAN 2 and VLAN 3 to mesh with the UDM and hacking the UDM’s persistence system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GPU Passthrough Step-by-Step&lt;/strong&gt;: The commands and configurations I used in Proxmox.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Arr Services and Hardlink Magic&lt;/strong&gt;: A deeper guide on making *Arr apps handle hardlinks smoothly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nginx Proxy Manager + Authentik&lt;/strong&gt;: How I secure external services while letting them stay easy to reach from anywhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;: More on how I set up ZeroTier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitOps&lt;/strong&gt;: How I manage my Docker Compose files and volumes with Git.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring &amp;amp; Alerts&lt;/strong&gt;: How I keep an eye on everything through &lt;strong&gt;Grafana&lt;/strong&gt;, &lt;strong&gt;Alloy&lt;/strong&gt;, and other tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;So, that’s the broad overview of my &lt;strong&gt;&lt;em&gt;Planetary Datacenter&lt;/em&gt;&lt;/strong&gt;, my homelab that thinks it can conquer the world (or at least my corner of it).&lt;/p&gt;
&lt;p&gt;As I keep iterating on this setup, I’ll share everything I learn, &lt;em&gt;mistakes&lt;/em&gt;, discoveries, and hopefully some &lt;em&gt;cool tips&lt;/em&gt;. If you have any questions or want to suggest your own improvements, drop a comment (or tweet, or smoke signal, whichever you prefer). I’d love to hear how you’re tackling similar homelab challenges.&lt;/p&gt;
&lt;p&gt;Stay tuned for more &lt;em&gt;detailed breakdowns&lt;/em&gt;, and thanks for reading!&lt;/p&gt;
</content:encoded></item><item><title>Service-Oriented Architecture with tRPC</title><link>https://nstlopez.com/talks/trpc-corunna-wtf/</link><guid isPermaLink="true">https://nstlopez.com/talks/trpc-corunna-wtf/</guid><description>An exploration of how to implement service-oriented architectures using tRPC to create typed and efficient APIs between client and server.</description><pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate><content:encoded>An exploration of how to implement service-oriented architectures using tRPC to create typed and efficient APIs between client and server.</content:encoded></item><item><title>Multi-Cloud Architecture with Wireguard and ZeroTier</title><link>https://nstlopez.com/talks/wireguard-and-zerotier-cncf/</link><guid isPermaLink="true">https://nstlopez.com/talks/wireguard-and-zerotier-cncf/</guid><description>A talk on the CNCF, Cloud Native Computing Foundation about how to use Wireguard and ZeroTier to create multi-cloud networks.</description><pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate><content:encoded>A talk on the CNCF, Cloud Native Computing Foundation about how to use Wireguard and ZeroTier to create multi-cloud networks.</content:encoded></item><item><title>My Obsidian workflow</title><link>https://nstlopez.com/blog/my-obsidian-workflow/</link><guid isPermaLink="true">https://nstlopez.com/blog/my-obsidian-workflow/</guid><description>A little peak into how I organize my notes and my daily routine to store information.</description><pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Obsidian has changed my workflow dramatically over the past year, I&apos;m going to share with you today, how and why I&apos;m committed to using it, hopefully, for ages.&lt;/p&gt;
&lt;p&gt;Have you tried Obsidian or any other note-taking tools? What setups have worked best for you? Hit me up on &lt;a href=&quot;https://twitter.com/nstlopez&quot;&gt;Twitter&lt;/a&gt; with your thoughts, I&apos;d love to hear them.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;The Trigger for Change&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;I am a tech enthusiast, I&apos;m constantly on the lookout for the latest advancements in technology. Every day brings a flood of new information, and honestly, it&apos;s more than I can handle sometimes.&lt;/p&gt;
&lt;p&gt;For years, I&apos;ve been scrolling through Twitter, Youtube, HackerNews, ByteByteGo, and more. Add to that the roster of tech content creators, shoutout to &lt;a href=&quot;https://twitter.com/t3dotgg&quot;&gt;Theo&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/ThePrimeagen&quot;&gt;Primeagen&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/MelkeyDev&quot;&gt;Melkey&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/@dreamsofcode&quot;&gt;Dreams of Code&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/@CodeAesthetic&quot;&gt;CodeAesthetic&lt;/a&gt; and many more.&lt;/p&gt;
&lt;p&gt;It&apos;s overwhelming. Cool, but overwhelming.&lt;/p&gt;
&lt;p&gt;I&apos;ve got stuff to do and this chaos is killing my focus.&lt;/p&gt;
&lt;p&gt;So, after many discussions with my good friend &lt;a href=&quot;https://oriolrius.me/&quot;&gt;Oriol&lt;/a&gt;, about a year ago, I decided to take control and start my own digital notebook.&lt;/p&gt;
&lt;p&gt;Initially, I went with &lt;a href=&quot;https://notion.so&quot;&gt;Notion&lt;/a&gt;, as it was familiar and somewhat effective, but it lacked certain features, also, it is often lagged, which was frustrating. Then, an idea struck. I remembered &lt;a href=&quot;obsidian.md&quot;&gt;Obsidian&lt;/a&gt; a tool that had been on my radar for a while. It was appealing, especially the idea of owning my files as plain markdown. Despite the learning curve looks complicated, I decided to dive in and see what I could make of it.&lt;/p&gt;
&lt;p&gt;My files were a mess, scattered across folders with random nesting, creating chaos in the root of my vault. The plugin system kinda helped in some cases, there are a few plugins we can talk about later that has helped me organize my stuff. but there is one in particular that I want to talk about. There is a few tools I use on a daily basis that are crucial to me, one of which is &lt;a href=&quot;https://github.com/excalidraw/excalidraw&quot;&gt;Excalidraw&lt;/a&gt;, there is a community plugin that integrates it directly into Obsidian, saving money and keeping everything local. Game changer, I thought.&lt;/p&gt;
&lt;p&gt;This last bit is more important than it seems, thanks to said plugin I got to discover &lt;a href=&quot;https://www.youtube.com/@VisualPKM&quot;&gt;Zsolt&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Developing a Personal Knowledge Management System&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/@VisualPKM&quot;&gt;Zsolt&lt;/a&gt; is the brains behind the Obsidian Excalidraw plugin and a creator of content on YouTube focused on Personal Knowledge Managers (PKM). His channel was a goldmine, exactly what I needed to see.&lt;/p&gt;
&lt;p&gt;Inspired by several videos and the broader PKM community, I&apos;ve built my own kind of management system. Here’s what I came up with;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Detailed Breakdown of Note Types&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;My workflow consists of three parts: how I write notes, where I save them, and the habits I&apos;ve cultivated.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Manual Notes&lt;/strong&gt;: Like this very article. Each note includes metadata like timestamps and tags to keep my graph organized and sometimes, more specific metadata for particular cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clippings&lt;/strong&gt;: The bulk of my vault. Remember the daily info madness? It’s manageable now, thanks to the &apos;Obsidian clipper&apos; a plugin I developed (&lt;a href=&quot;https://github.com/Nsttt/save-to-obsidian&quot;&gt;find it on my GitHub&lt;/a&gt;!). It captures full page metadata, creating detailed notes that help me recall and review later. It&apos;s a bit lacking still, I kinda need to update it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Habits&lt;/strong&gt;: Here’s where it gets a bit wild. Monday through Friday, my vault is a chaotic mess—notes everywhere, no real order. Come the weekend, I sort through the week&apos;s accumulation, organizing and refining as I go.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;Exploring the Folder Structure&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;For my folder, I use a hybrid system inspired by &lt;a href=&quot;https://fortelabs.com/blog/para/&quot;&gt;PARA&lt;/a&gt; and &lt;a href=&quot;https://zettelkasten.de/&quot;&gt;Zettelkasten&lt;/a&gt;, to fit my style.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0. Maps&lt;/strong&gt;: This is essentially the dashboard of my vault. It&apos;s where I visualize analytics and other overview elements of my note collection. Although it&apos;s still fairly poor, since I don&apos;t have many notes made here yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1. Projects&lt;/strong&gt;: Here, projects are just projects; they&apos;re ideas and initiatives I&apos;m actively working on or planning. I prefer to keep individual notes rather than folders here to maintain simplicity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2. Areas&lt;/strong&gt;: This section is to store different types of notes that need to be isolated from the general pool. For example, I keep all the architecture documents and diagrams for Nexiona, my current employer, here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3. Resources&lt;/strong&gt;: This folder is like my second brain, really. Here I drop everything I find interesting every day, most of my notes lie in here and they&apos;re structured in many different folders; Tweets, books, articles, webpages, OSS tools, videogames, videos, tools, slides, prompts, manuals, documents… The list goes on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4. Permanent&lt;/strong&gt;: To me, permanent notes are a kind of note that are meant to be hydrated from time to time yet do never die. Here lies for example my &apos;people&apos; folder where I a list of the people I know and care about. Some meeting notes that I think need to be saved, or some diagrams that I find relevant to keep in hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5. Fleeting&lt;/strong&gt;: As the name suggests, this folder is for ephemeral notes that are relevant only for a short period. These include brief ideas, temporary observations, and initial thoughts that either evolve into more substantial notes or get discarded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6. Daily&lt;/strong&gt;: My daily notes, split into two main parts: general notes and to-dos. Each day gets its own note, each one has relevant stuff I&apos;ve done on the day and a to-do list that rolls over to the next day, thanks to a handy plugin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;7. Archives&lt;/strong&gt;: This is where notes go to retire. It mirrors the main structure almost completely but is reserved for notes that are no longer active or relevant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8. Meta&lt;/strong&gt;: This folder is a bit of a backstage area. It houses templates and static elements like images that I embed in other notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;My Plugin Ecosystem&lt;/h2&gt;
&lt;p&gt;I don&apos;t particularly use a large number of plugins, but there are a few that I consider crucial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Excalidraw&lt;/strong&gt;: Very self-explanatory. It allows me to embed Excalidraw diagrams into Obsidian and save them locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Slides&lt;/strong&gt;: This plugin is essential for my presentations, as I create my slides in Markdown using Obsidian. It significantly enhances the experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dataview&lt;/strong&gt;: One of the major plugins in Obsidian, Dataview enables SQL-like queries on your notes to display them in tables or various formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homepage&lt;/strong&gt;: It simply displays my graph automatically if I close all tabs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day Planner&lt;/strong&gt;: This plugin integrates directly with my various calendars, allowing me to view all my work events in one place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iconize&lt;/strong&gt;: Adds icons to your folders (yes, I still need to add them, lol).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Omnisearch&lt;/strong&gt;: An important tool, Omnisearch is a fuzzy finder for Obsidian, enhancing the search functionality to better locate notes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollover Daily Todos&lt;/strong&gt;: As mentioned earlier, this plugin automates the transfer of my todos to the next day&apos;s note.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templater&lt;/strong&gt;: Enhanced templates !.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag Wrangler&lt;/strong&gt;: I use this to better organize my tags, which I tend to repeat too often.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style Settings&lt;/strong&gt;: Allows me to apply the Vesper color scheme to Obsidian.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, I am currently using the Minimal theme.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&apos;ve been talking about Obsidian for a while to some friends, and I&apos;ve told them many times I&apos;d like to share this in an Obsidian Post. So here it is. Hope you enjoyed.&lt;/p&gt;
</content:encoded></item><item><title>Effect: TypeScript for Production</title><link>https://nstlopez.com/talks/effect-ts-coruna-wtf/</link><guid isPermaLink="true">https://nstlopez.com/talks/effect-ts-coruna-wtf/</guid><description>Effect is a powerful TypeScript library designed to help developers easily create complex, synchronous and asynchronous programs.</description><pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate><content:encoded>Effect is a powerful TypeScript library designed to help developers easily create complex, synchronous and asynchronous programs.</content:encoded></item><item><title>Reflections on a Github Contribution Graph</title><link>https://nstlopez.com/blog/reflections-on-a-github-contribution-graph/</link><guid isPermaLink="true">https://nstlopez.com/blog/reflections-on-a-github-contribution-graph/</guid><description>My struggle with work-life balance in the tech world, discussing impostor syndrome and my resolve to reinvigorate my passion for personal projects.</description><pubDate>Sat, 17 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ever been on a roller coaster that just doesn&apos;t seem to stop? Yeah, that&apos;s been my life lately.&lt;/p&gt;
&lt;p&gt;Take a peek at my &lt;a href=&quot;https://github.com/Nsttt&quot;&gt;Github contribution graph&lt;/a&gt; and you&apos;ll find a barren landscape. My once somewhat vibrant field of green squares, each marking a day of my life dedicated to coding, is now just a digital ghost town.&lt;/p&gt;
&lt;p&gt;Why the sudden change in scenery, you ask? Life happened. And not just the usual life-stuff, but a &lt;em&gt;gigantic&lt;/em&gt;, heaping helping of it. I&apos;m talking about the kind of work that makes your plate look like a Thanksgiving dinner for giants.&lt;/p&gt;
&lt;p&gt;Here&apos;s the deal. I’ve been diving headfirst into a sea of projects that have stretched me to my limits. The responsibilities have been numerous, the deadlines merciless, and there&apos;s a whole battalion of folks counting on me to do my bit so they can do theirs.&lt;/p&gt;
&lt;p&gt;On top of that, there&apos;s the silent weight of my own ambition. I&apos;m not just in this for the thrill of the game. I&apos;ve set my sights on &lt;strong&gt;loftier goals&lt;/strong&gt;. I&apos;m aiming to climb the career ladder, not just for the view from the top, but to hoist my team and my company up there with me. I&apos;m striving to mold my colleagues into better engineers, support my company&apos;s rise to the top, and carve out a niche in the tech world where we can proudly stake our claim.&lt;/p&gt;
&lt;p&gt;But, with everything spinning around me like a tornado of responsibilities, something had to give. And looking at my desolate Github graph, it’s clear what took the hit.&lt;/p&gt;
&lt;p&gt;It&apos;s not a sight for sore eyes, but it&apos;s the wake-up call I needed. Looking at my barren field was like catching my reflection and not recognizing the person staring back. It was a reality check that I had been so swept up in the hurricane of work that I’d lost touch with a vital part of myself.&lt;/p&gt;
&lt;p&gt;But here&apos;s the thing: I’m not about to let the story end here. This isn&apos;t a tale of defeat, but a call to action.&lt;/p&gt;
&lt;h2&gt;Lost and Found: My Love for Open Sourcing&lt;/h2&gt;
&lt;p&gt;Picture this: You&apos;re standing in a room filled with tech maestros. The air is buzzing with energy, ideas are whizzing around, and the sheer talent in the room is nothing short of jaw-dropping.&lt;/p&gt;
&lt;p&gt;But let&apos;s rewind a bit, to a time when my enthusiasm for open sourcing was running on fumes. Why, you ask? Two words: &lt;strong&gt;impostor syndrome&lt;/strong&gt;. Yeah, that sneaky little voice that whispers, &quot;&lt;em&gt;You don&apos;t belong here&lt;/em&gt;&quot; every time you’re in the presence of super talented colleagues. When you&apos;re navigating the vast tech sea, it&apos;s easy to feel like a tiny fish, completely out of your depth. And let me tell you, it&apos;s a crummy feeling.&lt;/p&gt;
&lt;p&gt;Now, fast forward to JSDay at Canarias. You might have heard of it - it&apos;s only one of the coolest tech conferences out there! But for me, this wasn’t just a conference. It was the life-raft that pulled me out of my self-doubt and put the wind back in my open sourcing sails.&lt;/p&gt;
&lt;p&gt;Why? Because I had the chance to rub shoulders with some of the biggest names in the industry. I&apos;m talking about the likes of &lt;strong&gt;&lt;a href=&quot;https://twitter.com/kentcdodds&quot;&gt;Kent&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/TejasKumar_&quot;&gt;Tejas&lt;/a&gt;&lt;/strong&gt;, &lt;a href=&quot;https://twitter.com/aleksandrasays&quot;&gt;&lt;strong&gt;Aleksandra&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;&lt;a href=&quot;https://twitter.com/a_sandrina_p&quot;&gt;Sandrina&lt;/a&gt;&lt;/strong&gt;, and my T3 community buddy, &lt;strong&gt;Stoyko&lt;/strong&gt;. Just being in their presence was like mainlining a hefty dose of motivation.&lt;/p&gt;
&lt;p&gt;Their passion, their creativity, their drive, it was all so contagious. It was as if they reached into me and reignited the dormant flame of my love for open sourcing. I saw in them a reflection of who I used to be and who I knew I could be again.&lt;/p&gt;
&lt;p&gt;So this post? Consider it a massive shout-out to this stellar gang. A heartfelt thanks for being my guiding light in the foggy sea of self-doubt. Their brilliance not only lit up the path but also sparked a fire within me, reminding me of my love for open sourcing and why I chose this path in the first place.&lt;/p&gt;
&lt;h2&gt;The Comeback Plan&lt;/h2&gt;
&lt;p&gt;Alright, let&apos;s switch gears and talk about my life calendar from &lt;a href=&quot;https://waitbutwhy.com/2014/05/life-weeks.html&quot;&gt;WaitButWhy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;To some, it might seem a bit grim. Imagine a calendar filled with tiny boxes for each week of your entire life. It’s like a visual timeline from your birth date to... well, let&apos;s just say a very, very long time from now. Some of my friends look at it and get cold sweats. But for me, it&apos;s more like a treasure map.&lt;/p&gt;
&lt;p&gt;Yeah, seeing your whole life laid out might freak some folks out. But me? I see stories. Each little box is a week of wins, losses, lessons, and adventures. It&apos;s like a diary, but instead of &quot;&lt;em&gt;Dear Diary&lt;/em&gt;&quot; entries, there are tick marks for every week I&apos;ve lived.&lt;/p&gt;
&lt;p&gt;For me, it&apos;s not a countdown to doom. It&apos;s a progress bar. It&apos;s a tool that shows me where I&apos;ve been and where I&apos;m going. When I hit a slump, like these past two months, it&apos;s a kick in the pants. It&apos;s a wake-up call saying, &quot;&lt;em&gt;Hey, get back in the game and back to work!&lt;/em&gt;&quot;&lt;/p&gt;
&lt;p&gt;So yeah, my life calendar isn’t a ticking time bomb of anxiety for me. It’s more like a coach, a cheerleader, and a reality check all rolled into one. It keeps me focused, driven, and excited for what&apos;s coming next.&lt;/p&gt;
&lt;h2&gt;Laying Out the Strategy&lt;/h2&gt;
&lt;p&gt;Shifting focus to my action plan, the first item on the agenda is: it&apos;s time to get all my tasks in order. To help me do this, I&apos;ll be leveraging a to-do list app. It&apos;s a powerful tool that can instantly help me get a grip on my daily responsibilities, allowing me to jot down every task, big or small, and arrange them based on their priority.&lt;/p&gt;
&lt;p&gt;It may seem rudimentary, but it&apos;s a game changer. By having everything written down and easily accessible, I can alleviate the mental load, reduce stress, and keep my workflow moving seamlessly.&lt;/p&gt;
&lt;p&gt;Next up, I&apos;m reigniting my passion for personal projects. In the past, they&apos;ve been subjected to an endless cycle of idea generation, scribbles, and half-hearted beginnings, without ever reaching the finish line. This ends now. It&apos;s time for each project to move beyond the &quot;just started&quot; phase and come into its own. I&apos;ll be fully committing to each initiative, treating them with the seriousness they deserve, and seeing them through from inception to completion, no matter the hurdles along the way.&lt;/p&gt;
&lt;p&gt;Lastly, I&apos;m also carving out time for personal development. I&apos;m going to dedicate a portion of my day to reading, specifically books that can help me expand my knowledge and better understand my field. Currently, I have &quot;The Personal MBA&quot; by Josh Kaufman and &quot;Staff Engineering&quot; on my reading list.&lt;/p&gt;
&lt;h2&gt;A final message&lt;/h2&gt;
&lt;p&gt;To everyone reading this who might be feeling overwhelmed, stuck, or just looking for a way to regain control over their life and work:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remember, you&apos;re not alone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We all hit bumps in the road, face times when our passion falters, and find our task lists spiraling out of control. But, there are tools, procedures and strategies we can use to reclaim our lives and reignite our passions.&lt;/p&gt;
&lt;p&gt;The journey of getting our tasks in order, reigniting our passions, and striking that elusive work-life balance starts with a single step. Start small, perhaps by writing down your tasks in a tool like Microsoft To Do or setting aside time to read each day. The important thing is to take that first step, and before you know it, you&apos;ll be well on your way to getting things done and finding fulfillment in your work again.&lt;/p&gt;
&lt;p&gt;Remember, life is filled with ups and downs, and it&apos;s okay to falter. It&apos;s the getting back up that truly counts.&lt;/p&gt;
&lt;p&gt;So, let&apos;s get back up, together. Let&apos;s get started, and let&apos;s get things done.&lt;/p&gt;
</content:encoded></item><item><title>Embracing the New World Order of Server Components</title><link>https://nstlopez.com/blog/server-components/</link><guid isPermaLink="true">https://nstlopez.com/blog/server-components/</guid><description>Exploring the evolving landscape of web development with RSCs and Astro components.</description><pubDate>Sat, 25 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Web development&lt;/strong&gt; is a rapidly changing field, with new technologies and frameworks being introduced all the time. It can be challenging to keep up with the latest trends and best practices, but attending events like the recent discussion with &lt;a href=&quot;https://twitter.com/dan_abramov&quot;&gt;Dan Abramov&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/RyanCarniato&quot;&gt;Ryan Carniato&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/sophiebits&quot;&gt;Sophie Alpert&lt;/a&gt;, and others can provide valuable insights into the latest developments.&lt;/p&gt;
&lt;p&gt;As someone who contributes to &lt;strong&gt;OSS&lt;/strong&gt;, I found the discussion to be particularly interesting and informative.&lt;/p&gt;
&lt;p&gt;From the power of stateless React components to competing patterns and the future of web development, there were many fascinating topics covered. The React team&apos;s delicate balance was also discussed as well as the challenges of teaching server components and the future of them.&lt;/p&gt;
&lt;p&gt;The discussion was a pleasure to be a part of, and the collaboration between Dan and Ryan was inspiring. Regardless of whether you&apos;re a React user or not, the developments in the world of &lt;strong&gt;React Server Components&lt;/strong&gt; and &lt;strong&gt;Astro components&lt;/strong&gt; are worth taking note of, as they will undoubtedly shape the future of web development.&lt;/p&gt;
&lt;p&gt;In fact, I have compiled a list of my top takeaways from the event.&lt;/p&gt;
&lt;h2&gt;The Power of Stateless React Components&lt;/h2&gt;
&lt;p&gt;Stateless components are those that do not manage their own state and instead rely on receiving data through props from parent components. These components can be utilized in server components, running on the server, or imported into client components to run on the client-side. This versatile authoring experience, referred to as &quot;knitting&quot; by Dan, allows for smooth code movement across different boundaries.&lt;/p&gt;
&lt;p&gt;Both RSCs and Astro components adopt a server-only mental model, which enables the usage of &quot;top-level await&quot; for data fetching on the server side with Astro, and an async function as a React Server Component.The fetched data can be utilized in two different ways, depending on the situation. First, it can be directly serialized and passed to client components as props, integrating data fetching within the component tree itself. This allows for seamless data management within your application.&lt;/p&gt;
&lt;p&gt;Alternatively, you can also choose to render a server component directly, which will send HTML to the browser with the data already incorporated. This method is particularly useful when you want to optimize performance and reduce the amount of JavaScript sent to the client, as the server takes care of rendering the component with the fetched data.&lt;/p&gt;
&lt;p&gt;To clarify, a stateless component:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Does not manage its own state.&lt;/li&gt;
&lt;li&gt;Relies on receiving data through props from parent components.&lt;/li&gt;
&lt;li&gt;Can be used in server components or imported into client components.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Competing Patterns and the Future of Web Development&lt;/h2&gt;
&lt;p&gt;Although RSCs are becoming increasingly popular, the &lt;strong&gt;loader/action pattern&lt;/strong&gt;, championed by &lt;strong&gt;&lt;a href=&quot;https://remix.run/&quot;&gt;Remix Run&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://kit.svelte.dev/&quot;&gt;SvelteKit&lt;/a&gt;&lt;/strong&gt;, and &lt;a href=&quot;https://start.solidjs.com/&quot;&gt;&lt;strong&gt;SolidStart&lt;/strong&gt;&lt;/a&gt;, still has a prominent place in web development. This is because the loader/action pattern has been around for longer and has a proven track record of success.&lt;/p&gt;
&lt;p&gt;It is worth noting that just as JSX couldn&apos;t completely replace other templating languages, RSCs will not fully replace the loader/action pattern. While RSCs offer many benefits such as seamless code movement across boundaries and support for top-level await for data fetching on the server, the loader/action pattern provides developers with greater control over data fetching and caching in their applications.&lt;/p&gt;
&lt;p&gt;Loaders are responsible for fetching data and preparing it for the components, while actions handle client-side logic, such as user interactions and updating data. This separation of concerns enables more precise control over how data is fetched, manipulated, and cached, allowing for better optimization and customization.&lt;/p&gt;
&lt;p&gt;For a deeper understanding of the loader/action pattern, you can refer to the following resources:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://remix.run/docs/en/main/pages/philosophy#serverclient-model&quot;&gt;Remix Run Documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://kit.svelte.dev/docs/load&quot;&gt;SvelteKit Load Function&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://kit.svelte.dev/docs/form-actions&quot;&gt;SvelteKit Actions&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://start.solidjs.com/core-concepts/data-loading&quot;&gt;Solid Start Data Fetching&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://start.solidjs.com/core-concepts/actions&quot;&gt;Solid Start Actions&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;React Server Components and the RSC Protocol&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;RSC protocol&lt;/strong&gt; enables the server to expose a special endpoint that clients can use to request a part of the component tree. The server then generates, serializes, and sends the requested part back to the client. This process allows for a &lt;strong&gt;SPA-like routing experience&lt;/strong&gt; within an &lt;strong&gt;MPA-like architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In other words, you can create a fast MPA that feels like an SPA because you don&apos;t need to send a large amount of JavaScript code all the time, and you can also navigate without a full page reload. This approach combines the best of both worlds, offering the smooth navigation of an SPA while maintaining the performance and efficiency of an MPA.&lt;/p&gt;
&lt;h2&gt;The React Team&apos;s Delicate Balance&lt;/h2&gt;
&lt;p&gt;The React team, like any team in charge of a popular software library, must carefully balance their desire to excite their audience with new features with the need to deliver a reliable and consistent product.&lt;/p&gt;
&lt;p&gt;On one hand, early promotion of new features can generate buzz and excitement, and can help the team get feedback and improve the product. However, the team must also take into account the risk of changing the implementation later, which can cause confusion and frustration among users who were expecting a different behavior.&lt;/p&gt;
&lt;p&gt;On the other hand, waiting for a more confident delivery can help ensure that the product is stable and consistent. However, this can also lead to a lack of excitement and engagement from the community, which can make it harder to get feedback and improve the product.&lt;/p&gt;
&lt;p&gt;The React team must carefully weigh these considerations and find a balance that works for them and their users. This delicate balance requires skill, experience, and a deep understanding of both the technical and social aspects of software development.&lt;/p&gt;
&lt;h2&gt;Teaching Server Components&lt;/h2&gt;
&lt;p&gt;The most natural approach to teaching server components is to introduce them first, just as Astro components are taught before client-side interactivity. By starting with the basics of server components, students can gain a solid understanding of the underlying principles and architecture before diving into more complex topics.&lt;/p&gt;
&lt;p&gt;There&apos;s an alternate history where React started as a &lt;strong&gt;server-side component framework&lt;/strong&gt; and only later added client-side functionality. In this alternate scenario, developers would have a more balanced understanding of both server-side and client-side components from the beginning, making it easier to grasp the full potential of the React ecosystem. But unfortunately that isn&apos;t the case.&lt;/p&gt;
&lt;h2&gt;React Ecosystem and Suspense&lt;/h2&gt;
&lt;p&gt;React&apos;s implementation of Suspense and related features (&lt;a href=&quot;https://17.reactjs.org/docs/concurrent-mode-reference.html#usetransition&quot;&gt;transition&lt;/a&gt;, &lt;a href=&quot;https://github.com/acdlite/rfcs/blob/first-class-promises/text/0000-first-class-support-for-promises.md?ref=blixt-dev#example-use-in-client-components-and-hooks&quot;&gt;use&lt;/a&gt;) came later in the development process, which led to some popular libraries not initially adopting Suspense. This happened because the React team was focused on other areas of the library during the early stages of development. While this approach allowed the team to build a strong foundation for React, it also meant that routers and data fetching solutions weren&apos;t built on top of these primitives.&lt;/p&gt;
&lt;p&gt;This left the ecosystem in a tricky spot compared to Solid, a similar library, where everyone built on top of Suspense from the beginning. Therefore, React developers had to find workarounds and alternative solutions to achieve similar functionality. Popular libraries that emerged as a result include &lt;strong&gt;&lt;a href=&quot;https://react-query.tanstack.com/&quot;&gt;React Query&lt;/a&gt;&lt;/strong&gt;, which Suspense support is currently experimental, &lt;strong&gt;&lt;a href=&quot;https://swr.vercel.app/&quot;&gt;SWR&lt;/a&gt;&lt;/strong&gt;, another library for data fetching and caching without Suspense, and &lt;strong&gt;&lt;a href=&quot;https://www.apollographql.com/docs/react/&quot;&gt;Apollo Client&lt;/a&gt;&lt;/strong&gt;, a state management library for React applications using GraphQL that also has Suspense in an experimental &lt;em&gt;alpha&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As React continues to evolve and Suspense becomes more widely adopted, it is possible that these libraries may integrate Suspense in the future or that new libraries built on top of Suspense will emerge.&lt;/p&gt;
&lt;h2&gt;The Future of React Server Components&lt;/h2&gt;
&lt;p&gt;React Server Components are a hot topic among developers at the moment. Although there are some challenges that the React team is currently facing, such as the potential for slow server rendering times and the need for frameworks to implement the new features, there is a lot of excitement around what this technology can do for the future of web development.&lt;/p&gt;
&lt;p&gt;While there is still some uncertainty around how widely these new features will be adopted, the React team remains optimistic. As more developers begin to experiment with them and explore their capabilities, it is likely that we will see more widespread adoption in the community. Overall, the future of React Server Components looks bright, and we can&apos;t wait to see what developers will create with this exciting new technology.&lt;/p&gt;
&lt;h2&gt;References &amp;amp; Credits&lt;/h2&gt;
&lt;p&gt;Huge thanks to the following people for proofreading the article and giving new ideas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.c-ehrlich.dev/&quot;&gt;Chris&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nexxel.dev/&quot;&gt;Nexxel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Vue Covid</title><link>https://nstlopez.com/projects/covid/</link><guid isPermaLink="true">https://nstlopez.com/projects/covid/</guid><description>A very basic covid tracking app using Vue3, built mainly to refresh my knowledge of the framework and test out new features.</description><pubDate>Sat, 19 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently on my &lt;strong&gt;crusade&lt;/strong&gt; of learning new stuff I&apos;ve been reading through a lot of jobs around my local city and nearby. And realized that most of the open offers have a few things in common.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Either A:&lt;/strong&gt; They have some kind of stack hugely related to PHP and Java.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Or B:&lt;/strong&gt; They&apos;re about Angular or... surprisingly, &lt;strong&gt;Vue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hey, don&apos;t get me wrong, &lt;strong&gt;Vue is pretty cool&lt;/strong&gt; I quite like it in fact, it does things differently and, unlike its other two massive pals, Angular and React, it&apos;s community-driven which makes it even cooler.&lt;/p&gt;
&lt;p&gt;I&apos;ve never really done anything with it besides practice and check out and how it works. The last time I did that was back when v3 was still in development, when I heard they went live a few months ago, I wanted to give it a try, that&apos;s how this app was born.&lt;/p&gt;
&lt;p&gt;It&apos;s not much of a thing, quite something you could make in an afternoon with little to no effort, but it served me quite well to check out most of the new features v3 adds. Most of them did not make it through to the end, again, it&apos;s a really simple app, but you know, it ended up quite nicely. The API is pretty cool as well, it&apos;s available at &lt;a href=&quot;https://covid19api.com/&quot;&gt;here&lt;/a&gt; if you wanna check it out.&lt;/p&gt;
</content:encoded></item><item><title>Instagram Clone</title><link>https://nstlopez.com/projects/instagram_clone/</link><guid isPermaLink="true">https://nstlopez.com/projects/instagram_clone/</guid><description>A simple clone of Instagram with very basic functionality.  Made with React, TailwindCSS and Firebase. Including tests with testing-library, Jest and Cypress.</description><pubDate>Thu, 22 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is my second clone of a famous platform. First i started with my &lt;a href=&quot;https://nstlopez.com/project/streaming-service&quot;&gt;Netflix clone&lt;/a&gt; and now an Instagram clone.&lt;/p&gt;
&lt;p&gt;The sole purpose for me to make these clones is to learn how to manage a page that is commonly used in production-ready environments, and since I use Instagram quite a bit, I decided to try to replicate it.&lt;/p&gt;
&lt;p&gt;Since I wanted the project to be as straight-forward as possible I decided to use &lt;strong&gt;React&lt;/strong&gt; with &lt;strong&gt;create-react-app (CRA)&lt;/strong&gt;. I&apos;m quite used to work with it and it seemed like a good option to build and learn new things on the way.&lt;/p&gt;
&lt;p&gt;Later on, I realised that &lt;a href=&quot;https://dev.to/yyx990803/announcing-vite-2-0-2f0a&quot;&gt;Vite 2.0&lt;/a&gt; got released and thought about migrating to it, it did not happen at the end because the project was already sort of half-made already and I was honestly too lazy to move everything.&lt;/p&gt;
&lt;p&gt;I quite recommend you give it a look next time you want to start a new React project, it really is blazing fast.&lt;/p&gt;
&lt;p&gt;Talking about technologies used, one of the reasons that this project was used for is an excuse to learn &lt;strong&gt;TailwindCSS&lt;/strong&gt; since it&apos;s on everyone talks lately. Tailwind is a CSS framework based on classes. Working with it has been cool, it makes development quite easy, although if I had to say something about it, is that it really makes code a lot less legible and quite chaotic at some point.&lt;/p&gt;
&lt;p&gt;This time I have used Firebase again, just like in the &lt;a href=&quot;https://nstlopez.com/project/streaming-service&quot;&gt;Netflix clone&lt;/a&gt;, it just makes thing way easier for me, though, this time I decided to use more than what it offers, and not only do I use auth but also decided to upload data referring to followers to Firestore. Although this might be one of the last projects I use it. Don&apos;t take me wrong, Firebase is great, but lately I want to use my own data layer built on other DBs and with other approaches.&lt;/p&gt;
&lt;p&gt;Another reason that I took a project like this one is to put to practice my knowledge on testing libraries. On my other clone I just used &lt;a href=&quot;https://testing-library.com/&quot;&gt;testing-library&lt;/a&gt; and called it a day, they were not really complex tests or really useful at all, so I decided to make something different on this project.&lt;/p&gt;
&lt;p&gt;This time I used a classic approach of &lt;strong&gt;testing-library&lt;/strong&gt; + &lt;strong&gt;Jest&lt;/strong&gt; and end-to-end testing with &lt;strong&gt;Cypress&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This project has been quite a lot of fun. From managing the comments and the auth with Firebase to testing everything is running smoothly on any case as well as making the entire page as responsive as possible. This would probably be my last clone for a while, since I want to focus on making something different from the usual as a way to push myself further of my comfort zone as well as practicing other topics of project management.&lt;/p&gt;
&lt;p&gt;Thanks for the read and hope you have a good day :).&lt;/p&gt;
</content:encoded></item><item><title>Hello World</title><link>https://nstlopez.com/blog/hello-world/</link><guid isPermaLink="true">https://nstlopez.com/blog/hello-world/</guid><description>The first step of a journey is often the weirdest.</description><pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here I am. Pretty much my very first post so nothing to see here.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;for now&lt;/em&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Netflix Clone</title><link>https://nstlopez.com/projects/netflix_clone/</link><guid isPermaLink="true">https://nstlopez.com/projects/netflix_clone/</guid><description>A very simple but accurate clone of a famous streaming service. Made with React (custom hooks &amp; context), styled-components and Firebase</description><pubDate>Fri, 16 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is essentially a clone of the famous streaming platform Netflix, but built my way.
I decided to get more comfortable with React building a &lt;em&gt;quite complicated at the time&lt;/em&gt; project.
The idea was simple.
I wanted to copy a famous streaming platform design and logic but with my own stack.
The whole front-end is managed with a React app and the backend is a very basic Firebase setup with auth enabled.&lt;/p&gt;
&lt;p&gt;The app consists of a main page, login and signup pages, and a browse page where you can see a few of stock shows gave to the app.&lt;/p&gt;
&lt;p&gt;At the time when I built it I was planning on just making the “visible” part of it, but it ended up taking more than that. The auth part was probably the most tedious. Although it uses Firebase and it’s quite easy to setup I had never done anything like it and was quite an experience.&lt;/p&gt;
&lt;p&gt;For the whole communication it was a really nice practice for the &lt;code&gt;useContext&lt;/code&gt; hook. Pretty much the whole app is managed through it and gave me a really good glimpse of where and when is a nice idea to use it.&lt;/p&gt;
&lt;p&gt;Talking about &lt;em&gt;hooks&lt;/em&gt; I also made my owns with this project!
The &lt;em&gt;hooks&lt;/em&gt; I’m talking about is the &lt;code&gt;useContent&lt;/code&gt; and &lt;code&gt;useAuthListener&lt;/code&gt;. Both made for the Firebase provider to be a little easier to work with and to access the &lt;code&gt;localStorage&lt;/code&gt; for the auth sessions.&lt;/p&gt;
&lt;p&gt;Design-wise I tried to make the app as close as the original as possible, I believe I made a really accurate clone of it, the part where I struggled the most is the &lt;code&gt;browse&lt;/code&gt; page where the shows are displayed once you log in. It’s not as accurate as I’d like to, but I believe it turned out nicely.
On the other hand, the video player ended up being quite complicated, understandably, since it’s the key to the service, so I just made it play a stock video and called it a day.&lt;/p&gt;
&lt;p&gt;I also got to know &lt;strong&gt;styled-components&lt;/strong&gt;, which is the styling library used for the whole app. Pretty much my go-to library since then, I love it, works flawlessly and it puts you in control at the same time as give you a good way to structure your components.&lt;/p&gt;
</content:encoded></item><item><title>nst.sh</title><link>https://nstlopez.com/projects/nst_sh/</link><guid isPermaLink="true">https://nstlopez.com/projects/nst_sh/</guid><description>The app was built as a productivity tool for myself, being able to use my domain to go fast to specific pages on all my devices was really something that I find convenient. Its built with a Express backend + MongoDB and a really small Vue frontend</description><pubDate>Mon, 05 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Time ago, I was in a party with some friends. I told one of them about one of my apps that I had hosted at the time, nothing really big or fancy, but something I wanted to show him.&lt;/p&gt;
&lt;p&gt;At that moment I asked him to get his phone and type out the IP and port where I had it on my VPS, and then, I realised that it was awfully inconvenient to host my apps that way. That&apos;s a turning point when I decided to actually host all my apps in subdomains like I do right now. But even then, once again, it was somehow inconvenient to just give someone a long URL to type. That&apos;s where this project came in mind.&lt;/p&gt;
&lt;p&gt;I found that this domain name was untaken and it really fitted my idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Something you can type quick to led you somewhere else&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And so I decided to invest into finding out how URL shorteners worked and how to host a proper database for it. Ended up quite nicely and it&apos;s something I use frequently.&lt;/p&gt;
&lt;p&gt;It&apos;s made with &lt;strong&gt;Express&lt;/strong&gt; attached to a &lt;strong&gt;MongoDB&lt;/strong&gt; and &lt;strong&gt;Vue&lt;/strong&gt; as a fronted. It will probably be remade not long from now since it need to be improved. I will change this when it&apos;s done.&lt;/p&gt;
</content:encoded></item><item><title>Demon Harem</title><link>https://nstlopez.com/projects/demon_harem/</link><guid isPermaLink="true">https://nstlopez.com/projects/demon_harem/</guid><description>A static page made with HTML SCSS and Gulp. Created to practice my styling and basic web development skill without any framework whatsoever.</description><pubDate>Mon, 14 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This project was pretty much born as an excuse for practicing my knowledge on basic HTML + Vanilla JS. It ended up quite nicely I&apos;d say.&lt;/p&gt;
&lt;p&gt;I decided to make it based on &lt;a href=&quot;https://store.steampowered.com/app/1289310/Helltaker/&quot;&gt;Helltaker&lt;/a&gt;, which is a free game that came up recently that people really liked it, if you want to give it a try it&apos;s &lt;a href=&quot;https://store.steampowered.com/app/1289310/Helltaker/&quot;&gt;free&lt;/a&gt; on Steam.&lt;/p&gt;
&lt;p&gt;The project was heavily inspired by &lt;a href=&quot;https://satania.moe/&quot;&gt;Satania.moe&lt;/a&gt;, since it has such a wonderful boilerplate and design for the page I wanted to make. Props to &lt;a href=&quot;https://github.com/Pizzacus/&quot;&gt;Pizzacus&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Score Analyzer</title><link>https://nstlopez.com/projects/scores/</link><guid isPermaLink="true">https://nstlopez.com/projects/scores/</guid><description>A small OCR app to scan nodewar and siege scores from Black Desert Online and transpile them to pdf for easy access and tracking. Made with Tesseract.js</description><pubDate>Wed, 29 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Although very simple I found nobody had made anything like this before.&lt;/p&gt;
&lt;p&gt;In this game people keep track of huge scores of 100+ people MANUALLY to excel pages and other sheets. So I decided to make this app to make their life easier.&lt;/p&gt;
&lt;p&gt;Functionally is very basic, just takes a screenshot from one of the scores and Tesseract OCR them into a pdf file so you can actually copy paste its data to anywhere else.&lt;/p&gt;
</content:encoded></item><item><title>GitHunter</title><link>https://nstlopez.com/projects/githunter/</link><guid isPermaLink="true">https://nstlopez.com/projects/githunter/</guid><description>A starred project hunter for Github projects, created because I dislike the at the time awful timeline Github had for exploring new projects. Created using React and ChakraUI.</description><pubDate>Thu, 09 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This was pretty much on of my very early projects. In fact, it was partially broken until not long ago, when I asked a friend to help me out fix it.
It came out nicely in fact, there’s a few things that could be improved, like the way sorting works and the actual display and organisation of the different lists. But &lt;strong&gt;if it works it works&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The project uses React, &lt;a href=&quot;https://github.com/chakra-ui/chakra-ui&quot;&gt;ChakraUI&lt;/a&gt;, a really clean component library and &lt;a href=&quot;https://github.com/ava/use-http&quot;&gt;use-http&lt;/a&gt;, a hooks-based fetch library for isomorphic http requests.&lt;/p&gt;
&lt;p&gt;The idea for the project came from a Youtube video from &lt;a href=&quot;https://github.com/kamranahmedse&quot;&gt;Kamran Ahmed&lt;/a&gt;, with a few aditions made by my side.
Which in my opinion has one of the best roadmaps for every developer there is, you can check that roadmap &lt;a href=&quot;https://roadmap.sh/&quot;&gt;here&lt;/a&gt; if you want.&lt;/p&gt;
</content:encoded></item><item><title>Yet another React Todo List</title><link>https://nstlopez.com/projects/todo/</link><guid isPermaLink="true">https://nstlopez.com/projects/todo/</guid><description>Pretty much one of these everyone has, but with something different. It uses LocalStorage</description><pubDate>Tue, 03 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pretty much one of my very early projects with React, just a simple Todo list with categories.&lt;/p&gt;
&lt;p&gt;When I built it back in the day I decided it would be way better to have something different that every other tutorial around, so I invested some time on looking how exactly &lt;strong&gt;localStorage&lt;/strong&gt; worked on the browser, and at the end, decided to store the Todos that way.&lt;/p&gt;
</content:encoded></item><item><title>GameBoy Zero</title><link>https://nstlopez.com/projects/gameboy/</link><guid isPermaLink="true">https://nstlopez.com/projects/gameboy/</guid><description>A very complex project involving emulating old Games on a GameBoy encasing. Made with a Raspberry PI Zero and a lot of 3D printed parts as well as the original cartridge reader.</description><pubDate>Tue, 09 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I made this project around 2016. it&apos;s basically a fully capable Raspberry Pi Zero made to play games on Retropie, it features 3 USB A ports (1 outside, 2 inside) and a direct connection to the Pi in case you want to run it to a screen to play with a controller instead of the built-in screen.&lt;/p&gt;
&lt;p&gt;As an addon it has the SD card slot lined to the only cartridge reader of the original Game Boy, so if you like you can route a SD Card directly inside a Cartridge and use it to make it more aesthetic.&lt;/p&gt;
&lt;p&gt;It also have a 3DS Stick in the middle of the case, so you can play different games that requires one.&lt;/p&gt;
</content:encoded></item></channel></rss>