diff --git a/garage-workspace/garage/.editorconfig b/garage-workspace/garage/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..f166060da1cbc9f216e9f5e99a1ef6074ce2a8f8
--- /dev/null
+++ b/garage-workspace/garage/.editorconfig
@@ -0,0 +1,17 @@
+# Editor configuration, see https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ts]
+quote_type = single
+ij_typescript_use_double_quotes = false
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/garage-workspace/garage/.editorconfig:Zone.Identifier b/garage-workspace/garage/.editorconfig:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/.gitignore b/garage-workspace/garage/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..cc7b141350ffde43afce3ec16ea4d7b5007cde2b
--- /dev/null
+++ b/garage-workspace/garage/.gitignore
@@ -0,0 +1,42 @@
+# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
+
+# Compiled output
+/dist
+/tmp
+/out-tsc
+/bazel-out
+
+# Node
+/node_modules
+npm-debug.log
+yarn-error.log
+
+# IDEs and editors
+.idea/
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# Visual Studio Code
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# Miscellaneous
+/.angular/cache
+.sass-cache/
+/connect.lock
+/coverage
+/libpeerconnection.log
+testem.log
+/typings
+
+# System files
+.DS_Store
+Thumbs.db
diff --git a/garage-workspace/garage/.gitignore:Zone.Identifier b/garage-workspace/garage/.gitignore:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/.nvmrc b/garage-workspace/garage/.nvmrc
new file mode 100644
index 0000000000000000000000000000000000000000..ee09fac75c8313bd5bfd3edfe0f8b90baefb782b
--- /dev/null
+++ b/garage-workspace/garage/.nvmrc
@@ -0,0 +1 @@
+v20.11.1
diff --git a/garage-workspace/garage/.nvmrc:Zone.Identifier b/garage-workspace/garage/.nvmrc:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/.postcssrc.json b/garage-workspace/garage/.postcssrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..e092dc7c1ef60daccbdd481b8be40b4937df0d25
--- /dev/null
+++ b/garage-workspace/garage/.postcssrc.json
@@ -0,0 +1,5 @@
+{
+  "plugins": {
+    "@tailwindcss/postcss": {}
+  }
+}
diff --git a/garage-workspace/garage/.postcssrc.json:Zone.Identifier b/garage-workspace/garage/.postcssrc.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/.prettierignore b/garage-workspace/garage/.prettierignore
new file mode 100644
index 0000000000000000000000000000000000000000..6bf7e4cec1e483c8777129135a755650fb3740db
--- /dev/null
+++ b/garage-workspace/garage/.prettierignore
@@ -0,0 +1,4 @@
+dist/
+node_modules/
+package-lock.json
+pnpm-lock.yaml
\ No newline at end of file
diff --git a/garage-workspace/garage/.prettierignore:Zone.Identifier b/garage-workspace/garage/.prettierignore:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/.prettierrc.json b/garage-workspace/garage/.prettierrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93
--- /dev/null
+++ b/garage-workspace/garage/.prettierrc.json
@@ -0,0 +1 @@
+{}
diff --git a/garage-workspace/garage/.prettierrc.json:Zone.Identifier b/garage-workspace/garage/.prettierrc.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/README.md b/garage-workspace/garage/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..19af0f71893595d6ea80b19efe6010076e2f6064
--- /dev/null
+++ b/garage-workspace/garage/README.md
@@ -0,0 +1,59 @@
+# Garage
+
+This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.1.4.
+
+## Development server
+
+To start a local development server, run:
+
+```bash
+ng serve
+```
+
+Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
+
+## Code scaffolding
+
+Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
+
+```bash
+ng generate component component-name
+```
+
+For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
+
+```bash
+ng generate --help
+```
+
+## Building
+
+To build the project run:
+
+```bash
+ng build
+```
+
+This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
+
+## Running unit tests
+
+To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
+
+```bash
+ng test
+```
+
+## Running end-to-end tests
+
+For end-to-end (e2e) testing, run:
+
+```bash
+ng e2e
+```
+
+Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
+
+## Additional Resources
+
+For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
diff --git a/garage-workspace/garage/README.md:Zone.Identifier b/garage-workspace/garage/README.md:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/angular.json b/garage-workspace/garage/angular.json
new file mode 100644
index 0000000000000000000000000000000000000000..0b120bbec4af78efbd1b87cbb3f249ddea9f81ff
--- /dev/null
+++ b/garage-workspace/garage/angular.json
@@ -0,0 +1,113 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "cli": {
+    "packageManager": "pnpm",
+    "schematicCollections": ["angular-eslint"]
+  },
+  "newProjectRoot": "projects",
+  "projects": {
+    "garage-ui": {
+      "projectType": "application",
+      "schematics": {
+        "@schematics/angular:component": {
+          "style": "scss"
+        }
+      },
+      "root": "projects/garage-ui",
+      "sourceRoot": "projects/garage-ui/src",
+      "prefix": "app",
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:application",
+          "options": {
+            "outputPath": "dist/garage-ui",
+            "index": "projects/garage-ui/src/index.html",
+            "browser": "projects/garage-ui/src/main.ts",
+            "polyfills": ["zone.js"],
+            "tsConfig": "projects/garage-ui/tsconfig.app.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "projects/garage-ui/public"
+              }
+            ],
+            "styles": ["projects/garage-ui/src/styles.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "500kB",
+                  "maximumError": "1MB"
+                },
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "4kB",
+                  "maximumError": "8kB"
+                }
+              ],
+              "outputHashing": "all"
+            },
+            "development": {
+              "optimization": false,
+              "extractLicenses": false,
+              "sourceMap": true,
+              "fileReplacements": [
+                {
+                  "replace": "projects/garage-ui/src/environments/environment.ts",
+                  "with": "projects/garage-ui/src/environments/environment.development.ts"
+                }
+              ]
+            }
+          },
+          "defaultConfiguration": "production"
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "configurations": {
+            "production": {
+              "buildTarget": "garage-ui:build:production"
+            },
+            "development": {
+              "buildTarget": "garage-ui:build:development"
+            }
+          },
+          "defaultConfiguration": "development"
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n"
+        },
+        "test": {
+          "builder": "@angular-devkit/build-angular:karma",
+          "options": {
+            "polyfills": ["zone.js", "zone.js/testing"],
+            "tsConfig": "projects/garage-ui/tsconfig.spec.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "projects/garage-ui/public"
+              }
+            ],
+            "styles": ["projects/garage-ui/src/styles.scss"],
+            "scripts": []
+          }
+        },
+        "lint": {
+          "builder": "@angular-eslint/builder:lint",
+          "options": {
+            "lintFilePatterns": [
+              "projects/garage-ui/**/*.ts",
+              "projects/garage-ui/**/*.html"
+            ],
+            "eslintConfig": "projects/garage-ui/eslint.config.js"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/garage-workspace/garage/angular.json:Zone.Identifier b/garage-workspace/garage/angular.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/eslint.config.js b/garage-workspace/garage/eslint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..8379fae3b476ed6d2a4edadc8aa7d78cb3b65270
--- /dev/null
+++ b/garage-workspace/garage/eslint.config.js
@@ -0,0 +1,43 @@
+// @ts-check
+const eslint = require("@eslint/js");
+const tseslint = require("typescript-eslint");
+const angular = require("angular-eslint");
+
+module.exports = tseslint.config(
+  {
+    files: ["**/*.ts"],
+    extends: [
+      eslint.configs.recommended,
+      ...tseslint.configs.recommended,
+      ...tseslint.configs.stylistic,
+      ...angular.configs.tsRecommended,
+    ],
+    processor: angular.processInlineTemplates,
+    rules: {
+      "@angular-eslint/directive-selector": [
+        "error",
+        {
+          type: "attribute",
+          prefix: "app",
+          style: "camelCase",
+        },
+      ],
+      "@angular-eslint/component-selector": [
+        "error",
+        {
+          type: "element",
+          prefix: "app",
+          style: "kebab-case",
+        },
+      ],
+    },
+  },
+  {
+    files: ["**/*.html"],
+    extends: [
+      ...angular.configs.templateRecommended,
+      ...angular.configs.templateAccessibility,
+    ],
+    rules: {},
+  },
+);
diff --git a/garage-workspace/garage/eslint.config.js:Zone.Identifier b/garage-workspace/garage/eslint.config.js:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/package.json b/garage-workspace/garage/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..52755a34e01019d2a39d316f3b59f7233b5df8e2
--- /dev/null
+++ b/garage-workspace/garage/package.json
@@ -0,0 +1,55 @@
+{
+  "name": "garage",
+  "version": "0.0.0",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng dev",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint && prettier --check .",
+    "format": "prettier --write ."
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.1.0",
+    "@angular/common": "^19.1.0",
+    "@angular/compiler": "^19.1.0",
+    "@angular/core": "^19.1.0",
+    "@angular/forms": "^19.1.0",
+    "@angular/platform-browser": "^19.1.0",
+    "@angular/platform-browser-dynamic": "^19.1.0",
+    "@angular/router": "^19.1.0",
+    "@fortawesome/angular-fontawesome": "1.0.0",
+    "@fortawesome/free-brands-svg-icons": "^6.7.1",
+    "@fortawesome/free-regular-svg-icons": "^6.7.1",
+    "@fortawesome/free-solid-svg-icons": "^6.7.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.1.4",
+    "@angular/cli": "^19.1.4",
+    "@angular/compiler-cli": "^19.1.0",
+    "@tailwindcss/postcss": "^4.0.0",
+    "@types/jasmine": "~5.1.0",
+    "angular-eslint": "19.0.2",
+    "daisyui": "5.0.0-beta.2",
+    "eslint": "^9.16.0",
+    "eslint-config-prettier": "^10.0.1",
+    "eslint-plugin-prettier": "^5.2.3",
+    "jasmine-core": "~5.5.0",
+    "karma": "~6.4.0",
+    "karma-chrome-launcher": "~3.2.0",
+    "karma-coverage": "~2.2.0",
+    "karma-jasmine": "~5.1.0",
+    "karma-jasmine-html-reporter": "~2.1.0",
+    "postcss": "^8.5.1",
+    "prettier": "^3.4.2",
+    "prettier-eslint": "^16.3.0",
+    "tailwindcss": "^4.0.0",
+    "typescript": "~5.7.2",
+    "typescript-eslint": "8.18.0"
+  }
+}
diff --git a/garage-workspace/garage/package.json:Zone.Identifier b/garage-workspace/garage/package.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/eslint.config.js b/garage-workspace/garage/projects/garage-ui/eslint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..3614e93288c8c05af0c799443e55e64fe4c77abd
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/eslint.config.js
@@ -0,0 +1,32 @@
+// @ts-check
+const tseslint = require("typescript-eslint");
+const rootConfig = require("../../eslint.config.js");
+
+module.exports = tseslint.config(
+  ...rootConfig,
+  {
+    files: ["**/*.ts"],
+    rules: {
+      "@angular-eslint/directive-selector": [
+        "error",
+        {
+          type: "attribute",
+          prefix: "app",
+          style: "camelCase",
+        },
+      ],
+      "@angular-eslint/component-selector": [
+        "error",
+        {
+          type: "element",
+          prefix: "app",
+          style: "kebab-case",
+        },
+      ],
+    },
+  },
+  {
+    files: ["**/*.html"],
+    rules: {},
+  },
+);
diff --git a/garage-workspace/garage/projects/garage-ui/eslint.config.js:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/eslint.config.js:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/public/favicon.ico b/garage-workspace/garage/projects/garage-ui/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6
Binary files /dev/null and b/garage-workspace/garage/projects/garage-ui/public/favicon.ico differ
diff --git a/garage-workspace/garage/projects/garage-ui/public/favicon.ico:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/public/favicon.ico:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6a3f56ccbc0fddf1d6db6652def585639e8cc883
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+import { RouterOutlet } from '@angular/router';
+
+@Component({
+  selector: 'app-root',
+  imports: [RouterOutlet],
+  template: `<router-outlet />`,
+  styleUrl: './app.component.scss',
+})
+export class AppComponent {}
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.component.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cad493aae75e2dea0acbf7251a75be0370449c10
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts
@@ -0,0 +1,29 @@
+import {
+  type ApplicationConfig,
+  provideZoneChangeDetection,
+} from '@angular/core';
+import { provideRouter } from '@angular/router';
+
+import { provideHttpClient } from '@angular/common/http';
+import { routes } from './app.routes';
+import { CarGateway } from '@core/cars/ports/car.gateway';
+import { InMemoryCarGateway } from '@core/cars/adapters/in-memory-car.gateway';
+
+export const appConfig: ApplicationConfig = {
+  providers: [
+    provideZoneChangeDetection({ eventCoalescing: true }),
+    provideRouter(routes),
+    provideHttpClient(),
+    {
+      provide: CarGateway,
+      useFactory: () =>
+        new InMemoryCarGateway().withCars(
+          [
+            { id: 1, brand: 'Audi', model: 'A3', year: 2019, color: 'red' },
+            { id: 2, brand: 'Audi', model: 'RS3', year: 2024, color: 'black' },
+            { id: 3, brand: 'Audi', model: 'Q2', year: 2016, color: 'yellow' },
+          ]
+        ),
+    },
+  ],
+};
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.config.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0ffb48756834d80904e345078fe427289ddef994
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts
@@ -0,0 +1,8 @@
+import type { Routes } from '@angular/router';
+import CarsComponent from "@features/cars/cars.component";
+
+export const routes: Routes = [
+  { path: '', redirectTo: 'car', pathMatch: 'full' },
+  { path: 'car', component: CarsComponent },
+  { path: '**', redirectTo: 'car', pathMatch: 'full' },
+];
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/app.routes.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6caf67f92a713066f81bb683d93f95f8845ca6a9
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts
@@ -0,0 +1,16 @@
+import { CarGateway } from '@core/cars/ports/car.gateway';
+import { Observable, of } from 'rxjs';
+import { Cars } from '@core/cars/models/car.model';
+
+export class InMemoryCarGateway extends CarGateway {
+  private cars: Cars = [];
+
+  withCars(cars: Cars): InMemoryCarGateway {
+    this.cars = cars;
+    return this;
+  }
+
+  getAll(): Observable<Cars> {
+    return of(this.cars);
+  }
+}
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/adapters/in-memory-car.gateway.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bbf61cb7e615988fa270b80525dd740b132c0e2f
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts
@@ -0,0 +1,9 @@
+export interface Car {
+  id: number;
+  brand: string;
+  model: string;
+  year: number;
+  color: string;
+}
+
+export type Cars = Car[];
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/models/car.model.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ef890e4a0fff0668f0ff3119348635ab00ab3cd8
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts
@@ -0,0 +1,6 @@
+import { Observable } from 'rxjs';
+import { Cars } from '@core/cars/models/car.model';
+
+export abstract class CarGateway {
+  abstract getAll(): Observable<Cars>;
+}
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/core/cars/ports/car.gateway.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..3287aeb05c34d890d03c49fd103d3df8ef358480
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html
@@ -0,0 +1,28 @@
+<div class="container mx-auto py-6">
+  <h1 class="text-4xl font-bold text-center mb-6">My cars</h1>
+
+  <div class="overflow-x-auto">
+    <table class="table table-zebra w-full">
+      <thead>
+      <tr>
+        <th>#</th>
+        <th>Brand</th>
+        <th>Model</th>
+        <th>Year</th>
+        <th>Color</th>
+        <th>Actions</th>
+      </tr>
+      </thead>
+    @for (car of cars(); track car.id) {
+      <tr>
+        <td>{{ car.id }}</td>
+        <td>{{ car.brand }}</td>
+        <td>{{ car.model }}</td>
+        <td>{{ car.year }}</td>
+        <td>{{ car.color }}</td>
+        <td>Modify | Delete</td>
+      </tr>
+    }
+    </table>
+  </div>
+</div>
\ No newline at end of file
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.html:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.scss:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ddc06943a60ef23f4b2fca29f55bee7b6834024d
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts
@@ -0,0 +1,15 @@
+import { Component, inject } from "@angular/core";
+import { CarGateway } from "@core/cars/ports/car.gateway";
+import { toSignal } from "@angular/core/rxjs-interop";
+import { AsyncPipe } from "@angular/common";
+
+@Component({
+  selector: 'app-cars',
+  imports: [],
+  templateUrl: './cars.component.html',
+  styleUrl: './cars.component.scss',
+})
+export default class CarsComponent {
+  private readonly carGateway = inject(CarGateway);
+  cars = toSignal(this.carGateway.getAll());
+}
diff --git a/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/app/features/cars/cars.component.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f274e5edf297c322280400000710ffbfd88f7711
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts
@@ -0,0 +1 @@
+export const environment = {};
diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/environments/environment.development.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f274e5edf297c322280400000710ffbfd88f7711
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts
@@ -0,0 +1 @@
+export const environment = {};
diff --git a/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/environments/environment.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/index.html b/garage-workspace/garage/projects/garage-ui/src/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..2163e364e5e6bdddd2b331e30d1233b340439e2b
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/index.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html data-theme="light" lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <title>GarageUi</title>
+    <base href="/" />
+    <meta content="width=device-width, initial-scale=1" name="viewport" />
+    <link href="favicon.ico" rel="icon" type="image/x-icon" />
+  </head>
+  <body>
+    <app-root></app-root>
+  </body>
+</html>
diff --git a/garage-workspace/garage/projects/garage-ui/src/index.html:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/index.html:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/main.ts b/garage-workspace/garage/projects/garage-ui/src/main.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f3a7223da6dfe8bb71515d18071d24bf49ad89d9
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/main.ts
@@ -0,0 +1,7 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { AppComponent } from './app/app.component';
+import { appConfig } from './app/app.config';
+
+bootstrapApplication(AppComponent, appConfig).catch((err) =>
+  console.error(err),
+);
diff --git a/garage-workspace/garage/projects/garage-ui/src/main.ts:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/main.ts:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/src/styles.scss b/garage-workspace/garage/projects/garage-ui/src/styles.scss
new file mode 100644
index 0000000000000000000000000000000000000000..811169a27bdcd4789973fd16d85ad2e8dc03bf6c
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/src/styles.scss
@@ -0,0 +1,7 @@
+@use "tailwindcss";
+
+@plugin "daisyui" {
+  themes:
+    light --default,
+    black --prefersdark;
+}
diff --git a/garage-workspace/garage/projects/garage-ui/src/styles.scss:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/src/styles.scss:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.app.json b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json
new file mode 100644
index 0000000000000000000000000000000000000000..3f672ccab2c28a04fa89a17ad65d1bbd7a6004b1
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json
@@ -0,0 +1,11 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+  "extends": "../../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../out-tsc/app",
+    "types": []
+  },
+  "files": ["src/main.ts"],
+  "include": ["src/**/*.d.ts"]
+}
diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.app.json:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/tsconfig.app.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json
new file mode 100644
index 0000000000000000000000000000000000000000..4fd89a209e50c2201140ed1c7841fc58b2f35756
--- /dev/null
+++ b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json
@@ -0,0 +1,10 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+  "extends": "../../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../../out-tsc/spec",
+    "types": ["jasmine"]
+  },
+  "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]
+}
diff --git a/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json:Zone.Identifier b/garage-workspace/garage/projects/garage-ui/tsconfig.spec.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/garage-workspace/garage/tsconfig.json b/garage-workspace/garage/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..f3656be67b6e5fbc974a011b01492b8422641d46
--- /dev/null
+++ b/garage-workspace/garage/tsconfig.json
@@ -0,0 +1,35 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "baseUrl": "./projects/garage-ui/src",
+    "paths": {
+      "@app/*": ["app/*"],
+      "@env/*": ["environments/*"],
+      "@core/*": ["app/core/*"],
+      "@shared/*": ["app/shared/*"],
+      "@features/*": ["app/features/*"]
+    },
+    "outDir": "./dist/out-tsc",
+    "strict": true,
+    "noImplicitOverride": true,
+    "noPropertyAccessFromIndexSignature": true,
+    "noImplicitReturns": true,
+    "noFallthroughCasesInSwitch": true,
+    "skipLibCheck": true,
+    "isolatedModules": true,
+    "esModuleInterop": true,
+    "experimentalDecorators": true,
+    "moduleResolution": "bundler",
+    "importHelpers": true,
+    "target": "ES2022",
+    "module": "ES2022"
+  },
+  "angularCompilerOptions": {
+    "enableI18nLegacyMessageIdFormat": false,
+    "strictInjectionParameters": true,
+    "strictInputAccessModifiers": true,
+    "strictTemplates": true
+  }
+}
diff --git a/garage-workspace/garage/tsconfig.json:Zone.Identifier b/garage-workspace/garage/tsconfig.json:Zone.Identifier
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391