diff --git a/README.md b/README.md
index 8a971e4..1d7c198 100644
--- a/README.md
+++ b/README.md
@@ -50,6 +50,11 @@ If you would like to propose a challenge, this project is open source, so feel f
+
+
+
+
+
@@ -96,7 +101,7 @@ If you would like to propose a challenge, this project is open source, so feel f
+
+> Author: Thomas Laforge
+
+### Information
+
+In this series of challenges, you will learn how to optimize and enhance the performance of your Angular Application.
+
+The first step is to download the [Angular DevTools Chrome extention](https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh) if you haven't already done so. This extension allows you to profile your application and detect performance issues.
+
+In this challenge, we will explore the differences and impacts of using `ChangeDetectionStrategy.Default` versus `ChangeDetectionStrategy.OnPush`. To provide a clearer demonstration, I have added counters to each component and each row in our application. However, in real-world scenarios, you may not have such counters. This is where the Angular DevTool profiler comes to the rescue.
+
+Start by serving this application by running: `npx nx serve performance-default-onpush` inside your terminal. Then open Chrome DevTool by pressing **F12** and switch to the Angular Tab. From there you can select the Profiler tab as shown below.
+
+
+
+Start profiling your application and type some letters inside the input field. You will notice that each number is increasing and the profiler will show you a lot of change detection cycle.
+
+If you click on one of the bars (indicated by the yellow arrow on the picture below), you can see that `PersonListComponent`, `RandomComponent` and all the `MatListItem` are impacted by the change detection cycle, even when we only interact with the input field.
+
+
+
+### Statement
+
+The goal of this challenge is to improve the clustering of change detection within the application.
+
+### Hints:
+
+
+ Hint 1
+
+Use `ChangeDetectionStrategy.OnPush` but this will not be enough.
+
+
+
+
+ Hint 2
+
+Create smaller components to better separate the input field from the list.
+
+
+
+### Submitting your work
+
+1. Fork the project
+2. clone it
+3. npm ci
+4. `npx nx serve performance-default-onpush`
+5. _...work on it_
+6. Commit your work
+7. Submit a PR with a title beginning with **Answer:34** that I will review and other dev can review.
+
+
+
+
+
+
+_You can ask any question on_
diff --git a/apps/performance/default-onpush/img/profiler-record.png b/apps/performance/default-onpush/img/profiler-record.png
new file mode 100644
index 0000000..febcbd2
Binary files /dev/null and b/apps/performance/default-onpush/img/profiler-record.png differ
diff --git a/apps/performance/default-onpush/img/profiler-tab.png b/apps/performance/default-onpush/img/profiler-tab.png
new file mode 100644
index 0000000..a6d228d
Binary files /dev/null and b/apps/performance/default-onpush/img/profiler-tab.png differ
diff --git a/apps/performance/default-onpush/project.json b/apps/performance/default-onpush/project.json
new file mode 100644
index 0000000..571c029
--- /dev/null
+++ b/apps/performance/default-onpush/project.json
@@ -0,0 +1,84 @@
+{
+ "name": "performance-default-onpush",
+ "$schema": "../../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "application",
+ "prefix": "app",
+ "sourceRoot": "apps/performance/default-onpush/src",
+ "tags": [],
+ "targets": {
+ "build": {
+ "executor": "@angular-devkit/build-angular:browser",
+ "outputs": ["{options.outputPath}"],
+ "options": {
+ "outputPath": "dist/apps/performance/default-onpush",
+ "index": "apps/performance/default-onpush/src/index.html",
+ "main": "apps/performance/default-onpush/src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "apps/performance/default-onpush/tsconfig.app.json",
+ "assets": [
+ "apps/performance/default-onpush/src/favicon.ico",
+ "apps/performance/default-onpush/src/assets"
+ ],
+ "styles": [
+ "apps/performance/default-onpush/src/styles.scss",
+ "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css"
+ ],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "500kb",
+ "maximumError": "1mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "namedChunks": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "executor": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "browserTarget": "performance-default-onpush:build:production"
+ },
+ "development": {
+ "browserTarget": "performance-default-onpush:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "extract-i18n": {
+ "executor": "@angular-devkit/build-angular:extract-i18n",
+ "options": {
+ "browserTarget": "performance-default-onpush:build"
+ }
+ },
+ "lint": {
+ "executor": "@nx/linter:eslint",
+ "outputs": ["{options.outputFile}"],
+ "options": {
+ "lintFilePatterns": [
+ "apps/performance/default-onpush/**/*.ts",
+ "apps/performance/default-onpush/**/*.html"
+ ]
+ }
+ }
+ }
+}
diff --git a/apps/performance/default-onpush/src/app/app.component.ts b/apps/performance/default-onpush/src/app/app.component.ts
new file mode 100644
index 0000000..ac19efc
--- /dev/null
+++ b/apps/performance/default-onpush/src/app/app.component.ts
@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { PersonListComponent } from './person-list.component';
+import { Persons } from './persons';
+import { RandomComponent } from './random.component';
+
+@Component({
+ standalone: true,
+ imports: [PersonListComponent, RandomComponent],
+ selector: 'app-root',
+ template: `
+
+
+
+
+
+
+ `,
+})
+export class AppComponent {
+ personList = [...Persons];
+ person2List = [...Persons];
+}
diff --git a/apps/performance/default-onpush/src/app/app.config.ts b/apps/performance/default-onpush/src/app/app.config.ts
new file mode 100644
index 0000000..59198e6
--- /dev/null
+++ b/apps/performance/default-onpush/src/app/app.config.ts
@@ -0,0 +1,6 @@
+import { ApplicationConfig } from '@angular/core';
+import { provideAnimations } from '@angular/platform-browser/animations';
+
+export const appConfig: ApplicationConfig = {
+ providers: [provideAnimations()],
+};
diff --git a/apps/performance/default-onpush/src/app/person-list.component.ts b/apps/performance/default-onpush/src/app/person-list.component.ts
new file mode 100644
index 0000000..1e5d8a6
--- /dev/null
+++ b/apps/performance/default-onpush/src/app/person-list.component.ts
@@ -0,0 +1,72 @@
+import { Component, Input } from '@angular/core';
+
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { MatChipsModule } from '@angular/material/chips';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { MatListModule } from '@angular/material/list';
+import { Person } from './person';
+
+@Component({
+ selector: 'app-person-list',
+ standalone: true,
+ imports: [
+ CommonModule,
+ FormsModule,
+ MatListModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatChipsModule,
+ ],
+ template: `
+