diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index f20600c..3484cec 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -3,7 +3,7 @@
{
"name": "Node.js & TypeScript",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
- "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
+ "image": "mcr.microsoft.com/devcontainers/typescript-node:1-24-bookworm",
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
"ghcr.io/eitsupi/devcontainer-features/nushell:0": {}
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..9edcd85
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,9 @@
+# Public URL, used for OG Image when running nuxt generate
+NUXT_PUBLIC_SITE_URL=
+
+# PostHog Analytics (Europe region)
+# Get your project API key from: https://eu.posthog.com/settings/project
+NUXT_PUBLIC_POSTHOG_PUBLIC_KEY=
+
+# SubmitJSON API Key
+NUXT_PUBLIC_SUBMIT_JSON_API_KEY=
diff --git a/.github/agents/website-retrospec-generator.agent.md b/.github/agents/website-retrospec-generator.agent.md
deleted file mode 100644
index 06dc7fa..0000000
--- a/.github/agents/website-retrospec-generator.agent.md
+++ /dev/null
@@ -1,505 +0,0 @@
----
-name: Website RetroSpec Generator
-description: Generate comprehensive retro specifications of live websites by browsing with Playwright MCP, capturing structure, content, functionality, and creating architectural documentation.
-tools: ['edit', 'runNotebooks', 'search', 'new', 'runCommands', 'runTasks', 'microsoft/playwright-mcp/*', 'runSubagent', 'usages', 'vscodeAPI', 'problems', 'changes', 'testFailure', 'openSimpleBrowser', 'fetch', 'githubRepo', 'extensions', 'todos']
-mcp-servers:
- playwright:
- command: "npx"
- args: ["-y", "@playwright/mcp"]
- tools: ['*']
----
-
-# Website RetroSpec Generator
-
-You are an expert in reverse engineering website specifications by analyzing live websites through browser automation. You create comprehensive retro specifications that document website structure, functionality, user flows, content strategy, and technical implementation details by systematically exploring websites using Playwright MCP.
-
----
-
-## Core Workflow
-
-### 1. Gather Website Information
-
-Before analyzing a website, collect the following inputs from the user:
-
-- **Website URL**: The complete URL of the website to analyze (required)
-- **Specification Scope**: Areas to focus on (full site, specific sections, user flows, etc.)
-- **Documentation Format**: Desired output format (markdown, structured document, technical spec)
-- **Special Considerations**: Authentication requirements, specific features to document, accessibility concerns
-
-**Input Validation:** If the website URL is missing, ask the user to provide it before proceeding.
-
-### 2. Website Exploration with Playwright MCP
-
-Use Playwright MCP to systematically explore the website:
-
-**Initial Analysis:**
-- Navigate to the provided URL using Playwright MCP
-- Take page snapshots to capture current state
-- Identify site structure (navigation, main sections, page hierarchy)
-- Document visual design patterns and layout
-
-**Deep Exploration:**
-- Navigate through main sections and key pages
-- Interact with forms, buttons, and interactive elements
-- Capture screenshots of important pages and states
-- Document user flows and interaction patterns
-- Identify responsive behavior and breakpoints
-- Test accessibility features
-
-**Technical Analysis:**
-- Examine page metadata and SEO elements
-- Identify third-party integrations and services
-- Document forms, inputs, and validation patterns
-- Capture error states and edge cases
-- Note performance characteristics
-
-### 3. Generate RetroSpec Documentation
-
-Create a comprehensive specification document with the following structure:
-
----
-
-## Required RetroSpec Structure
-
-### Front Matter
-
-```yaml
----
-title: "RetroSpec: [Website Name]"
-url: "[Website URL]"
-date: "YYYY-MM-DD"
-scope: "[Specification Scope]"
-version: "1.0"
-tags: ["retrospec", "website-analysis", "documentation"]
----
-```
-
-### Document Sections
-
-#### 1. Executive Summary
-
-**Purpose:** High-level overview of the website's purpose, audience, and key characteristics.
-
-**Guidelines:**
-- Describe the primary purpose and target audience
-- Highlight unique features or differentiators
-- Summarize the technology stack (if identifiable)
-- Note the overall user experience approach
-
-#### 2. Site Structure & Navigation
-
-**Purpose:** Document the information architecture and navigation patterns.
-
-**Guidelines:**
-- Create a sitemap of discovered pages and sections
-- Document navigation menus (primary, secondary, footer)
-- Describe navigation patterns (hamburger, mega menu, etc.)
-- Include breadcrumb and internal linking strategies
-- Map out URL structure and routing patterns
-
-**Format:**
-```
-- Homepage: /
- - About: /about
- - Team: /about/team
- - History: /about/history
- - Products: /products
- - Category A: /products/category-a
- - Contact: /contact
-```
-
-#### 3. Page Inventory & Content
-
-**Purpose:** Catalog all discovered pages with their purpose and content structure.
-
-**Format:**
-
-##### [Page Name] - `/url/path`
-
-- **Purpose**: [Page objective and user goal]
-- **Layout**: [Description of page structure]
-- **Content Sections**:
- - **SECT-001**: [Section name and purpose]
- - **SECT-002**: [Section name and purpose]
-- **Key Elements**:
- - **ELEM-001**: [Interactive or important element]
- - **ELEM-002**: [Interactive or important element]
-- **Screenshots**: [Reference to captured screenshots]
-
-**Guidelines:**
-- Document 5-10 major pages in detail
-- Include both static and dynamic content
-- Note content types (text, images, video, forms)
-- Identify repeating patterns or components
-
-#### 4. User Flows & Interactions
-
-**Purpose:** Document key user journeys and interaction patterns.
-
-**Format:**
-
-##### Flow: [User Flow Name]
-
-**Entry Points:**
-- [How users arrive at this flow]
-
-**Steps:**
-1. **STEP-001**: User action → System response
-2. **STEP-002**: User action → System response
-3. **STEP-003**: User action → System response
-
-**Success Criteria:**
-- [What constitutes successful completion]
-
-**Alternative Paths:**
-- **ALT-001**: [Alternative or error path]
-
-**Guidelines:**
-- Document 3-5 critical user flows
-- Include both happy paths and error scenarios
-- Note form validation and feedback patterns
-- Capture multi-step processes (checkout, registration, etc.)
-
-#### 5. Visual Design & UI Patterns
-
-**Purpose:** Document the visual design system and reusable components.
-
-**Color Palette:**
-- Primary: [Color codes]
-- Secondary: [Color codes]
-- Accent: [Color codes]
-- Neutral: [Color codes]
-
-**Typography:**
-- Headings: [Font families and styles]
-- Body: [Font families and styles]
-- Special: [Unique typography use cases]
-
-**Component Library:**
-- **COMP-001**: [Component name and usage pattern]
-- **COMP-002**: [Component name and usage pattern]
-
-**Layout Patterns:**
-- Grid system: [Description]
-- Spacing: [Padding/margin patterns]
-- Responsive breakpoints: [Identified breakpoints]
-
-**Guidelines:**
-- Extract visible design tokens
-- Document repeating UI components
-- Note responsive design approach
-- Identify design inconsistencies
-
-#### 6. Functionality & Features
-
-**Purpose:** Catalog all functional elements and interactive features.
-
-**Format:**
-
-##### [Feature Name]
-
-- **FUNC-001**: **Description**: [What the feature does]
-- **FUNC-002**: **Location**: [Where it appears on the site]
-- **FUNC-003**: **Behavior**: [How it works and responds]
-- **FUNC-004**: **Dependencies**: [Related features or requirements]
-
-**Categories:**
-- **Navigation Features**: Menu systems, search, filters
-- **Content Features**: Galleries, sliders, accordions
-- **Forms & Input**: Contact forms, calculators, configurators
-- **Social Features**: Sharing, comments, user-generated content
-- **E-commerce Features**: Cart, checkout, product filters
-- **Authentication**: Login, registration, password reset
-
-**Guidelines:**
-- Document both obvious and subtle features
-- Include JavaScript-driven functionality
-- Note AJAX interactions and dynamic loading
-- Identify third-party integrations
-
-#### 7. Technical Implementation Notes
-
-**Purpose:** Document observable technical characteristics.
-
-**Technology Stack:**
-- **TECH-001**: [Framework or library identified]
-- **TECH-002**: [CMS or platform detected]
-- **TECH-003**: [Hosting or infrastructure clues]
-
-**Performance Observations:**
-- **PERF-001**: [Load time characteristics]
-- **PERF-002**: [Lazy loading patterns]
-- **PERF-003**: [Caching indicators]
-
-**SEO & Metadata:**
-- **SEO-001**: [Meta description patterns]
-- **SEO-002**: [Structured data implementation]
-- **SEO-003**: [OpenGraph/social metadata]
-
-**Accessibility:**
-- **A11Y-001**: [ARIA labels and roles]
-- **A11Y-002**: [Keyboard navigation support]
-- **A11Y-003**: [Screen reader considerations]
-
-**Guidelines:**
-- Focus on observable characteristics
-- Don't speculate about backend technology
-- Document client-side frameworks if identifiable
-- Note analytics or tracking implementations
-
-#### 8. Content Strategy & Patterns
-
-**Purpose:** Analyze content organization and editorial approach.
-
-**Content Types:**
-- **CONT-001**: [Content type and frequency]
-- **CONT-002**: [Content type and frequency]
-
-**Messaging & Tone:**
-- Voice: [Formal, casual, technical, etc.]
-- Key Messages: [Recurring themes or calls-to-action]
-- Value Propositions: [How benefits are communicated]
-
-**Content Patterns:**
-- Headlines: [Style and approach]
-- Calls-to-Action: [Placement and language]
-- Social Proof: [Testimonials, reviews, case studies]
-
-**Guidelines:**
-- Identify content marketing strategies
-- Note persuasion techniques
-- Document microcopy patterns
-- Analyze information hierarchy
-
-#### 9. Responsive & Mobile Behavior
-
-**Purpose:** Document responsive design implementation.
-
-**Breakpoints Observed:**
-- Desktop: [Behavior at large screens]
-- Tablet: [Behavior at medium screens]
-- Mobile: [Behavior at small screens]
-
-**Responsive Patterns:**
-- **RESP-001**: [Navigation transformation]
-- **RESP-002**: [Content reflow patterns]
-- **RESP-003**: [Touch-friendly interactions]
-- **RESP-004**: [Hidden/revealed elements]
-
-**Guidelines:**
-- Test at multiple viewport sizes
-- Document mobile-specific features
-- Note any mobile app promotion
-- Identify touch gesture support
-
-#### 10. Recommendations & Observations
-
-**Purpose:** Provide insights and improvement suggestions.
-
-**Strengths:**
-- **STR-001**: [Well-executed aspects]
-- **STR-002**: [Notable best practices]
-
-**Improvement Opportunities:**
-- **IMP-001**: [Potential enhancements]
-- **IMP-002**: [Usability concerns]
-
-**Technical Debt Indicators:**
-- **DEBT-001**: [Outdated patterns or technologies]
-- **DEBT-002**: [Inconsistencies or workarounds]
-
-**Modern Web Standards:**
-- **STD-001**: [Alignment with current best practices]
-- **STD-002**: [Areas for modernization]
-
-**Guidelines:**
-- Be objective and constructive
-- Focus on user experience impact
-- Consider accessibility and performance
-- Note competitive advantages or gaps
-
-#### 11. Appendices
-
-**Screenshots:**
-- [List of captured screenshots with descriptions]
-
-**Page Inventory:**
-- [Complete list of discovered URLs]
-
-**Forms Catalog:**
-- [All forms with field details]
-
-**External Resources:**
-- [Third-party services and APIs]
-
----
-
-## File Naming and Location
-
-### Naming Convention
-
-`retrospec-[domain-name]-YYYY-MM-DD.md`
-
-**Examples:**
-- `retrospec-example-com-2025-11-05.md`
-- `retrospec-myshop-store-2025-11-05.md`
-
-### Location
-
-All RetroSpecs should be saved in: `/docs/retrospecs/`
-
-If the directory doesn't exist, create it before saving the document.
-
----
-
-## Quality Checklist
-
-Before finalizing the RetroSpec, verify:
-
-- [ ] Website was thoroughly explored using Playwright MCP
-- [ ] All major sections and pages were documented
-- [ ] User flows were tested and captured accurately
-- [ ] Screenshots were taken for key pages and states
-- [ ] Visual design patterns were documented
-- [ ] Interactive features were tested and described
-- [ ] Responsive behavior was examined
-- [ ] Accessibility features were noted
-- [ ] Technical observations are factual, not speculative
-- [ ] Document follows the required structure
-- [ ] All coded items use proper format (SECT-001, FUNC-001, etc.)
-- [ ] Recommendations are constructive and actionable
-- [ ] Front matter is complete with all required fields
-- [ ] File name follows naming convention
-- [ ] Document is well-formatted and readable
-
----
-
-## Important Guidelines
-
-1. **Be Systematic**: Follow a methodical approach to exploration
-2. **Be Thorough**: Don't skip sections or leave placeholders
-3. **Be Objective**: Document what exists, not what should exist
-4. **Be Specific**: Provide concrete examples and details
-5. **Be Visual**: Reference screenshots for complex layouts
-6. **Be Accurate**: Verify observations through testing
-7. **Be Complete**: Cover all aspects of the specification structure
-8. **Be Professional**: Maintain a technical but accessible tone
-9. **Be Timely**: Use current date for the specification
-10. **Be Tool-Dependent**: Always use Playwright MCP for exploration - never speculate without browsing
-
----
-
-## Playwright MCP Usage Pattern
-
-### Standard Exploration Flow
-
-```
-1. Launch browser with Playwright MCP
-2. Navigate to target URL
-3. Take initial page snapshot
-4. Analyze page structure and content
-5. Identify navigation elements
-6. Click through navigation items systematically
-7. Take snapshots of key pages
-8. Test interactive elements (forms, buttons, etc.)
-9. Capture responsive behavior at different viewport sizes
-10. Document findings in real-time
-11. Close browser context when complete
-```
-
-### Key Playwright MCP Commands
-
-- Navigate to pages and capture state
-- Take screenshots for documentation
-- Interact with forms and buttons
-- Test navigation flows
-- Examine page accessibility tree
-- Capture network activity (if needed)
-- Test responsive breakpoints
-
----
-
-## Agent Success Criteria
-
-Your work is complete when:
-
-1. RetroSpec file is created in `/docs/retrospecs/` with correct naming
-2. Website was systematically explored using Playwright MCP
-3. All required sections are filled with detailed, accurate information
-4. User flows are thoroughly documented with step-by-step details
-5. Visual design and UI patterns are comprehensively cataloged
-6. Interactive features are tested and documented
-7. Screenshots are captured and referenced appropriately
-8. Technical observations are factual and evidence-based
-9. Recommendations are constructive and actionable
-10. Document follows all formatting standards
-11. Quality checklist items are satisfied
-12. The specification provides enough detail for someone to understand the website without visiting it
-
----
-
-## Example Workflow
-
-**User Request:** "Generate a retro specification for https://example.com"
-
-**Agent Response:**
-
-1. **Initiate Exploration**
- - "I'll analyze https://example.com using Playwright MCP to create a comprehensive retro specification."
-
-2. **Browse & Document**
- - Launch browser and navigate to site
- - "I'm exploring the homepage structure..."
- - Take snapshots and document findings
- - "I've identified 5 main sections and testing navigation..."
- - Click through navigation items
- - "Testing the contact form functionality..."
- - Interact with forms and features
-
-3. **Analyze Patterns**
- - Document visual patterns
- - Test responsive behavior
- - Capture user flows
-
-4. **Generate Documentation**
- - Create structured RetroSpec document
- - Include all observations and findings
- - Add screenshots and references
- - Save to `/docs/retrospecs/`
-
-5. **Present Results**
- - "RetroSpec complete! I've documented [X] pages, [Y] user flows, and [Z] interactive features."
- - Provide summary of key findings
- - Highlight interesting observations
-
----
-
-## Notes for Effective RetroSpec Generation
-
-### Do:
-- Use Playwright MCP for every claim about the website
-- Take screenshots of important pages and states
-- Test interactive elements thoroughly
-- Document both desktop and mobile experiences
-- Note accessibility features you observe
-- Be specific about locations and behaviors
-- Provide context for recommendations
-
-### Don't:
-- Speculate about backend technology without evidence
-- Skip sections with "TBD" or placeholders
-- Document only the happy path - include errors
-- Assume functionality without testing
-- Copy marketing language verbatim without context
-- Overlook responsive and mobile behavior
-- Make subjective design judgments without reasoning
-
----
-
-## Continuous Improvement
-
-After generating each RetroSpec:
-- Ask if user wants to explore specific areas in more depth
-- Offer to generate visual diagrams or flowcharts
-- Suggest related documentation (API specs, technical architecture)
-- Provide next steps for implementation or redesign
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 0000000..b8208d9
--- /dev/null
+++ b/.github/copilot-instructions.md
@@ -0,0 +1,106 @@
+# GitHub Copilot Instructions
+
+## MCP Tool Usage
+
+When answering questions about this project, use the appropriate MCP (Model Context Protocol) tools:
+
+### Nuxt UI Questions
+
+For questions about **Nuxt UI components, styling, theming, or UI-related features**, use the Nuxt UI MCP tools:
+
+- `mcp_nuxt-ui_list-components` - List all available Nuxt UI components
+- `mcp_nuxt-ui_get-component-metadata` - Get detailed props, slots, and events for a component
+- `mcp_nuxt-ui_list-examples` - Browse UI examples and code demonstrations
+- `mcp_nuxt-ui_get-example` - Get specific example implementation code
+- `mcp_nuxt-ui_get-migration-guide` - Get migration guides between versions
+- `mcp_nuxt-ui_list-getting-started-guides` - List installation and setup guides
+- `mcp_nuxt-ui_get-template` - Get template details and setup instructions
+
+**Examples of Nuxt UI questions:**
+- How do I use the UButton component?
+- What props does UHeader accept?
+- How do I customize the color theme?
+- How do I create a navigation menu?
+- What's the difference between UCard and UPageCard?
+
+### Nuxt Framework Questions
+
+For questions about **Nuxt framework, routing, configuration, modules, content, or deployment**, use the Nuxt MCP tools:
+
+- `mcp_nuxt_get-getting-started-guide` - Get the Nuxt getting started guide
+- `mcp_nuxt_list-documentation-pages` - Search/explore Nuxt documentation
+- `mcp_nuxt_list-modules` - Discover available Nuxt modules
+- `mcp_nuxt_list-deploy-providers` - List deployment/hosting options
+
+Activate additional tool groups as needed:
+- `activate_nuxt_documentation_tools` - For detailed documentation pages
+- `activate_nuxt_module_management_tools` - For module details
+- `activate_nuxt_deployment_tools` - For deployment guides
+- `activate_nuxt_blog_management_tools` - For Nuxt blog posts
+
+**Examples of Nuxt questions:**
+- How do I configure nuxt.config.ts?
+- How does Nuxt Content v3 work?
+- How do I set up SSR/SSG?
+- How do I deploy to Netlify/Vercel?
+- How do I create API routes in Nuxt?
+
+## Project Context
+
+This is a personal blog built with:
+- **Nuxt 4** - Vue.js meta-framework
+- **Nuxt UI v3** - UI component library
+- **Nuxt Content v3** - Markdown/content management
+- **TailwindCSS v4** - Styling
+
+Content is stored in the `content/` directory with blog posts in `content/1.posts/`.
+
+## Nuxt UI v3 Styling Guidelines
+
+When customizing Nuxt UI v3 components:
+
+### Use the `ui` prop for styling
+Do NOT use `class` to style internal parts of components. Instead, use the `ui` prop with slot names:
+
+```vue
+
+
+
+
+
+```
+
+### Common ui slots by component
+- **UNavigationMenu**: `root`, `list`, `link`, `linkLabel`, `linkLeadingIcon`, etc.
+- **UButton**: `base`, `label`, `leadingIcon`, `trailingIcon`
+- **UHeader**: `root`, `left`, `center`, `right`, `logo`
+- **UAvatar**: `root`, `image`, `fallback`
+
+### UAvatar custom sizes
+When using UAvatar with a custom size via the `ui` prop, always set explicit `width` and `height` props to match the display size. This ensures NuxtImg fetches the image at the correct resolution and avoids blurry images:
+
+```vue
+
+
+
+
+
+```
+
+### Always check component documentation
+Use `mcp_nuxt-ui_get-component` or `mcp_nuxt-ui_get-component-metadata` to find:
+- Available props and their types
+- Available slots for customization
+- The `ui` prop structure with all customizable slots
+- Theme configuration in `app.config.ts`
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..58d9ce9
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,34 @@
+name: ci
+
+on: push
+
+jobs:
+ ci:
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ matrix:
+ os: [ubuntu-latest]
+ node: [22]
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+
+ - name: Install node
+ uses: actions/setup-node@v6
+ with:
+ node-version: ${{ matrix.node }}
+ cache: pnpm
+
+ - name: Install dependencies
+ run: pnpm install
+
+ - name: Lint
+ run: pnpm run lint
+
+ - name: Typecheck
+ run: pnpm run typecheck
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e69de29..0000000
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..bf2e764
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+shamefully-hoist=true
diff --git a/.vscode/mcp.json b/.vscode/mcp.json
new file mode 100644
index 0000000..28b9388
--- /dev/null
+++ b/.vscode/mcp.json
@@ -0,0 +1,12 @@
+{
+ "servers": {
+ "nuxt-ui": {
+ "type": "http",
+ "url": "https://ui.nuxt.com/mcp"
+ },
+ "nuxt": {
+ "type": "http",
+ "url": "https://nuxt.com/mcp"
+ }
+ }
+}
\ No newline at end of file
diff --git a/CC-BY-SA-4.0 b/CC-BY-SA-4.0
index 7d4f96c..f5bbb40 100644
--- a/CC-BY-SA-4.0
+++ b/CC-BY-SA-4.0
@@ -410,7 +410,7 @@ Section 8 -- Interpretation.
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
-will be considered the “Licensor.” The text of the Creative Commons
+will be considered the "Licensor." The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
diff --git a/LICENSE b/LICENSE
index 528e8cd..06ac070 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2024 Alexandre Nédélec
+Copyright (c) 2026 Alexandre Nédélec
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 2b7ec8a..98571b1 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# TechWatching.dev
This is the code and content for my personal website https://techwatching.dev.
-The website is built using [Nuxt](https://nuxt.com/) and is based on the [Nuxt UI pro SaaS template](https://github.com/nuxt-ui-pro/saas).
+The website is built using [Nuxt](https://nuxt.com/) and is based on the [Nuxt SaaS template](https://github.com/nuxt-ui-templates/saas).
## License
@@ -12,6 +12,4 @@ Images used on this blog that are my not my own mostly come Unsplash and in part
My original blog was built in .NET using [Statiq](https://www.statiq.dev/web) (and even [Wyam](https://github.com/Wyamio/Wyam) before that).
It worked well, and I could have kept using it. But in 2024, I decided to migrate the blog to Nuxt in 2024 to benefits from the Vue.js/Nuxt ecosystem and because I was more familiar with Vue.js for frontend development.
-The code that used the Statiq Web static website generation toolkit in .NET can still be found on the [statiqdev branch](https://github.com/TechWatching/techwatching.dev/tree/statiqdev).
-
-
+The code that used the Statiq Web static website generation toolkit in .NET can still be found on the [statiqdev branch](https://github.com/TechWatching/techwatching.dev/tree/statiqdev).
\ No newline at end of file
diff --git a/_redirects b/_redirects
deleted file mode 100644
index b6f53cc..0000000
--- a/_redirects
+++ /dev/null
@@ -1 +0,0 @@
-/gitcheatsheet /goodies/gitcheatsheet 301!
diff --git a/app.config.ts b/app.config.ts
deleted file mode 100644
index 95a9d69..0000000
--- a/app.config.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-export default defineAppConfig({
- ui: {
- primary: 'sky',
- gray: 'cool',
- button: {
- rounded: 'rounded-full',
- default: {
- size: 'md'
- }
- },
- variables: {
- header: {
- height: '6rem'
- }
- },
- input: {
- default: {
- size: 'md'
- }
- },
- // avatar: { size: [''] },
- card: {
- rounded: 'rounded-xl'
- },
- footer: {
- top: {
- wrapper: 'border-t border-gray-200 dark:border-gray-800',
- container: 'py-8 lg:py-16'
- },
- bottom: {
- wrapper: 'border-t border-gray-200 dark:border-gray-800'
- }
- },
- page: {
- hero: {
- wrapper: 'lg:py-24'
- }
- },
- content: {
- prose: {
- code: {
- icon: {
- cs: 'vscode-icons:file-type-csharp',
- csx: 'vscode-icons:file-type-csharp'
- }
- }
- }
- }
- }
-})
diff --git a/app.vue b/app.vue
deleted file mode 100644
index 2259256..0000000
--- a/app.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
diff --git a/content.config.ts b/content.config.ts
new file mode 100644
index 0000000..d72a351
--- /dev/null
+++ b/content.config.ts
@@ -0,0 +1,165 @@
+import { defineCollection, z } from '@nuxt/content'
+
+const variantEnum = z.enum(['solid', 'outline', 'subtle', 'soft', 'ghost', 'link'])
+const colorEnum = z.enum(['primary', 'secondary', 'neutral', 'error', 'warning', 'success', 'info'])
+const sizeEnum = z.enum(['xs', 'sm', 'md', 'lg', 'xl'])
+const orientationEnum = z.enum(['vertical', 'horizontal'])
+
+const createBaseSchema = () => z.object({
+ title: z.string().nonempty(),
+ description: z.string().nonempty()
+})
+
+const _createFeatureItemSchema = () => createBaseSchema().extend({
+ icon: z.string().nonempty().editor({ input: 'icon' })
+})
+
+const createLinkSchema = () => z.object({
+ label: z.string().nonempty(),
+ to: z.string().nonempty(),
+ icon: z.string().optional().editor({ input: 'icon' }),
+ size: sizeEnum.optional(),
+ trailing: z.boolean().optional(),
+ target: z.string().optional(),
+ color: colorEnum.optional(),
+ variant: variantEnum.optional()
+})
+
+const createImageSchema = () => z.object({
+ src: z.string().nonempty().editor({ input: 'media' }),
+ alt: z.string().optional(),
+ loading: z.enum(['lazy', 'eager']).optional(),
+ srcset: z.string().optional()
+})
+
+export const collections = {
+ index: defineCollection({
+ source: '0.index.yml',
+ type: 'page',
+ schema: z.object({
+ hero: z.object(({
+ title: z.string().optional(),
+ description: z.string().optional(),
+ links: z.array(createLinkSchema())
+ })),
+ roles: z.object({
+ title: z.string().nonempty(),
+ description: z.string().nonempty(),
+ items: z.array(
+ z.object({
+ title: z.string().nonempty(),
+ description: z.string().nonempty(),
+ icon: z.string().nonempty().editor({ input: 'icon' }),
+ to: z.string().optional(),
+ target: z.string().optional()
+ })
+ )
+ }).optional(),
+ socials: z.object({
+ title: z.string().nonempty(),
+ links: z.array(
+ z.object({
+ icon: z.string().nonempty().editor({ input: 'icon' }),
+ to: z.string().nonempty(),
+ label: z.string().nonempty()
+ })
+ )
+ }).optional(),
+ sections: z.array(
+ z.object({
+ title: z.string().nonempty(),
+ description: z.string().nonempty(),
+ id: z.string().nonempty(),
+ orientation: orientationEnum.optional(),
+ reverse: z.boolean().optional(),
+ image: z.object({
+ src: z.string().nonempty().editor({ input: 'media' }),
+ alt: z.string().optional(),
+ to: z.string().optional(),
+ target: z.string().optional(),
+ width: z.number().optional()
+ }).optional(),
+ features: z.array(
+ z.object({
+ name: z.string().nonempty(),
+ description: z.string().nonempty(),
+ icon: z.string().nonempty().editor({ input: 'icon' })
+ })
+ ).optional()
+ })
+ ),
+ cta: createBaseSchema().extend({
+ links: z.array(createLinkSchema())
+ }).optional()
+ })
+ }),
+ blog: defineCollection({
+ source: '1.posts.yml',
+ type: 'page',
+ schema: z.object({
+ align: z.string().optional(),
+ links: z.array(createLinkSchema()).optional(),
+ image: createImageSchema().optional()
+ })
+ }),
+ posts: defineCollection({
+ source: '1.posts/**/*',
+ type: 'page',
+ schema: z.object({
+ tags: z.array(z.string()).optional(),
+ canonical: z.string().optional(),
+ image: z.object({ src: z.string().nonempty().editor({ input: 'media' }) }),
+ authors: z.array(
+ z.object({
+ name: z.string().nonempty(),
+ to: z.string().nonempty(),
+ avatar: z.object({ src: z.string().nonempty().editor({ input: 'media' }) })
+ })
+ ).optional(),
+ date: z.date(),
+ badge: z.object({ label: z.string().nonempty() })
+ })
+ }),
+ goodiesPage: defineCollection({
+ source: '3.goodies.yml',
+ type: 'page',
+ schema: z.object({
+ align: z.string().optional(),
+ image: createImageSchema().optional()
+ })
+ }),
+ goodies: defineCollection({
+ source: '3.goodies/*.md',
+ type: 'page',
+ schema: z.object({
+ lead: z.string().optional(),
+ image: createImageSchema().optional()
+ })
+ }),
+ speaking: defineCollection({
+ source: '2.speaking.yml',
+ type: 'page',
+ schema: z.object({
+ align: z.string().optional(),
+ events: z.array(
+ z.object({
+ name: z.string().optional(),
+ date: z.string().optional(),
+ event: z.string().optional(),
+ type: z.enum(['conference', 'meetup', 'podcast', 'webinar']).optional(),
+ format: z.enum(['talk', 'workshop', 'panel', 'keynote', 'lightning']).optional(),
+ location: z.string().optional(),
+ url: z.string().optional(),
+ slides: z.string().optional(),
+ image: z.string().optional(),
+ speakers: z.array(z.string()).optional()
+ })
+ ).optional()
+ })
+ }),
+ content: defineCollection({
+ source: '*.md',
+ type: 'page',
+ schema: z.object({})
+ })
+}
diff --git a/content/0.index.yml b/content/0.index.yml
index 7dfa860..542e991 100644
--- a/content/0.index.yml
+++ b/content/0.index.yml
@@ -1,5 +1,8 @@
title: Alexandre Nédélec's personal website
description: Techwatching.dev is the personal website of Alexandre Nédélec, developer.
+seo:
+ title: Alexandre Nédélec's personal website
+ description: Techwatching.dev is the personal website of Alexandre Nédélec, developer.
navigation: false
hero:
title: Hi, I'm Alexandre
@@ -8,13 +11,13 @@ hero:
- label: See my blog
to: '/posts'
size: xl
- color: black
- icon: i-heroicons-arrow-right-20-solid
+ icon: i-lucide-arrow-right
trailing: true
- label: Check the code
icon: i-simple-icons-github
size: xl
- color: gray
+ color: neutral
+ variant: subtle
to: https://github.com/TechWatching/techwatching.dev
target: _blank
roles:
@@ -23,25 +26,25 @@ roles:
items:
- title: Developer
description: I'm primarily coding in C# and TypeScript but I'm interested in other languages too.
- icon: i-heroicons-code-bracket-20-solid
+ icon: i-lucide-code
to: https://github.com/TechWatching
target: _blank
- title: Blogger
description: I write technical articles on my blog, sharing what I learn throughout my journey as a developer.
- icon: i-ph-pen-nib-fill
+ icon: i-lucide-pen-line
to: /posts
- title: Teacher
description: I teach a software engineering optional course about DevOps practices at my former graduate engineering school, the ENSEIRB-MATMECA.
- icon: i-ph-chalkboard-teacher
+ icon: i-lucide-graduation-cap
to: https://enseirb-matmeca.bordeaux-inp.fr/fr
target: _blank
- title: Speaker
description: When I get the chance, I give talks at developer conferences and meetups.
- icon: i-ph-microphone-stage
+ icon: i-lucide-mic
to: /speaking
- title: Eternal learner
description: Learning, especially in IT, is a never-ending journey that I'm happy to take. I want to keep learning to become a better developer.
- icon: i-heroicons-academic-cap
+ icon: i-lucide-book-open
- title: Meetup organizer
description: I created the Microsoft Tech Group Bordeaux with some friends in early 2024. We organize meetups about Microsoft related technologies.
icon: i-simple-icons-meetup
@@ -49,11 +52,12 @@ roles:
target: _blank
sections:
- title: I'm a Microsoft MVP.
- description: "In December 2024, I was awarded the Microsoft MVP title in the Microsoft Azure category."
+ description: In December 2024, I was awarded the Microsoft MVP title in the Microsoft Azure category.
id: mvp
- align: center
+ orientation: horizontal
+ features: []
image:
- src: mvp-badge.png
+ src: /mvp-badge.png
alt: Microsoft MVP badge.
to: https://mvp.microsoft.com/en-US/mvp/profile/b6deecb6-7760-406e-84cb-8206f051f8e5
target: _blank
@@ -61,43 +65,44 @@ sections:
- title: I'm a Puluminary.
description: "Since 2022, I have been part of the Puluminaries community program that recognizes members of the Pulumi community. Pulumi is the technology that made me love Infrastructure as Code and I truly believe that IaC should be:"
id: puluminary
- align: right
+ orientation: horizontal
+ reverse: true
image:
- src: puluminary-badge.png
+ src: /puluminary-badge.png
alt: Puluminary badge.
to: https://www.pulumi.com/community/puluminaries
target: _blank
features:
- - name: Easy to learn, use, and be productive with
+ - title: Easy to learn, use, and be productive with
description: Infrastructure development should be done using the same practices as software development (programming languages, tools, libraries, tests...).
- icon: i-heroicons-cog
- - name: Up to date with main cloud providers' resources and features
+ icon: i-lucide-cog
+ - title: Up to date with main cloud providers' resources and features
description: The infrastructure we provision needs to be able to benefit from the latest resources, innovations, security improvements.
- icon: i-heroicons-check
- - name: Secure by default
- description: Secrets encryption should be built-in (wherever sensitive data may be, in the configuration, in the the state or in the outputs).
- icon: i-heroicons-lock-closed
+ icon: i-lucide-check
+ - title: Secure by default
+ description: Secrets encryption should be built-in (wherever sensitive data may be, in the configuration, in the state or in the outputs).
+ icon: i-lucide-lock
- title: Microsoft Tech Bordeaux
description: I am one of the co-creators and organizers of the meetup group MTG:Bordeaux, which is part of MTG:France. If you live in or are visiting Bordeaux, come say hi.
- align: left
id: mtg-bordeaux
+ orientation: horizontal
image:
- src: coonelé.png
+ src: /coonelé.png
alt: A racoon holding a cannelé.
to: https://www.meetup.com/mtg-bordeaux
target: _blank
features:
- - name: Tech meetups
+ - title: Tech meetups
description: Talks about latest technologies (Microsoft and non-Microsoft) and experience feedback from various speakers.
- icon: i-ph-brackets-curly-bold
- - name: Networking
+ icon: i-lucide-braces
+ - title: Networking
description: A community open to everyone and a good place to network.
- icon: i-ph-chats-circle-bold
+ icon: i-lucide-messages-square
cta:
title: Contact
description: If you have any questions or would like to discuss anything, don't hesitate to drop me a line.
links:
- label: Let's talk
size: xl
- color: black
to: /contact
+
diff --git a/content/1.posts.yml b/content/1.posts.yml
index 9abe466..4640996 100644
--- a/content/1.posts.yml
+++ b/content/1.posts.yml
@@ -16,7 +16,7 @@ links:
icon: 'i-heroicons-rss-20-solid'
size: 'xs'
- label: 'See all tags'
- color: 'gray'
+ color: 'neutral'
to: '/tags'
size: 'xs'
icon: 'i-heroicons-hashtag-16-solid'
diff --git a/content/1.posts/1.testing-your-api-with-rest-client.md b/content/1.posts/1.testing-your-api-with-rest-client.md
index ef8da40..3684bca 100644
--- a/content/1.posts/1.testing-your-api-with-rest-client.md
+++ b/content/1.posts/1.testing-your-api-with-rest-client.md
@@ -1,6 +1,6 @@
---
title: Testing your API with REST Client
-lead: Why using the vscode extension "REST Client" instead of Postman?
+description: Why using the vscode extension "REST Client" instead of Postman?
date: 2019-03-05
image:
src: /images/swiss_knifes.jpg
@@ -32,14 +32,15 @@ Okay, I know that Postman paid plan allows you to share requests with other peop
The REST Client extension is an open source vs code extension developed by [Huachao Mao](https://github.com/Huachao). If I quote the README of its [GitHub repository](https://github.com/Huachao/vscode-restclient): REST Client allows you to send HTTP request and view the response in Visual Studio Code directly.
Let's see that with a simple GET request to [The Start Wars API](https://swapi.co/):
-05578273
+{ .rounded-lg .mx-auto width="400" }
Nothing new or complicated here, just the request you would have written intuitively. Like this, you can write any kind of request you want simply following the standard RFC 2616. Even if you don't know the standard, it's pretty straightforward and you often find samples with this format on the documentation of the API you are querying, like on the [Microsoft Graph API documentation](https://learn.microsoft.com/en-us/graph/api/user-list-memberof?view=graph-rest-1.0#example&wt.mc_id=MVP_430820) for instance.
-REST Client works on text files in vscode by selecting _HTTP_ as the Language Mode (by default this language mode is associated with files having the _.rest_ or _.http_ extension). It provides you with some autocompletion and a few snippets to help you write your queries. You can write multiple requests on the same file in vscode just by separating them with ###. Above each request an actionable _Send Request_ link allows you to run the request and see the response in a response panel.
-
{ .rounded-lg .mx-auto width="800" height="400" }
+REST Client works on text files in vscode by selecting _HTTP_ as the Language Mode (by default this language mode is associated with files having the _.rest_ or _.http_ extension). It provides you with some autocompletion and a few snippets to help you write your queries. You can write multiple requests on the same file in vscode just by separating them with `###`. Above each request an actionable _Send Request_ link allows you to run the request and see the response in a response panel.
+
+
## Using variables in REST Client
As you can see below, it is possible to use variables with REST Client. A variable `planetName` is defined in the file and reused in 2 requests. A variable is also used to name the request _GET https://swapi.co/api/people/?search=Luke_ and makes it possible to use elements from the response (that you can see on the right). Here we are using the `homeworld` property of the response to retrieve the planet from which Luke was from in the following GET request. With the help of variables you can easily combine and chain requests for the scenario you need to realize.
diff --git a/content/1.posts/10.azure-functions-custom-configuration.md b/content/1.posts/10.azure-functions-custom-configuration.md
index 9d605fb..87d2322 100644
--- a/content/1.posts/10.azure-functions-custom-configuration.md
+++ b/content/1.posts/10.azure-functions-custom-configuration.md
@@ -1,6 +1,6 @@
---
title: You almost no longer need Key Vault references for Azure Functions.
-lead: Talking about how to manage configuration secrets in Azure Functions.
+description: Talking about how to manage configuration secrets in Azure Functions.
date: 2020-09-21
image:
src: /images/lightning_1.jpg
diff --git a/content/1.posts/11.technology-watch-part3.md b/content/1.posts/11.technology-watch-part3.md
index ea2758e..77b44a6 100644
--- a/content/1.posts/11.technology-watch-part3.md
+++ b/content/1.posts/11.technology-watch-part3.md
@@ -1,6 +1,6 @@
---
title: How to do a technology watch? - Part 3
-lead: Be part of the community
+description: Be part of the community
date: 2020-10-29
image:
src: /images/passion_1.jpg
diff --git a/content/1.posts/12.devops-future.md b/content/1.posts/12.devops-future.md
index ca34615..edfc7ae 100644
--- a/content/1.posts/12.devops-future.md
+++ b/content/1.posts/12.devops-future.md
@@ -1,6 +1,6 @@
---
title: Forget DevOps, the future is already here!
-lead: Best practices in IT.
+description: Best practices in IT.
date: 2021-02-11
image:
src: /images/books_1.jpg
diff --git a/content/1.posts/13.w09-2021-tips-learned-this-week.md b/content/1.posts/13.w09-2021-tips-learned-this-week.md
index 63f4274..a3b8d36 100644
--- a/content/1.posts/13.w09-2021-tips-learned-this-week.md
+++ b/content/1.posts/13.w09-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 9, 2021 - Tips I learned this week
-lead: Windows Terminal startup actions, a git config setting for submodules, and a better IntelliSense for azure pipelines vscode extension.
+description: Windows Terminal startup actions, a git config setting for submodules, and a better IntelliSense for azure pipelines vscode extension.
date: 2021-03-07
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/14.w12-2021-tips-learned-this-week.md b/content/1.posts/14.w12-2021-tips-learned-this-week.md
index e98d8b6..d358197 100644
--- a/content/1.posts/14.w12-2021-tips-learned-this-week.md
+++ b/content/1.posts/14.w12-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 12, 2021 - Tips I learned this week
-lead: Version in git tag with Azure Pipelines and in application insight logs.
+description: Version in git tag with Azure Pipelines and in application insight logs.
date: 2021-03-26
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/15.w14-2021-tips-learned-this-week.md b/content/1.posts/15.w14-2021-tips-learned-this-week.md
index c2aed16..7f76420 100644
--- a/content/1.posts/15.w14-2021-tips-learned-this-week.md
+++ b/content/1.posts/15.w14-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 14, 2021 - Tips I learned this week
-lead: Azure tenant in vs code and Azure IoT Hub vs code extension.
+description: Azure tenant in vs code and Azure IoT Hub vs code extension.
date: 2021-04-10
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/16.once-upon-a-time-in-dotnet.md b/content/1.posts/16.once-upon-a-time-in-dotnet.md
index 4480265..34a7360 100644
--- a/content/1.posts/16.once-upon-a-time-in-dotnet.md
+++ b/content/1.posts/16.once-upon-a-time-in-dotnet.md
@@ -1,6 +1,6 @@
---
title: Once upon a time in .NET
-lead: A story about records, HTTP message handlers, HTTP client extensions...
+description: A story about records, HTTP message handlers, HTTP client extensions...
date: 2021-04-24
image:
src: /images/western_1.jpg
diff --git a/content/1.posts/17.winget-import.md b/content/1.posts/17.winget-import.md
index a79b7a4..db9f804 100644
--- a/content/1.posts/17.winget-import.md
+++ b/content/1.posts/17.winget-import.md
@@ -1,6 +1,6 @@
---
title: Install your applications with winget
-lead: Winget import a promising feature
+description: Winget import a promising feature
date: 2021-05-26
description: Using Windows Package Manager import to install multiple applications.
image:
diff --git a/content/1.posts/18.winget-override.md b/content/1.posts/18.winget-override.md
index 0fa3314..61b3f13 100644
--- a/content/1.posts/18.winget-override.md
+++ b/content/1.posts/18.winget-override.md
@@ -1,6 +1,6 @@
---
title: Customize your applications when installing them with winget
-lead: The override option of winget install command
+description: The override option of winget install command
date: 2021-05-31
image:
src: /images/surface_2.jpg
diff --git a/content/1.posts/19.w22-2021-tips-learned-this-week.md b/content/1.posts/19.w22-2021-tips-learned-this-week.md
index 4f02003..6a35a20 100644
--- a/content/1.posts/19.w22-2021-tips-learned-this-week.md
+++ b/content/1.posts/19.w22-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 22, 2021 - Tips I learned this week
-lead: IntelliSense in vscode, Azure CLI command to get assigned roles, and Azure Storage Explorer new version.
+description: IntelliSense in vscode, Azure CLI command to get assigned roles, and Azure Storage Explorer new version.
date: 2021-06-07
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/2.html-templating-in-xamarin.md b/content/1.posts/2.html-templating-in-xamarin.md
index f570345..dcc6a50 100644
--- a/content/1.posts/2.html-templating-in-xamarin.md
+++ b/content/1.posts/2.html-templating-in-xamarin.md
@@ -1,6 +1,6 @@
---
title: HTML templating in Xamarin
-lead: Razor templates, Handlebars.Net ...
+description: Razor templates, Handlebars.Net ...
date: 2019-03-10
image:
src: /images/phone_2.jpg
@@ -18,12 +18,12 @@ What is nice is that you don't need to be in an ASP.NET context to use Razor tem
There is already a complete article about Razor HTML templates in Xamarin in the [Microsoft documentation](https://learn.microsoft.com/en-us/xamarin/cross-platform/platform/razor-html-templates/?wt.mc_id=MVP_430820) so if you want an in-depth explanation I suggest you read it. In this article, it is explained how to add a Razor template file (`.cshtml` file) to a Xamarin project by using the _Text Templating_ section of the _New file_ dialog.
However, if you try to add a new item in a Xamarin project you won't see a _Text Templating_ section.
-{ .rounded-lg .mx-auto }
+{ .rounded-lg .mx-auto width="300" }
That's because, at the time of writing this article, it only exists in Visual Studio for Mac (probably because it comes from Xamarin Studio). So how to add a Razor template file in Visual Studio (Windows)?
There is a little tip to do that (I found it in an old post on [StackOverflow](https://stackoverflow.com/questions/39048900/is-there-a-preprocessed-razor-template-for-visual-studio-2015)): you have to manually add a `.cshtml` file to your project and set the custom tool to `RazorTemplatePreprocessor` in the properties of the file (this will generate the code-behind file).
-{ .rounded-lg .mx-auto }
+{ .rounded-lg .mx-auto width="400" }
Then you can generate an HTML string from your Razor template and your data in your Xamarin project.
diff --git a/content/1.posts/20.sqlclient-active-directory-authent.md b/content/1.posts/20.sqlclient-active-directory-authent.md
index 3cce11a..d3d9657 100644
--- a/content/1.posts/20.sqlclient-active-directory-authent.md
+++ b/content/1.posts/20.sqlclient-active-directory-authent.md
@@ -1,6 +1,6 @@
---
title: How to connect to an Azure SQL Database from C# using Azure AD
-lead: Talking about Active Directory Default authentication mode for SqlClient.
+description: Talking about Active Directory Default authentication mode for SqlClient.
date: 2021-06-22
image:
src: /images/cloud-azure_1.jpg
diff --git a/content/1.posts/21.wingetcreate.md b/content/1.posts/21.wingetcreate.md
index a8b868d..cb1583b 100644
--- a/content/1.posts/21.wingetcreate.md
+++ b/content/1.posts/21.wingetcreate.md
@@ -1,6 +1,6 @@
---
title: Producing packages for Windows Package Manager
-lead: Automate the upgrade of a winget package with GitHub Actions and Winget Create.
+description: Automate the upgrade of a winget package with GitHub Actions and Winget Create.
date: 2021-08-25
image:
src: /images/surface_2.jpg
diff --git a/content/1.posts/23.azure-functions-without-azurewebjobsstorage.md b/content/1.posts/23.azure-functions-without-azurewebjobsstorage.md
index 3d07b3a..8c58d70 100644
--- a/content/1.posts/23.azure-functions-without-azurewebjobsstorage.md
+++ b/content/1.posts/23.azure-functions-without-azurewebjobsstorage.md
@@ -29,7 +29,7 @@ By default when you create a Function App with its storage account from Azure Po
App settings of your Function App are stored encrypted in Azure so having secrets in a Function App configuration in Azure does not seem a big security threat. Yet, secrets in Azure application settings will be available to anyone who has access to the configuration screen of your Function App (or to Kudu) which does not seem a great idea. Moreover in the application settings of a Function App, there is no proper access monitoring, alerting, and auditing as you would have in an Azure Key Vault. So your secret is not really "safe" there.
-{.rounded-lg .mx-auto}
+{.rounded-lg .mx-auto}
To avoid having someone gaining access to your storage account without you knowing, you probably do not want your storage account connection string to stay in a Function App configuration on Azure Portal.
diff --git a/content/1.posts/24.lost-in-configuration.md b/content/1.posts/24.lost-in-configuration.md
index 5611978..bcbf998 100644
--- a/content/1.posts/24.lost-in-configuration.md
+++ b/content/1.posts/24.lost-in-configuration.md
@@ -1,6 +1,6 @@
---
title: ASP.NET Core - Lost in configuration
-lead: How should you use configuration providers in ASP.NET Core?
+description: How should you use configuration providers in ASP.NET Core?
date: 2021-09-27
image:
src: /images/tokyo.jpg
@@ -26,7 +26,7 @@ Configuration can take many forms and ASP.NET Core has this powerful concept of
When you create a new ASP.NET Core project from a template and run it, you have probably noticed that your configuration is not empty and that by default, multiple configuration providers are already registered.
-{.rounded-lg .mx-auto}
+{.rounded-lg .mx-auto}
Do not worry there is no magic here, it just comes from the call `Host.CreateDefaultBuilder(args)` in your Program.cs.
Here is an extract of what does this method:
diff --git a/content/1.posts/25.w39-2021-tips-learned-this-week.md b/content/1.posts/25.w39-2021-tips-learned-this-week.md
index 12ca5a6..a3bf979 100644
--- a/content/1.posts/25.w39-2021-tips-learned-this-week.md
+++ b/content/1.posts/25.w39-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 39, 2021 - Tips I learned this week
-lead: Azure emulators, Use my current account Edge extension, Azure icons in Visio, and Azure Charts.
+description: Azure emulators, Use my current account Edge extension, Azure icons in Visio, and Azure Charts.
date: 2021-10-04
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/26.w41-2021-tips-learned-this-week.md b/content/1.posts/26.w41-2021-tips-learned-this-week.md
index 54aaddd..3ffdd50 100644
--- a/content/1.posts/26.w41-2021-tips-learned-this-week.md
+++ b/content/1.posts/26.w41-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 41, 2021 - Tips I learned this week
-lead: vscode, vscode Jest extension, csharp attributes for nullables.
+description: vscode, vscode Jest extension, csharp attributes for nullables.
date: 2021-10-18
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/27.migrating-blog.md b/content/1.posts/27.migrating-blog.md
index 2e92857..d0c60bf 100644
--- a/content/1.posts/27.migrating-blog.md
+++ b/content/1.posts/27.migrating-blog.md
@@ -1,6 +1,6 @@
---
title: Migrating and open-sourcing my blog
-lead: What changed on my blog - Statiq, GitHub, giscus, and much more.
+description: What changed on my blog - Statiq, GitHub, giscus, and much more.
date: 2021-11-07
badge:
label: Tooling
diff --git a/content/1.posts/28.w45-2021-tips-learned-this-week.md b/content/1.posts/28.w45-2021-tips-learned-this-week.md
index 5dbc30b..28dcca7 100644
--- a/content/1.posts/28.w45-2021-tips-learned-this-week.md
+++ b/content/1.posts/28.w45-2021-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 45, 2021 - Tips I learned this week
-lead: A bit of tooling and a bit of git.
+description: A bit of tooling and a bit of git.
date: 2021-11-14
description: Vue Devtools, Visual Studio themes, Git tips, and .NET Conf replays.
image:
diff --git a/content/1.posts/29.astral.md b/content/1.posts/29.astral.md
index 7d7eb7d..77081c9 100644
--- a/content/1.posts/29.astral.md
+++ b/content/1.posts/29.astral.md
@@ -1,7 +1,7 @@
---
title: Organize your GitHub stars with Astral
date: 2021-11-28
-lead: Another way to bookmark GitHub repositories.
+description: Another way to bookmark GitHub repositories.
image:
src: /images/stars_1.jpg
badge:
diff --git a/content/1.posts/3.welcome-azure-cli.md b/content/1.posts/3.welcome-azure-cli.md
index 0f2ee65..49f0285 100644
--- a/content/1.posts/3.welcome-azure-cli.md
+++ b/content/1.posts/3.welcome-azure-cli.md
@@ -1,6 +1,6 @@
---
title: Goodbye Azure Portal, Welcome Azure CLI
-lead: Let's jump into Azure CLI!
+description: Let's jump into Azure CLI!
description: Let's jum into Azure CLI to manage Azure resources. The article will show the syntax, the main functionalities and some less-known features like Azure CLI interactive mode.
date: 2019-04-08
image:
@@ -50,7 +50,7 @@ We could have added some arguments to this command, like the `--resource-group`
A few arguments are globally available arguments which means that can be used for every command. This is the case of the `--help` argument which displays help information about a command. The following example showing the use of the `--help` argument allows us to better understand the structure of an Azure CLI command.
-{ .rounded-lg .mx-auto }
+{ .rounded-lg .mx-auto width="800" }
Once used to the Azure CLI syntax, it is way more convenient than the Azure Portal and you don't have to search what Azure PowerShell command you need to use. You just have to look for the available subgroups and commands in the Azure service where you want to work (don't forget to use `--help`) and you will quickly get the job done.
@@ -58,11 +58,11 @@ Once used to the Azure CLI syntax, it is way more convenient than the Azure Port
### Command output
-{ .rounded-lg .mx-auto }
+{ .rounded-lg .mx-auto width="800" }
By default, the output format of Azure CLI commands is JSON but there are other formats you can use by specifying an output argument (`--output` or `-o`) like this: `az group list -o table`.
-{ .rounded-lg .mx-auto }
+{ .rounded-lg .mx-auto width="800" }
::callout{icon="i-fluent-emoji-flat-gem-stone"}
The default output format can be configured using the `az configure` command. This command also allows you to configure other settings like a default resource group for your commands for instance.
@@ -206,11 +206,11 @@ As for most of Azure components, there is an extension in vs code for Azure CLI:
With this extension you can create Azure CLI Scrapbooks which are files with an `.azcli` extension where you have IntelliSense on CLI commands you write.
-{ .rounded-lg .mx-auto width=1000}
+{ .rounded-lg .mx-auto }
It also allows you to run commands in the integrated terminal or run them and show their output in a side-by-side editor as showN in the screenshot below.
-{ .rounded-lg .mx-auto width=1000}
+{ .rounded-lg .mx-auto }
### Azure Cloud Shell
@@ -221,7 +221,7 @@ If we quote the documentation:
In concrete terms, you open a browser, go to https://shell.azure.com, log in to your Azure subscription and you have access to a shell (PowerShell or Bash) that can interact with all the resources of your subscription through Azure CLI.
-{ .rounded-lg .mx-auto width=1000}
+{ .rounded-lg .mx-auto }
Cloud Shell in itself is free but requires an Azure file share to be mounted so you will have regular storage costs (which are low).
@@ -234,7 +234,7 @@ I mentioned Azure CLI interactive mode as a way to have auto-completion. In fact
To enter in interactive mode, you have to type `az interactive` in your terminal.
Then you can type your CLI commands with autocompletion, a description of the command you are using, and examples for it. Moreover, while you are typing a command you will see help about the arguments for this command.
-{ .rounded-lg .mx-auto width=1000}
+{ .rounded-lg .mx-auto }
One thing to notice is that commands you type are scoped to a command group. By default, it's scoped to `az` group so you don't have to type the `az` keyword before your commands. So by default, it only saves you two characters as you will write `group list` instead of `az group list`. But you can set the scope to any subgroup as you can see in the following example.
diff --git a/content/1.posts/30.pulumi-azure-backend.md b/content/1.posts/30.pulumi-azure-backend.md
index f29bdce..c94df9f 100644
--- a/content/1.posts/30.pulumi-azure-backend.md
+++ b/content/1.posts/30.pulumi-azure-backend.md
@@ -1,6 +1,6 @@
---
title: Pulumi with an Azure Blob Storage backend
-lead: Pulumi without Pulumi Service.
+description: Pulumi without Pulumi Service.
date: 2021-12-14
badge:
label: DevOps
diff --git a/content/1.posts/31.pulumi-watch.md b/content/1.posts/31.pulumi-watch.md
index df48f0b..0b6678d 100644
--- a/content/1.posts/31.pulumi-watch.md
+++ b/content/1.posts/31.pulumi-watch.md
@@ -1,6 +1,6 @@
---
title: IaC Hot Reload with Pulumi Watch
-lead: Hot-reloading your cloud infrastructure.
+description: Hot-reloading your cloud infrastructure.
date: 2022-01-02
badge:
label: DevOps
diff --git a/content/1.posts/32.w02-2022-tips-learned-this-week.md b/content/1.posts/32.w02-2022-tips-learned-this-week.md
index bfba032..024f0a4 100644
--- a/content/1.posts/32.w02-2022-tips-learned-this-week.md
+++ b/content/1.posts/32.w02-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 2, 2022 - Tips I learned this week
-lead: Tooling around .NET, Azure, Github and VS Code.
+description: Tooling around .NET, Azure, Github and VS Code.
date: 2022-01-14
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/33.w03-2022-tips-learned-this-week.md b/content/1.posts/33.w03-2022-tips-learned-this-week.md
index b90ba41..7bf0299 100644
--- a/content/1.posts/33.w03-2022-tips-learned-this-week.md
+++ b/content/1.posts/33.w03-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 3, 2022 - Tips I learned this week
-lead: Tooling around .NET, Azure DevOps, and VS Code.
+description: Tooling around .NET, Azure DevOps, and VS Code.
date: 2022-01-24
description: .NET configuration providers, Vite vscode extension, Azure DevOps pull request templates, and degit.
image:
diff --git a/content/1.posts/34.w05-2022-tips-learned-this-week.md b/content/1.posts/34.w05-2022-tips-learned-this-week.md
index 349b734..5f0d7db 100644
--- a/content/1.posts/34.w05-2022-tips-learned-this-week.md
+++ b/content/1.posts/34.w05-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 5, 2022 - Tips I learned this week
-lead: Tooling around .NET, Azure DevOps and VS Code.
+description: Tooling around .NET, Azure DevOps and VS Code.
date: 2022-02-04
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/35.sqldatabase-active-directory-authent.md b/content/1.posts/35.sqldatabase-active-directory-authent.md
index 05c5684..c952b2c 100644
--- a/content/1.posts/35.sqldatabase-active-directory-authent.md
+++ b/content/1.posts/35.sqldatabase-active-directory-authent.md
@@ -1,6 +1,6 @@
---
title: How to provision an Azure SQL Database with Active Directory authentication
-lead: Using Pulumi and its command provider to grant database permissions
+description: Using Pulumi and its command provider to grant database permissions
date: 2022-02-22
image:
src: /images/lockers_1.jpg
diff --git a/content/1.posts/36.pulumi-vs-terraform.md b/content/1.posts/36.pulumi-vs-terraform.md
index 62adcd8..70b232b 100644
--- a/content/1.posts/36.pulumi-vs-terraform.md
+++ b/content/1.posts/36.pulumi-vs-terraform.md
@@ -1,6 +1,6 @@
---
title: Why will I choose Pulumi over Terraform for my next project?
-lead: My take on choosing an Infrastructure as solution
+description: My take on choosing an Infrastructure as solution
date: 2022-05-02
image:
src: /images/clouds_1.jpg
@@ -130,7 +130,7 @@ Today lots of companies are using multiple clouds to meet their needs and to avo
When Pulumi came out in 2018, instead of reinventing the wheel they choose to take advantage of Terraform Providers' mature ecosystem to build most of their own providers. Indeed, Pulumi created tools to adapt/bridge any existing Terraform provider.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
To understand what it means, we have to talk about what is exactly a provider. According to Terraform's documentation, "providers are a logical abstraction of an upstream API. They are responsible for understanding API interactions and exposing resources". That means a provider defines a schema describing the resources available on a cloud provider API, and all the mappings (parameters, models, responses ...) needed to interact with this API. Instead of doing the same job of mapping everything, a Pulumi provider that is created by "bridging" a Terraform provider simply reuses the same schema, that's it. But, Pulumi itself does not use Terraform, they have a completely different engine.
diff --git a/content/1.posts/37.w19-2022-tips-learned-this-week.md b/content/1.posts/37.w19-2022-tips-learned-this-week.md
index 917e727..2d22c95 100644
--- a/content/1.posts/37.w19-2022-tips-learned-this-week.md
+++ b/content/1.posts/37.w19-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 19, 2022 - Tips I learned this week
-lead: Git commands in vscode, a nice tool for Vue developers and a must-have Visual Studio extension.
+description: Git commands in vscode, a nice tool for Vue developers and a must-have Visual Studio extension.
description: Git commands in vscode, a nice tool for Vue developers and a must-have Visual Studio extension.
date: 2022-05-14
image:
@@ -20,11 +20,11 @@ tags:
If you have read my [git cheat sheet](https://www.techwatching.dev/gitcheatsheet), you know that I am a big fan of the [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) vscode extension. I have been using it for a while now but just discovered recently that there is a [Git Command Palette](https://github.com/gitkraken/vscode-gitlens#git-command-palette-) that gives access to most common Git commands.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
Usually, I prefer typing the git commands rather than using a visual tool. This way, I know exactly what I am doing (no magic commands done by a tool behind the scene), and I improve my knowledge of git. However, I think that with Git Command Palette, I get the best of both worlds. The UI helps me to use the git command I need without having to type everything and remember the exact syntax of the command. Yet, this is not a UI with buttons that hide from me the git commands being run. I am still aware of the exact git commands I am using and how.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
On Windows, the default shortcut to use the Git Command Palette is `Ctrl + Shift + G : `.
@@ -32,20 +32,20 @@ On Windows, the default shortcut to use the Git Command Palette is `Ctrl + Shift
If you are a Vue developer and don't know this tool yet, this is going to make your day! When browsing a website, you are probably wondering if it has been made with Vue.js and if so what is the technology stack behind it. Personally, I find it very interesting to know which frameworks, libraries, or plugins have been used to create a website in Vue. And that's what [Vue Telescope](https://vuetelescope.com/) is about. It's an open source tool made by [NuxtLabs](https://nuxtlabs.com/) (the team behind the [Nuxt](https://nuxtjs.org/) framework) that detects the Vue technologies used in a website. It can be used from a browser [extension](https://chrome.google.com/webstore/detail/vue-telescope/neaebjphlfplgdhedjdhcnpjkndddbpd) or from Vue Telescope's [website](https://vuetelescope.com/) to search a analyze a specific website.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
You can explore the Vue.js websites already scanned by VueTelescope [here](https://vuetelescope.com/explore) and filter on the frameworks, UI Frameworks you are interested in.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
## The Visual Studio extension you should try: Add New File
Sometimes the simplest IDE extensions are the best. That's the case for the ["Add New"](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.AddNewFile64) Visual Studio extension which allows you to quickly create a new file by hitting "Shift+F2" and writing the name of the file with its extension. Nothing fancy, but it saves you a lot of time compared to adding a new file using the default dialog.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
As you can see you can even create the missing folders where the file is placed.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
And that's it for this week, happy learning!
\ No newline at end of file
diff --git a/content/1.posts/38.w20-2022-tips-learned-this-week.md b/content/1.posts/38.w20-2022-tips-learned-this-week.md
index e8d191b..42f27ca 100644
--- a/content/1.posts/38.w20-2022-tips-learned-this-week.md
+++ b/content/1.posts/38.w20-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 20, 2022 - Tips I learned this week
-lead: The "this" in TypeScript, a must-have tool for Durable Functions, and a new git alias.
+description: The "this" in TypeScript, a must-have tool for Durable Functions, and a new git alias.
date: 2022-05-23
image:
src: /images/surface_1.jpg
diff --git a/content/1.posts/39.http-clients-secrets.md b/content/1.posts/39.http-clients-secrets.md
index d55f088..7f719ab 100644
--- a/content/1.posts/39.http-clients-secrets.md
+++ b/content/1.posts/39.http-clients-secrets.md
@@ -1,6 +1,6 @@
---
title: Keeping secrets secure when using API Clients
-lead: Playing with Azure CLI and Nushell to generate a secret environment file to send HTTP requests
+description: Playing with Azure CLI and Nushell to generate a secret environment file to send HTTP requests
date: 2022-08-01
image:
src: /images/padlock_1.jpg
diff --git a/content/1.posts/4.gitpod.md b/content/1.posts/4.gitpod.md
index 3c85f70..b00a0cd 100644
--- a/content/1.posts/4.gitpod.md
+++ b/content/1.posts/4.gitpod.md
@@ -1,6 +1,6 @@
---
title: Coming across Gitpod
-lead: An IDE in the browser
+description: An IDE in the browser
date: 2019-08-12
image:
src: /images/github-usbkey.jpg
diff --git a/content/1.posts/40.be-a-developer.md b/content/1.posts/40.be-a-developer.md
index 2eb6a25..826944e 100644
--- a/content/1.posts/40.be-a-developer.md
+++ b/content/1.posts/40.be-a-developer.md
@@ -1,6 +1,6 @@
---
title: What made me want to be a developer?
-lead: Some thoughts about how and why I became a developer
+description: Some thoughts about how and why I became a developer
date: 2022-08-20
badge:
label: Essay
diff --git a/content/1.posts/41.get-unstuck.md b/content/1.posts/41.get-unstuck.md
index a78e2c7..4ea53e2 100644
--- a/content/1.posts/41.get-unstuck.md
+++ b/content/1.posts/41.get-unstuck.md
@@ -1,6 +1,6 @@
---
title: What can we do when stuck with a programming problem?
-lead: Some tips to get unstuck as a developer
+description: Some tips to get unstuck as a developer
date: 2022-08-27
badge:
label: Essay
@@ -80,7 +80,7 @@ I don't know if you use Twitter for technology content but it's an amazing platf
On Twitter, you can also join Communities which are spaces created by people to engage with others who share interests. For instance, if you are struggling with C# code, you could join the dotnet community and tweet your question, some might have encountered the same issue and know how to solve it.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
What I find extraordinary with Twitter is to be able to reach some people that I could not have reached otherwise. And I am not talking only about developer advocates who are easier to approach, but people building the products I am using. When someone from a team building Xamarin, Azure, winget, or GitHub takes the time to explain to you something you are struggling with just by answering your tweet it's always nice. Of course, sometimes people don't see your tweet or don't have the time to answer. However, by experience people on Twitter are usually very kind and answer. Obviously, I don't spend my time harassing developers on Twitter with my questions but I had interesting answers to my tweets and some nice exchanges by private message too.
diff --git a/content/1.posts/42.automate-developer-machine.md b/content/1.posts/42.automate-developer-machine.md
index d6f8e0f..8ae0d69 100644
--- a/content/1.posts/42.automate-developer-machine.md
+++ b/content/1.posts/42.automate-developer-machine.md
@@ -1,6 +1,6 @@
---
title: How did I automate the setup of my developer Windows laptop?
-lead: A git repository, 2 packages managers, a little bit of scripting, and here is my new environment ready
+description: A git repository, 2 packages managers, a little bit of scripting, and here is my new environment ready
date: 2022-09-02
badge:
label: Tooling
diff --git a/content/1.posts/43.http-clients.md b/content/1.posts/43.http-clients.md
index 10ce82f..e947d5e 100644
--- a/content/1.posts/43.http-clients.md
+++ b/content/1.posts/43.http-clients.md
@@ -1,6 +1,6 @@
---
title: Discussion about API clients
-lead: What should you consider when choosing an API client?
+description: What should you consider when choosing an API client?
date: 2022-09-08
image:
src: /images/tools_1.jpg
diff --git a/content/1.posts/44.w46-2022-tips-learned-this-week.md b/content/1.posts/44.w46-2022-tips-learned-this-week.md
index 7aa3adf..2f4db17 100644
--- a/content/1.posts/44.w46-2022-tips-learned-this-week.md
+++ b/content/1.posts/44.w46-2022-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 46, 2022 - Tips I learned this week
-lead: Some tips about .NET, pnpm, and Azure DevOps.
+description: Some tips about .NET, pnpm, and Azure DevOps.
description: Some tips about .NET, pnpm, and Azure DevOps.
date: 2022-11-20
image:
@@ -54,10 +54,10 @@ Check the [documentation](https://pnpm.io/aliases) to see why and how to use thi
GitLens, the awesome extension for vscode has a nice feature called "autolinks" that can make external references in your commit messages clickable links.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
If you are using Azure DevOps, this feature can become very handy for you commit messages that contain references to work items (usually an hasjtag followed by the work item number). You just have to configure # as the prefix and https://dev.azure.com/{organizationName}/{projectName}/_workitems/edit/ as the URL) to make it work.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
And that's it for this week, happy learning!
diff --git a/content/1.posts/45.when-pulumi-met-nuke.md b/content/1.posts/45.when-pulumi-met-nuke.md
index d1bf911..32172aa 100644
--- a/content/1.posts/45.when-pulumi-met-nuke.md
+++ b/content/1.posts/45.when-pulumi-met-nuke.md
@@ -1,6 +1,6 @@
---
title: "When Pulumi met Nuke: a .NET love story"
-lead: Pushing an ASP.NET Core API to Azure using .NET from provisioning to deployment
+description: Pushing an ASP.NET Core API to Azure using .NET from provisioning to deployment
date: 2022-12-18
image:
src: /images/trees_1.jpg
@@ -48,11 +48,11 @@ To package a .NET application, we have to first restore the dependencies, then c
A [`dotnet publish`](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish#description?wt.mc_id=MVP_430820) does an implicit restore and build the application so only one step could be used but I like separating these steps for clarity. Moreover it is sometimes needed, for instance when you are restoring packages from private Nuget feeds.
::
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
I said the application needed to be deployed to Azure App Service but I don't have an existing Azure App Service resource, and I don't want to manually create one. So I also need a step to deploy the infrastructure
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
It seems fine. I will just add another optional step at the beginning to clean the temporary files I could have created on previous builds.
@@ -386,7 +386,7 @@ Let's execute the complete pipeline:
If I go to my Azure portal I can see the new Azure resources, among them an App Service where my Weather API is deployed.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
## Conclusion
diff --git a/content/1.posts/46.2022-retro.md b/content/1.posts/46.2022-retro.md
index e766b4a..b499c4a 100644
--- a/content/1.posts/46.2022-retro.md
+++ b/content/1.posts/46.2022-retro.md
@@ -1,6 +1,6 @@
---
title: A year of learning and sharing - Dev Retro 2022
-lead: Challenges and achievements of 2022
+description: Challenges and achievements of 2022
date: 2023-01-03
image:
src: /images/review_1.jpg
@@ -68,7 +68,7 @@ Here are the most read articles on my blog in 2022 (without taking into account
In 2022, I started submitting some of my articles on [DZone](https://dzone.com/users/4682620/techwatching.html) and continued cross-posting all my articles on [Hashnode](https://techwatching.hashnode.dev/) and [dev.to](https://dev.to/techwatching).
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
Views are great, nevertheless, what pleased me the most was seeing a few nice comments on my articles. When you know your articles helped someone or taught something to someone, it's the best achievement.
diff --git a/content/1.posts/47.pnpm-dlx.md b/content/1.posts/47.pnpm-dlx.md
index b689ea3..e6c94ce 100644
--- a/content/1.posts/47.pnpm-dlx.md
+++ b/content/1.posts/47.pnpm-dlx.md
@@ -1,6 +1,6 @@
---
title: Perform Dynamic Execution of an npm Package
-lead: pnpm dlx
+description: pnpm dlx
date: 2023-05-18
image:
src: /images/pnpm.png
diff --git a/content/1.posts/48.pnpm-env.md b/content/1.posts/48.pnpm-env.md
index dc20c41..aca4e09 100644
--- a/content/1.posts/48.pnpm-env.md
+++ b/content/1.posts/48.pnpm-env.md
@@ -1,6 +1,6 @@
---
title: Manage multiple Node.js versions
-lead: pnpm env
+description: pnpm env
date: 2023-05-25
image:
src: /images/pnpm.png
diff --git a/content/1.posts/5.delegating-handler.md b/content/1.posts/5.delegating-handler.md
index 98ead3a..d1b9dca 100644
--- a/content/1.posts/5.delegating-handler.md
+++ b/content/1.posts/5.delegating-handler.md
@@ -1,6 +1,6 @@
---
title: Handle token retrieval while querying an API
-lead: Using a DelegatingHandler
+description: Using a DelegatingHandler
date: 2020-01-29
image:
src: /images/keyboard_1.jpg
diff --git a/content/1.posts/50.pnpm-exec.md b/content/1.posts/50.pnpm-exec.md
index fd6c4c8..2a58142 100644
--- a/content/1.posts/50.pnpm-exec.md
+++ b/content/1.posts/50.pnpm-exec.md
@@ -1,6 +1,6 @@
---
title: Execute commands using your project dependencies
-lead: pnpm exec
+description: pnpm exec
date: 2023-06-15
image:
src: /images/pnpm.png
diff --git a/content/1.posts/51.vuecicd-ci.md b/content/1.posts/51.vuecicd-ci.md
index f863e7c..355ba0c 100644
--- a/content/1.posts/51.vuecicd-ci.md
+++ b/content/1.posts/51.vuecicd-ci.md
@@ -61,7 +61,7 @@ You can observe that some of these scripts precisely correspond to the necessary
You can see that packages used in the npm scripts are specified in the `devDependencies` section of the `package.json` file. That means these packages will be available to use locally or in a CI server after executing the `pnpm install` command. As part of the CI, other packages may also be needed, so you should include them in the `devDependencies` section as well.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
In your CI pipeline, I think it's a good idea to directly execute the npm scripts of the `package.json` file rather than specifying the packages you want to run along with their corresponding flags and parameters. You can accomplish this by using the [`pnpm run`](https://pnpm.io/fr/cli/run) command like so: `pnpm run build` or `pnpm build` (all npm scripts are aliased by pnpm by default). Of course, you'll need to add any missing npm scripts required for your CI. There are several benefits to this approach:
diff --git a/content/1.posts/52.pnpm-who-is-using.md b/content/1.posts/52.pnpm-who-is-using.md
index 366c5b4..2a2a915 100644
--- a/content/1.posts/52.pnpm-who-is-using.md
+++ b/content/1.posts/52.pnpm-who-is-using.md
@@ -1,6 +1,6 @@
---
title: Who is using pnpm?
-lead: Discussion about pnpm usage and popularity.
+description: Discussion about pnpm usage and popularity.
date: 2023-07-06
badge:
label: Tooling
diff --git a/content/1.posts/53.azure-ready-github-repository.md b/content/1.posts/53.azure-ready-github-repository.md
index b66c3e3..c5d8c5e 100644
--- a/content/1.posts/53.azure-ready-github-repository.md
+++ b/content/1.posts/53.azure-ready-github-repository.md
@@ -1,6 +1,6 @@
---
title: Create an Azure-Ready GitHub Repository using Pulumi
-lead: Using Azure OpenID Connect with Pulumi in GitHub Actions
+description: Using Azure OpenID Connect with Pulumi in GitHub Actions
date: 2023-07-20
image:
src: /images/azureOIDC.webp
@@ -456,7 +456,7 @@ To read the YAML file, I use the `readFileSync` method from the File System API
Now that the infrastructure code to provision the Azure-Ready GitHub repository is written, let's run it with the `pulumi up` command and see if it works!
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
All the resources are correctly created and our new GitHub repository is ready to be used.
diff --git a/content/1.posts/54.ado-workload-identity-federation.md b/content/1.posts/54.ado-workload-identity-federation.md
index f0ecacc..5013b67 100644
--- a/content/1.posts/54.ado-workload-identity-federation.md
+++ b/content/1.posts/54.ado-workload-identity-federation.md
@@ -1,6 +1,6 @@
---
title: Deploying to Azure from Azure DevOps without secrets
-lead: Azure DevOps Workload identity federation (OIDC) with Pulumi
+description: Azure DevOps Workload identity federation (OIDC) with Pulumi
date: 2023-09-21
image:
src: /images/azuredevopsoidc.webp
@@ -57,7 +57,7 @@ I will use Pulumi and its Azure DevOps provider to provision the necessary resou
Here is the complete solution to implement:
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
## Automate the configuration of Workload identity federation in Azure DevOps
diff --git a/content/1.posts/55.scripting-azure-ready-github-repository.md b/content/1.posts/55.scripting-azure-ready-github-repository.md
index 98022c6..7f2fefe 100644
--- a/content/1.posts/55.scripting-azure-ready-github-repository.md
+++ b/content/1.posts/55.scripting-azure-ready-github-repository.md
@@ -1,6 +1,6 @@
---
title: Effortlessly Configure GitHub Repositories for Azure Deployment via OIDC
-lead: Scripting your Azure-Ready GitHub Repository using Azure and GitHub CLI
+description: Scripting your Azure-Ready GitHub Repository using Azure and GitHub CLI
date: 2023-10-23
image:
src: /images/azureOIDC_2.webp
diff --git a/content/1.posts/56.playing-with-dotnet8.md b/content/1.posts/56.playing-with-dotnet8.md
index 8f29697..375bc7c 100644
--- a/content/1.posts/56.playing-with-dotnet8.md
+++ b/content/1.posts/56.playing-with-dotnet8.md
@@ -1,6 +1,6 @@
---
title: Playing with the .NET 8 Web API template
-lead: Enhanced weather forecast API
+description: Enhanced weather forecast API
date: 2023-12-19
image:
src: /images/weather_flag.webp
diff --git a/content/1.posts/57.2023-retro.md b/content/1.posts/57.2023-retro.md
index 87ca2e4..7292130 100644
--- a/content/1.posts/57.2023-retro.md
+++ b/content/1.posts/57.2023-retro.md
@@ -1,6 +1,6 @@
---
title: Another year of sharing and learning - Dev Retro 2023
-lead: Challenges and achievements of 2023
+description: Challenges and achievements of 2023
date: 2024-01-02
image:
src: /images/review_1.jpg
diff --git a/content/1.posts/58.w04-2024-tips-learned-this-week.md b/content/1.posts/58.w04-2024-tips-learned-this-week.md
index 794f67a..0484525 100644
--- a/content/1.posts/58.w04-2024-tips-learned-this-week.md
+++ b/content/1.posts/58.w04-2024-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 4, 2024 - Tips I learned this week
-lead: Some tips about Azure and Azure DevOps.
+description: Some tips about Azure and Azure DevOps.
description: Some tips about Azure and Azure DevOps.
date: 2024-01-29
image:
diff --git a/content/1.posts/59.azure-sdk-di.md b/content/1.posts/59.azure-sdk-di.md
index 5b4bc17..6176dd8 100644
--- a/content/1.posts/59.azure-sdk-di.md
+++ b/content/1.posts/59.azure-sdk-di.md
@@ -1,6 +1,6 @@
---
title: Using dependency injection with Azure .NET SDK
-lead: Register your Azure clients the proper way
+description: Register your Azure clients the proper way
date: 2024-02-19
image:
src: /images/apple-di.webp
diff --git a/content/1.posts/6.cleaning-git-branches.md b/content/1.posts/6.cleaning-git-branches.md
index 965c9ec..b33f449 100644
--- a/content/1.posts/6.cleaning-git-branches.md
+++ b/content/1.posts/6.cleaning-git-branches.md
@@ -1,6 +1,6 @@
---
title: Clean up your local git branches.
-lead: Playing with Nushell to create a useful git alias to delete unused local git branches.
+description: Playing with Nushell to create a useful git alias to delete unused local git branches.
date: 2020-04-06
image:
src: /images/branches_1.jpg
@@ -35,11 +35,11 @@ As my outdated branches are already removed from my remote (thanks to `git fetch
If I take my blog repository as an example I have a bunch of branches: some that could be useful (articles I have started to write but did not finish yet and I don't know if I will one day 😋) and some that are already merged into my master branch through a PR.
-{.rounded-lg .mx-auto width=800}
+{.rounded-lg .mx-auto }
The command `git branch -vl` (which lists in a verbose way the local git branches) gives us an interesting view as it shows the branches for which the remote has been deleted specifying a `[gone]` for them. These branches correspond to the outdated branches we want to delete.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
We know how to identify the outdated branches but we need a command to delete them which is the `git branch -D` command. Now we only need a script to associate the output and input of these two commands to automate the deletion.
@@ -50,15 +50,15 @@ You can find on Stackoverflow some posts like [this one](https://stackoverflow.c
Enough of talking, let's script.
To start with, we can use the nu lines command to create a table from the lines of the `git branch -vl` output (we added an extra `*/*` argument as we are only interested in posts branches).
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
Then we can split the different lines into columns that we can name with the `split column` command. We use spaces to correctly split a line and the option `--collapse-empty` to remove the empty columns.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
We then just have to filter the table to get only the lines with the Status `[gone]`.
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
And the final script:
```bash
@@ -78,6 +78,6 @@ where `gitalias_bcl.nu` is the nu script file we created earlier (it's located h
Now we can simply do a `git bcl` to clean our outdated local git branches.
-{.rounded-lg .mx-auto width=800}
+{.rounded-lg .mx-auto }
That's it, nothing revolutionary but that was the opportunity to automate the boring task of deleting outdated local branches while playing with nushell.
diff --git a/content/1.posts/60.it-event-calendars.md b/content/1.posts/60.it-event-calendars.md
index 04f3137..5c3f68d 100644
--- a/content/1.posts/60.it-event-calendars.md
+++ b/content/1.posts/60.it-event-calendars.md
@@ -1,6 +1,6 @@
---
title: Having Fun With IT Event Calendars
-lead: Playing with AngleSharp
+description: Playing with AngleSharp
date: 2024-03-04
image:
src: /images/calendar_1.webp
diff --git a/content/1.posts/61.http-clients-oauth2.md b/content/1.posts/61.http-clients-oauth2.md
index 96e5fac..9fb407b 100644
--- a/content/1.posts/61.http-clients-oauth2.md
+++ b/content/1.posts/61.http-clients-oauth2.md
@@ -1,6 +1,6 @@
---
title: Call your Azure AD B2C protected API with authenticated HTTP requests from your JetBrains IDE
-lead: Automatically acquire OAuth 2.0 tokens
+description: Automatically acquire OAuth 2.0 tokens
date: 2024-03-11
image:
src: /images/access-code-door.webp
diff --git a/content/1.posts/63.any-terraform-provider-with-pulumi.md b/content/1.posts/63.any-terraform-provider-with-pulumi.md
index 6feb388..4e1fc3e 100644
--- a/content/1.posts/63.any-terraform-provider-with-pulumi.md
+++ b/content/1.posts/63.any-terraform-provider-with-pulumi.md
@@ -1,6 +1,6 @@
---
title: "Using Any Terraform Provider in Pulumi: A Guide with Netlify provider"
-lead: Manage Netlify Resources with Pulumi
+description: Manage Netlify Resources with Pulumi
date: 2024-09-23
image:
src: /images/bridge_cloud_1.jpg
@@ -73,7 +73,7 @@ By default, this command uses the latest version of the Terraform Provider speci
If the Terraform provider you want to use to generate a Pulumi SDK is on your local file system, you can simply specify the path to the provider.
::
-{.rounded-lg .mx-auto width=1000}
+{.rounded-lg .mx-auto }
You can see that a `./sdks/netlify` folder has been created that contains the Pulumi TypeScript SDK for the Netlify provider.
diff --git a/content/1.posts/64.manage-dotnet-versions.md b/content/1.posts/64.manage-dotnet-versions.md
index 0bb1a59..aa185d3 100644
--- a/content/1.posts/64.manage-dotnet-versions.md
+++ b/content/1.posts/64.manage-dotnet-versions.md
@@ -1,6 +1,6 @@
---
title: Five Effective Strategies for Managing .NET Versions
-lead: From the command line to the a GUI tool to manage .NET versions
+description: From the command line to the a GUI tool to manage .NET versions
date: 2024-12-13
image:
src: /images/windows_update_1.jpg
@@ -25,7 +25,7 @@ You can check the supported and unsupported versions of .NET [here](https://dotn
With the `dotnet --list-sdks` command you can display the installed SDKs (same thing for installed runtimes with the command `dotnet --runtimes`).
-{.rounded-lg.mx-auto width="800"}
+{.rounded-lg.mx-auto }
So it’s not too complicated to make a script to uninstall these. It will help you free some space!
@@ -35,7 +35,7 @@ Instead of doing your own script, you can use the [.NET Uninstall Tool](https://
With the `dotnet-core-uninstall list` command, you can see the .NET versions that can be uninstalled. As you can see, it also identifies which versions are used by Visual Studio.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
You can then uninstall .NET versions using the `dotnet-core-uninstall remove` command which has interesting options like `--all-but` to remove all .NET SDKs and runtimes except the ones specified.
@@ -43,7 +43,7 @@ You can then uninstall .NET versions using the `dotnet-core-uninstall remove` co
If you are using Visual Studio, updating it to the latest version will automatically update the .NET versions too. You can also use the installer to add specific .NET versions in the individual components section.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
## 4 - Use a package manager like winget
@@ -51,7 +51,7 @@ The easiest way to manage your .NET versions is by using a package manager. This
For Mac or Linux, you can use homebrew for instance. For Windows I like to use winget.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
With the following command `winget install Microsoft.DotNet.SDK.9`, I can install the .NET 9 SDK.
@@ -59,7 +59,7 @@ With the following command `winget install Microsoft.DotNet.SDK.9`, I can instal
[Dots](https://github.com/nor0x/Dots) is my latest discovery, which I found while looking for a way to uninstall old .NET versions, and it's fantastic. It's an open-source project that offers a GUI to search, install, and uninstall SDKs. What I love about it is that you can see a lot of useful information about the versions, such as their support status, whether they are LTS, and if they are already installed. There are also filters to quickly see which versions you should update or cleanup.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
To summarize, there are various ways to manage your .NET SDK versions. This can help free up space and ensure your system is up-to-date with supported versions. Using a package manager like `winget` is my preferred method for managing .NET versions. However, other tools like Dots or the .NET Uninstall tool can also be very helpful at times.
diff --git a/content/1.posts/65.2024-retro.md b/content/1.posts/65.2024-retro.md
index 3bb8593..4bac6fa 100644
--- a/content/1.posts/65.2024-retro.md
+++ b/content/1.posts/65.2024-retro.md
@@ -1,6 +1,6 @@
---
title: A Year About Community - Dev Retro 2024
-lead: 2024 retrospective and plans for 2025
+description: 2024 retrospective and plans for 2025
date: 2025-01-21T00:00:00.000Z
image:
src: /images/review_1.jpg
diff --git a/content/1.posts/66.developer-experience-thoughts.md b/content/1.posts/66.developer-experience-thoughts.md
index 8054753..e3e9c15 100644
--- a/content/1.posts/66.developer-experience-thoughts.md
+++ b/content/1.posts/66.developer-experience-thoughts.md
@@ -1,6 +1,6 @@
---
title: Thoughts about Developer Experience
-lead: Do not forget about DX when choosing a technology
+description: Do not forget about DX when choosing a technology
date: 2025-02-24
image:
src: /images/laptop_2.jpg
diff --git a/content/1.posts/67.aspnetcore-with-nuxt.md b/content/1.posts/67.aspnetcore-with-nuxt.md
index 1b7c229..ca78bfd 100644
--- a/content/1.posts/67.aspnetcore-with-nuxt.md
+++ b/content/1.posts/67.aspnetcore-with-nuxt.md
@@ -1,6 +1,6 @@
---
title: "Integrating an ASP.NET Core API with a Nuxt Front End: A Step-by-Step Guide"
-lead: When ASP.NET Core Met Nuxt
+description: When ASP.NET Core Met Nuxt
date: 2025-02-25
image:
src: /images/dotnet_nuxt_1.webp
diff --git a/content/1.posts/68.aspnetcore-with-nuxt-https.md b/content/1.posts/68.aspnetcore-with-nuxt-https.md
index 25a7d70..4c541b1 100644
--- a/content/1.posts/68.aspnetcore-with-nuxt-https.md
+++ b/content/1.posts/68.aspnetcore-with-nuxt-https.md
@@ -1,6 +1,6 @@
---
title: "Develop Your ASP.NET .NET And Nuxt Web Application using HTTPS"
-lead: Use HTTPS in local development environment
+description: Use HTTPS in local development environment
date: 2025-02-28
image:
src: /images/dotnet_nuxt_https.webp
diff --git a/content/1.posts/69.aspire-tailor-to-your-stack.md b/content/1.posts/69.aspire-tailor-to-your-stack.md
index a943887..ecfc68e 100644
--- a/content/1.posts/69.aspire-tailor-to-your-stack.md
+++ b/content/1.posts/69.aspire-tailor-to-your-stack.md
@@ -1,6 +1,6 @@
---
title: ".NET Aspirations - Tailor It To Your Stack"
-lead: "Using .NET Aspire with a Nuxt front end"
+description: "Using .NET Aspire with a Nuxt front end"
date: 2025-03-02
image:
src: /images/aspire_1.webp
diff --git a/content/1.posts/7.teams-sso-powershell.md b/content/1.posts/7.teams-sso-powershell.md
index 168082a..7f2253e 100644
--- a/content/1.posts/7.teams-sso-powershell.md
+++ b/content/1.posts/7.teams-sso-powershell.md
@@ -1,6 +1,6 @@
---
title: Automate configuration of Teams Tab SSO with PowerShell.
-lead: Creating a PowerShell script to configure SSO for the tab of a Teams application.
+description: Creating a PowerShell script to configure SSO for the tab of a Teams application.
date: 2020-06-15
image:
src: /images/shell_1.jpg
diff --git a/content/1.posts/70.nuxt-otel.md b/content/1.posts/70.nuxt-otel.md
index 043fe5a..cbffff0 100644
--- a/content/1.posts/70.nuxt-otel.md
+++ b/content/1.posts/70.nuxt-otel.md
@@ -1,6 +1,6 @@
---
title: "How to Develop an Open Telemetry Plugin for Nuxt"
-lead: "Integrating Observability into Your Nuxt Application with OpenTelemetry"
+description: "Integrating Observability into Your Nuxt Application with OpenTelemetry"
date: 2025-03-09
image:
src: /images/nuxt_otel.png
diff --git a/content/1.posts/71.aspire-open-telemetry.md b/content/1.posts/71.aspire-open-telemetry.md
index 913fa4d..cb062dc 100644
--- a/content/1.posts/71.aspire-open-telemetry.md
+++ b/content/1.posts/71.aspire-open-telemetry.md
@@ -1,6 +1,6 @@
---
title: ".NET Aspirations - Embracing OpenTelemetry"
-lead: "Integrating OpenTelemetry with .NET Aspire"
+description: "Integrating OpenTelemetry with .NET Aspire"
date: 2025-03-12
image:
src: /images/aspire-otel.png
@@ -105,15 +105,15 @@ builder.ConfigureOpenTelemetry();
Please note that this method only configures OpenTelemetry. To benefit from service discovery, resilience, and health checks, there are other methods you should call. However, the simplest way is to call `builder.AddServiceDefaults`, which configures everything directly.
::
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
Since .NET Aspire automatically provides the needed OpenTelemetry environment variables to the various resources it manages, the code we added in the `WebApi` will correctly export the traces, metrics, and logs to the dashboard, where they will be displayed.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
If we had other .NET resources (such as other APIs, services, or a Blazor front end), we could configure them just as easily by calling the same methods from `ServiceDefaults`. However, for a browser application, it's not as straightforward.
@@ -134,7 +134,7 @@ The first point can be handled easily by replacing the environment variable `DOT
"DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "https://localhost:16175",
```
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
For the second point, there isn't much we can do. However, even though client instrumentation in the browser is still experimental, the OpenTelemetry JavaScript SDK works well and there are resources to help you set it up:
@@ -212,7 +212,7 @@ var webApp= builder.AddPnpmApp("WebApp", "../WebApp", "dev")
We can check that we now have the environment variables twice (with prefix and without) so that .NET Aspire correctly provides the OTEL configuration in the `WebApp`.
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
And with just that, we can now see both the traces from the `WebApi` and the `WebApp` in the dashboard.
diff --git a/content/1.posts/72.w11-2025-tips-learned-this-week.md b/content/1.posts/72.w11-2025-tips-learned-this-week.md
index 3c71e13..39d4ee7 100644
--- a/content/1.posts/72.w11-2025-tips-learned-this-week.md
+++ b/content/1.posts/72.w11-2025-tips-learned-this-week.md
@@ -1,6 +1,6 @@
---
title: Week 11, 2025 - Tips I learned this week
-lead: Some tips about .NET, vscode, git, HTTP
+description: Some tips about .NET, vscode, git, HTTP
date: 2025-03-17
image:
src: /images/surface_1.jpg
@@ -35,7 +35,7 @@ upgrade-assistant upgrade
Sometimes, we don’t want to clone an entire git repository but just to have a look at it, see how the code is written and that’s it. Browsing code on GitHub is fine but let’s be honest when you start to spend some time in the repository, to search some code it’s not the best experience. Thanks to the [Remote Repositories vscode extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-repositories), you can directly browse code in your vscode without having to clone anything. There are two separate extensions depending on where your git repository is located: [GitHub Repositories](https://marketplace.visualstudio.com/items?itemName=GitHub.remotehub) and [Azure Repos](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-repos).
-{.rounded-lg.mx-auto width="1000"}
+{.rounded-lg.mx-auto }
I find it particularly useful when you want to browse open source code samples.
@@ -45,9 +45,9 @@ I find it particularly useful when you want to browse open source code samples.
Recently, a colleague was trying to troubleshoot HTTP requests to an API that were failing when sent from some C# code but succeeding from another tool. The issue was due to a difference in the User Agent between the two requests. At the time, I didn't think of it, but he could have discovered the problem sooner by using the [`devtunnels echo` command](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/cli-commands#diagnostic-commands). This command sets up a simple server that returns the content of a request. By sending the requests to the localhost `echo` endpoint instead of the API, he could have easily compared the requests from his two tools.
-{.rounded-lg.mx-auto width="800"}
+{.rounded-lg.mx-auto }
-{.rounded-lg.mx-auto width="800"}
+{.rounded-lg.mx-auto }
## Git tip I did know about
diff --git a/content/1.posts/73.aspire-devcert.md b/content/1.posts/73.aspire-devcert.md
index a6f6d42..e75172d 100644
--- a/content/1.posts/73.aspire-devcert.md
+++ b/content/1.posts/73.aspire-devcert.md
@@ -1,6 +1,6 @@
---
title: ".NET Aspirations - Use ASP.NET Core HTTPS Development Certificate"
-lead: "Simplify HTTPS set up in your local development environment"
+description: "Simplify HTTPS set up in your local development environment"
date: 2025-03-18
image:
src: /images/aspire-devcert.png
diff --git a/content/1.posts/74.developer-conferences-pulumi.md b/content/1.posts/74.developer-conferences-pulumi.md
index 14bb7d5..ead26d0 100644
--- a/content/1.posts/74.developer-conferences-pulumi.md
+++ b/content/1.posts/74.developer-conferences-pulumi.md
@@ -1,6 +1,6 @@
---
title: "Deploying a Nuxt Static Website on Azure with Pulumi"
-lead: "Provision the Azure infrastructure for the Developer Conferences website"
+description: "Provision the Azure infrastructure for the Developer Conferences website"
date: 2025-04-06
image:
src: /images/developer-conferences-pulumi.png
diff --git a/content/1.posts/75.christmas-story-generator.md b/content/1.posts/75.christmas-story-generator.md
index 3411e92..1fb94cf 100644
--- a/content/1.posts/75.christmas-story-generator.md
+++ b/content/1.posts/75.christmas-story-generator.md
@@ -1,6 +1,6 @@
---
title: "From Spec to Santa: My C#‑Powered Christmas Story Generator Experiment"
-lead: "When AI meets bedtime stories: a C# holiday experiment"
+description: "When AI meets bedtime stories: a C# holiday experiment"
date: 2025-12-18
image:
src: /images/christmas-story.jpg
diff --git a/content/1.posts/8.technology-watch-part1.md b/content/1.posts/8.technology-watch-part1.md
index 79ad7ad..0449bf4 100644
--- a/content/1.posts/8.technology-watch-part1.md
+++ b/content/1.posts/8.technology-watch-part1.md
@@ -1,6 +1,6 @@
---
title: How to do a technology watch? - Part 1
-lead: Starting your journey with blogs and bloggings/microblogging platforms.
+description: Starting your journey with blogs and bloggings/microblogging platforms.
date: 2020-09-16
image:
src: /images/library_1.jpg
diff --git a/content/1.posts/9.technology-watch-part2.md b/content/1.posts/9.technology-watch-part2.md
index b6a75a4..c407a94 100644
--- a/content/1.posts/9.technology-watch-part2.md
+++ b/content/1.posts/9.technology-watch-part2.md
@@ -1,6 +1,6 @@
---
title: How to do a technology watch? - Part 2
-lead: Where to learn?
+description: Where to learn?
date: 2020-09-18
image:
src: /images/classroom_1.jpg
diff --git a/content/2.speaking.yml b/content/2.speaking.yml
new file mode 100644
index 0000000..522622d
--- /dev/null
+++ b/content/2.speaking.yml
@@ -0,0 +1,115 @@
+navigation.icon: i-ph-microphone-stage
+title: Speaking
+description: Talks, conferences and presentations about Cloud, Infrastructure as Code, and .NET development.
+seo:
+ title: Speaking - Alexandre Nédélec
+ description: Discover my talks and presentations at conferences about Cloud, DevOps, Pulumi, and .NET development.
+events:
+ - name: "Roundtable: Aspire13, DevOps Server, WinUI3, CsWin32"
+ date: 2025-12-10
+ event: devdevdev.net
+ type: podcast
+ format: panel
+ location: Online
+ url: https://devdevdev.net/tr11-2025-aspire13-devops-server-winui3-cswin32/
+ - name: "Roundtable: .NET 10 performance, PATs, Semantic Kernel, Spec-Kit, TypedResult"
+ date: 2025-10-09
+ event: devdevdev.net
+ type: podcast
+ format: panel
+ location: Online
+ url: https://devdevdev.net/tr10-2025-net-10-perfs-les-pat-semantic-kernel-spec-kit-typedresult/
+ - name: Spec Driven Development with GitHub Spec Kit
+ date: 2025-09-29
+ event: VS Code Dev Days Bordeaux 2025
+ type: meetup
+ format: talk
+ location: Bordeaux
+ url: https://www.youtube.com/watch?v=TkQZfDq7LTI&list=PL5Kprdw8GhxdySCoOw9_l5QfqW5a5W69p&index=1&t=3321s
+ - name: "Internal Developer Platform: choose the right path for your organization"
+ date: 2025-06-24
+ event: WAX 2025
+ type: conference
+ format: talk
+ location: Aix-en-Provence
+ url: https://youtu.be/5LrGE_qn_OE?si=rlfWXWBdt0ZK4_xX
+ - name: Master DevOps - The Ultimate DevOps Learning Path with Pulumi
+ date: 2025-01-23
+ event: PulumiTV
+ type: webinar
+ format: interview
+ location: Online
+ url: https://youtu.be/6RXXCxWymEM
+ - name: Infrastructure as Code with Pulumi
+ date: 2024-11-15
+ event: BDX I/O 2024
+ type: conference
+ format: workshop
+ location: Bordeaux
+ - name: Infrastructure as Code with Pulumi
+ date: 2024-10-10
+ event: Cloud Nord 2024
+ type: conference
+ format: workshop
+ location: Lille
+ - name: Industrialize the configuration of your GitHub repositories using IaC
+ date: 2024-09-18
+ event: PulumiUP 2024
+ type: conference
+ format: talk
+ location: Online
+ url: https://youtu.be/C5ZuEVXesOk?si=YhLZflz91CMMcsYV
+ - name: Industrialize the configuration of your GitHub repositories using IaC
+ date: 2024-06-11
+ event: Meetup 3 MTG:Bordeaux
+ type: meetup
+ format: talk
+ location: Bordeaux
+ url: https://www.youtube.com/watch?v=ZYIXMb4C8Dg&list=PL5Kprdw8GhxdySCoOw9_l5QfqW5a5W69p&index=6&t=4056s
+ - name: Code your application and your infrastructure in .NET 8
+ date: 2023-12-05
+ event: .NET Conf 2023 with MTG
+ type: conference
+ format: talk
+ location: Online
+ url: https://youtu.be/10LVhbODDaE?si=iOhCCkVDCmYun499
+ - name: Oops I forgot to make my slides
+ date: 2023-11-15
+ event: BDX I/O 2023
+ type: conference
+ format: lightning
+ location: Bordeaux
+ url: https://youtu.be/XZAIb5CLqok?si=wrQ2Ive-o9DjlNZV
+ - name: Infrastructure as Code or Infrastructure as Software
+ date: 2023-06-29
+ event: BreizhCamp 2023
+ type: conference
+ format: talk
+ location: Rennes
+ url: https://youtu.be/vhJfNetCp9Y?si=fkbiyM00DSwNGj6G
+ - name: IaC to the future with Pulumi
+ date: 2023-06-20
+ event: Cloud Est 2023
+ type: conference
+ format: talk
+ location: Lyon
+ - name: How Pulumi is revolutionizing infrastructure deployment in Azure
+ date: 2023-05-13
+ event: Global Azure France 2023
+ type: conference
+ format: talk
+ location: Paris
+ - name: Infrastructure as Code or Infrastructure as Software
+ date: 2022-06-30
+ event: Cloud Ouest 2022
+ type: conference
+ format: talk
+ location: Online
+ url: https://youtu.be/V_Fis-hxQk4?si=1z1oiLFTcbVbDaDH
+ - name: Pulumi vs. Terraform
+ date: 2022-03-22
+ event: Clash
+ type: webinar
+ format: panel
+ location: Online
+ url: https://www.youtube.com/live/7raXBE5XH7Y?si=7hYJu702DxMSZBjo
diff --git a/content/2.speaking/_dir.yaml b/content/2.speaking/_dir.yaml
deleted file mode 100644
index b8ec265..0000000
--- a/content/2.speaking/_dir.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-navigation.icon: i-ph-microphone-stage
-events:
- - name: Pulumi vs. Terraform
- date: 2022-03-22
- type: online
- image:
- conference: Clash
- url: https://www.youtube.com/live/7raXBE5XH7Y?si=7hYJu702DxMSZBjo
- - name: Infrastructure as Code or Infrastructure as Software
- date: 2022-06-30
- type: conference
- image:
- conference: Cloud Ouest 2022
- url:
- - name: How Pulumi is revolutionizing infrastructure deployment in Azure?s
- date: 2023-05-13
- type: conference
- image:
- conference: Global Azure France 2023
- url:
- - name: IaC to the future with Pulumi
- date: 2023-06-20
- type: conference
- image:
- conference: Cloud Est 2023
- url:
- - name: Infrastructure as Code or Infrastructure as Software
- date: 2023-06-29
- type: conference
- image:
- conference: BreizhCamp 2023
- url: https://youtu.be/vhJfNetCp9Y?si=fkbiyM00DSwNGj6G
- - name: Oops I forgot to make my slides
- date: 2023-06-29
- type: conference
- image:
- conference: BDX I/O 2023
- location: Bordeaux
- url: https://youtu.be/XZAIb5CLqok?si=wrQ2Ive-o9DjlNZV
- speakers:
- - name: Industrialize the configuration of your GitHub repositories using IaC
- type: conference
- location: virtual
- conference: PulumiUP 2024
- - name:
- type: conference
- conference: Cloud Nord 2024
- - name:
- type: conference
- conference: BDX I/O 2024
-
diff --git a/content/3.goodies.yml b/content/3.goodies.yml
new file mode 100644
index 0000000..7b2a9cd
--- /dev/null
+++ b/content/3.goodies.yml
@@ -0,0 +1,4 @@
+title: Goodies
+description: Some things you might find useful.
+navigation.icon: i-heroicons-gift-solid
+align: left
diff --git a/content/3.goodies/.navigation.yml b/content/3.goodies/.navigation.yml
new file mode 100644
index 0000000..512c57b
--- /dev/null
+++ b/content/3.goodies/.navigation.yml
@@ -0,0 +1 @@
+icon: i-heroicons-gift-solid
diff --git a/content/3.goodies/_dir.yml b/content/3.goodies/_dir.yml
deleted file mode 100644
index 203c9d2..0000000
--- a/content/3.goodies/_dir.yml
+++ /dev/null
@@ -1 +0,0 @@
-navigation.icon: i-heroicons-gift-solid
diff --git a/content/about.md b/content/about.md
index 33aca88..295a82a 100644
--- a/content/about.md
+++ b/content/about.md
@@ -5,9 +5,9 @@ navigation.icon: i-heroicons-user-circle-solid
---
Hi, my name is Alexandre Nédélec. I am a software developer living in Bordeaux.
-I graduated from the Engineer School [ENSEIRB-MATMECA](https://enseirb-matmeca.bordeaux-inp.fr) in Computer Sciences over 10 years ago. I am currently working for an IT consulting company specialized in Microsoft Technologies.
+I graduated from the Engineer School [ENSEIRB-MATMECA](https://enseirb-matmeca.bordeaux-inp.fr) in Computer Sciences over :years-since{date="2013-11-01"} years ago. I am currently working for an IT consulting company specialized in Microsoft Technologies.
I am a .NET and Azure enthusiast, primarily coding in C# but I like to discover other languages and technologies too. I want to keep learning and always become a better developer.
My blog and its posts are a good way to remind me of things I have learned, solutions and workarounds to some coding issues I have encountered and helpful tools I have used. This blog is also a place to write about things I am interested in and if it can make some people learn something new or help them solve a problem, that's for the better.
-This website is built using [Nuxt Content](https://content.nuxt.com/) and [NuxtUI Pro](https://ui.nuxt.com/). It was initially created using the [NuxtUI Pro SaaS template](https://github.com/nuxt-ui-pro/saas) but was also inspired by other websites (like [Nuxt website](https://nuxt.com/)). Previously, my blog was generated using [Statiq](https://www.statiq.dev/), but I have switched to Nuxt to benefit from the Nuxt ecosystem.
+This website is built using [Nuxt Content](https://content.nuxt.com/) and [NuxtUI](https://ui.nuxt.com/). It was initially created using the [Nuxt SaaS template](https://github.com/nuxt-ui-templates/saas) but was also inspired by other websites (like [Nuxt website](https://nuxt.com/)). Previously, my blog was generated using [Statiq](https://www.statiq.dev/), but I have switched to Nuxt to benefit from the Nuxt ecosystem.
diff --git a/error.vue b/error.vue
deleted file mode 100644
index c7a21b8..0000000
--- a/error.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-