
Every Angular app rewrites the same data-fetching layer: fetch lists, track loading states, handle errors, invalidate caches, mutate with optimistic updates. The code isn't hard—it's just identical every time.
@void-snippets/angular extracts that boilerplate once, built ground-up for Angular 19+ and Signals. No async pipes. No subscription management. Just inject() and reactive Signals that automatically respond to your data.
The Problem We're Solving
Building a contacts CRUD feature typically looks like:
// The old way — lots of manual state
export class ContactsComponent {
private apiService = inject(ContactsApiService);
private queryClient = inject(QueryClient);
contacts


