Healthcheck was failing because curl is not installed in the LiteLLM
container, causing Traefik to mark it as unhealthy and not route traffic.
Disabled healthcheck as Traefik doesn't require it for routing.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
LiteLLM was binding to localhost by default, making it unreachable
from Traefik reverse proxy. Added --host 0.0.0.0 parameter to allow
connections from the Docker network.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added Traefik configuration to make LiteLLM accessible at llm.ai.pivoine.art
for use with @openai/codex CLI tool.
Changes:
- Added AI_LITELLM_TRAEFIK_HOST to arty.yml (llm.ai.pivoine.art)
- Updated ai/compose.yaml litellm service with full Traefik labels
- HTTP to HTTPS redirect
- SSL termination via Let's Encrypt
- Compression and security headers
This allows external tools like Codex to use Claude models via
OpenAI-compatible API endpoint.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed miniPaint image editor service from the kit stack:
- Deleted paint service definition from kit/compose.yaml
- Removed Dockerfile for paint build
- Removed KIT_PAINT_TRAEFIK_HOST from arty.yml
- Stopped and removed kit_paint container
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Paint service uses a custom Dockerfile build from GitHub, so it shouldn't
be auto-updated by Watchtower. Set watchtower.enable=false explicitly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Watchtower was failing with "Unknown notification type 'mattermost'" because
'mattermost' is not a valid WATCHTOWER_NOTIFICATIONS value. When using
Shoutrrr URLs (WATCHTOWER_NOTIFICATION_URL), the notification type should
be set to 'shoutrrr' or left empty, as the service type is inferred from
the URL format (mattermost://...).
Changed WATCHTOWER_NOTIFICATIONS from 'mattermost' to 'shoutrrr' to fix
the fatal error that was occurring every minute.
The mattermost:// Shoutrrr URL in WATCHTOWER_NOTIFICATION_URL is correct
and will work once the notification type is fixed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Netdata v2.7 doesn't natively support Mattermost notifications, but
Mattermost supports Slack-compatible webhooks. Changed configuration to
use SEND_SLACK with SLACK_WEBHOOK_URL pointing to the Mattermost webhook.
Configuration changes:
- Changed SEND_MATTERMOST="YES" to SEND_SLACK="YES"
- Changed MATTERMOST_WEBHOOK_URL to SLACK_WEBHOOK_URL
- Updated role_recipients_mattermost to role_recipients_slack
- Webhook URL still uses ${MATTERMOST_WEBHOOK_URL} env var from .env
Tested with: alarm-notify.sh test
Result: All three alarm types (WARNING, CRITICAL, CLEAR) show "OK"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
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>