Tuesday, March 3, 2026

Building a Web Scraping RAG Pipeline in .NET Using GitHub Models

Retrieval‑Augmented Generation (RAG) has quickly become one of the most practical ways to build AI systems that work with real‑world data instead of relying only on a model’s training knowledge.

Most RAG examples today are written in Python and often depend on frameworks like LangChain. While powerful, this leaves a gap for developers working primarily in .NET and C#.

In this post, I’ll walk through a .NET Console application I built that implements a complete RAG pipeline using GitHub Models for embeddings and chat completion.

What This Project Does?

At a high level, this application allows you to:

  1. Provide a website URL
  2. Automatically scrape and clean the page content
  3. Convert the content into embeddings
  4. Store embeddings in an in‑memory vector store
  5. Ask questions about the website
  6. Get accurate, context‑aware answers generated by an AI model

All of this runs inside a .NET Console App, making it easy to debug, extend, and later expose as an API.

Monday, December 16, 2024

Content Projection in Angular

Content Projection in Angular

In Angular, content projection is a powerful technique that allows developers to pass content from a parent component into a child component, and display it in a specific location within the child component's template. This mechanism enables component reusability and flexibility, making it an essential concept for building modular applications.

This blog post delves into the concept of content projection, its types, and provides an example to help you understand how to implement it effectively.

What is Content Projection?

Content projection allows you to project or "transclude" external content into a component’s template. It uses the <ng-content> directive, which acts as a placeholder in the child component’s template where the content provided by the parent component will be inserted.

Monday, December 9, 2024

Angular(DI) Resolution Modifiers

Angular(DI) Resolution Modifiers

In Angular, one of its core strengths lies in its Dependency Injection (DI) system, which ensures that components and services can seamlessly interact. A key feature of this DI system is the use of Resolution Modifiers. In this blog post, we'll explore what Resolution Modifiers are, how they work, and their practical applications in Angular.

What Are Resolution Modifiers?

Resolution Modifiers in Angular provide specific instructions to the dependency injection system on how to resolve a dependency. They are used to modify the default behavior of Angular's DI system, allowing developers to handle more complex scenarios effectively.

Angular provides four main resolution modifiers:

  1. @Optional
  2. @Self
  3. @SkipSelf
  4. @Host

Monday, December 2, 2024

Angular Preloading Strategy : Enhancing User Experience and Performance

Angular Preloading Strategy

Angular offers several features to enhance performance and improve the user experience. One of these features is preloading, a mechanism to load modules in the background after the application has been bootstrapped.At the heart of this feature is the PreloadStrategy, a powerful tool for optimizing Angular applications.

In this blog post, we’ll explore what PreloadStrategy is, its significance, how it works, and how to customize it to suit your needs.

What is PreloadStrategy?

In Angular applications, lazy loading is commonly used to load modules only when needed, reducing the initial bundle size and improving load time. However, lazy loading might cause a delay when users navigate to a route whose module hasn’t been loaded yet. Preloading bridges this gap by loading lazy-loaded modules in the background after the application is initialized.

PreloadStrategy is an Angular interface that defines the strategy for preloading these modules. By default, Angular provides two built-in strategies:

  1. NoPreloading: Disables preloading entirely.
  2. PreloadAllModules: Preloads all lazy-loaded modules as soon as possible.

Friday, November 29, 2024

Understanding Resolvers in Angular

Resolvers in Angular

When building Angular applications, one of the common requirements is to fetch data before navigating to a route. For instance, consider a scenario where you want to display a user's details on a profile page. Instead of loading the route and showing a spinner while fetching data, wouldn't it be better to resolve the data before entering the route? This is where Angular Resolvers shine.

In this post, we'll explore what resolvers are, why they're essential, and how to use them effectively in your Angular applications

What is a Resolver in Angular?

A Resolver in Angular is a service that retrieves data before a route is activated. It ensures that your component is rendered with the required data already available, improving user experience by reducing the time spent waiting for asynchronous calls after the view is loaded.

Resolvers are part of Angular's Route Guards, which include CanActivate, CanDeactivate, CanLoad, and others. While these guards determine route activation, Resolvers focus specifically on fetching data.

Why Use Resolvers?

  1. Optimized User Experience: By fetching data before rendering, you avoid rendering incomplete views with loading indicators.
^ Scroll to Top