Website Rebuild & Patch Notes

| Web Design | 85 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.


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 HubOptionsCircuitOptions

πŸ“Š 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