Remove all theme customization code:
- Removed theme directory (custom.css, custom.js, favicon.svg)
- Removed app.html.heex template override
- Removed Dockerfile for custom build
- Reverted compose.yaml to only mount custom.exs for SMTP config
Keeping only SMTP configuration in custom.exs.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Mount app.html.heex template with custom theme links:
- Custom CSS at /assets/custom.css via Routes.static_path()
- Custom favicon at /images/favicon-custom.svg
Phoenix will use the external template file instead of compiled version.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
static_paths only includes: assets, fonts, images, js
The css directory is NOT served by Phoenix.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The Plug was causing AsciinemaWeb.Endpoint to fail on startup.
Reverting to just SMTP configuration while we find a proper way
to inject custom theme.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Mount custom CSS, favicon, and JS into static directories
- Create custom.js to inject theme CSS and favicon via JavaScript
- Add CustomThemeInjector Plug in custom.exs to inject script tag
- Custom theme features:
- Pivoine rose primary color (#CE275B)
- Gray tone backgrounds
- Custom SVG favicon with rose gradient
- Bootstrap 4 component overrides
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added explicit overrides for body, main, and pre elements to prevent
default light gray (#f7f7f7) backgrounds from showing through.
- Body and main: metal-bg-base (dark)
- Pre/code blocks: metal-bg-elevated (slightly lighter)
- Main container: metal-bg-surface with proper spacing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Refined the metal gray palette for better consistency and polish:
- Renamed variables to semantic names (base, elevated, surface, interactive, input)
- Reduced color range from 10%-30% to 16%-28% for smoother transitions
- Adjusted saturation to 10-12% for more cohesive palette
- Softened shadows and reduced motion for subtle elegance
- Added distinct heading area background for better hierarchy
- Improved button states with smoother hover transitions
- Refined border weights (1px default, 2px for accents)
- Updated all components to use new semantic variable names
Color hierarchy:
- metal-bg-base (16%): Body, terminal, code blocks
- metal-bg-elevated (19%): Header, footer, control bars, headings
- metal-bg-surface (22%): Cards, tables
- metal-bg-interactive (25%): Buttons, pagination
- metal-bg-input (28%): Form inputs
- metal-border (32%): Subtle borders
- metal-border-strong (40%): Accent borders
Rose accents preserved for all interactive elements.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated color palette to use multiple metal gray shades for visual hierarchy
- Kept original Pivoine rose accent colors for borders, links, and highlights
- Background variations:
- Darkest (10%): Body, terminal player, code blocks
- Darker (15%): Header/navbar, table headers
- Dark (18%): Footer, control bars
- Base (22%): Filter buttons, pagination
- Light (26%): Cards, tables, recording items
- Lighter (30%): Form inputs
- Border (35%): Borders and separators
- All rose accents preserved for visual pop on dark metal backgrounds
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Unified background colors for smoother visual flow:
Changes:
- Header background: bg-darker → bg-dark (matches body)
- Footer background: bg-darker → bg-dark (matches body)
- Body background: bg-darker → bg-dark (consistent base color)
- Removed redundant main content background override
This creates a cohesive color scheme where:
- Body, header, and footer all use bg-dark (HSL 0, 0%, 17.5%)
- Cards and panels use bg-lighter (HSL 0, 0%, 22%) for subtle contrast
- Rose borders on header/footer provide visual separation
- No more jarring black-to-gray transitions
The result is a smooth, unified dark theme with the Pivoine rose
accent colors providing visual interest and hierarchy.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced the Pivoine theme with better visual hierarchy and usability:
Logo improvements:
- Fixed logo selector to target .navbar-brand img (not just .logo)
- Logo now properly colorized with primary rose/magenta color
Contrast improvements:
- Changed body background to darker shade (bg-darker)
- Added main content area with lighter background (bg-dark) for better separation
- Added heading styles with rose accent color
- H1/H2 headings now have rose bottom border for visual hierarchy
Button refinements:
- Split button styling into primary buttons and filter buttons
- Filter buttons (.btn-light in .btn-group) now have subtle, elegant styling:
* Lighter background with border
* Smaller size and lighter font weight
* Hover shows rose border and text color
* Active state has solid rose background
- Primary buttons maintain bold rose background styling
The result is clearer visual separation between navigation, content, and
interactive elements with better contrast throughout.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed awkward appearance where Bootstrap .container elements were being
styled as cards with backgrounds, borders, and padding.
Changes:
- Removed .container from card/panel styling rule
- Added explicit .container reset to transparent background
- Removed .container from responsive design rule
- .container now maintains proper Bootstrap layout behavior
This fixes the "inner looks like a card" issue where main content areas
had unwanted card styling applied.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated custom.css to target the actual Bootstrap classes used by
asciinema server instead of generic selectors:
- Added .navbar-dark and .bg-dark overrides for navigation
- Added .btn-light targeting for button styles
- Added .btn.active and .btn-light.active for active button states
This ensures the Pivoine theme properly overrides Bootstrap's default
dark theme classes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updated entrypoint-wrapper.sh to delete .css.gz files after injecting
custom CSS. The web server was serving old pre-compressed files instead
of our updated CSS with the Pivoine theme.
Changes:
- Remove app.css.gz and app-*.css.gz after CSS injection
- Forces web server to serve uncompressed updated CSS files
- Ensures custom Pivoine theme is visible on production
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed server endpoints not starting by correcting the entrypoint wrapper
script to use the proper command: /sbin/tini -- /opt/app/bin/server
Changes:
- Updated entrypoint-wrapper.sh to exec /sbin/tini instead of /opt/app/bin/asciinema
- Removed incorrect command: ["start"] from compose.yaml
- Custom CSS injection now working with proper server startup
- Both main (port 4000) and admin (port 4002) endpoints now running
The custom Pivoine theme CSS is successfully injected at container startup
and served via both app.css and hashed app-*.css files.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added entrypoint wrapper script that injects custom.css into the
main app.css file at container startup. This allows the custom
Pivoine theme to be applied without building a custom image.
Changes:
- Mount custom.css to static assets directory
- Add entrypoint-wrapper.sh to inject CSS on startup
- Append custom CSS to both app.css and hashed app-*.css
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed 404 error by explicitly specifying which service each router
should use. Traefik was unable to automatically link routers when
multiple services were defined.
Added service specification to all routers:
- asciinema-web → asciinema service
- asciinema-web-secure → asciinema service
- asciinema-admin-web → asciinema-admin service
- asciinema-admin-web-secure → asciinema-admin service
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added admin interface routing at admin.asciinema.pivoine.art:
- Port 4002 exposed via Traefik
- HTTP Basic Auth protection using AUTH_USERS
- HTTPS with Let's Encrypt certificate
- Security headers and compression middleware
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Force IONOS SMTP server IP (213.165.67.97) in /etc/hosts
to bypass potential DNS resolution issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed SMTP_NO_MX_LOOKUPS and SMTP_ALLOWED_TLS_VERSIONS settings
that were added during troubleshooting. Using only basic SMTP
configuration that works for other services (mattermost, tandoor).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>