{
  "id": 576694,
  "title": "I built a Signals-first toolkit for Angular. Here is the problem I could not stop hitting.",
  "url": "https://urgent.news/2026/08/11/i-built-a-signals-first-toolkit-for-angular-here-is-the-problem-i",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-11T15:06:59.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/romain_geffrault_10d88369/i-built-a-signals-first-toolkit-for-angular-here-is-the-problem-i-could-not-stop-hitting-3e3o"
  },
  "original_language": "en",
  "account": "I built a toolkit called craft-ng to address the challenges in managing application state in Angular. The problem I encountered was that each application handled state differently, leading to inconsistencies, bugs, and difficulty in testing. This article focuses on the specific issue I couldn't resolve and the solution I developed.\n\nIn Angular applications, there are three kinds of state: URL state, client state, and server state. Each of these is handled differently, using ActivatedRoute, Signals or a store, and services with Observables, plus loading and error indicators. While these methods are not inherently wrong, the glue between them is often written manually, leading to bugs in the glue.\n\nThe specific challenge I faced was managing the interaction between these different states, especially when dealing with HTTP calls, error handling, and state persistence. I reviewed many codebases and found that a helper library, while helpful, was not a comprehensive solution.\n\nThe toolkit, craft-ng, aims to simplify the management of application state by providing a reactive, declarative approach. It addresses issues like race conditions, untyped errors, synchronization between signals and URL queries, and decoupling state updates. With craft-ng, developers can define their state, including the server responses, URL queries, and service interactions, in a more cohesive and testable manner.\n\nUsing craft-ng, the example service provided earlier can be rewritten to handle state more effectively. The service now includes URL-based queries, scoped state, and a clear separation of concerns. This approach simplifies testing, improves error handling, and ensures that the state is managed declaratively.",
  "summary": "Every Angular application I have worked on in the last few years had the same three kinds of state: URL state — the page number, the active filter, the selected tab. Client state — what the user typed, what is expanded, what is selected. Server state — the thing you fetched, and everything that can go wrong while fetching it. And every application handled them three completely different ways.…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}