Files
SuperCharged-Claude-Code-Up…/CACHE_BUSTING_FIX.md
uroma 55aafbae9a Fix project isolation: Make loadChatHistory respect active project sessions
- Modified loadChatHistory() to check for active project before fetching all sessions
- When active project exists, use project.sessions instead of fetching from API
- Added detailed console logging to debug session filtering
- This prevents ALL sessions from appearing in every project's sidebar

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:43:05 +00:00

6.7 KiB

Browser Cache-Busting Fix - Implementation Summary

Problem

Browsers were caching old JavaScript files and ignoring cache headers. The file /home/uroma/obsidian-web-interface/public/claude-ide/ide.js had been fixed (regex at line 494), but browsers kept loading the old broken version.

Root Cause

  1. Inconsistent cache-busting parameters in HTML (ide.js used ?t= while others used ?v=)
  2. Stale timestamps (ide.js had 1769008200000 vs 1769008667735 for other files)
  3. HTML files were not included in Express cache-busting logic
  4. Outdated inline cache-busting script in HTML head

Solution Implemented

1. Updated HTML File (/home/uroma/obsidian-web-interface/public/claude-ide/index.html)

Changes:

  • Unified all asset references to use ?v= parameter (not ?t=)
  • Applied fresh timestamp 1769008703817 to all JavaScript and CSS files
  • Removed outdated inline cache-busting script (lines 9-19)
  • Added cache-busting meta tags:
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="0">
    

Files Updated:

  • All 14 JavaScript files now have ?v=1769008703817
  • All 11 CSS files now have ?v=1769008703817

Critical Fix:

<!-- Before -->
<script src="/claude/claude-ide/ide.js?t=1769008200000"></script>

<!-- After -->
<script src="/claude/claude-ide/ide.js?v=1769008703817"></script>

2. Updated Server Configuration (/home/uroma/obsidian-web-interface/server.js)

Changes:

  • Added HTML files to cache-busting logic (line 374)
  • Updated comments to reflect HTML inclusion (lines 367, 373)

Before:

if (filePath.endsWith('.js') || filePath.endsWith('.css')) {

After:

if (filePath.endsWith('.js') || filePath.endsWith('.css') || filePath.endsWith('.html')) {

3. Cache-Busting Infrastructure

Existing Components (Verified):

  • /home/uroma/obsidian-web-interface/cache-bust-middleware.js - Dynamic asset versioning
  • Server uses createCacheBustingMiddleware(ASSET_VERSION) at line 242
  • Static file serving has:
    • etag: false
    • lastModified: false
    • Cache-Control headers for JS, CSS, and now HTML files

Nginx Configuration (Verified):

location /claude {
    proxy_pass http://127.0.0.1:3010;
    proxy_hide_header Cache-Control;
    add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0" always;
    add_header Pragma "no-cache" always;
    add_header Expires "0" always;
}

4. Automation Script

Created /home/uroma/obsidian-web-interface/force-cache-refresh.sh:

  • Generates fresh timestamp
  • Updates all asset references in HTML
  • Creates backup
  • Restarts server
  • Verifies server status

Usage:

./force-cache-refresh.sh

Implementation Details

Cache-Busting Strategy

  1. Query Parameter Approach: All assets use ?v=TIMESTAMP format
  2. Timestamp Generation: Date.now() in milliseconds (e.g., 1769008703817)
  3. Scope: Applied to all JavaScript, CSS, and HTML files
  4. Layered Defense:
    • Meta tags in HTML head
    • HTTP headers from Express
    • HTTP headers from Nginx
    • Dynamic query parameters

Headers Applied

Express Server:

Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0
Pragma: no-cache
Expires: 0
ETag: (disabled)

Nginx Proxy:

Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0
Pragma: no-cache
Expires: 0

Testing & Verification

Manual Testing Steps:

  1. Clear browser cache (Ctrl+Shift+Delete)
  2. Hard refresh page (Ctrl+Shift+R)
  3. Open DevTools Network tab
  4. Verify all assets load with ?v=1769008703817
  5. Check response headers show no-cache directives

Server Status:

Process ID: 1074464
Port: 3010
Status: Listening
Configuration: Active

Prevention of Future Issues

Best Practices Implemented:

  1. Consistent Parameter Naming: All assets use ?v= (not mixed with ?t=)
  2. Timestamp Synchronization: All assets receive the same timestamp simultaneously
  3. HTML Cache Protection: HTML files now have no-cache headers
  4. Automated Refresh: Script available for future updates

Development Workflow:

  1. Make code changes
  2. Run ./force-cache-refresh.sh
  3. Hard refresh browser
  4. Verify changes load

Files Modified

  1. /home/uroma/obsidian-web-interface/public/claude-ide/index.html

    • Updated all script and link tags
    • Added meta tags
    • Removed inline script
  2. /home/uroma/obsidian-web-interface/server.js

    • Added HTML to cache-busting logic
    • Updated comments
  3. /home/uroma/obsidian-web-interface/force-cache-refresh.sh (new)

    • Automation script for cache refresh
  4. /home/uroma/obsidian-web-interface/CACHE_BUSTING_FIX.md (new)

    • This documentation

Verification Commands

# Check server is running
ps aux | grep "node server.js"

# Check port is listening
netstat -tlnp | grep 3010

# Verify timestamp in HTML
grep "\.js?v=" /home/uroma/obsidian-web-interface/public/claude-ide/index.html

# Check server logs
tail -20 /home/uroma/obsidian-web-interface/server.log

# Test cache headers
curl -I https://rommark.dev/claude/claude-ide/ide.js?v=1769008703817

Success Criteria

  • All JavaScript files have consistent timestamp
  • All CSS files have consistent timestamp
  • HTML files have cache-busting headers
  • Nginx proxy has no-cache headers
  • Express server has no-cache headers
  • Server restarted and listening on port 3010
  • Automation script created and executable
  • Documentation created

Expected Outcome

After this fix:

  1. Browsers will treat ide.js?v=1769008703817 as a completely new resource
  2. Old cached version (ide.js?t=1769008200000) will not be used
  3. All browsers will download the fixed version with the regex at line 494
  4. Future changes can be deployed using the automation script

Troubleshooting

If browsers still cache old content:

  1. Clear browser cache completely (Ctrl+Shift+Delete)
  2. Close all browser windows
  3. Restart browser
  4. Hard refresh (Ctrl+Shift+R)
  5. Check DevTools Network tab to verify new URLs are being requested
  6. Verify timestamp in HTML matches what you expect

Maintenance

To update cache-busting timestamp in the future:

cd /home/uroma/obsidian-web-interface
./force-cache-refresh.sh

This will:

  • Generate a new timestamp
  • Update all asset references
  • Restart the server
  • Provide verification feedback