<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Turing's Oracle</title>
    <description>The latest articles on Forem by Turing's Oracle (@turingsoracle).</description>
    <link>https://forem.com/turingsoracle</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9347%2F7a287c81-6a1d-486c-9c09-5d4d5640ad06.png</url>
      <title>Forem: Turing's Oracle</title>
      <link>https://forem.com/turingsoracle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/turingsoracle"/>
    <language>en</language>
    <item>
      <title>MCP Skills vs MCP Tools: The Right Way to Configure Your Server</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sun, 22 Mar 2026 08:40:00 +0000</pubDate>
      <link>https://forem.com/turingsoracle/mcp-skills-vs-mcp-tools-the-right-way-to-configure-your-server-562c</link>
      <guid>https://forem.com/turingsoracle/mcp-skills-vs-mcp-tools-the-right-way-to-configure-your-server-562c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Skills and MCP tools are not the same thing — and confusing them costs you. Learn the real difference, the real downsides, and how to combine both for a better agentic workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  MCP Skills vs MCP Tools: What's the Difference and How to Combine Them
&lt;/h1&gt;

&lt;p&gt;Everyone is talking about MCP. Everyone is talking about skills.&lt;/p&gt;

&lt;p&gt;Most people are using them interchangeably — and that's exactly the problem.&lt;/p&gt;

&lt;p&gt;They are not the same thing. They don't solve the same problem. And if you reach for the wrong one, you will feel it: hallucinations, context blowups, agents that drift off-task, and workflows that fall apart under pressure.&lt;/p&gt;

&lt;p&gt;Let's fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of it like a kitchen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP tools&lt;/strong&gt; are your appliances and ingredients — the oven, the fridge, the fresh vegetables. Raw capability. Without them, nothing gets cooked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; are your recipes — the step-by-step instructions that tell a skilled chef exactly how to turn those ingredients into something good. Without them, you have power with no direction.&lt;/p&gt;

&lt;p&gt;An agent with only MCP tools can &lt;em&gt;do&lt;/em&gt; things but doesn't necessarily know &lt;em&gt;how&lt;/em&gt; to do them well. An agent with only skills has great instructions but no way to act on them.&lt;/p&gt;

&lt;p&gt;You need both.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is an MCP Tool?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol&lt;/strong&gt; is an open standard — now under the Linux Foundation's Agentic AI Foundation — that gives AI agents a standardized way to connect to external systems: databases, APIs, file systems, GitHub, Slack, your Angular CLI.&lt;/p&gt;

&lt;p&gt;When you connect an MCP server to your client—whether that's Claude Code, the Gemini CLI, or a custom agent—it gets access to a set of typed, deterministic tools. Each tool has a clear input/output schema. When the agent calls it, it executes — no interpretation, no hallucination risk at the execution level. It's a structured API call, not a suggestion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP is how the agent &lt;em&gt;reaches outside itself&lt;/em&gt;. It's the nervous system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use MCP when you need the agent to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read or write to a real system (database, filesystem, API)&lt;/li&gt;
&lt;li&gt;Execute actions with clear, auditable inputs and outputs&lt;/li&gt;
&lt;li&gt;Connect to tools you don't own or control&lt;/li&gt;
&lt;li&gt;Integrate multiple services through a consistent interface&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Is a Skill?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Skill&lt;/strong&gt; is a folder containing a Markdown file (with YAML frontmatter) plus optional scripts and resources. It's not executable by itself — it's a playbook.&lt;/p&gt;

&lt;p&gt;When a user's request matches a Skill's relevance criteria, the agent loads those instructions dynamically and follows them. Think of it as giving the agent expert-level procedural memory on demand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-component-review&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Review Angular components for Signal compliance and standalone architecture&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Angular Component Review&lt;/span&gt;

When reviewing an Angular component:
&lt;span class="p"&gt;1.&lt;/span&gt; Check that all state uses &lt;span class="sb"&gt;`signal()`&lt;/span&gt; or &lt;span class="sb"&gt;`computed()`&lt;/span&gt; — never direct property mutation
&lt;span class="p"&gt;2.&lt;/span&gt; Verify the component is &lt;span class="sb"&gt;`standalone: true`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Confirm no &lt;span class="sb"&gt;`NgModule`&lt;/span&gt; dependencies remain
&lt;span class="p"&gt;4.&lt;/span&gt; Validate that &lt;span class="sb"&gt;`@if`&lt;/span&gt; / &lt;span class="sb"&gt;`@for`&lt;/span&gt; is used instead of &lt;span class="sb"&gt;`*ngIf`&lt;/span&gt; / &lt;span class="sb"&gt;`*ngFor`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent loads this only when it's relevant. When it's not — it costs you nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a skill when you need the agent to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow a consistent process or checklist&lt;/li&gt;
&lt;li&gt;Apply domain-specific expertise (your coding standards, review criteria)&lt;/li&gt;
&lt;li&gt;Encode knowledge that doesn't change often&lt;/li&gt;
&lt;li&gt;Reuse the same workflow across different conversations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Downsides
&lt;/h2&gt;

&lt;p&gt;This is where most guides stop. They shouldn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: The Token Tax
&lt;/h3&gt;

&lt;p&gt;Every MCP tool you connect injects its full schema into the context window &lt;em&gt;before the agent processes a single message&lt;/em&gt;. Each tool costs 550–1,400 tokens. Connect GitHub, Slack, and Sentry, and you're looking at &lt;strong&gt;55,000 tokens burned upfront&lt;/strong&gt; — over a quarter of Claude's 200k limit before any real work begins. And if you are using Gemini with its 1M+ token window, you might think you can just ignore this. Don't. Even if you have the space to spare, dumping 55,000 tokens of raw JSON schema into every single turn of a conversation drives up your latency, increases API costs, and dilutes the model's focus.&lt;/p&gt;

&lt;p&gt;One team reported connecting three MCP servers and consuming &lt;strong&gt;143,000 of 200,000 tokens&lt;/strong&gt; on tool definitions alone. The agent had 57,000 tokens left for the actual conversation.&lt;/p&gt;

&lt;p&gt;The good news: modern clients like Claude Code and the Gemini CLI have adopted progressive discovery for MCP—loading only tool names and descriptions upfront (~20–50 tokens each) and fetching full schemas only when the agent actually needs a tool. Token overhead declined by ~85%. But this feature only works if your MCP setup is configured to use it, and most setups still aren't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills: The Staleness Problem
&lt;/h3&gt;

&lt;p&gt;Skills are Markdown files. They don't update themselves. If your Angular patterns evolve — say you migrate from &lt;code&gt;setInput()&lt;/code&gt; to the new declarative API in Angular 20 — your Skill still teaches the old way until someone updates it manually.&lt;/p&gt;

&lt;p&gt;The more skills you create, the more maintenance burden you carry. And if a skill is subtly wrong, the agent will follow it confidently — no error, just quietly incorrect output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Both: The Selection Problem
&lt;/h3&gt;

&lt;p&gt;Give an agent too many tools or too many skills, and it starts making the wrong choices — calling the wrong tool, triggering the wrong playbook, or combining them in ways that produce contradictory instructions. Experts recommend staying under &lt;strong&gt;10–15 active MCP tools&lt;/strong&gt; at any time.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Combine Them
&lt;/h2&gt;

&lt;p&gt;The most powerful pattern is using them as layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1 — MCP provides access.&lt;/strong&gt;&lt;br&gt;
Connect only what the agent genuinely needs for the current task. Angular CLI, a database, and a file system. Keep it lean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2 — Skills provide expertise.&lt;/strong&gt;&lt;br&gt;
Create a skill that tells the agent &lt;em&gt;how&lt;/em&gt; to use those tools in your specific context. Not just "run the Angular CLI" — but "when migrating a component, run &lt;code&gt;ng generate&lt;/code&gt; with these flags, then validate against these patterns."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 — Skills can orchestrate MCP.&lt;/strong&gt;&lt;br&gt;
A Skill can define a multi-step workflow that calls multiple MCP tools in sequence. Example: a "Deploy &amp;amp; Notify" Skill that uses GitHub MCP to push, a CI/CD MCP to trigger a build, and a Slack MCP to notify the team — all under one coherent playbook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;angular-migration-workflow&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Full workflow for migrating an Angular component to v21 patterns&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Migration Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Use the Angular CLI MCP to check the current component version
&lt;span class="p"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`ng update`&lt;/span&gt; for the affected package
&lt;span class="p"&gt;3.&lt;/span&gt; Apply the zoneless migration schematic
&lt;span class="p"&gt;4.&lt;/span&gt; Review the output against the angular-component-review Skill
&lt;span class="p"&gt;5.&lt;/span&gt; Run tests and report results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Practical Decision Guide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Need to query a real database&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to follow a code review checklist&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to push to GitHub&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to apply your team's commit message format&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to read a live API&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need to teach the agent your Angular architecture rules&lt;/td&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need both access and consistent process&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Improving Your Workflow
&lt;/h2&gt;

&lt;p&gt;A few patterns that actually work in production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. One MCP server per domain.&lt;/strong&gt; Don't load everything at once. Create separate configs for "Angular development," "deployment," and "communication" — and activate only the one you need for a given session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Version your Skills like code.&lt;/strong&gt; Put them in your repository. Review them when you update your stack. A Skill for Angular 19 patterns will actively hurt you on Angular 21.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use Skills to write MCP guardrails.&lt;/strong&gt; Instead of relying on the agent to figure out when to call a destructive MCP action, write a Skill that explicitly says: &lt;em&gt;"Before running any &lt;code&gt;ng update&lt;/code&gt;, always create a git branch first."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Measure your context budget.&lt;/strong&gt; Before your agent does any real work, know how many tokens your MCP setup consumes. If you're over 30% of your context window is on tool definitions, you have a configuration problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Let the agent maintain simple Skills.&lt;/strong&gt; For fast-moving areas — like keeping track of your team's current Angular version conventions — let the agent update the Skill file itself when you tell it to. It's faster than doing it manually and keeps the Skill honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;MCP gives agents the ability to act. Skills teach them how to act well.&lt;/p&gt;

&lt;p&gt;The debate of "MCP vs Skills" is a false one. The real question is: &lt;em&gt;do you need access, expertise, or both?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In most real Angular workflows, you need both. An agent that can run your CLI but doesn't know your architecture is just a faster way to make the same mistakes. An agent that knows your patterns but can't touch your actual project is just an expensive search engine.&lt;/p&gt;

&lt;p&gt;Used together, with clear boundaries and lean configuration, they're the foundation of agentic development that actually works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previously I wrote about &lt;a href="https://www.yeou.dev/articles/angular-21-mcp-migrations" rel="noopener noreferrer"&gt;Angular 21 MCP and the end of manual migrations&lt;/a&gt; — a good starting point if you're new to the MCP server setup for Angular.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>Angular 20 to 21 Upgrade: The Practical Survival Guide</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sat, 13 Dec 2025 07:48:14 +0000</pubDate>
      <link>https://forem.com/turingsoracle/angular-20-to-21-upgrade-the-practical-survival-guide-1km9</link>
      <guid>https://forem.com/turingsoracle/angular-20-to-21-upgrade-the-practical-survival-guide-1km9</guid>
      <description>&lt;p&gt;A clear and concise guide to upgrading from Angular 20 to 21. that Covers the essentials like the Karma full removal, the new default Zoneless mode, automatic HttpClient, and how to fix your breaking builds.&lt;/p&gt;

&lt;p&gt;If you thought Angular 20 was a big shift, welcome to Angular 21.&lt;/p&gt;

&lt;p&gt;While version 20 was about stabilizing Signals, version 21 is about removing most of the old patterns. The "Angular Way" has fundamentally changed: &lt;code&gt;zone.js&lt;/code&gt; is optional, Karma is dead, and RxJS is slowly retreating to the edges.&lt;/p&gt;

&lt;p&gt;This isn't just an update; it's a new ecosystem. Here is what is going to break and how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚨 The "Stop Everything" Breaking Changes
&lt;/h2&gt;

&lt;p&gt;Before you run &lt;code&gt;ng update&lt;/code&gt;, be aware that your build will likely fail if you rely on these legacy patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Karma Extinction Event (Vitest is Default)
&lt;/h3&gt;

&lt;p&gt;The most immediate shock for many teams will be &lt;code&gt;ng test&lt;/code&gt;. Angular 21 has officially swapped Karma for Vitest as the default test runner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; If you have a custom &lt;code&gt;karma.conf.js&lt;/code&gt; or rely on specific Karma plugins/reporters, your test suite is now legacy code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;New Projects:&lt;/strong&gt; You get Vitest out of the box. It's faster, cleaner, and uses Vite.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Existing Projects:&lt;/strong&gt; You aren't forced to switch immediately, but the writing is on the wall. The CLI will nag you.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Migration:&lt;/strong&gt; Run the schematic &lt;code&gt;ng generate @angular/core:karma-to-vitest&lt;/code&gt; to attempt an auto-migration. It's remarkably good at converting standard configs, but custom Webpack hacks in your test setup will need manual rewriting for Vite.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. HttpClient is "Just There"
&lt;/h3&gt;

&lt;p&gt;Remember adding &lt;code&gt;provideHttpClient()&lt;/code&gt; to your &lt;code&gt;app.config.ts&lt;/code&gt; or importing &lt;code&gt;HttpClientModule&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Change:&lt;/strong&gt; &lt;code&gt;HttpClient&lt;/code&gt; is now injected by default in the root injector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you have tests that mock &lt;code&gt;HttpClient&lt;/code&gt; by expecting it not to be there, they might fail.&lt;/li&gt;
&lt;li&gt;  If you rely on &lt;code&gt;HttpClientModule&lt;/code&gt; for complex interceptor ordering in a mixed NgModule/Standalone app, you might see subtle behavior changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Remove explicit &lt;code&gt;provideHttpClient()&lt;/code&gt; calls unless you are passing configuration options (like &lt;code&gt;withInterceptors&lt;/code&gt; or &lt;code&gt;withFetch&lt;/code&gt;). It cleans up your config, but check your interceptor execution order.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. zone.js is Gone (For New Apps)
&lt;/h3&gt;

&lt;p&gt;New apps generated with &lt;code&gt;ng new&lt;/code&gt; will exclude &lt;code&gt;zone.js&lt;/code&gt; by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks:&lt;/strong&gt; Nothing for existing apps (yet). Your &lt;code&gt;polyfils.ts&lt;/code&gt; will keep importing Zone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Warning:&lt;/strong&gt; If you copy-paste code from a new v21 tutorial into your existing v20 app, it might assume Zoneless behavior (using &lt;code&gt;ChangeDetectorRef&lt;/code&gt; less often, relying on Signals). If you mix the two paradigms without understanding them, you'll get "changed after checked" errors or views that don't update.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ The New Toys: Features You'll Actually Use
&lt;/h2&gt;

&lt;p&gt;Once you fix the build, v21 offers some incredible DX improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Signal Forms (Experimental but Stable)
&lt;/h3&gt;

&lt;p&gt;This is the feature we've been waiting for. No more &lt;code&gt;valueChanges.pipe(...)&lt;/code&gt;spaghetti.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/forms/signals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Define a reactive form model&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loginForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;form&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Access values directly as signals!&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loginForm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why use it:&lt;/strong&gt; It's type-safe by default and doesn't require RxJS mastery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Experimental. Use it for new features, but maybe don't rewrite your checkout flow just yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Angular Aria (Developer Preview)
&lt;/h3&gt;

&lt;p&gt;A new library of headless primitives for accessibility.&lt;/p&gt;

&lt;p&gt;Instead of fighting with &lt;code&gt;aria-expanded&lt;/code&gt; and &lt;code&gt;role="button"&lt;/code&gt;, you use directives that handle the a11y logic while you handle the CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Handles keyboard nav, focus, and ARIA roles automatically --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;ariaMenu&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;ariaMenuItem&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Option 1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;ariaMenuItem&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Option 2&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Regex in Templates
&lt;/h3&gt;

&lt;p&gt;Small but mighty. You can finally use regex literals in templates, perfect for &lt;code&gt;@if&lt;/code&gt;logic without creating a helper function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@if (email() | match: /@company\.com$/) {
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Employee&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ The Upgrade Checklist
&lt;/h2&gt;

&lt;p&gt;Ready to jump? Follow this order to minimize pain.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Backup:&lt;/strong&gt; Commit everything. Seriously.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update the Global CLI:&lt;/strong&gt;&lt;br&gt;
Updating Angular generally involves two parts: the global CLI and the local project dependencies. Ensure your global CLI is up to date first (you might need sudo or Administrator privileges).&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Optional: Uninstall the old global version first to avoid conflicts&lt;/span&gt;
npm uninstall &lt;span class="nt"&gt;-g&lt;/span&gt; @angular/cli

&lt;span class="c"&gt;# Verify the npm cache&lt;/span&gt;
npm cache verify

&lt;span class="c"&gt;# Install the latest global CLI version&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @angular/cli@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update Local Project:&lt;/strong&gt;&lt;br&gt;
Now update your local project dependencies:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng update @angular/cli@21 @angular/core@21
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run the Diagnostics:&lt;/strong&gt;&lt;br&gt;
Angular 21 includes smarter diagnostics. Pay attention to warnings about &lt;code&gt;ngClass&lt;/code&gt; (soft deprecated in favor of &lt;code&gt;[class.my-class]&lt;/code&gt;) and standalone migration opportunities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Your Tests:&lt;/strong&gt;&lt;br&gt;
Run &lt;code&gt;ng test&lt;/code&gt;. If it explodes, decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Path A:&lt;/strong&gt; Keep Karma (add &lt;code&gt;@angular/build:karma&lt;/code&gt; manually if removed).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Path B:&lt;/strong&gt; Migrate to Vitest (Recommended).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optional: Go Zoneless:&lt;/strong&gt;&lt;br&gt;
If you're feeling brave, run the experimental migration:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate @angular/core:zoneless-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This is "Agentic" territory. See our &lt;a href="https://dev.to/turingsoracle/angular-21-mcp-the-end-of-manual-migrations-4hdh"&gt;MCP Guide&lt;/a&gt; for how to let AI handle this complex refactor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Angular 21 is the "clean slate" release. It sheds the weight of the last decade (Zone, Karma, Modules) to compete with modern frameworks like Svelte and Solid.&lt;/p&gt;

&lt;p&gt;The upgrade might be bumpy due to the testing changes, but the destination—a faster, simpler, signal-driven framework—is absolutely worth it.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>upgrade</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Upgrading to Angular 20</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sat, 28 Jun 2025 10:07:39 +0000</pubDate>
      <link>https://forem.com/turingsoracle/upgrading-to-angular-20-4h5i</link>
      <guid>https://forem.com/turingsoracle/upgrading-to-angular-20-4h5i</guid>
      <description>&lt;p&gt;This is a practical guide focused on what really matters when updating a real-world application: what breaks, what makes your work easier, and how you should adapt your development style.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Full Story Behind Karma's Removal: Beyond a Broken Build
&lt;/h2&gt;

&lt;p&gt;The immediate issue when upgrading is that &lt;code&gt;ng test&lt;/code&gt; will fail. The reason is a fundamental change in Angular's build tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did Angular drop Karma?
&lt;/h3&gt;

&lt;p&gt;With Angular 20, the default build package changes from &lt;code&gt;@angular-devkit/build-angular&lt;/code&gt; to the new &lt;code&gt;@angular/build&lt;/code&gt;. This new package no longer includes the Karma plugin used by legacy test setups.&lt;/p&gt;

&lt;p&gt;The web ecosystem has moved on to faster test runners like &lt;strong&gt;Vitest&lt;/strong&gt; and &lt;strong&gt;Jest&lt;/strong&gt; that use modern tools like Vite and esbuild. Karma had become a bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the new world looks like (Vitest/Jest)
&lt;/h3&gt;

&lt;p&gt;Angular's experimental test runner, now powered by &lt;strong&gt;Vitest&lt;/strong&gt;, is the future. Migrating means your unit tests will run in a fast, modern Node.js-based environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "temporary fix" explained
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @angular-devkit/build-angular &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command forces the CLI to fall back to the old compiler that still supports Karma. It’s a compatibility bridge — but the message is clear: start planning your migration to Jest or Vitest soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting the update process, make sure you meet the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;: Version &lt;code&gt;20.11.1&lt;/code&gt; or later
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt;: Version &lt;code&gt;5.8&lt;/code&gt; or later
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project backup&lt;/strong&gt;: Commit all current changes in Git
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. How to Update: CLI Command and Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Update Command
&lt;/h3&gt;

&lt;p&gt;Make sure you're running Node.js &lt;code&gt;v20.11.1&lt;/code&gt; or later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng update @angular/cli @angular/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use Angular Material:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng update @angular/cli @angular/core @angular/material
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual intervention required
&lt;/h3&gt;

&lt;p&gt;To reinstall the old compiler with Karma support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @angular-devkit/build-angular &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This wasn't required in earlier versions but is now &lt;strong&gt;mandatory&lt;/strong&gt; if you want to keep using Karma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compared to earlier upgrades
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular v19&lt;/strong&gt;: &lt;code&gt;ng update&lt;/code&gt; just worked.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular v20&lt;/strong&gt;: You must manually reinstall the old builder for Karma.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Control Flow: More Than Syntactic Sugar
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@for&lt;/code&gt; replaces &lt;code&gt;*ngFor&lt;/code&gt; and is a major improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Old syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let item of items; trackBy: trackItemById"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{ item.name }}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@for (item of items; track item.id) {
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;{{ item.name }}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
} @empty {
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;No items to display.&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;track&lt;/code&gt; is &lt;strong&gt;mandatory&lt;/strong&gt; and encourages best practices.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@empty&lt;/code&gt; improves DX by removing the need for separate &lt;code&gt;@if&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automated migration and performance
&lt;/h3&gt;

&lt;p&gt;Use the CLI to automatically refactor templates to the new control flow syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate @angular/core:control-flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  General Best Practices and Further Migrations
&lt;/h3&gt;

&lt;p&gt;You can also migrate to other modern Angular features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate @angular/core:standalone
ng generate @angular/core:inject
ng generate @angular/core:route-lazy-loading
ng generate @angular/core:signal-input-migration
ng generate @angular/core:signal-queries-migration
ng generate @angular/core:output-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands allow for a comprehensive update of an Angular app to leverage the latest patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Standalone by Default: A Fundamental Architectural Shift
&lt;/h2&gt;

&lt;p&gt;By explicitly listing dependencies using the &lt;code&gt;imports&lt;/code&gt; array at the component level, each component becomes self-contained. This:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clarifies your architecture&lt;/li&gt;
&lt;li&gt;Improves tree-shaking&lt;/li&gt;
&lt;li&gt;Results in smaller bundles&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Zoneless: Escaping the "Magic" of Change Detection
&lt;/h2&gt;

&lt;p&gt;In a zone-less world, the UI only updates when you explicitly tell it to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt; are the main tool here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;mySignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This directly tells Angular to update only the DOM parts that use that signal. It’s a &lt;strong&gt;surgical, predictable, and high-performance&lt;/strong&gt; approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. New Naming Convention: Why It Feels Complicated
&lt;/h2&gt;

&lt;p&gt;Angular 20 introduces a new official naming convention that &lt;strong&gt;drops traditional suffixes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Old naming
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;directive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New naming
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;       &lt;span class="c1"&gt;// UI component&lt;/span&gt;
&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;         &lt;span class="c1"&gt;// state&lt;/span&gt;
&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;          &lt;span class="c1"&gt;// directive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Focus on intent instead of type
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;         &lt;span class="c1"&gt;// HTTP requests&lt;/span&gt;
&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;       &lt;span class="c1"&gt;// reactive state&lt;/span&gt;
&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;       &lt;span class="c1"&gt;// UI component&lt;/span&gt;
&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;    &lt;span class="c1"&gt;// UI component&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Naming rules
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;dashes&lt;/strong&gt;: &lt;code&gt;user-profile.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Match &lt;strong&gt;class and filename&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;.spec.ts&lt;/code&gt; for tests&lt;/li&gt;
&lt;li&gt;Avoid generic names like &lt;code&gt;utils.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Co-locate&lt;/strong&gt; related files&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Feature-based folder structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── core/
│   └── auth/
│       ├── auth-store.ts
│       ├── login.ts
│       └── register.ts
├── features/
│   └── users/
│       ├── user-profile.ts
│       ├── user-api.ts
│       └── user-settings.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner Git diffs&lt;/li&gt;
&lt;li&gt;Intention-oriented code&lt;/li&gt;
&lt;li&gt;Easier onboarding&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Important Detail: &lt;code&gt;browserslist&lt;/code&gt; and Browser Support
&lt;/h2&gt;

&lt;p&gt;Angular 20 &lt;strong&gt;no longer supports Opera&lt;/strong&gt; officially.&lt;br&gt;&lt;br&gt;
If you list Opera in your &lt;code&gt;browserslist&lt;/code&gt;, you may need to remove it.&lt;/p&gt;

&lt;p&gt;Other non-mainstream browsers may also lose support, potentially triggering warnings or build issues.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>typescript</category>
      <category>unittest</category>
    </item>
    <item>
      <title>From Vibe Coding to Vibe Engineering with V0 and Firebase Studio. [Part 0].</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 08 Apr 2025 18:48:10 +0000</pubDate>
      <link>https://forem.com/turingsoracle/from-vibe-coding-to-vibe-engineering-with-v0-and-firebase-part-0-2m8m</link>
      <guid>https://forem.com/turingsoracle/from-vibe-coding-to-vibe-engineering-with-v0-and-firebase-part-0-2m8m</guid>
      <description>&lt;h1&gt;
  
  
  Yes, you heard right
&lt;/h1&gt;

&lt;p&gt;In this tutorial, we’re going to crank up impostor syndrome to the max by building a full-stack web app using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Auth&lt;/strong&gt; for authentication
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firestore&lt;/strong&gt; for real-time data storage
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Hosting&lt;/strong&gt; so you can actually show your project and avoid the “it works on my machine” excuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Studio&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this time, we’re not doing another “Login + Hello World.”&lt;/p&gt;

&lt;p&gt;We’re going to build something with purpose: a &lt;strong&gt;book lending and return management platform&lt;/strong&gt; for a public library.&lt;br&gt;
And yes, we’ll generate &lt;strong&gt;QR codes&lt;/strong&gt; to streamline returns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase One: Planning and Goals
&lt;/h2&gt;

&lt;p&gt;A popular saying goes:&lt;br&gt;
&lt;strong&gt;You don’t start a house from the roof...&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
And even though Vercel’s V0 lets us begin with the UI, we’re going to do things properly.&lt;/p&gt;

&lt;p&gt;Before sending prompts, we’ll define what we’re building:&lt;/p&gt;

&lt;h3&gt;
  
  
  The What
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;library management app&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full CRUD for books
&lt;/li&gt;
&lt;li&gt;Book lending and return system
&lt;/li&gt;
&lt;li&gt;QR code generation for scannable loan identification
&lt;/li&gt;
&lt;li&gt;QR code reading to easily mark books as returned
&lt;/li&gt;
&lt;li&gt;(Optional) Social features to create a reading club where users can exchange books and experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Why
&lt;/h3&gt;

&lt;p&gt;We aim to solve a real problem: managing a &lt;strong&gt;public or community library&lt;/strong&gt; in a simple, modern, and digital way — and encourage reading habits.&lt;/p&gt;

&lt;p&gt;Also, it’s a great excuse to practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14/15&lt;/strong&gt; architecture
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V0-generated UI components&lt;/strong&gt; (which we’ll refine manually later)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase as backend&lt;/strong&gt; (although you could swap it for something else)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRUD best practices&lt;/strong&gt; (create, read, update, delete)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Premise
&lt;/h2&gt;

&lt;p&gt;We want to manage book check-ins and check-outs from a physical location and create a small community that works like a book club.&lt;/p&gt;

&lt;p&gt;Manage the borrowing and returning of books in a public library.&lt;br&gt;
All this using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;v0.dev&lt;/a&gt; for quick UI creation with style
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; as the web framework, also used by V0
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; for authentication, database, and hosting
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Studio&lt;/strong&gt; (Optional alternative to v0)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR codes&lt;/strong&gt; to ease the physical return of books, using

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/yudiel/react-qr-scanner" rel="noopener noreferrer"&gt;&lt;code&gt;yudiel/react-qr-scanner&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zpao/qrcode.react" rel="noopener noreferrer"&gt;&lt;code&gt;qrcode.react&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Logic
&lt;/h2&gt;

&lt;p&gt;We assume there will be a &lt;strong&gt;librarian role&lt;/strong&gt; — someone responsible for books. &lt;br&gt;
This person’s responsibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registering new books
&lt;/li&gt;
&lt;li&gt;Updating stock
&lt;/li&gt;
&lt;li&gt;Correcting input errors
&lt;/li&gt;
&lt;li&gt;Removing availability of certain books
&lt;/li&gt;
&lt;li&gt;Checking return status (condition, timeliness)
&lt;/li&gt;
&lt;li&gt;Tracking book locations (e.g., Sci-Fi shelf 2)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a &lt;strong&gt;user&lt;/strong&gt;, I want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for a book and check if it’s available&lt;/li&gt;
&lt;li&gt;The homepage should display a searchable list of books by &lt;strong&gt;name, ISBN, or category&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Know where a book is physically located&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another scenario: the user finds the book and &lt;strong&gt;scans the QR code&lt;/strong&gt; to request a loan. &lt;br&gt;
To do this, they must &lt;strong&gt;sign in or register&lt;/strong&gt; — since managing libraries or book clubs requires some form of membership or ID.&lt;/p&gt;

&lt;p&gt;To simplify, all books can be borrowed, and the &lt;strong&gt;Google account&lt;/strong&gt; used to request them will serve as identification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other Considerations: “Security”
&lt;/h2&gt;

&lt;p&gt;This includes both &lt;strong&gt;physical&lt;/strong&gt; and &lt;strong&gt;digital&lt;/strong&gt; security and depends on the specific library’s operations.&lt;/p&gt;

&lt;p&gt;In public libraries, there’s usually a front desk with a librarian who grants access to the reading area. &lt;br&gt;
They assign books by &lt;strong&gt;membership number&lt;/strong&gt; or personal data.&lt;/p&gt;

&lt;p&gt;If the user wants to take a book home:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It must be &lt;strong&gt;scanned and assigned&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The system may also send return details and deadlines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Digitally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users must &lt;strong&gt;log in&lt;/strong&gt; to borrow a book&lt;/li&gt;
&lt;li&gt;Protect routes so only admins access core CRUD operations.&lt;/li&gt;
&lt;li&gt;Optionally, implement a &lt;strong&gt;reputation system&lt;/strong&gt; that limits the number of loans based on:

&lt;ul&gt;
&lt;li&gt;Account age
&lt;/li&gt;
&lt;li&gt;Verification status
&lt;/li&gt;
&lt;li&gt;Membership validity
&lt;/li&gt;
&lt;li&gt;Loan and return history
&lt;/li&gt;
&lt;li&gt;Return timeliness&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;With Firebase, it’s crucial to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structure documents properly.&lt;/li&gt;
&lt;li&gt;Define security rules so only authorized roles can read, write, or delete certain documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(This section will be expanded in future articles.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;After all this planning, we’ve essentially written a &lt;strong&gt;pseudocode-like spec&lt;/strong&gt; for our app.&lt;/p&gt;

&lt;p&gt;So in the &lt;strong&gt;next article&lt;/strong&gt;, we’ll set up everything from Firebase to V0, use alternative Firebase Studio, and build the first prompt based on pseudocode.&lt;/p&gt;

&lt;p&gt;In future posts, we’ll explore &lt;strong&gt;Copilot, Cursor,&lt;/strong&gt; and other AI tools to &lt;strong&gt;accelerate development&lt;/strong&gt; — because at the end of the day, &lt;strong&gt;AI is a tool, not a replacement.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>v0</category>
      <category>webdev</category>
      <category>firebasestudio</category>
    </item>
    <item>
      <title>The Future of FrontEnd Is Written... with Prompts</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 26 Mar 2025 09:21:33 +0000</pubDate>
      <link>https://forem.com/turingsoracle/the-future-of-frontend-is-written-with-prompts-2cle</link>
      <guid>https://forem.com/turingsoracle/the-future-of-frontend-is-written-with-prompts-2cle</guid>
      <description>&lt;p&gt;As you may know, after several iterations, v0 no longer just centers divs.&lt;br&gt;
It now raises a question that makes many feel uncomfortable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To what extent can—or should—artificial intelligence replace the work of a frontend developer?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What is v0?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;v0.dev&lt;/a&gt; is a platform developed by Vercel that allows you to generate full frontend components from natural language descriptions. It's a sort of &lt;em&gt;visual copilot&lt;/em&gt; that combines design and implementation, returning clean code using React, Tailwind, and other modern stacks.&lt;/p&gt;

&lt;p&gt;What sets v0 apart from other generators is its semantic precision. It understands the context of the request, provides coherent structures, and offers visually well-designed solutions.&lt;/p&gt;

&lt;p&gt;It doesn't generate "random code"; it generates useful components, aligned with what the prompt suggests and how it's written.&lt;/p&gt;

&lt;p&gt;Some time ago, the prompt used by v0 from Vercel to build interfaces from plain text was leaked. You can take a look &lt;a href="https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Despite causing a stir, the leak uncovered the true power of this tool: context.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a prompt?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;prompt&lt;/strong&gt; is the instruction given to a language model to perform a task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A registration form with validation, dark mode, and mobile-first design."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The power of a prompt doesn't just lie in &lt;em&gt;what&lt;/em&gt; is being asked, but in &lt;em&gt;how&lt;/em&gt; it is asked.&lt;br&gt;
Clear language, explicit intentions, and well-defined context are key to obtaining useful results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is context?
&lt;/h2&gt;

&lt;p&gt;Technically speaking, &lt;strong&gt;context&lt;/strong&gt; is the additional information that accompanies a prompt and allows the model to more precisely "understand" what is expected.&lt;/p&gt;

&lt;p&gt;It may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The desired stack (React, Next.js, Tailwind)&lt;/li&gt;
&lt;li&gt;Accessibility considerations&lt;/li&gt;
&lt;li&gt;Expected component behavior&lt;/li&gt;
&lt;li&gt;Technical or design constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;v0 uses an advanced &lt;em&gt;prompt engineering&lt;/em&gt; system with enriched context, which enables it to generate functional code relevant to the project environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vibe Coding?
&lt;/h2&gt;

&lt;p&gt;The concept of &lt;strong&gt;vibe coding&lt;/strong&gt; refers to a new way of programming guided more by intention and creative energy than by manually writing every line of code.&lt;/p&gt;

&lt;p&gt;With tools like v0, the development experience begins to feel more like &lt;em&gt;composing music&lt;/em&gt; than coding line by line.&lt;/p&gt;

&lt;p&gt;The flow shifts: it becomes a collaboration between human and AI, where intuition and technical judgment remain essential.&lt;/p&gt;

&lt;p&gt;And v0 isn't alone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; transforms Visual Studio Code into a conversational environment, allowing you to edit, navigate, and write code directly with AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; enables reasoning over complex structures and high-level refactoring, very useful for abstract frontend tasks like architecture design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; continues to act as a line-level assistant, suggesting snippets and completing code as you type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these tools are part of the new development environment—one where human ingenuity and algorithmic efficiency meet at the center of the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The End of the Front-End Dev?
&lt;/h2&gt;

&lt;p&gt;Personally, the approach I like most regarding artificial intelligence is &lt;strong&gt;augmenting capabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Automating without understanding what is being done can be a dangerous trap, often generating more technical debt than real value.&lt;/p&gt;

&lt;p&gt;v0 doesn't replace the frontend developer, but it does require them to evolve.&lt;br&gt;
The role shifts from implementer to &lt;strong&gt;curator, architect, and interface strategist&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Writing a good prompt, understanding the project context and its logic, testing its security, validating accessibility, fixing errors generated by AI implementations, optimizing performance…&lt;br&gt;
All of that is still part of the job.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artificial intelligence doesn't eliminate frontend development. It transforms it.&lt;br&gt;&lt;br&gt;
And those who understand that transformation will be the ones to lead it—rather than resist it.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>promptengineering</category>
      <category>vibecoding</category>
      <category>v0</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Seamless Reactive HTTP Requests in Angular</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 18 Mar 2025 10:49:21 +0000</pubDate>
      <link>https://forem.com/turingsoracle/seamless-reactive-http-requests-in-angular-2ihh</link>
      <guid>https://forem.com/turingsoracle/seamless-reactive-http-requests-in-angular-2ihh</guid>
      <description>&lt;p&gt;Starting from Angular v19.2, we can begin to move away from manually handling API calls thanks to Angular's new primitive: &lt;code&gt;httpResource&lt;/code&gt;. It allows us to reactively fetch data, calling our preferred API automatically each time the value changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main features:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatic Reactivity:&lt;br&gt;
The resource generated by httpResource observes signals and automatically makes HTTP requests each time reactive dependencies change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Default state:&lt;br&gt;
Allows defining default values through the defaultValue property, ensuring a consistent response during initial states, loading phases, or request errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data validation and transformation:&lt;br&gt;
The parse option facilitates automatic validation and transformation of HTTP responses, enhancing type safety and ensuring the integrity of received data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advantages over the traditional approach:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Significant code reduction: Eliminates the need to manually manage subscriptions, reducing errors such as memory leaks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatic state updates: By directly depending on Signals, data updates automatically according to changes in the application's reactive state, eliminating manual tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increased security: Promotes robust development through automatic validation and strict state management throughout all phases of the data lifecycle.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently, this API is in an experimental phase, so it's recommended to monitor its evolution before implementing it in critical production environments.&lt;/p&gt;




&lt;h1&gt;
  
  
  Usage and implementation example:
&lt;/h1&gt;

&lt;p&gt;Previously, we had to rely on RxJS to subscribe and unsubscribe each time we made an API call, which sometimes contributed to the famous memory leaks when we forgot to unsubscribe.&lt;/p&gt;

&lt;p&gt;To implement it, we should start by creating an interface defining the structure of our character with data such as the ID, name, image, etc.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Now we implement httpResource in our component.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;characterResource&lt;/code&gt; is an &lt;code&gt;httpResourceRef&lt;/code&gt; that returns character data from the API; &lt;code&gt;defaultValue&lt;/code&gt; ensures that &lt;code&gt;characterResource&lt;/code&gt; has a defined structure even before the data is loaded.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
characterId&lt;/code&gt; is a signal representing the ID of the character being displayed. Changing this value triggers &lt;code&gt;httpResource&lt;/code&gt; to fetch data for the selected character.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;But what if we want to use POST, PUT, DELETE?&lt;/p&gt;

&lt;p&gt;We only need to change the method and provide the corresponding body along with the params.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;usersResource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;httpResource&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RickCharacter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;per_page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next article, I'll cover more advanced aspects like &lt;code&gt;headers&lt;/code&gt;, &lt;code&gt;params&lt;/code&gt;, etc., but for now you can see all the functional code in the following:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe src="https://stackblitz.com/edit/stackblitz-angularhttpresource?embed=1&amp;amp;file=src%2Frickandmoty.component.ts" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Proyect Fugu</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Mon, 25 Nov 2024 14:00:00 +0000</pubDate>
      <link>https://forem.com/turingsoracle/proyect-fugu-4e2j</link>
      <guid>https://forem.com/turingsoracle/proyect-fugu-4e2j</guid>
      <description>&lt;p&gt;Aims to bridge the gap between progressive web applications (PWAs) and native applications, making PWAs more useful, appealing, and accessible to everyone. This effort is a collaboration between the Chromium community and companies such as Google, Microsoft, and other contributors from the broader web community.&lt;/p&gt;




&lt;h2&gt;
  
  
  What are PWAs?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PWAs&lt;/strong&gt; are web applications designed to be fast, reliable, and capable of being installed on devices as if they were native applications. They use modern APIs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhance capabilities:&lt;/strong&gt; Access advanced hardware and features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ensure reliability:&lt;/strong&gt; Load quickly and work seamlessly, even offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplify installation:&lt;/strong&gt; Behave like traditional apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these enhancements, PWAs combine the best of the web and native applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why "Fugu Project"?
&lt;/h2&gt;

&lt;p&gt;The name "Fugu" refers to the Japanese pufferfish, known for being delicious but dangerous if not prepared correctly. This symbolism captures the essence of the project: the new APIs can be very powerful, but if not implemented carefully, they can pose risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of advanced capabilities and risks:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced capabilities:&lt;/strong&gt; File system access, video editing tools, integration with Bluetooth and USB devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Potential risks:&lt;/strong&gt; These tools must ensure user security and privacy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Fugu Project focuses on enabling these capabilities while maintaining a balance between utility and security.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key APIs in the Fugu Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;File System Access API:&lt;/strong&gt; Allows applications to read and write files directly on the user's system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Share API and Web Share Target API:&lt;/strong&gt; Facilitates sharing content between web and native apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact Picker API:&lt;/strong&gt; Provides access to device contacts with explicit permission.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Bluetooth and Web USB:&lt;/strong&gt; Enables connection with physical devices to extend functionality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Badging API:&lt;/strong&gt; Displays notifications and counts on the installed app's icon.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Benefits of the Fugu Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal compatibility:&lt;/strong&gt; PWAs work on any device with a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hassle-free updates:&lt;/strong&gt; Always up-to-date without requiring downloads from an app store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better user experience:&lt;/strong&gt; Access to features previously exclusive to native apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security and the Future of PWAs
&lt;/h2&gt;

&lt;p&gt;The Fugu Project aims to expand PWA capabilities securely. It works to mitigate risks through explicit permissions and the development of responsible practices for developers.&lt;/p&gt;

&lt;p&gt;With Fugu, PWAs are evolving beyond being mere web versions. They are a powerful tool transforming how we interact with technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Via App the easy way to personalize macros and Keytes &lt;a href="https://usevia.app/" rel="noopener noreferrer"&gt;https://usevia.app/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Momentum website &lt;a href="https://momentum-fw.dev/" rel="noopener noreferrer"&gt;https://momentum-fw.dev/&lt;/a&gt; uses the Web USB API to install an alternative firmware to the default one on FlipperZero.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More examples and inspiration at:&lt;br&gt;
&lt;a href="https://developer.chrome.com/docs/capabilities/fugu-showcase" rel="noopener noreferrer"&gt;https://developer.chrome.com/docs/capabilities/fugu-showcase&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>fugu</category>
      <category>chromium</category>
      <category>devtools</category>
    </item>
    <item>
      <title>What's New Angular 19:</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 19 Nov 2024 15:47:47 +0000</pubDate>
      <link>https://forem.com/turingsoracle/whats-new-angular-19-3fe9</link>
      <guid>https://forem.com/turingsoracle/whats-new-angular-19-3fe9</guid>
      <description>&lt;p&gt;Angular is constantly evolving, and version 19 is no exception. With a focus on developer experience, improved performance, and new tools, Angular 19 offers features to streamline your projects and enhance efficiency. In this article, we’ll explore improvements in reactivity with &lt;strong&gt;signals&lt;/strong&gt;, rendering optimizations, and much more. This marks the eleventh iteration since version 8, one of the first articles on this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Standalone Components as the Default Standard
&lt;/h2&gt;

&lt;p&gt;Standalone components, introduced in Angular 14, have been revolutionary, and now in Angular 19, they are the default behavior. This means you no longer need to declare &lt;code&gt;standalone: true&lt;/code&gt; for each component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Angular 19:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./standalone-component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StandaloneComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./standalone-component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StandaloneComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This eliminates the need for NgModules in most cases, simplifying application structure and promoting modular development. If you still need to work with NgModules, you can explicitly declare &lt;code&gt;standalone: false&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Partial and Incremental Hydration for Faster Rendering
&lt;/h2&gt;

&lt;p&gt;Angular 19 introduces partial and incremental hydration, transforming the performance of server-rendered (SSR) applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Partial Hydration:&lt;/strong&gt; Prioritizes critical component loading, reducing initial interaction time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental Hydration:&lt;/strong&gt; Defers feature loading based on user interactions (clicks or hovers), optimizing resource usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These techniques create faster, more interactive applications right from the start, improving the user experience.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  3. Enhanced Signals: Simplifying Reactivity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt; integration in Angular continues to improve, now with deeper support and new tools like &lt;strong&gt;LinkedSignal&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are signals?
&lt;/h3&gt;

&lt;p&gt;Signals are an API designed to manage states reactively and predictably, reducing reliance on Zone.js. This not only simplifies debugging but also improves performance and reduces bundle size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example with Signals: Introducing LinkedSignal
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;linkedSignal&lt;/code&gt; allows the creation of dependent signals that automatically update based on a source signal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;linkedSignal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Improvements to Component API
&lt;/h2&gt;

&lt;p&gt;Angular 19 introduces a new lifecycle hook, &lt;code&gt;ngAfterSignalUpdate&lt;/code&gt;, to react after a Signal update, simplifying interactions with complex states.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AfterSignalUpdate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-lifecycle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;h3&amp;gt;Signal Lifecycle &amp;lt;/h3&amp;gt;
    &amp;lt;button (click)="updateSignal()"&amp;gt;Update&amp;lt;/button&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SignalLifecycleComponent&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;AfterSignalUpdate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;mySignal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;updateSignal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mySignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mySignal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;ngAfterSignalUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Signal updated to:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mySignal&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This hook helps developers manage UI changes and complex state interactions effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Faster Build Times
&lt;/h2&gt;

&lt;p&gt;Thanks to optimizations in Angular CLI, builds are faster in both development and production environments. The addition of caching accelerates iterative processes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Build with Cache&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng build &lt;span class="nt"&gt;--optimization&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;--build-cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Dependency Injection Enhancements
&lt;/h2&gt;

&lt;p&gt;Angular now automatically infers types in Dependency Injection (DI), reducing repetitive code and increasing type safety.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Type Inference in DI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Now in Angular 19&lt;/span&gt;
&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Resource and rxResource APIs: Simplifying Async Data
&lt;/h2&gt;

&lt;p&gt;The new experimental &lt;strong&gt;resource&lt;/strong&gt; and &lt;strong&gt;rxResource&lt;/strong&gt; APIs are designed for promises and observables, simplifying asynchronous data handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Properties of &lt;code&gt;resource&lt;/code&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Tracks resource state (loading, success, or error).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value:&lt;/strong&gt; Contains data after loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error:&lt;/strong&gt; Handles errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example with &lt;code&gt;rxResource&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rxResource&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rxResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tools unify asynchronous data management, making workflows more intuitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Improved Routing
&lt;/h2&gt;

&lt;p&gt;Angular 19 integrates signals more deeply with the router, enabling more reactive and streamlined navigation flows. This simplifies handling route and query parameters reactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Using Signals with Router&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-signal-route&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;h2&amp;gt;Signal Route&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;Route ID: {{ routeSignal() }}&amp;lt;/p&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RouteDemoComponent&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ActivatedRoute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;routeSignal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paramMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;routeSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus: Angular Material Enhancements
&lt;/h2&gt;

&lt;p&gt;Angular Material introduces new style improvements, accessibility features, and enhanced component interactions. For example, components like &lt;code&gt;mat-menu&lt;/code&gt; and &lt;code&gt;mat-select&lt;/code&gt; are now more intuitive and user-friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Improved &lt;code&gt;mat-menu&lt;/code&gt; Usage&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;mat-button&lt;/span&gt; &lt;span class="na"&gt;[matMenuTriggerFor]=&lt;/span&gt;&lt;span class="s"&gt;"menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Menu&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;mat-menu&lt;/span&gt; &lt;span class="na"&gt;#menu&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="na"&gt;matMenu&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;mat-menu-item&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Item 1&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;mat-menu-item&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Item 2&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;mat-menu-item&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Item 3&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/mat-menu&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Angular 19 marks a significant step in the evolution of the framework. From default standalone components to improved reactivity with signals and SSR optimizations, this version provides tools to build faster, more reactive, and maintainable applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to upgrade?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng update @angular/core @angular/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;more info about update here:&lt;a href="https://angular.dev/update-guide/?v=18.0-19.0&amp;amp;l=1" rel="noopener noreferrer"&gt;https://angular.dev/update-guide/?v=18.0-19.0&amp;amp;l=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share your experience&lt;/strong&gt; with these new features and keep exploring the future of Angular development! 🚀, Stay tuned for upcoming articles deep down about Material, Signals and of course Hydration&lt;/p&gt;

&lt;p&gt;¡Thanks to &lt;a class="mentioned-user" href="https://dev.to/damiansire"&gt;@damiansire&lt;/a&gt; for being the editor and approving this post!&lt;/p&gt;

</description>
      <category>news</category>
      <category>angular</category>
      <category>angular19</category>
      <category>webdev</category>
    </item>
    <item>
      <title>12 HTML Tricks You Probably Don't Know About</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Mon, 09 Sep 2024 22:48:22 +0000</pubDate>
      <link>https://forem.com/turingsoracle/12-html-tricks-you-probably-dont-know-about-584i</link>
      <guid>https://forem.com/turingsoracle/12-html-tricks-you-probably-dont-know-about-584i</guid>
      <description>&lt;p&gt;HTML is the backbone of the web, but it's far more than just a set of basic tags and attributes. There are tons of hidden features in HTML that can make your websites more interactive, accessible, and efficient. Ready to level up your HTML skills? Let's dive into these cool tricks!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;contenteditable&lt;/code&gt; - Make Elements Editable
&lt;/h3&gt;

&lt;p&gt;Did you know you can make any HTML element directly editable by the user? The &lt;code&gt;contenteditable&lt;/code&gt; attribute allows you to do just that. Whether you're building a CMS, an interactive blog, or a live text editor, this attribute can save you loads of time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;contenteditable=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 You can edit this text. Give it a try!
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Enhance user engagement by allowing them to edit content directly on the page. No need for complex JavaScript!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Custom Data Attributes - Store Extra Info on Elements
&lt;/h3&gt;

&lt;p&gt;If you've ever needed a way to store custom data within an HTML element, custom data attributes are for you. These attributes, prefixed with &lt;code&gt;data-&lt;/code&gt;, let you add extra information that you can access via JavaScript, without cluttering your DOM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"user-profile"&lt;/span&gt; &lt;span class="na"&gt;data-user-id=&lt;/span&gt;&lt;span class="s"&gt;"42"&lt;/span&gt; &lt;span class="na"&gt;data-role=&lt;/span&gt;&lt;span class="s"&gt;"admin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;! &lt;/span&gt;&lt;span class="na"&gt;-&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;User&lt;/span&gt; &lt;span class="na"&gt;details&lt;/span&gt; &lt;span class="na"&gt;go&lt;/span&gt; &lt;span class="na"&gt;here&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt;
&lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="na"&gt;div&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Perfect for dynamic applications that rely on metadata. Plus, it keeps your code clean!&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The &lt;code&gt;hidden&lt;/code&gt; Attribute - Hide Elements Without CSS
&lt;/h3&gt;

&lt;p&gt;Forget using &lt;code&gt;display: none;&lt;/code&gt; in your stylesheets. The &lt;code&gt;hidden&lt;/code&gt; attribute is a more semantic way to hide elements. It's easy to use and helps keep your HTML tidy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This paragraph is visible.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;hidden&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This paragraph is hidden.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Use it with JavaScript to show or hide elements dynamically without worrying about styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt; - Better Form Accessibility
&lt;/h3&gt;

&lt;p&gt;Forms can get messy, especially if they have many inputs. Enter &lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt;. These tags help you group related controls together, providing a clear, accessible structure for all users, including those using screen readers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fieldset&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;legend&amp;gt;&lt;/span&gt;Personal Information&lt;span class="nt"&gt;&amp;lt;/legend&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"firstname"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;First Name:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"firstname"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"firstname"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/fieldset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; It's all about improving user experience. Structured forms are easier to navigate and understand!&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;download&lt;/code&gt; Attribute - Simplify File Downloads
&lt;/h3&gt;

&lt;p&gt;Want to offer a file download on your site? The &lt;code&gt;download&lt;/code&gt; attribute on an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag lets you do this seamlessly. You can even specify the filename that the file should be saved as.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"path/to/file.pdf"&lt;/span&gt; &lt;span class="na"&gt;download=&lt;/span&gt;&lt;span class="s"&gt;"myfile.pdf"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Download the PDF&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Makes downloading files straightforward for your users. No need for extra server-side configurations!&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;code&gt;spellcheck&lt;/code&gt; - Enable Spell Checking in Text Inputs
&lt;/h3&gt;

&lt;p&gt;Ever wanted to add spell-checking to your text inputs or textareas? The &lt;code&gt;spellcheck&lt;/code&gt; attribute lets you turn on the browser's built-in spell checker. This can be super useful for enhancing user experience by reducing typos and mistakes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;spellcheck=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This textarea will be spell-checked!&lt;span class="nt"&gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Make sure users always have a great experience by helping them avoid embarrassing typos.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;code&gt;inputmode&lt;/code&gt; - Improve Mobile Input
&lt;/h3&gt;

&lt;p&gt;Tailor the virtual keyboard for users on mobile devices using the &lt;code&gt;inputmode&lt;/code&gt; attribute. This attribute specifies what kind of input is expected, triggering a keyboard that's optimized for the type of data to be entered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;inputmode=&lt;/span&gt;&lt;span class="s"&gt;"numeric"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your phone number"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Providing the right keyboard helps users enter data quickly and correctly. Great for mobile-friendly sites!&lt;/p&gt;

&lt;h3&gt;
  
  
  8. &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; - Create Native Expandable Content
&lt;/h3&gt;

&lt;p&gt;Need to create expandable content without relying on JavaScript? The &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; elements offer a simple, built-in solution for collapsible sections. Perfect for FAQs, menus, or any other content that benefits from being hidden until needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;details&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;What is HTML?&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;HTML stands for HyperText Markup Language. It's the foundation of the web!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/details&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; This is a lightweight, accessible way to toggle content visibility without using JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. &lt;code&gt;draggable&lt;/code&gt; -Add Drag-and-Drop Functionality
&lt;/h3&gt;

&lt;p&gt;Want to add drag-and-drop functionality to your site? The user is able to drag elements with the "draggable" attribute. It's an easy way to introduce interactivity without needing external libraries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Draggable Image"&lt;/span&gt; &lt;span class="na"&gt;draggable=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Combine &lt;code&gt;draggable&lt;/code&gt; with JavaScript events to create custom drag-and-drop experiences!&lt;/p&gt;

&lt;h3&gt;
  
  
  10. &lt;code&gt;type="date"&lt;/code&gt; - Simplify Date Input
&lt;/h3&gt;

&lt;p&gt;Instead of using text fields and JavaScript to manage dates, try using &lt;code&gt;&amp;lt;input type="date"&amp;gt;&lt;/code&gt;. This will bring up a native date picker in most modern browsers, making it easier for users to enter dates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"birthday"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Provides a consistent, easy-to-use interface for date input, no additional JavaScript required.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; - Optimize Images for Different Devices
&lt;/h3&gt;

&lt;p&gt;If you want to make your website faster and more responsive, use the &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; attributes on &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags. These attributes allow the browser to choose the most appropriate image based on the device's screen size and resolution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image-small.jpg"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image-medium.jpg 768w, image-large.jpg 1200w"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"(max-width: 768px) 100vw, (min-width: 769px) 50vw"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Responsive Image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; Serve the right image for the right screen, reducing load times and improving the user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. &lt;code&gt;placeholder&lt;/code&gt; - Enhance Form Inputs with Hints
&lt;/h3&gt;

&lt;p&gt;Need to provide a hint or example for your form inputs? Use the &lt;code&gt;placeholder&lt;/code&gt; attribute to display a short hint inside an input field before the user enters a value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"you@example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; It helps users understand what input is expected without cluttering your form with extra text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Takeaway
&lt;/h3&gt;

&lt;p&gt;These HTML tricks show that there’s a lot more to HTML than meets the eye. Don’t just settle for the basics—explore and experiment with these features to build more dynamic, accessible, and user-friendly web pages. Dive in and start experimenting to discover all the cool things HTML can do!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>html</category>
      <category>coding</category>
    </item>
    <item>
      <title>AlphaFold: Towards Infinite Possibilities and the Next Step in Human Evolution</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 29 Aug 2024 04:09:35 +0000</pubDate>
      <link>https://forem.com/turingsoracle/alphafold-towards-infinite-possibilities-and-the-next-step-in-human-evolution-4895</link>
      <guid>https://forem.com/turingsoracle/alphafold-towards-infinite-possibilities-and-the-next-step-in-human-evolution-4895</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;From creating single-use plastics to developing new treatments and one day uncovering humanity's greatest mystery: "&lt;strong&gt;How life works.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What is the problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The main problem in molecular biology is the difficulty of determining the three-dimensional structure of proteins, which are essential for understanding how life works. There are around 200 million known proteins, but only a small fraction of them have their exact shape determined. Each protein folds into a unique 3D structure that defines its biological function. This folding depends on the specific sequence of 20 types of amino acids.&lt;/p&gt;

&lt;p&gt;Traditionally, discovering the exact structure of a protein has required expensive and slow methods such as X-ray crystallography, nuclear magnetic resonance (NMR) spectroscopy, and cryo-electron microscopy. These processes can take many years and cost hundreds of thousands of dollars, limiting scientists to study only a small fraction of proteins. This limitation significantly delays the research and development of new medicines to cure diseases.&lt;/p&gt;

&lt;p&gt;In 1969, Cyrus Levinthal highlighted the complexity of this problem, stating that it would take more time than the age of the known universe to list all the possible configurations of a typical protein by brute force calculation. Levinthal estimated (10^{300}) possible conformations for a typical protein, demonstrating the extreme difficulty of predicting its structure. However, in nature, proteins fold spontaneously, sometimes in milliseconds, a phenomenon known as &lt;em&gt;Levinthal's paradox&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is AlphaFold?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AlphaFold was developed in response to the challenge known as the "Protein Folding Problem" in the CASP (Critical Assessment of Protein Structure Prediction) competition, held every two years. In this competition, teams receive a selection of amino acid sequences for proteins whose exact 3D structure has been mapped but not made public. The teams must submit their best predictions to see how close they are to the structures revealed later.&lt;/p&gt;

&lt;p&gt;In 2018, AlphaFold ranked first in CASP13. In 2020, AlphaFold 2 achieved such a high level of accuracy in CASP14 that the scientific community considered the protein folding problem solved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does AlphaFold do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By using graph connections to understand the relationship between amino acids, AlphaFold accurately predicts a protein's structure from its amino acid sequence. This is achieved by leveraging the sequences and structures of hundreds of thousands of already known proteins, segmented by scientists worldwide. This revolutionary capability allows researchers to tackle the protein-folding problem much more efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applications and functionalities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AlphaFold 3 is transforming how we understand and approach biological problems. If you could unravel a protein, you would see that it is like a string of beads made of a sequence of different chemical substances known as amino acids. These sequences are assembled according to the genetic instructions of an organism's DNA.&lt;/p&gt;

&lt;p&gt;Traditional experimental methods, such as nuclear magnetic resonance and X-ray crystallography, though effective, require years of hard work and specialized multimillion-dollar equipment. AlphaFold 3, however, offers a revolutionary alternative by predicting the structure of proteins solely from their amino acid sequence. This capability opens up new possibilities in diverse areas, from new medicine research to developing advanced materials and improving agricultural crops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it important for advancing health sciences?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AlphaFold 3 is a game-changer for health sciences because it allows researchers to understand the structures and functions of proteins at a level of detail previously unattainable. This understanding is critical for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drug discovery&lt;/strong&gt;: By accurately predicting protein structures, AlphaFold 3 can significantly accelerate the drug discovery process. Pharmaceutical researchers can design more effective drugs by targeting specific proteins involved in diseases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disease research&lt;/strong&gt;: Understanding how proteins fold and interact can lead to advances in understanding complex diseases, including those involving misfolded proteins, such as Alzheimer's and Parkinson's.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Biological processes&lt;/strong&gt;: AlphaFold 3 helps scientists explore and visualize the intricate interactions between proteins and other molecules, shedding light on fundamental biological processes and leading to new therapeutic strategies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global health and food security&lt;/strong&gt;: The tool's ability to predict protein structures can also be applied to areas such as agriculture and environmental science, helping to develop more resilient crops and sustainable resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations and responsibilities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Despite its immense potential, AlphaFold 3 also has limitations. Although its accuracy is remarkable, it is not infallible, and its use must be complemented with other methods and a responsible approach. Developers and scientists are working to ensure that this powerful tool is used ethically, aiming to benefit the entire global community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to get started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For those interested in exploring AlphaFold 3, it is recommended to start with the resources available in the AlphaFold Protein Structure Database, where millions of predicted protein structures can be accessed. This is an excellent starting point for researchers, students, and anyone interested in molecular biology and medicine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Democratizing science&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most significant aspects of AlphaFold 3 is its accessibility. The AlphaFold Protein Structure Database is available for free, allowing scientists worldwide to access millions of predicted protein structures. This democratization of science accelerates research and innovation, enabling discoveries that could have global health implications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world applications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AlphaFold 3 is already being used in real-world scenarios, such as predicting the structure of previously uncharacterized proteins, helping develop new materials, and even in agricultural research. The tool's versatility means it has the potential to impact a wide range of fields beyond health sciences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AlphaFold 3 represents a significant advancement in our ability to understand and manipulate protein structures, with the potential to revolutionize medicine, biology, and many other disciplines. By tackling one of the biggest challenges in modern biology, AlphaFold 3 brings us closer to a healthier future filled with new scientific possibilities.&lt;/p&gt;

</description>
      <category>alphafold</category>
      <category>deepmind</category>
      <category>google</category>
      <category>biology</category>
    </item>
    <item>
      <title>Warp: Redefining Productivity with AI Right In Your Terminal</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Mon, 26 Aug 2024 04:47:43 +0000</pubDate>
      <link>https://forem.com/turingsoracle/warp-the-terminal-redefining-productivity-with-ai-4306</link>
      <guid>https://forem.com/turingsoracle/warp-the-terminal-redefining-productivity-with-ai-4306</guid>
      <description>&lt;p&gt;Artificial intelligence is no longer a thing of the future. It has become crucial in software development, transforming how we work, from coding to managing systems. In this context, Warp is a tool that meets the current needs of developers and anticipates future requirements by using AI to enhance every interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Warp?
&lt;/h2&gt;

&lt;p&gt;Warp is a terminal for Mac and Linux (soon available on Windows) characterized by its simple design and strong AI integration. But what makes it unique? The key lies in how Warp changes the way we use the terminal. Not only does it allow for customization, but it also simplifies executing commands with an Agent Mode that understands plain language questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI in the Terminal: A Paradigm Shift
&lt;/h2&gt;

&lt;p&gt;Warp's significant innovation is its ability to suggest commands and solve problems directly from the terminal. Imagine you don't remember how to show hidden files in a folder. Instead of searching on Google, you just type in English: "How can I see all hidden files in a folder?" and Warp will recommend the correct command (&lt;code&gt;ls -a&lt;/code&gt;). This way of working not only saves time but also avoids having to memorize difficult commands, allowing developers to focus on what's essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Mode: Your Virtual Assistant in the Terminal
&lt;/h2&gt;

&lt;p&gt;Warp's Agent Mode enhances work efficiency. Like GitHub Copilot for code, Warp's Agent Mode assists in the terminal by suggesting commands and solving problems on the spot.&lt;/p&gt;

&lt;p&gt;For example, if you need to perform a rebase or squash branches in Git, just consult the agent mode. Within seconds, you'll have the correct command ready to use without having to remember or search for the exact process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison: Warp vs. Other AI Tools
&lt;/h2&gt;

&lt;p&gt;To better understand Warp's position in the current landscape, it's useful to compare it with other popular tools that also use artificial intelligence, such as Ollama, Fabric, Shell Automation, AIChat, YAI, Aider, gen.nvim, and gp.nvim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. Ollama
&lt;/h3&gt;

&lt;p&gt;Ollama: Is a program that allows you to talk to AI models like GPT through simple commands. It provides AI-generated responses, focusing more on interacting with models than improving commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is perfect for developers needing a terminal with integrated AI, while Ollama is better suited for those looking for a command-line interface specialized in working with language models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. Fabric
&lt;/h3&gt;

&lt;p&gt;Fabric: A tool for automation and remote administration that allows running commands and scripts on servers via SSH. It's more oriented towards automating repetitive tasks across multiple servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is better for improving the individual terminal experience, while Fabric is more useful for automating and remotely managing servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. Shell Automation
&lt;/h3&gt;

&lt;p&gt;Shell Automation: A collection of scripts and utilities that add AI capabilities to the existing terminal, focusing on personalization and expanding specific functionalities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is ideal for those looking for an all-in-one solution, while Shell Automation is better for users who want to customize and extend their existing environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. AIChat
&lt;/h3&gt;

&lt;p&gt;AIChat: Is essentially a chat interface that allows you to have conversations and ask questions to AI directly from the command line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is perfect for enhancing the terminal with AI, while AIChat is more appropriate for those who want to interact conversationally with AI models in the terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. YAI
&lt;/h3&gt;

&lt;p&gt;YAI: A terminal tool that allows you to communicate with language models like GPT, focusing on asking questions and receiving AI-based responses directly in the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is very useful for making the terminal easier to use with direct command assistance, while YAI is better suited for communicating with language models in the terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. Aider
&lt;/h3&gt;

&lt;p&gt;Aider: A tool that helps programmers with their code. This AI tool interacts with code repositories to assist in tasks like writing, editing, and improving code based on what the developer needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is perfect for those who want to improve their terminal usage, while Aider is more useful for programmers needing help with coding and repository management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. gen.nvim
&lt;/h3&gt;

&lt;p&gt;gen.nvim: A tool for Neovim that uses AI to help create and modify code directly in the editor. This makes programming easier and provides assistance while writing code in real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp enhances the terminal, and gen.nvim facilitates coding in Neovim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warp vs. gp.nvim
&lt;/h3&gt;

&lt;p&gt;gp.nvim: An extension for Neovim that uses language models like GPT to help create and edit code within the editor, making programming easier and more efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Warp is perfect for making the terminal more efficient, while gp.nvim is designed to assist in writing code in Neovim using AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and Considerations
&lt;/h2&gt;

&lt;p&gt;Despite Warp's usefulness, it also has some restrictions. For example, it might not always have the latest information, leading to outdated instructions. Additionally, Warp is not yet ready for use on Windows, which could be an issue for those who prefer this operating system.&lt;/p&gt;

&lt;p&gt;However, these aspects do not diminish the possibilities that Warp offers. Incorporating AI into the terminal is a significant step forward in automating and continuously improving daily activities in software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Warp is not just an ordinary terminal; it's a tool that changes how development is done, as "all" the answers are in one window, minimizing distractions. Along with a user-friendly design and advanced features like Agent Mode, it becomes an essential tool for any programmer looking to improve their workflow.&lt;/p&gt;

&lt;p&gt;Whether you're managing a file storage location, troubleshooting remote connections, or simply trying to remember a forgotten command, Warp is available to help, providing a unique user experience in the world of computing.&lt;/p&gt;

&lt;p&gt;If you haven't tried it yet, now is the time. Warp can be used on macOS and Linux computers and will soon be available for Windows. Don't fall behind—find out how this tool can change your daily life as a programmer. Use my referral code to get a theme for further customizing your terminal: &lt;br&gt;
&lt;a href="https://app.warp.dev/referral/RVWG95" rel="noopener noreferrer"&gt;Here&lt;/a&gt; &lt;/p&gt;

</description>
      <category>terminal</category>
      <category>development</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
