Website Rebuild & Patch Notes

| Web | 152 Reads

After months of planning and development, I'm excited to share the fully rebuilt version of my website. This update marks a major shift in both design and architecture — moving away from the legacy ASP.NET Core 2.1 MVC framework to a modern .NET 8 Blazor Web App, combining both Blazor Server and WebAssembly.

In this post, I’ll highlight the key changes, fixes, and improvements made in March 2025. Whether you're here to see what’s new or you're curious about the technical migration process, this summary should give you a clear overview of what’s been done — and why.


September 26, 2026

Update: Most Read Controls & Admin Improvements

Public Most Read Controls

  • Added an Include in Most Read option to the article editor, allowing individual articles to be excluded from the public homepage's Sort by Reads list.
  • This setting only affects that list. Articles remain available through search, including search results sorted by reads, chronological browsing, category and archive pages, and direct links. Global visibility remains controlled separately by IsHidden.
  • Exclusions are applied before page counts and pagination, including articles that are pinned.
  • Added the database field through an EF Core migration, with existing articles included by default. Saving changes invalidates the homepage list cache so subsequent page loads reflect the new settings.

Admin Article Management

  • Added Newest First and Most Read sorting to the admin article list. Both work with the existing search and filter options.
  • Added an Include in Most Read filter with All, Included, and Excluded options. The table now displays status labels, with excluded articles highlighted for easier identification.
  • The admin Most Read sort continues to include articles excluded from the public ranking unless an explicit filter is selected.
  • Fixed the All option in the IsPinned, IsCategoryPinned, and IsHidden filters, which previously displayed incorrectly as False.

Account Navigation

  • Updated Blazor Identity redirects to use .NET 10's non-throwing navigation behavior, preventing normal account redirects from interrupting debugging with a NavigationException.
  • Updated affected account and admin page flows to stop processing after redirects, and added regression coverage for navigation and Most Read behavior.

July 9, 2026

Enhancement: Category Ordering

  • Replaced the paginated admin category list with a single list that supports drag-and-drop ordering.
  • Reordering automatically updates and saves DisplayOrder, with feedback showing the save status.
  • New categories default to the end of the existing order.
  • Removed the redundant order column and kept DisplayOrder synchronized with the displayed arrangement.

June 10–11, 2026

Enhancement: Keyboard Navigation & Focus Handling

  • Converted article cards into standard links so they can be reached with Tab and opened with Enter.
  • Added a visible article-title focus indicator for keyboard navigation, while avoiding unnecessary focus outlines after mouse or touch navigation.
  • Preserved the navigation input mode across page transitions and improved focus handling after Blazor enhanced navigation, including navigation from Related Articles.
  • Restricted the EF Core migrations endpoint to the Development environment.

June 9, 2026

Update: Site Search, Related Articles & SEO

Built-in Site Search

  • Replaced the external search flow with an internal search page that matches article titles and summaries.
  • Added sorting by time or reads, keyword highlighting, and search timing information.
  • Improved empty-result messages and the return-to-home action, and fixed unwanted focus behavior when submitting a search with Enter.

Related Articles & Metadata

  • Added a Related Articles section, prioritizing articles in the same category. Each recommendation card is fully clickable.
  • Added article descriptions, canonical URLs, Open Graph and Twitter metadata, publication and modification dates, and JSON-LD TechArticle structured data.
  • Added noindex metadata for missing or unavailable articles.

Rendering & Development Fixes

  • Moved shared frontend styles and favicon declarations outside dynamic article head content to keep styling consistent during navigation.
  • Improved wrapping for long article text and links to prevent horizontal overflow on narrow screens.
  • Disabled advertising scripts in Debug builds to prevent third-party script errors from interrupting local debugging.
  • Updated the publish profile to target .NET 10.

June 4, 2026

Platform Update: .NET 10

  • Upgraded both the server and WebAssembly client projects from .NET 8 to .NET 10, along with the associated Blazor packages.
  • Kept EF Core and the MySQL provider on compatible 9.x versions.
  • Updated static asset mapping and trusted proxy network configuration for .NET 10.
  • Disabled third-party advertising, analytics, and reCAPTCHA scripts in the Development environment to reduce interference during debugging.
  • Added an Ubuntu 24.04 deployment guide for the runtime upgrade.

May 27, 2026

Fix: Article Readability & Site Maintenance

  • Fixed long inline code snippets overflowing the article container on narrow screens. Multi-line code blocks retain horizontal scrolling.
  • Updated the sidebar copyright year to advance automatically using JST.

July 13, 2025

πŸ“¦ Release: Mid‑Year UX and Performance Update

πŸ” Unified Time Display in JST + Local Tooltip
– Standardized all <time> elements across posts and feeds to show JST
– On hover, users see their local time via localizeTimeTitles() in articlePageHelper.js
– Ensures consistent cross-timezone readability

πŸ–ΌοΈ Image Enhancements for a Smoother Experience
– Click-to-zoom functionality for post images
– Smooth scaling animations and support for captions
– Implemented in articlePageHelper.js initialization logic

🧹 Frontend Cleanup and UI Simplification
– Removed background matrix animation and obsolete scripts
– Replaced site slogan with “Clarity over complexity.” in TopNav.razor
– Sidebar clock and metrics displays removed for clarity

πŸš€ RSS & Sitemap Optimization
– Now fully cached for better performance
– Switched to AsNoTracking() queries to reduce EF Core overhead
– Endpoints streamlined in Program.cs

πŸ“‰ Removed Visitor Tracking and System Metrics
– Deleted unused metrics services and SystemMetricsService hooks
– Resulted in ~1,500 LOC removed and faster page load times

πŸ“± Mobile Improvements
– Fixed sidebar overlay behavior and improved swipe handling
– Removed obstructive elements on mobile (e.g., floating clocks)

βœ… Result: A cleaner, faster, and more intuitive browsing experience — reflecting a core philosophy of clarity over complexity.


April 25, 2025

Enhancement: Layout & SPA Navigation Polish

🧱 Simplified MainLayout.razor – Removed redundant @inject and @using – Limited layout scope to essential blocks: BackGround, TopNav, Sidebar, and @Body

πŸ“œ Enabled Smooth SPA Route Transitions – Captured pushState & popstate in app.razor – Smooth-scrolled .spa-navigate elements into view using scrollTo({ top: 0, behavior: 'smooth' }) – Trimmed boilerplate from app.css, favicon, and layout <head>

🧹 Chore Cleanup: FrontendLayout – Removed stale IDbContextFactory injection – Ensured clean separation of layout concerns

πŸ“¦ Refactored Pagination Scrolling Behavior – Moved scroll logic to CyberPagination.razor via Js.InvokeVoidAsync("window.scrollTo") – Isolated scroll behavior to PaginatedArticleList’s OnPageChange, ensuring only one scroll per navigation – Leaner CyberPagination: focuses only on pageIndex and event handling

βœ… Result: Streamlined layout rendering, smoother client-side routing, and more maintainable pagination logic


April 20, 2025

Fix: Sidebar Resource Leak & Metrics Overhead

πŸ“‰ Refactored SystemMetricsService
– Switched to Subscribe/Unsubscribe model
– Timer runs only when active subscribers exist

🧹 Cleaned up Sidebar.razor lifecycle
– Implemented IDisposable to unsubscribe from metrics
– Removed StateHasChanged() from metrics callback
– Disposed DotNetObjectReference and JS intervals on unmount

🧠 Hardened sidebarInterop.js
– Made initialize() idempotent
– Added dispose() to release timers, handlers, and animations

βœ… Result: No JS/SignalR accumulation, stable CPU usage across page views


April 18, 2025

πŸ”§ Fix: Blazor Server CPU Leak & Circuit Cleanup

🧠 Added DisconnectedCircuitRetentionPeriod to auto-release inactive circuits after 30s

🧹 Implemented IDisposable in .razor to unsubscribe from SystemMetricsService

πŸ“‰ Disposed DotNetObjectReference to prevent JSInterop handle leaks

πŸ’¬ Clarified that HubOptions ≠ CircuitOptions

πŸ“Š Prepared TrackingCircuitHandler (optional) for circuit monitoring endpoint


April 7, 2025

βš™οΈ Refactor: Removed Ineffective HTTP 404 StatusCode Assignments

🚫 Removed HttpContext.Response.StatusCode = 404 from Article, Category, and Archive pages

🧠 Blazor Server doesn't support setting HTTP status codes via SignalR-rendered components

πŸ”€ 404 handling is now fully managed via IsNotFound + conditional rendering

βœ… Prevents false assumptions and better aligns with Blazor Server architecture


April 4, 2025

Feat: Cyberpunk Blockquote & Inline Code Styling

🟦 Added blockquote style with neon cyan border, glow background, and flicker animation
πŸ’» Applied cyberpunk theme to inline code: neon blue text, black background, glow effect
πŸ”„ Unified inline code using code:not(pre code) for clarity
🧱 Preserved pre > code block style (dark background + green border)
πŸ›‘οΈ Highlight.js and copy button styles remain unchanged


April 1, 2025

Fix: Increased client_max_body_size to resolve upload failure

πŸ”§ Updated Nginx server block to include client_max_body_size 100M; directive
🚫 Resolved 413 Request Entity Too Large error during file upload
πŸ“‚ Now supports uploading larger files via /upload/download endpoint without server rejection
🧩 Confirmed that the issue was caused by Nginx request size limit, unrelated to SignalR settings


March 31, 2025

Fix: Added @rendermode InteractiveServer for proper form data binding

  • πŸ”§ Added @rendermode InteractiveServer directive to ensure the page runs in interactive mode
  • 🎯 Fixed the issue where [SupplyParameterFromForm] failed to bind user input in prerender mode, ensuring Category's Name and DisplayOrder are correctly updated

March 30, 2025

Fix: Adjusted .rainbow-glow pin position to prevent horizontal scrollbar

  • πŸ”§ Changed .rainbow-glow::after right value from -15px to -12px

  • 🎯 Preserved the floating visual effect while ensuring the pin no longer causes .main-content to overflow horizontally


March 27, 2025

  • Global Image Deletion: All blog posts now update any references to an image before it is deleted, ensuring no broken links remain.

  • Consistency with Rename: The deletion process now mirrors the rename operation by globally updating image references.

  • Enhanced Data Integrity: This update prevents missing images and improves overall content reliability.


March 25, 2025

Fixed horizontal overflow issues in tables by adding horizontal scrollbars and making them responsive.


March 24, 2025

Enhanced the stability of SignalR connections by configuring HubOptions in Program.cs.

These adjustments improved the app's resilience under heavy load by enforcing tighter connection timeouts and message size limits.

For context on this change and the surrounding issue, see the full write-up:
How I Used Linux Logs, Nginx Rate Limiting, and Blazor Config to Defend Against High-Frequency Attacks


March 21, 2025

  • Fixed a DbContext concurrency issue in ArticlePage by using isolated instances for data updates.

  • Improved SignalR handling in Blazor to gracefully stop polling and avoid errors when the connection is lost.


March 20, 2025

  • Refactored VisitorData-related JavaScript by extracting logic into visitorDataInterop.js and resolving race conditions.

  • Partially modularized JS interop, though some red dot issues remain unresolved.

  • Minor updates to Blazor WebAssembly components (highlight.min.js, BackGround.razor).

  • Updated CodeRain effect to use only binary digits (0 and 1) for a cleaner Matrix-style look.


March 19, 2025

  • Fixed an issue where the displayOrder field in the backend category table could not be updated.

  • Fixed a frontend issue where the COPY button would copy itself.

  • Refactored the article display logic into a reusable component.


March 17, 2025

  • The redesigned version of the website was released.

  • The tech stack was upgraded from .NET Core 2.1 MVC to .NET 8 Blazor Web App (a hybrid of Blazor Server and Blazor WebAssembly).

This article was last edited at