<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>webX&apos;s Blog</title><description>Technical deep dives, security boundaries and proven implementation patterns from real client projects.</description><link>https://www.web-x.dev/en/blog</link><language>en-GB</language><item><title>Google Maps in Power Pages with React and Web Templates</title><link>https://www.web-x.dev/en/blog/power-pages-react-google-maps-consent</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-google-maps-consent</guid><description>Load Google Maps in Power Pages only after consent. React and Web Templates on detail pages share the same consent status for the SDK and Google Maps instance.</description><pubDate>Wed, 23 Sep 2026 15:00:00 GMT</pubDate></item><item><title>Load Application Insights in Power Pages only after consent</title><link>https://www.web-x.dev/en/blog/power-pages-application-insights-consent</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-application-insights-consent</guid><description>Load Application Insights in Power Pages only after consent: the SDK lifecycle, withdrawal, renewed consent and an important technical limitation.</description><pubDate>Wed, 23 Sep 2026 14:00:00 GMT</pubDate></item><item><title>Building a consent service registry in Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-consent-service-registry</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-consent-service-registry</guid><description>A consent service registry connects consentmanager to Power Pages and React. Vendor IDs, snapshots and events control each service separately.</description><pubDate>Wed, 23 Sep 2026 13:00:00 GMT</pubDate></item><item><title>Power Pages consent management for React and external services</title><link>https://www.web-x.dev/en/blog/power-pages-consent-management-architecture</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-consent-management-architecture</guid><description>Power Pages consent management connects consentmanager, web templates and React. Control external services separately and keep responsibilities clear.</description><pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate></item><item><title>Power Pages favourites with batch GUIDs and Server Logic</title><link>https://www.web-x.dev/en/blog/power-pages-favourites-batch-guids-server-logic</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-favourites-batch-guids-server-logic</guid><description>Power Pages loads favourites as a GUID batch through Server Logic. Typed contracts distinguish results, missing records and invalid IDs.</description><pubDate>Thu, 17 Sep 2026 05:00:00 GMT</pubDate></item><item><title>Power Pages detail search with GUIDs, Server Logic and Liquid</title><link>https://www.web-x.dev/en/blog/power-pages-detail-search-guid-server-logic-liquid</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-detail-search-guid-server-logic-liquid</guid><description>Power Pages detail search uses a GUID, entity type and Server Logic. Resolved DTOs make center and area data directly usable in Liquid.</description><pubDate>Wed, 16 Sep 2026 15:00:00 GMT</pubDate></item><item><title>Power Pages JSON configuration with Liquid, React and JavaScript</title><link>https://www.web-x.dev/en/blog/power-pages-industry-configuration-liquid-react</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-industry-configuration-liquid-react</guid><description>Power Pages industry configuration connects Liquid, JavaScript and React. Stable IDs, independent checks and server-side allowlists protect the contract.</description><pubDate>Sat, 12 Sep 2026 12:00:00 GMT</pubDate></item><item><title>Validating Power Pages search filters and generating safe OData</title><link>https://www.web-x.dev/en/blog/power-pages-search-filter-sanitization-odata</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-search-filter-sanitization-odata</guid><description>Validate Power Pages search filters safely: URL and payload checks remain separate before Server Logic generates controlled OData filters from fixed components.</description><pubDate>Sat, 12 Sep 2026 05:00:00 GMT</pubDate></item><item><title>Power Pages auto-suggest with React, debounce and requests</title><link>https://www.web-x.dev/en/blog/power-pages-react-autosuggest</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-autosuggest</guid><description>Power Pages auto-suggest with React uses debounce, request sequences and clear UI states to prevent stale responses and unnecessary search requests.</description><pubDate>Fri, 11 Sep 2026 13:00:00 GMT</pubDate></item><item><title>Power Pages React CustomEvents for decoupled search results</title><link>https://www.web-x.dev/en/blog/power-pages-react-customevents-results</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-customevents-results</guid><description>Power Pages React CustomEvents separate search state and results. JavaScript, jQuery and React consume validated contracts without shared application state.</description><pubDate>Fri, 11 Sep 2026 12:00:00 GMT</pubDate></item><item><title>Power Pages search filters with URLs, React and browser history</title><link>https://www.web-x.dev/en/blog/power-pages-react-url-browser-history</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-url-browser-history</guid><description>Power Pages React synchronizes search filters with the URL and browser history. pushState, replaceState and popstate make search states shareable and recoverable.</description><pubDate>Wed, 02 Sep 2026 12:00:00 GMT</pubDate></item><item><title>Connecting Power Pages React and Dataverse with typed interfaces</title><link>https://www.web-x.dev/en/blog/power-pages-react-dataverse-typed-interfaces</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-dataverse-typed-interfaces</guid><description>Typed Power Pages interfaces connect React and Dataverse through controllers, services, repositories, transport and validated runtime parsers.</description><pubDate>Wed, 02 Sep 2026 05:00:00 GMT</pubDate></item><item><title>Power Pages Server Logic connecting React and Dataverse securely</title><link>https://www.web-x.dev/en/blog/power-pages-server-logic-security-boundary</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-server-logic-security-boundary</guid><description>Power Pages Server Logic validates browser data, request size, authorization and OData filters before React reaches the Dataverse Custom API.</description><pubDate>Tue, 01 Sep 2026 16:00:00 GMT</pubDate></item><item><title>Power Pages enterprise search with React, Dataverse and Server Logic</title><link>https://www.web-x.dev/en/blog/power-pages-enterprise-search-architecture</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-enterprise-search-architecture</guid><description>The architecture of Power Pages enterprise search with React, Server Logic and Dataverse. An overview of responsibilities, data contracts and security boundaries.</description><pubDate>Tue, 01 Sep 2026 15:00:00 GMT</pubDate></item><item><title>Power Pages React Web Templates with JSON configuration</title><link>https://www.web-x.dev/en/blog/power-pages-react-web-template-configuration</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-web-template-configuration</guid><description>Power Pages React Web Templates separate host, bundle and JSON configuration. One widget runs on landing and results pages in the appropriate mode.</description><pubDate>Tue, 01 Sep 2026 10:00:00 GMT</pubDate></item><item><title>Capture Intake as a separate module with less orchestration in the Express endpoint</title><link>https://www.web-x.dev/en/blog/capture-intake-module-express-endpoint-refactoring</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/capture-intake-module-express-endpoint-refactoring</guid><description>My /ingest endpoint knew too much about validation, content hashes, PostgreSQL, S3, BullMQ and rollback. I moved these rules into a dedicated Capture Intake module without changing behavior.</description><pubDate>Mon, 29 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Batch editing in Power Pages with fast browser-side data validation</title><link>https://www.web-x.dev/en/blog/power-pages-batch-editing-data-validation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-batch-editing-data-validation</guid><description>Learn how to validate hundreds of records in real time and use optimized lookups to keep the user interface responsive.</description><pubDate>Sun, 28 Jun 2026 11:00:00 GMT</pubDate></item><item><title>Multilingual Power Pages and React with centralized content management</title><link>https://www.web-x.dev/en/blog/power-pages-multilingual-content-management</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-multilingual-content-management</guid><description>How to manage translations for complex portals centrally and pass them seamlessly to React components.</description><pubDate>Sat, 27 Jun 2026 12:00:00 GMT</pubDate></item><item><title>Monitoring in Power Pages and why telemetry is essential</title><link>https://www.web-x.dev/en/blog/power-pages-monitoring-portal-modernisation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-monitoring-portal-modernisation</guid><description>Why modernizing a user interface without supporting telemetry data is an unpredictable risk, and how to add Azure Application Insights.</description><pubDate>Fri, 26 Jun 2026 13:00:00 GMT</pubDate></item><item><title>Excel integration in Power Pages for bulk editing without overhead</title><link>https://www.web-x.dev/en/blog/power-pages-excel-integration-bulk-editing</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-excel-integration-bulk-editing</guid><description>Learn how to build Excel files programmatically with ExcelJS and process them directly in Power Pages through automated workflows.</description><pubDate>Thu, 25 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Chunking, Qdrant and retrieval without duplicate RAG search results</title><link>https://www.web-x.dev/en/blog/validating-chunking-storage-search</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/validating-chunking-storage-search</guid><description>I check the new path from worker to search so that a long capture is not only processed, but also appears cleanly as one result.</description><pubDate>Wed, 24 Jun 2026 10:00:00 GMT</pubDate></item><item><title>How I split the embedding workflow in Qdrant into clear steps</title><link>https://www.web-x.dev/en/blog/embedding-workflow-steps-qdrant</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/embedding-workflow-steps-qdrant</guid><description>I rebuilt the worker so that one capture produces multiple token chunks, each chunk is embedded individually, and storage in Qdrant remains completely isolated.</description><pubDate>Tue, 23 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Why I set the chunk size in my RAG system to 1500 tokens</title><link>https://www.web-x.dev/en/blog/chunking-1500-token-safety-margin</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chunking-1500-token-safety-margin</guid><description>The migration to bge-m3 brought an 8192-token limit. Nevertheless, I deliberately set the chunk limit to 1500 tokens to preserve semantic focus.</description><pubDate>Mon, 22 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Why my chunking still failed despite tokenization</title><link>https://www.web-x.dev/en/blog/diagnosing-chunking-token-budgets-special-tokens</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/diagnosing-chunking-token-budgets-special-tokens</guid><description>I had already implemented text splitting, but the context error kept appearing. Only when I accounted for the token budget and special tokens did the cause become clear.</description><pubDate>Sun, 21 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Open the Qdrant dashboard securely with local Traefik and an SSH tunnel</title><link>https://www.web-x.dev/en/blog/secure-qdrant-dashboard-traefik-ssh-tunnel</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/secure-qdrant-dashboard-traefik-ssh-tunnel</guid><description>I wanted to inspect Qdrant data in the browser without making the database public. Locally I use Traefik; in production I open only an SSH tunnel and keep Qdrant internal.</description><pubDate>Sat, 20 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Observability for my Docker Compose stack with Bull Board and Dozzle</title><link>https://www.web-x.dev/en/blog/observability-docker-compose-stack-bull-board-dozzle</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/observability-docker-compose-stack-bull-board-dozzle</guid><description>I wanted to make the path from the extension to storage visible. With Bull Board and Dozzle, I have queue status and container logs directly in the browser and can identify failures much faster.</description><pubDate>Fri, 19 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Fixing the frontend when the nginx healthcheck fails on localhost</title><link>https://www.web-x.dev/en/blog/frontend-healthcheck-nginx-localhost-ipv6</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/frontend-healthcheck-nginx-localhost-ipv6</guid><description>The frontend container was built and running, yet still unhealthy. The cause was a small Alpine pitfall: BusyBox Wget resolved localhost over IPv6 first, while nginx listened only on IPv4.</description><pubDate>Thu, 18 Jun 2026 12:00:00 GMT</pubDate></item><item><title>Wiring Zitadel behind Traefik with issuer, JWKS and Login V2</title><link>https://www.web-x.dev/en/blog/zitadel-behind-traefik-issuer-jwks-login-v2</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/zitadel-behind-traefik-issuer-jwks-login-v2</guid><description>The ingest 401 error did not come from the JWT itself, but from a small architectural mismatch. Issuer, JWKS and Host headers needed the same public view of Zitadel.</description><pubDate>Wed, 17 Jun 2026 11:00:00 GMT</pubDate></item><item><title>Traefik as the single entry point in a Docker Compose stack</title><link>https://www.web-x.dev/en/blog/traefik-single-entry-point-docker-compose-stack</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/traefik-single-entry-point-docker-compose-stack</guid><description>I restructured the stack so that browsers and the extension see only Traefik. Everything else runs through two Docker networks, explicit labels and no more direct host ports.</description><pubDate>Tue, 16 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Redis without authentication and an exposed Qdrant admin port before launch</title><link>https://www.web-x.dev/en/blog/redis-auth-qdrant-port-security-hardening</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/redis-auth-qdrant-port-security-hardening</guid><description>Before launch, I reviewed my architecture for more than scaling. I also examined implicit security assumptions and found two small gaps that could quickly become costly in production.</description><pubDate>Mon, 15 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Docker volumes in production with named volumes, bind mounts and the Hetzner volume approach</title><link>https://www.web-x.dev/en/blog/docker-volumes-production-named-volumes-bind-mounts-hetzner</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/docker-volumes-production-named-volumes-bind-mounts-hetzner</guid><description>I learned that a Docker named volume does not automatically end up on a Hetzner volume in production. Only when I deliberately control the path do I really know where Qdrant, Redis and certificates are written.</description><pubDate>Sun, 14 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Embedding model lock-in with mxbai-embed-large as a permanent production decision</title><link>https://www.web-x.dev/en/blog/embedding-model-lock-in-mxbai-embed-large-vector-dimensions</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/embedding-model-lock-in-mxbai-embed-large-vector-dimensions</guid><description>I do not treat the choice of embedding model as an interchangeable environment variable. In Qdrant, it becomes part of every collection. Using different vector spaces locally and in production creates an expensive future migration.</description><pubDate>Sat, 13 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Implementing GDPR Article 17 correctly with Promise.allSettled and export batching</title><link>https://www.web-x.dev/en/blog/gdpr-article-17-promise-allsettled-export-batching</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/gdpr-article-17-promise-allsettled-export-batching</guid><description>A sequential await chain in the DELETE account endpoint means that if Qdrant fails, S3 data and the Zitadel identity remain. That is a GDPR Article 17 risk. The solution is Promise.allSettled with structured failure reporting. Alongside that: how batching prevents an OOM crash in the export endpoint.</description><pubDate>Fri, 12 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Two-layer rate limiting with Traefik and express-rate-limit backed by Redis</title><link>https://www.web-x.dev/en/blog/two-layer-rate-limiting-traefik-express-redis</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/two-layer-rate-limiting-traefik-express-redis</guid><description>Without rate limiting, one script can exhaust the AI provider key within minutes. Two independent layers address this: Traefik limits by IP, while express-rate-limit with Redis backing limits by authenticated user. Why both layers matter and how to handle the Redis adapter’s TypeScript mismatch.</description><pubDate>Thu, 11 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Traefik instead of NGINX for a growing Docker Compose stack</title><link>https://www.web-x.dev/en/blog/traefik-reverse-proxy-docker-compose-multi-service</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/traefik-reverse-proxy-docker-compose-multi-service</guid><description>With eight services in a Docker Compose stack, nginx.conf becomes a maintenance burden. Traefik reads service configuration directly from Docker labels, terminates TLS automatically through ACME and needs no separate configuration file. Why I switched and what the configuration looks like.</description><pubDate>Wed, 10 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Backend code review with six problems fixed before launch</title><link>https://www.web-x.dev/en/blog/backend-code-review-before-launch</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/backend-code-review-before-launch</guid><description>Before going live, I read through the entire backend again. I found six concrete problems and fixed them all. Here is what I found, where I found it and why each issue mattered.</description><pubDate>Tue, 09 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Why I removed Zitadel bootstrap because of Host header validation in Docker</title><link>https://www.web-x.dev/en/blog/zitadel-bootstrap-host-header-bug-manual-setup</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/zitadel-bootstrap-host-header-bug-manual-setup</guid><description>The bootstrap container exited with code 22. The cause was not an incorrect API URL, but Zitadel Host header validation inside the Docker network.</description><pubDate>Mon, 08 Jun 2026 10:00:00 GMT</pubDate></item><item><title>When backend and frontend know different types</title><link>https://www.web-x.dev/en/blog/frontend-api-types-health-response-breaking-change</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/frontend-api-types-health-response-breaking-change</guid><description>A TypeError in the browser after a backend refactoring. The cause is not a bug in the code, but an outdated frontend type that did not know the new API response shape.</description><pubDate>Sun, 07 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Qdrant multi-tenancy with a separate collection per user</title><link>https://www.web-x.dev/en/blog/qdrant-multi-tenancy-per-user-collections-gdpr</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/qdrant-multi-tenancy-per-user-collections-gdpr</guid><description>Phase 3 introduces real data isolation. Each user gets a separate Qdrant collection, an individual S3 path and three new endpoints for GDPR rights.</description><pubDate>Sat, 06 Jun 2026 10:00:00 GMT</pubDate></item><item><title>access_token, id_token and the Userinfo endpoint</title><link>https://www.web-x.dev/en/blog/access-token-id-token-userinfo-oidc</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/access-token-id-token-userinfo-oidc</guid><description>OAuth 2.0 and OIDC return two tokens at login, and almost every implementation reads the email address from the wrong one. Why access_token and id_token serve fundamentally different purposes, and why the Userinfo endpoint is the more reliable source for user profile data.</description><pubDate>Fri, 05 Jun 2026 10:00:00 GMT</pubDate></item><item><title>MinIO instead of Azurite for S3-compatible object storage locally and on Hetzner</title><link>https://www.web-x.dev/en/blog/minio-s3-compatible-object-storage-local-hetzner</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/minio-s3-compatible-object-storage-local-hetzner</guid><description>Azurite ties the project to Azure Blob Storage. MinIO speaks the same S3 API as Hetzner Object Storage. Changing environment variables is enough to move to production. Alongside that: how the Zitadel bootstrap container creates OIDC apps automatically.</description><pubDate>Thu, 04 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Event-driven ingestion with BullMQ and Redis</title><link>https://www.web-x.dev/en/blog/bullmq-event-driven-ingestion-queue</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/bullmq-event-driven-ingestion-queue</guid><description>POST /ingest blocked the extension until embedding generation and the Qdrant upsert finished. BullMQ and Redis make ingestion asynchronous: an immediate 202, background processing and status queries through GET /captures/:id/status.</description><pubDate>Wed, 03 Jun 2026 10:00:00 GMT</pubDate></item><item><title>Vite build-time environment variables in Docker and why ARG is unnecessary</title><link>https://www.web-x.dev/en/blog/vite-env-vars-docker-build-context</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/vite-env-vars-docker-build-context</guid><description>Vite embeds import.meta.env variables at build time instead of reading them at runtime. In Docker, this works through the build context, not ARG/ENV. A common mistake with a surprisingly simple solution.</description><pubDate>Tue, 02 Jun 2026 18:00:00 GMT</pubDate></item><item><title>Managing six authentication states in a React frontend with react-oidc-context and Zitadel</title><link>https://www.web-x.dev/en/blog/react-oidc-context-zitadel-frontend</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/react-oidc-context-zitadel-frontend</guid><description>react-oidc-context handles the browser PKCE flow. The real challenge is not the login button, but correctly handling all six authentication states in App.tsx and backend JWT middleware using Zitadel’s JWKS endpoint.</description><pubDate>Mon, 01 Jun 2026 18:00:00 GMT</pubDate></item><item><title>PKCE OAuth in a Chrome MV3 Extension with chrome.identity.launchWebAuthFlow</title><link>https://www.web-x.dev/en/blog/pkce-chrome-extension-zitadel</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/pkce-chrome-extension-zitadel</guid><description>chrome.identity.launchWebAuthFlow is the right entry point for PKCE OAuth in Chrome Extensions. How token storage in chrome.storage.sync, automatic renewal and the extension-specific redirect URI work together.</description><pubDate>Sun, 31 May 2026 18:00:00 GMT</pubDate></item><item><title>Setting up Zitadel Login V2 in Docker Compose with fixes for three hidden errors</title><link>https://www.web-x.dev/en/blog/zitadel-login-v2-docker-compose</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/zitadel-login-v2-docker-compose</guid><description>Zitadel v4 includes its own Next.js login UI. Setting it up in Docker Compose encounters three non-obvious problems: the Postgres 18 volume layout, missing PAT file permissions and incorrect BaseURI configuration.</description><pubDate>Sat, 30 May 2026 18:00:00 GMT</pubDate></item><item><title>Lowercase normalization and duplicate detection in tag input with a chip animation</title><link>https://www.web-x.dev/en/blog/tag-input-lowercase-duplicate-animation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/tag-input-lowercase-duplicate-animation</guid><description>Tags in a vector database need consistency. &quot;Rolex&quot; and &quot;rolex&quot; are different tokens, and both enter the embedding. A toLowerCase() call and an animated chip response to duplicates solve this without UI friction.</description><pubDate>Fri, 29 May 2026 17:00:00 GMT</pubDate></item><item><title>Instagram keyboard shortcuts block Chrome Extension input</title><link>https://www.web-x.dev/en/blog/instagram-keyboard-shortcuts-keydown-propagation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/instagram-keyboard-shortcuts-keydown-propagation</guid><description>Type &quot;n&quot; in a Chrome Extension text field and Instagram suddenly opens a panel. That is no coincidence. A look at event bubbling, document-level listeners and why stopPropagation() in the right place solves it.</description><pubDate>Thu, 28 May 2026 16:00:00 GMT</pubDate></item><item><title>Notes and tags when saving screenshots in a Shadow DOM overlay</title><link>https://www.web-x.dev/en/blog/chrome-extension-notes-tags-capture-overlay</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chrome-extension-notes-tags-capture-overlay</guid><description>Notes and tags are entered directly in the capture overlay, persisted in Qdrant and included in the embedding. How types, Shadow DOM and a chip input make this work.</description><pubDate>Wed, 27 May 2026 15:00:00 GMT</pubDate></item><item><title>Capture a complete Instagram carousel with MutationObserver</title><link>https://www.web-x.dev/en/blog/instagram-carousel-all-slides-mutationobserver</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/instagram-carousel-all-slides-mutationobserver</guid><description>Instagram lazy-loads carousel slides. Only the first two are in the DOM when a post opens. A MutationObserver and a while loop automatically extract every slide without touching a single class name.</description><pubDate>Tue, 26 May 2026 14:00:00 GMT</pubDate></item><item><title>Extract Instagram PostId correctly from the feed and profile grid</title><link>https://www.web-x.dev/en/blog/instagram-dom-traversal-postid-extraction</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/instagram-dom-traversal-postid-extraction</guid><description>Instagram uses article tags in the feed, but not in the profile grid. Ancestor traversal fixes incorrect PostIds, while a promise map prevents duplicate backend requests.</description><pubDate>Mon, 25 May 2026 14:00:00 GMT</pubDate></item><item><title>Debugging and preventing race conditions in Chrome Extensions</title><link>https://www.web-x.dev/en/blog/chrome-extension-race-condition-platform-detection</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chrome-extension-race-condition-platform-detection</guid><description>The Shadow DOM overlay triggered a race condition. Instagram was detected as generic, and all metadata was missing. The cause and fix using capturedElement and a previewOpen flag.</description><pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate></item><item><title>Chrome Extension with Shadow DOM preview and Tailwind CSS v4</title><link>https://www.web-x.dev/en/blog/chrome-extension-phase-2-shadow-dom-tailwind-duplicate-detection</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chrome-extension-phase-2-shadow-dom-tailwind-duplicate-detection</guid><description>Phase 2 adds three features: a Shadow DOM preview overlay before saving, color-coded duplicate detection on hover, and a popup styled with Tailwind CSS v4.</description><pubDate>Sat, 23 May 2026 10:00:00 GMT</pubDate></item><item><title>Chrome Extension foundation with a health indicator and retry queue</title><link>https://www.web-x.dev/en/blog/chrome-extension-phase-1-foundation-trust</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chrome-extension-phase-1-foundation-trust</guid><description>Phase 1 establishes the foundation: a health indicator, retry queue and capture history make the Chrome Extension reliable and transparent in everyday use.</description><pubDate>Fri, 22 May 2026 12:00:00 GMT</pubDate></item><item><title>Load complete Instagram captions with MutationObserver</title><link>https://www.web-x.dev/en/blog/instagram-caption-more-button-mutationobserver</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/instagram-caption-more-button-mutationobserver</guid><description>Instagram truncates captions and changes class names with every deployment. Semantic DOM searches and a MutationObserver still load the full text reliably.</description><pubDate>Thu, 21 May 2026 10:00:00 GMT</pubDate></item><item><title>Why module Node16 breaks a Vite extension and how to fix it</title><link>https://www.web-x.dev/en/blog/fix-tsconfig-moduleresolution-vite-errors</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/fix-tsconfig-moduleresolution-vite-errors</guid><description>Nine TypeScript errors at once, all about missing .js extensions in imports. The cause is a tsconfig.json setting that is correct for Node.js but incompatible with Vite as a bundler. I explain why and show the right configuration.</description><pubDate>Wed, 20 May 2026 10:00:00 GMT</pubDate></item><item><title>Why a manual docker exec led to an automated Ollama entrypoint setup</title><link>https://www.web-x.dev/en/blog/ollama-auto-pull-entrypoint</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/ollama-auto-pull-entrypoint</guid><description>After the first successful start of my RAG system, I thought it was finished. Then I saw a docker exec step in the Quick Start and could not leave it alone. How a small source of friction led to a better architecture.</description><pubDate>Tue, 19 May 2026 10:00:00 GMT</pubDate></item><item><title>Ollama locally or in Docker? Why this decision affects the entire architecture</title><link>https://www.web-x.dev/en/blog/ollama-local-or-docker-decision</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/ollama-local-or-docker-decision</guid><description>When I received &quot;Ollama is not reachable&quot;, I faced a real architectural decision: install Ollama on the host or run it as a Docker container? The answer changed my entire deployment strategy.</description><pubDate>Mon, 18 May 2026 10:00:00 GMT</pubDate></item><item><title>Docker Compose override pattern for local development and Azure deployment</title><link>https://www.web-x.dev/en/blog/docker-compose-local-azure-deployment-strategy</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/docker-compose-local-azure-deployment-strategy</guid><description>Most projects have one docker-compose.yml for local development and a completely different one for the cloud. That creates drift, errors and &quot;works on my machine&quot; problems. I show how the Docker Compose override pattern manages both environments with the same base files.</description><pubDate>Sun, 17 May 2026 12:00:00 GMT</pubDate></item><item><title>Chrome Extension MV3 with three isolated contexts and type-safe message passing</title><link>https://www.web-x.dev/en/blog/chrome-extension-mv3-three-contexts</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/chrome-extension-mv3-three-contexts</guid><description>A Chrome Extension has no &quot;main.js&quot;. It has three completely isolated runtime contexts that must communicate through a strict message protocol. Understanding this distinction is what makes extensions robust rather than fragile.</description><pubDate>Sat, 16 May 2026 10:00:00 GMT</pubDate></item><item><title>AI provider abstraction for a flexible RAG system with Ollama and OpenAI</title><link>https://www.web-x.dev/en/blog/ai-provider-abstraction-ollama-openai-strategy</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/ai-provider-abstraction-ollama-openai-strategy</guid><description>I could have built Ollama directly into the backend. I could have built OpenAI directly into it. Instead, I built an abstraction layer that allows both, and understood why this is not overengineering but the only strategically sound decision.</description><pubDate>Fri, 15 May 2026 10:00:00 GMT</pubDate></item><item><title>Building a RAG system with Qdrant, embeddings and Node.js</title><link>https://www.web-x.dev/en/blog/building-vector-database-embeddings-rag-system</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/building-vector-database-embeddings-rag-system</guid><description>Retrieval-Augmented Generation is not theory. It is a concrete three-step architecture: embed, retrieve and generate. I show how I implemented it entirely locally with Qdrant, nomic-embed-text and llama3.2, without cloud costs.</description><pubDate>Thu, 14 May 2026 11:00:00 GMT</pubDate></item><item><title>From a screenshot extension to an AI memory engine with RAG, Qdrant and Ollama</title><link>https://www.web-x.dev/en/blog/rag-ai-memory-engine-vision</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/rag-ai-memory-engine-vision</guid><description>A Chrome Extension for Instagram metadata was the starting point. It grew into a complete RAG system built on Qdrant, Ollama and TypeScript that runs locally, is cloud-ready and enables semantic search across captured social media data.</description><pubDate>Wed, 13 May 2026 10:00:00 GMT</pubDate></item><item><title>Power Pages architecture beyond the jQuery monolith</title><link>https://www.web-x.dev/en/blog/power-pages-architecture-jquery-monolith-react</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-architecture-jquery-monolith-react</guid><description>Why traditional Power Pages frontends with a global jQuery context reach their limits over time, and how a hybrid React architecture enables reliability.</description><pubDate>Tue, 12 May 2026 10:00:00 GMT</pubDate></item><item><title>React in Power Pages and frontend architecture for enterprise portals</title><link>https://www.web-x.dev/en/blog/power-pages-react-frontend-integration</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-frontend-integration</guid><description>Why choose between low-code and React? Learn how to embed React components in Power Pages and deliver a modern user experience.</description><pubDate>Mon, 11 May 2026 10:00:00 GMT</pubDate></item><item><title>Automating React application deployment in Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-pac-cli-automated-react-deployment</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-pac-cli-automated-react-deployment</guid><description>Learn how to replace inefficient manual uploads in Power Pages with an automated deployment script and a side-by-side architecture.</description><pubDate>Sat, 09 May 2026 09:00:00 GMT</pubDate></item><item><title>Loading local resources safely in Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-resource-management</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-resource-management</guid><description>External CDNs often fail against strict CSP policies in Power Pages. We show the options for providing scripts and stylesheets natively as Web Files and loading them synchronously in the browser.</description><pubDate>Fri, 08 May 2026 08:00:00 GMT</pubDate></item><item><title>Full-text search with Astro and Pagefind</title><link>https://www.web-x.dev/en/blog/astro-pagefind-search-architecture</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/astro-pagefind-search-architecture</guid><description>Learn how we use Pagefind and Astro to deliver fast, static full-text search without expensive backend infrastructure.</description><pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate></item><item><title>Power Pages supply chain attack</title><link>https://www.web-x.dev/en/blog/power-pages-supply-chain-attack</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-supply-chain-attack</guid><description>One compromised script in the header is enough to steal your portal users’ identities. Learn how a supply chain attack targets Microsoft Power Pages and how a strict architecture protects your portal.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate></item><item><title>GDPR-compliant web tracking in Power Pages with Application Insights</title><link>https://www.web-x.dev/en/blog/power-pages-application-insights-gdpr-case-study</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-application-insights-gdpr-case-study</guid><description>How companies combine Application Insights and consent managers to build meaningful user analytics in Power Pages without compromising data protection.</description><pubDate>Tue, 05 May 2026 08:00:00 GMT</pubDate></item><item><title>Enterprise payment integration with secure Stripe checkouts through Power Automate in Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-stripe-payment-integration</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-stripe-payment-integration</guid><description>How to implement PCI-compliant payment processes in low-code platforms. An architectural deep dive into server-side Stripe orchestration through Power Automate.</description><pubDate>Mon, 04 May 2026 10:00:00 GMT</pubDate></item><item><title>Actionable Analytics with an Application Insights architecture in Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-analytics-application-insights</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-analytics-application-insights</guid><description>Why conventional logging approaches often fall short in low-code portals and how asynchronous Azure Functions and Dataverse generate GDPR-compliant user dashboards.</description><pubDate>Sun, 03 May 2026 08:00:00 GMT</pubDate></item><item><title>Power Pages e-commerce modernization</title><link>https://www.web-x.dev/en/blog/power-pages-ecommerce-modernisation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-ecommerce-modernisation</guid><description>Learn how to protect substantial investments in Microsoft Power Pages and achieve enterprise-level performance through a hybrid architecture.</description><pubDate>Fri, 01 May 2026 10:00:00 GMT</pubDate></item><item><title>A new design stack for Power Pages with native TailwindCSS and DaisyUI</title><link>https://www.web-x.dev/en/blog/power-pages-tailwindcss-daisyui</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-tailwindcss-daisyui</guid><description>Standard portal applications often reach their visual limits. Native TailwindCSS and DaisyUI integration creates a modern user experience without compromising the core architecture.</description><pubDate>Thu, 30 Apr 2026 08:00:00 GMT</pubDate></item><item><title>Real-time shopping cart architecture in Power Pages beyond caching limits</title><link>https://www.web-x.dev/en/blog/power-pages-caching-real-time-cart</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-caching-real-time-cart</guid><description>How to combine performance and dynamic data synchronization in Power Pages. An architectural analysis of bypassing server-side caching with the Power Pages Web API.</description><pubDate>Wed, 29 Apr 2026 08:00:00 GMT</pubDate></item><item><title>Rethinking Power Pages with hybrid React architecture for scalable portals</title><link>https://www.web-x.dev/en/blog/power-pages-react-architecture</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-react-architecture</guid><description>Learn why Power Pages portals reach their limits and how professional React web development creates a scalable hybrid architecture with a low-code backend and high-end frontend.</description><pubDate>Tue, 28 Apr 2026 10:00:00 GMT</pubDate></item><item><title>Developing a design system for Power Pages</title><link>https://www.web-x.dev/en/blog/power-pages-design-system-isolation</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-design-system-isolation</guid><description>Do global Power Pages styles conflict with your design system? Learn the three-layer CSS isolation strategy and avoid collisions.</description><pubDate>Mon, 27 Apr 2026 10:00:00 GMT</pubDate></item><item><title>Power Pages design system and clean CSS overrides</title><link>https://www.web-x.dev/en/blog/power-pages-design-system</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-design-system</guid><description>Removing Bootstrap and system CSS from Microsoft Power Pages causes errors. Build a custom design system safely by selectively overriding standard styles.</description><pubDate>Sun, 26 Apr 2026 10:00:00 GMT</pubDate></item><item><title>Power Pages design and why standard files always load</title><link>https://www.web-x.dev/en/blog/power-pages-design-standard-files</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-design-standard-files</guid><description>Learn why Microsoft Power Pages automatically loads standard CSS and JavaScript files even when you disable or delete them, how they affect your portal design, and how a small JavaScript snippet lets you regain control over loaded resources.</description><pubDate>Sat, 25 Apr 2026 10:00:00 GMT</pubDate></item><item><title>Power Pages Web API response behavior for POST requests</title><link>https://www.web-x.dev/en/blog/power-pages-web-api-response</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/power-pages-web-api-response</guid><description>An overview of Power Pages Web API responses to POST requests. Why do you receive 204 No Content, and how do you extract the created record ID from the header?</description><pubDate>Fri, 24 Apr 2026 10:00:00 GMT</pubDate></item><item><title>A production-ready carousel component with Astro and TypeScript</title><link>https://www.web-x.dev/en/blog/astro-carousel-component-typescript-no-dependencies</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/astro-carousel-component-typescript-no-dependencies</guid><description>Learn how to build a fully featured, responsive carousel component from scratch with Astro and TypeScript, without external dependencies.</description><pubDate>Sat, 24 Jan 2026 10:00:00 GMT</pubDate></item><item><title>Reduce Azure Monitor costs with efficient data collection</title><link>https://www.web-x.dev/en/blog/azure-monitor-reduce-data-collection-costs</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/azure-monitor-reduce-data-collection-costs</guid><description>In this guide, I explain how Azure Monitor costs arise and which strategic measures can reduce them.</description><pubDate>Thu, 01 Jan 2026 10:00:00 GMT</pubDate></item><item><title>Cost optimisation in Azure Log Analytics and Azure Application Insights</title><link>https://www.web-x.dev/en/blog/azure-log-analytics-application-insights-cost-optimisation-case-study</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/azure-log-analytics-application-insights-cost-optimisation-case-study</guid><description>How a detailed analysis and targeted measures in Azure Log Analytics and Application Insights led to measurable cost savings of around 70% for a client</description><pubDate>Wed, 10 Sep 2025 09:00:00 GMT</pubDate></item><item><title>Reduce Azure Monitor costs with Data Collection Rules and table transformations</title><link>https://www.web-x.dev/en/blog/data-collection-rule</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/data-collection-rule</guid><description>Learn how Data Collection Rules (DCRs) and table transformations can significantly reduce the costs of Azure Monitor and Log Analytics Workspace.</description><pubDate>Mon, 01 Sep 2025 08:00:00 GMT</pubDate></item><item><title>Debugging Angular in VS Code on Ubuntu</title><link>https://www.web-x.dev/en/blog/angular-debugging-vscode-ubuntu</link><guid isPermaLink="true">https://www.web-x.dev/en/blog/angular-debugging-vscode-ubuntu</guid><description>How to debug Angular projects in VS Code on Ubuntu again when the default debugger stops working. A step-by-step guide with practical tips.</description><pubDate>Thu, 21 Aug 2025 16:00:00 GMT</pubDate></item></channel></rss>