README.md:
- Add 'Starting a New App' section with step-by-step instructions:
nginx alias setup, which skeleton to copy, how to define nav for
each framework, app.css pattern, lt.init() call
- Update File Structure section: remove app-specific labels from
framework skeletons (was 'PHP / Tinker Tickets' etc.), add
layout.ejs to the node/ listing
node/layout.ejs:
- New EJS base layout skeleton matching the PHP/Python equivalents:
generic nav via navLinks locals, lt-* class names throughout,
CSP nonce on all script tags, pageStyles/pageScripts arrays,
CURRENT_USER + CSRF_TOKEN globals injected at runtime
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- base.js: Fix boot sequence title centering — old formula was off by 1
char for odd-length app names (PULSE, GANDALF). Remove unused `bar`
variable. New logic computes left/right padding independently to
handle both even and odd title lengths correctly.
- node/middleware.js: Prune expired rate-limit entries from Map when
size exceeds 5000 to prevent unbounded memory growth. Also use
req.socket?.remoteAddress as fallback for req.ip.
- README.md: Document lt.beep() in the JS API section. Clarify Quick
Start to distinguish core files from platform-specific helpers.
Note that tableNav.init() and sortTable.init() require explicit calls.
- aesthetic_diff.md: Correct §8 toast icon format — base.js uses
bracketed symbols [✓][✗][!][i], not >> prefix as previously stated.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Unified CSS, JavaScript utilities, HTML template, and framework skeleton
files for Tinker Tickets (PHP), PULSE (Node.js), and GANDALF (Flask).
Includes aesthetic_diff.md documenting every divergence between the three
apps with prioritised recommendations for convergence.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>