asciinema/asciinema-server
49.6
Weak · 22 September 2026
17.5k
lines of production code
Elixir
primary language
6
measurements over time
What this system is
This system is a self-hosted platform for recording, storing, and streaming terminal sessions, rebuilt from a legacy Ruby application into a modern Elixir/Phoenix service. It provides core capabilities for managing user accounts, uploading and compressing terminal recordings, and hosting live streams with support for multiple protocols including ALiS v1 and asciicast v2/v3. The application features a comprehensive admin panel for content moderation, full-text search across terminal output, and a customizable web interface with an embeddable player for viewing sessions.
How it got here
2011–2018 — Elixir/Phoenix migration
25 changes.
The project underwent a comprehensive rewrite, migrating the backend from Ruby/Sinatra to Elixir/Phoenix and replacing the legacy JavaScript terminal player with the asciinema-player library. This period established the core domain logic, database schema, and file storage infrastructure for the new stack, while simultaneously building out the admin panel and user-facing web interface using Phoenix LiveView and HEEx templates.
2019–2025 — Phoenix 1.7 migration and UI overhaul
45 changes.
The project underwent a comprehensive modernization, migrating the codebase to Phoenix 1.7 and replacing Bootstrap with a custom CSS architecture. This period introduced significant new features including full-text search, native terminal emulation, and a redesigned admin panel, while refactoring core subsystems for recordings and streaming.
2026 — Web UI expansion and streaming infrastructure
15 changes.
This period focused on expanding the web interface with dedicated Explore pages, user profile views for recordings and streams, and a refined CLI authentication flow. Concurrently, the backend underwent significant structural improvements, including the introduction of a native SVG rasterization library, a refactored asciicast parsing engine, and a dedicated ALIS v1 codec for streaming, all supported by comprehensive test coverage across these new components.
Features
Added database seeding script
A new \priv/repo/seeds.exs\ file has been added to the project, providing a script for populating the database. This file includes standard comments explaining how to run the script via \mix run\ and recommends using bang functions like \insert!\ for immediate error feedback during data population.
priv/repo · high confidence
Added utility functions for renaming keys in keywords and maps
New helper modules Ext.Keyword and Ext.Map were added to the library, providing a 'rename' function that allows users to change the key name of a specific entry in a keyword list or map while preserving its value. This simplifies data transformation tasks by offering a dedicated utility for key remapping operations.
lib/ext · high confidence
Core domain logic and infrastructure for Asciinema v2
This change introduces the foundational Elixir modules for the application's core domains, including user accounts, recordings, and live streaming. It establishes the \Asciinema.Accounts\ context with a flexible query language for filtering users, implements a centralized \Asciinema.Authorization\ policy for access control, and defines the \Asciinema.Recordings\ and \Asciinema.Streaming\ contexts for managing media assets and live events. The diff also adds essential infrastructure components such as a robust \FileCache\ for handling file generation and storage, \FileStore\ and \HttpUtil\ for external resource management, and specialized modules for color manipulation (\Colors\), compression (\Gzip\, \Zstd\), and full-text search (\Fts\).
lib/asciinema · high confidence
Initial full-text search implementation for terminal recordings
This change introduces a new native FTS (Full-Text Search) module that parses terminal output to build an index of searchable text. The implementation processes input streams to extract words from both the primary screen buffer and the alternate screen buffer, ensuring that content fits within PostgreSQL's tsvector size limits. It tracks changes in the alternate buffer to maintain an accurate word list for search indexing.
native/fts · high confidence
Introduce dedicated admin UI component library
The admin interface now uses a new set of UI components defined in \lib/asciinema\_admin/components\, separate from the public site's core components. This includes a page layout wrapper with header status badges and action menus, styled buttons, state tags, pagination controls, and helpers for displaying terminal theme palettes and visibility states, providing a consistent visual foundation for the admin panel.
_lib/asciinema\admin/components · high confidence
Introduce native SVG rasterization library for terminal graphics
A new native Rust library (\native/svg\_raster\) has been added to handle the rasterization of terminal content into PNG images for SVG previews. This implementation provides a \render\_png\ NIF that accepts terminal dimensions, background runs, and mosaic block data to generate pixel buffers, which are then encoded into valid PNG files using zlib compression. The library specifically supports rendering various Unicode box-drawing characters (such as heavy vertical lines and up/down arrows) and shading symbols (like upper/lower half blocks) by mapping their code points to specific pixel-fill regions within each cell, enabling accurate visual representation of complex terminal layouts in SVG output.
_native/svg\raster · high confidence
Introduce native Vt NIF for terminal emulation
Added a new native Vt NIF module that exposes the \avt\ terminal emulator to the host application. This allows users to create virtual terminal instances with configurable dimensions and scrollback limits, feed them text input, resize them dynamically, and retrieve the rendered screen state or plain text output via NIF functions.
native/vt · high confidence
New admin panel for managing users, recordings, and streams
The previous admin interface has been replaced with a comprehensive new admin panel. Administrators can now manage users (list, show, edit, create, delete, and merge accounts), recordings (list, show with a player, edit, change visibility, feature/unfeature, archive/unarchive, and delete), and live streams (list, show with a player, edit, disconnect, change visibility, and delete). The panel includes a dashboard with sparklines and growth strips for signups, recordings, and streams, as well as a query language for filtering lists. Additionally, a CLI authorization endpoint allows admins to assign CLI tokens to users.
_lib/asciinema\_admin, lib/asciinema\admin/controllers · high confidence
New background workers for maintenance, compression, and search indexing
This change introduces a suite of new Oban workers in the Asciinema.Workers namespace to handle background tasks. Key additions include workers for compressing uncompressed asciicast files (CompressRecording, CompressRecordings), managing unclaimed recordings (DeleteUnclaimedRecordings), and generating or updating recording snapshots and full-text search content (GenerateSnapshots, UpdateSnapshot, ReindexRecordings, UpdateFtsContent). It also adds workers for migrating recording files, recomputing popularity scores, rescheduling recurring streams, and marking offline streams, ensuring these operations are processed asynchronously on the maintenance or default queues.
lib/asciinema/workers · high confidence
New controllers and views for user-facing pages and error handling
This change introduces a suite of new Phoenix controllers and HTML view modules to handle specific user-facing features and system responses. Key additions include an Explore page controller to display live streams, upcoming streams, and featured/popular recordings; a Search controller for full-text recording search; and dedicated controllers for CLI authentication, email address changes, and oEmbed integration. The update also standardizes error handling by replacing the legacy ErrorView with separate ErrorHTML, ErrorJSON, and ErrorTEXT modules, and adds a FallbackController to manage error responses across formats. Additionally, new controllers for login, session management, and user profile pages are included, alongside helper modules like MediumHTML for rendering recording and stream cards.
_lib/asciinema\web/controllers · high confidence
New embeddable player, red logo, and search engine restrictions
This update introduces a new JavaScript-based embeddable player (priv/static/js/embed.js) that dynamically creates an iframe for asciicast recordings, supporting data attributes for configuration and syncing text styles with the host page's theme. A new red SVG logo is added (priv/static/images/logo-red.svg). Additionally, robots.txt is updated to block search engine crawlers from accessing cast data and image files (.json, .png, .gif) while explicitly allowing Twitterbot to access image assets.
priv/static · high confidence
New full-text search results page with advanced query syntax support
A new search results view has been added that displays matching recordings and includes a modal explaining the search syntax. Users can now search across recording titles, descriptions, and full terminal session content. The interface supports advanced query operators including AND (default), OR, NOT (using a minus sign), and exact phrase matching (using double quotes). The search bar can be focused by pressing the forward slash key, and results are paginated with a custom component.
_lib/asciinema\_web/controllers/search\html · high confidence
New icon components added to the library
The icon component library in lib/asciinema\_web/components/icons has been expanded with new SVG-based components, including adjustments\_horizontal\_mini, cog\_8\_tooth\_mini, copy, download\_mini, envelope\_outline, eye\_solid, info\_outline, info\_solid, live, offline, share\_mini, terminal\_solid, user\_circle\_outline, and user\_solid. These additions provide the UI with updated visual assets for features such as settings, sharing, downloading, and status indicators.
_lib/asciinema\web/components/icons · high confidence
New stream status and scheduling preview components
The live view layer now includes dedicated components for displaying stream status and schedule previews. StreamStatusLive provides a real-time status bar that shows whether a stream is live, scheduled, or ended, including elapsed time, remaining time until start, and viewer counts, while also handling cases where a stream is deleted. StreamCardLive manages the lifecycle and status updates for individual stream cards. Additionally, SchedulePreviewLive allows users to see the next few scheduled start times for a cron expression in real-time as they edit it.
_lib/asciinema\web/live · high confidence
New streaming protocol parsers for ALiS v1, asciicast v2/v3, and raw output
The streaming parser module now includes dedicated parsers for the ALiS v1 binary protocol, asciicast v2 and v3 JSON formats, and a raw terminal output mode. Users connecting via live streams will see support for the new ALiS v1 binary framing (using delta timestamps and LEB128 encoding), full compatibility with asciicast v3 features including exit events and delta time offsets, and robust handling of malformed JSON payloads that previously risked crashing the connection. The raw parser now automatically detects terminal dimensions from resize sequences or script start messages.
lib/asciinema/streaming/parser · high confidence
New user profile pages for live and upcoming streams
Added dedicated HTML templates for the 'live' and 'upcoming' stream sections of user profile pages. These pages display a list of streams belonging to the current user or another user, utilizing the StreamCardLive component to render individual stream cards. The visibility badge on these cards is now conditionally shown based on whether the viewer is the stream owner (@self), allowing users to see visibility indicators on their own streams while keeping them hidden for other users.
_lib/asciinema\_web/controllers/user\_stream\html · high confidence
New user profile pages for viewing recordings
Users can now view a dedicated list of recordings on a user's profile page. The new index template displays either 'Your recordings' for the logged-in user or 'Recordings by \[username\]' for other users, listing each recording with a card component. The visibility badge is only shown on the user's own profile page, and pagination is handled by a new component. If no recordings exist, a message indicates whether the user has none or if the profile has no public recordings.
_lib/asciinema\_web/controllers/user\_recording\html · high confidence
Removals
Removal of legacy JavaScript terminal player components
The \public/javascripts\ directory has been cleared of several core files that previously powered the in-browser terminal playback feature. Specifically, \ansi-interpreter.js\ (which handled ANSI escape sequences like cursor movement and screen buffers), \terminal.js\ (which managed the terminal UI and CP437 character mapping), \player.js\ (which orchestrated frame-by-frame playback), \utf8.js\ (for encoding/decoding), and \misc.js\ (for utility functions) have all been deleted. This removes the client-side logic responsible for rendering and animating terminal sessions within the web interface.
public/javascripts · high confidence
Removal of legacy Sinatra-based movie player views and model
The application has removed the previous Sinatra-based implementation for viewing terminal recordings. This change deletes the Movie model (app/models.rb) which handled file attachments for terminal sessions, along with the associated ERB templates (index, show, and layout) that rendered the movie list, the terminal player interface, and the page structure. Users will no longer have access to the legacy web-based movie playback and listing features provided by this stack.
app/views · high confidence
Removal of legacy stylesheet assets
The \main.css\ and \reset.css\ files in the public stylesheets directory have been deleted. This removes the previous styling rules for the application's layout, terminal elements, and color definitions, as well as the HTML5 reset styles that were previously applied to the site.
public/stylesheets · high confidence
Behavioural changes
Added configuration template for Swoosh email delivery via SMTP
A new configuration file has been added to the release overlays to support email delivery using Swoosh. The file provides a commented-out template for configuring an SMTP adapter (specifically targeting Mailgun), allowing users to easily enable and customize email sending by uncommenting and adjusting the relay, port, and credential settings.
rel/overlays/etc · high confidence
Added default English error message translations
The application now includes default English translations for common Ecto validation error messages. This change adds the \priv/gettext/errors.pot\ template and the \priv/gettext/en/LC\_MESSAGES/errors.po\ file, covering standard validation strings such as 'can't be blank', 'has already been taken', and 'is invalid', enabling users to see these messages in English by default.
priv/gettext · high confidence
Admin panel shell and core UI behaviors
The admin interface now includes a foundational layout and interactive behaviors. Users can manage streams, recordings, and users through new list, show, edit, and delete actions. The interface features a GitHub-style keyboard shortcut (/) to focus the search box, auto-hiding flash messages after 5 seconds or on click, and improved modal dialog handling with focus restoration. Additionally, code snippets now support a copy-to-clipboard feature, and the player initialization has been aligned with the public player for consistency.
assets/js · high confidence
CLI authentication page now shows recording migration details and requires explicit confirmation
The CLI linking page (lib/asciinema\_web/controllers/cli\_html/show.html.heex) has been updated to provide more context during the authentication flow. When a CLI is associated with a temporary user account that has previous unregistered uploads, the page now explicitly informs the user that authenticating will migrate those recordings to their account, including the count of affected recordings. Additionally, the interface now requires an explicit user action (clicking the 'Authenticate CLI' button) to complete the linking process, ensuring users confirm the association before it takes effect.
_lib/asciinema\_web/controllers/cli\html · high confidence
Configurable multipart upload size limit
The multipart parser now supports a configurable length limit for uploads, allowing administrators to adjust the maximum upload size via the application configuration rather than relying on a hardcoded value. This change introduces a new parser module that wraps the standard Plug multipart parser to inject this custom limit, ensuring that upload size constraints can be managed dynamically through the application's environment settings.
_lib/asciinema\web/plug/parsers · high confidence
Custom CSS styles for site header and footer regions
The site's header and footer regions now use custom CSS files instead of the previous framework-based styling. The header includes a dark-themed navigation bar with a search input featuring a background icon, hover effects on links, and responsive adjustments for mobile screens. The footer is anchored to the bottom of the page with a grid-based layout that stacks vertically on narrow screens to improve alignment and readability.
assets/css/regions · high confidence
Database schema overhaul for recordings, streams, and users
This update applies a comprehensive set of database migrations that restructure the core data model. It introduces live streaming capabilities with a new \streams\ table (renamed from \live\streams\) and adds recording features to the \asciicasts\ table, including support for markers, speed, and audio URLs. Visibility controls are expanded from simple private/public to a three-tier system (public, unlisted, private) for both recordings and streams, with user-level defaults. The schema also standardizes naming conventions, such as renaming terminal-related columns with a \term\\ prefix, converting timestamps to UTC, and renaming \api\_tokens\ to \clis\. Additionally, it integrates Oban for background job processing, adds full-text search support for recordings, and enforces live stream limits via database triggers.
priv/repo/migrations · high confidence
Enforce mandatory username selection during signup
The username selection step in the signup flow is now mandatory; users can no longer skip choosing a username. The new template at lib/asciinema\_web/controllers/username\_html/new.html.heex presents a form where users must enter a valid username (letters, digits, and hyphens only) before proceeding, with specific error messages displayed if the username is invalid or already taken.
_lib/asciinema\_web/controllers/username\html · high confidence
Improved release attachment and legacy data directory support
The release environment scripts now automatically detect and use a release cookie stored in the data directory (defaulting to /var/lib/asciinema, with fallback to /var/opt/asciinema) so that attach commands work without requiring an explicit cookie configuration. Additionally, the system warns users if the legacy /var/opt/asciinema directory is in use and suggests migrating to the new default location.
rel · high confidence
Introduce ALIS v1 codec module for frame encoding and decoding
The ALIS v1 wire format logic has been extracted into a dedicated \Asciinema.Streaming.Alis.V1\ module, centralizing the encoding and decoding of binary frames (init, output, input, resize, marker, exit, and EOT). This change standardizes how terminal session data is serialized and deserialized, ensuring that the End-Of-Transmission (EOT) is handled as a bare control frame while maintaining robust error handling for malformed input during decoding.
lib/asciinema/streaming/alis · high confidence
Login flow now requires explicit confirmation and captures user timezone
The login process now presents a dedicated confirmation page where users must actively click a button to complete authentication, rather than being logged in automatically. Additionally, the login form now automatically detects and submits the user's browser timezone via the Intl API, ensuring session data is stored with the correct local time context.
_lib/asciinema\_web/controllers/session\html · high confidence
Migrate configuration to Phoenix 1.6 runtime and esbuild
The application configuration has been restructured to support Phoenix 1.6, moving from compile-time settings to runtime environment variable injection via \config/runtime.exs\. This change introduces support for dynamic configuration of database connections, secret keys, and network bindings through environment variables (e.g., \DATABASE\_URL\, \SECRET\_KEY\_BASE\, \BIND\_ALL\). Additionally, the static asset pipeline has switched from webpack to esbuild, with configuration now defining specific build targets for the main application and admin panel, including LibreJS-compatible license banners. The legacy \config/init.rb\ file has been removed as part of this transition.
config · high confidence
Migrate email delivery to Swoosh and extract email templates
The email system has been refactored to use the Swoosh library for delivery, replacing the previous implementation. Email templates for sign-up, login, email change, and account deletion are now centralized in the Asciinema.Emails module, using Phoenix components for consistent HTML layout. The system now generates Message-ID headers with the instance's hostname, includes Date headers, and suppresses auto-replies for login emails. Configuration prefers MAIL\_FROM\_ADDRESS and MAIL\_REPLY\_TO\ADDRESS over SMTP\\* equivalents, defaulting to the instance's hostname if not set.
lib/asciinema/emails · high confidence
Migrate layout templates to HEEx and introduce component-based header, footer, and flash messages
The application's layout templates have been converted from EEx (.eex) to HEEx (.heex) format, enabling the use of Phoenix components and verified routes. The main app layout now renders distinct, reusable components for the header (\_header.html.heex), footer (\_footer.html.heex), and flash messages (\_flash.html.heex). The header includes a new search form, a forum link, and an updated user dropdown menu with links to profile, recordings, streams, settings, and admin panel. Flash messages are now displayed in accessible sections with close buttons. The iframe layout has been updated to use specific assets and includes a color-scheme meta tag. These changes improve code maintainability and user interface consistency across the application.
_lib/asciinema\web/templates · high confidence
Migrate server to Elixir/Phoenix and remove legacy Ruby app
The repository has been completely rewritten to use the Elixir language and Phoenix framework, replacing the previous Ruby/Sinatra implementation (app.rb, config.ru) which has been removed. This change introduces a new Dockerfile for building the server, a Nix flake for development and packaging, and updated tooling configurations (.tool-versions, .formatter.exs, .credo.exs). The server now runs on Erlang/OTP 28 and Elixir 1.19, with Node.js 20 for asset compilation.
(repo-wide) · high confidence
Migrate to Phoenix 1.7 components and replace external dependencies
The application now uses the Phoenix 1.7 component style, introducing new core components for form inputs, labels, buttons, and error display, alongside a new \\<.code\_with\_copy\>\ component for code snippets with clipboard functionality. The \scrivener\_html\ library has been removed and replaced with a custom \\<.pagination\_links /\>\ component for pagination, and icon templates have been consolidated into a dedicated \icons.ex\ component module.
_lib/asciinema\web/components · high confidence
Migrate view layer to Phoenix 1.7 and modernize layout helpers
The view layer has been refactored to align with Phoenix 1.7 conventions, introducing new view modules (ApplicationView, ErrorHelpers, LayoutView, MediaView) that utilize Phoenix.Component and HEEx templates (\~H) for rendering. This update replaces legacy helper logic with standardized functions for time formatting, error translation, and dynamic body class generation. Additionally, the MediaView now exposes terminal theme and font options, supporting the new user settings for terminal appearance, while the LayoutView handles page titles and controller-specific CSS classes for the updated Bootstrap 4-based layout.
_lib/asciinema\web/views · high confidence
New CSS architecture with custom theming and font updates
The application's styling has been restructured into a modular CSS system (app.css, admin.css, iframe.css) that replaces previous stylesheets. This change introduces a comprehensive light and dark theme system using CSS custom properties, ensuring consistent visual presentation across the public interface, admin panel, and embedded player views. Additionally, the UI fonts have been updated to Fira Sans and JetBrains Mono, and the layout now supports responsive design with proper base resets and component-specific styles for tables, forms, and navigation.
assets/css · high confidence
New CSS styles for explore, user profiles, and stream management pages
This change introduces dedicated stylesheet files for several key areas of the application, replacing or supplementing previous global styles. Users will see a redesigned layout for the new explore pages, featuring a responsive grid with a sidebar for navigation. User profile pages now have a distinct visual identity with a dark hero section and larger avatar display. Stream management views (index and show) have been restyled, including a fixed-width table for stream listings and improved layout for stream instructions and metadata. Additionally, new styles cover the login flow, search results, static pages like About, and user settings/edit views, ensuring consistent spacing and typography across these sections.
assets/css/pages · high confidence
New authentication, authorization, and admin routing plugs
This change introduces several new plugs in the web layer to improve security and routing. The new \AdminGate\ plug allows the admin panel to be served on the main endpoint for admin users, while redirecting anonymous users to login and returning 404 for non-admins. The \Authn\ plug handles user authentication by checking sessions and cookies, and sets Sentry context for identified users. The \Authz\ plug provides a standardized way to check authorization for resources, falling back to a forbidden error if access is denied. Additionally, \ReturnTo\ enables saving and redirecting back to the original path after login, and \TrailingFormat\ parses file extensions from URLs to set the response format.
_lib/asciinema\web/plug · high confidence
New dedicated Explore pages for streams and recordings
The Explore section now features dedicated sub-pages for Live, Upcoming, Featured, Popular, and Recent content, each with its own layout and pagination. The main Explore page aggregates previews of these categories with links to their respective full lists. A new sidebar navigation helps users switch between these sections, and the UI has been updated to hide timestamps on featured and popular recordings while ensuring visibility badges are handled correctly for live streams.
_lib/asciinema\_web/controllers/explore\html · high confidence
New local and S3 file store implementations
The application now includes dedicated file store backends for local disk and Amazon S3 (compatible with providers like Cloudflare R2 or MinIO). The local store handles file operations such as uploading, moving, and deleting files using atomic writes, while the S3 store manages these operations via the ExAws library, including generating presigned URLs for direct access. These implementations replace the previous generic file store interface, providing specific, optimized storage strategies for different deployment environments.
_lib/asciinema/file\store · high confidence
New stream management and viewing interface
The stream section has been rebuilt with a new set of Heex templates, introducing a dedicated stream index page for managing existing streams (including creation, editing, and deletion) and a redesigned stream show page that displays the player, stream metadata, and past recordings. This update adds a countdown component for scheduled streams, a share modal for easy link copying, and a visibility badge system to indicate public, unlisted, or private status. The stream edit form now supports scheduling, terminal theme customization (including adaptive palette and bold-is-bright options), and visibility settings, while the show page integrates a live status component and provides instructions for starting streams via the CLI.
_lib/asciinema\_web/controllers/stream\html · high confidence
Port web layer to Phoenix 1.6 with LiveView and verified routes
The web interface has been migrated to Phoenix 1.6, introducing LiveView support and enabling verified routes for improved security and type safety. This change restructures the application around new Phoenix conventions, including a dedicated authentication module for session and cookie management, a centralized router with explicit pipelines, and new WebSocket handlers for live streaming. Users benefit from a more responsive interface via LiveView, secure session handling with SameSite cookie policies, and reliable route generation that prevents broken links.
_lib/asciinema\web · high confidence
Recordings context refactored with segmented snapshots and new storage schemas
The recordings module has been restructured to use a new segmented snapshot format, which significantly improves performance for snapshot operations and SVG rendering. This change introduces new Ecto schemas for \Asciicast\ and \AsciicastStats\ to better manage recording metadata, visibility, and popularity metrics. Additionally, the system now supports storing recordings in zstd-compressed format, tracks file sizes, and includes a new query API for listing recordings. The snapshot data is now stored in a specialized binary format that optimizes memory usage and speeds up processing.
lib/asciinema/recordings · high confidence
Redesigned /about page with server-specific details and admin contact
The /about page has been updated to display the specific server name and version (if available) in the header and description, replacing the generic title. It now conditionally shows an admin contact section with an obfuscated email address when a contact email is configured, providing users with clear channels for account issues, content reporting, and security vulnerabilities. The page also retains general information about the asciinema project and links to documentation and community resources.
_lib/asciinema\_web/controllers/page\html · high confidence
Redesigned login and email-sent pages with custom CSS
The login interface has been updated to use a custom, simpler CSS layout instead of Bootstrap, featuring a two-column design on the login page that separates the form from informational text for new and returning users. The login form now includes a hidden honeypot field and a hidden terms checkbox to help prevent automated submissions. Additionally, the 'email sent' confirmation page has been redesigned to clearly instruct users to check their inbox (and spam folder) for the one-time login link, with a direct link to retry the process if the email does not arrive.
_lib/asciinema\_web/controllers/login\html · high confidence
Redesigned recording pages with new settings and sharing options
The recording detail and management interface has been completely overhauled. The main show page now features a dedicated 'cinema' player container, updated metadata display, and a 'More by this user' section. A new edit form allows users to configure terminal-specific settings, including column/row overrides, theme selection, adaptive palette, bold-is-bright rendering, idle time limits, playback speed, and a new keystroke overlay toggle. Sharing and download capabilities are now handled via dedicated modals, providing copyable code snippets for embedding the player, generating GIFs via the \agg\ tool, and downloading recordings in various formats.
_lib/asciinema\_web/controllers/recording\html · high confidence
Redesigned user profile and account management pages
The user profile and account settings views have been completely rewritten to support a unified profile experience and enhanced account controls. The new profile page displays live streams, upcoming streams, and recent recordings, with specific guidance for users on the CLI 3.0 streaming workflow. Account settings now include dedicated forms for changing email addresses (with verification status feedback), setting time zones for stream scheduling, and managing profile details like username and display name. Additionally, users can configure default visibility settings for new recordings and streams, and a new account deletion flow is available to permanently remove accounts and associated data.
_lib/asciinema\_web/controllers/user\html · high confidence
Refactored API controllers and standardized error responses
The API controllers for recordings and streams have been rewritten to use a new-style controller pattern with explicit plugs for authentication, authorization, and limit enforcement. Authentication errors are now handled by a shared \AuthError\ module that returns consistent 401 JSON responses with specific error types (e.g., \unauthenticated\, \account\_required\). Recording and stream JSON responses now include additional fields such as \audio\_url\, \visibility\, and \live\ status. The recording controller supports update and delete actions, while the stream controller introduces cursor-based pagination for listing user streams.
_lib/asciinema\web/controllers/api · high confidence
Refactored asciicast parsing with new event stream and reader modules
The asciicast library has been restructured to decouple recording logic from stream processing. New modules \EventStream\ and \Reader\ handle time conversion (absolute/relative), event statistics, and file I/O (including zstd decompression detection), while version-specific parsers (\V1\, \V2\, \V3\) now delegate to these helpers. This change ensures that recordings with no events or missing headers are properly rejected, and recording duration is consistently computed as a float.
lib/asciinema/asciicast · high confidence
Refactored streaming architecture with protocol negotiation and new schema fields
The streaming subsystem has been restructured to support multiple producer protocols (raw, ALiS v1, asciicast v2, and v3) via a new Parser interface and dedicated session state machines for producers and consumers. This change introduces a new Stream schema that captures detailed terminal metadata (theme, font, cursor mode, adaptive palette, bold-is-bright), user environment data, and scheduling information, while also adding real-time viewer count tracking and support for recording stream exit codes.
lib/asciinema/streaming · high confidence
Replace Bootstrap with custom CSS foundation
The application's styling foundation has been replaced with a custom, lightweight CSS architecture, removing the dependency on Bootstrap. This change introduces a new set of design tokens (CSS custom properties) for colors, spacing, typography, and breakpoints, alongside a minimal CSS reset to normalize element defaults. The UI now uses Fira Sans and JetBrains Mono as the primary typefaces, and transition timings have been reduced for a snappier user experience.
assets/css/foundation · high confidence
Replace Bootstrap with custom CSS framework
The site's styling has been migrated from Bootstrap to a custom, lightweight CSS implementation located in assets/css/base. This change introduces new base styles for typography and layout, replaces Bootstrap's grid system with custom CSS Grid utilities (such as .grid-cols-2 and .main-sidebar-layout), and provides a comprehensive set of utility classes for spacing, display, and flexbox behavior. Users will see updated visual spacing and layout structures while retaining responsive design capabilities.
assets/css/base · high confidence
Replace Bootstrap with custom, simpler CSS components
The application's UI framework has been switched from Bootstrap to a custom, lightweight CSS implementation. This change introduces new, standalone component styles for buttons, forms, modals, dropdowns, tables, and pagination, along with specific utilities for code snippets with copy functionality, recording cards, and section headings. Users will see a refreshed visual design with updated typography, spacing, and interaction states, while retaining core layout and form behaviors.
assets/css/components · high confidence
Rework user account model and introduce CLI token management
The user account schema has been expanded to include granular terminal customization settings (font family, bold-is-bright, adaptive palette, theme preference) and streaming controls (enabled, recording enabled, live stream limit), alongside default visibility preferences for recordings and streams. Additionally, a new CLI token model has been introduced to manage command-line interface access, linking tokens to specific users and their associated recordings.
lib/asciinema/accounts · high confidence
SVG previews now use embedded PNG backgrounds and a new centered logo
The SVG preview rendering has been updated to use an embedded PNG image for the terminal background and block/quadrant visuals, replacing previous methods. Additionally, the preview now features a new, slightly smaller, centered logo that scales proportionally with the SVG size, and the font family definitions no longer include 'ui-monospace'.
_lib/asciinema\_web/controllers/recording\svg · high confidence
SVG to PNG conversion script with BusyBox compatibility
The priv/svg2png.sh script now handles BusyBox-specific timeout syntax (using -s KILL) to ensure reliable execution on Alpine 3.11+, while retaining standard timeout flags for other environments. It converts SVGs to PNGs using rsvg-convert with a configurable zoom factor and optionally optimizes the output with pngquant if available.
priv · high confidence
Updated UI and code fonts to woff2 format
The application's font assets have been updated to use the more efficient woff2 format for Fira Sans, Fira Code, and JetBrains Mono. This change improves loading performance and reduces bandwidth usage for the UI and code display fonts.
assets/css/fonts · high confidence
Updated release scripts with boot banner and ephemeral secret generation
The release overlay scripts in rel/overlays/bin have been updated. The server script now displays an ASCII art boot banner and automatically generates a temporary SECRET\_KEY\_BASE from /dev/urandom if one is not already set, warning the user to configure it for production. Additionally, new scripts have been added: migrate, which runs database migrations via the release interface, and send-test-email, which allows sending a test email via RPC.
rel/overlays/bin · high confidence
Upgrade to Phoenix 1.8 with verified routes and new web entrypoints
The application has been upgraded to Phoenix 1.8, introducing verified routes for improved security and developer experience. This change replaces legacy route helpers with the new \Phoenix.VerifiedRoutes\ system, ensuring that all generated links are type-safe and resilient to refactoring. The upgrade also modernizes the web layer by introducing new entrypoint modules (\AsciinemaWeb\ and \AsciinemaAdmin\) that standardize the use of Phoenix components, LiveViews, and controllers. Users benefit from a more robust routing system and a consistent, component-based UI architecture across both the main application and the admin panel.
lib · high confidence
Test coverage
Added comprehensive test suite for core account and recording operations; Added feature tests for account management, CLI linking, and content visibility; Added large terminal output fixture for testing; Added test coverage for recording and stream API controllers; Added test coverage for the new Asciinema Admin interface; Added test coverage for the new streaming subsystem components; Added test fixtures for asciicast v2 edge cases; Added test fixtures for asciicast v3 parsing edge cases; Added tests for ALIS v1 frame encoding and decoding; Added tests for ApplicationView and LayoutView; Added tests for Asciinema asciicast parsing and event stream handling; Added tests for Asciinema background workers; Added tests for Local and S3 file store implementations; Added tests for stream card and status LiveViews; Added tests for stream consumer and producer WebSocket sockets; Added tests for streaming parser modules; Added tests for the Ecto Snapshot type; Added tests for the new pagination\_links component; Added unit tests for recordings module components; Expanded controller test coverage for web endpoints; Expanded test coverage for core Asciinema modules; Expanded test coverage for web layer security, rendering, and configuration; New test support infrastructure for Asciinema.
Dependencies
Migrate from Ruby/Sinatra to Elixir/Phoenix and update native Rust dependencies
The application has migrated its primary stack from a Ruby/Sinatra backend to an Elixir/Phoenix backend, removing the legacy Gemfile and introducing a new mix.exs with Phoenix 1.8.9, Phoenix LiveView 1.2.7, Oban for background jobs, and Ecto for database access. The JavaScript asset pipeline has been updated to use Phoenix 1.8.9, Phoenix HTML 4.3.0, and the asciinema-player 3.17.0. Additionally, the native Rust components (vt, fts, svg\_raster) have been updated to use Rustler 0.38.0 and associated dependencies like avt 0.17.0.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 41 → 50 (+8.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 63 → 64 (+0.3)
- Architecture 96 → 87 (-9.3)
- Maturity 47 → 57 (+10.5)
- Readiness 25 → 43 (+17.7)
- Security 55 → 66 (+10.7)
- Accessibility 47 (new)
Resolved (50)
- Boundary-crossing change coupling: recordings.ex ↔ seeds.exs (lib/asciinema/recordings.ex)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (lib/asciinema/gzip.ex)
- Duplicated block (11 lines × 2) (lib/asciinema_web/controllers/recording_controller.ex)
- Duplicated block (12 lines × 2) (lib/asciinema/asciicast/v2.ex)
- Duplicated block (12 lines × 2) (lib/asciinema/asciicast/v2.ex)
- Duplicated block (12 lines × 2) (lib/asciinema_web/controllers/email_controller.ex)
- Duplicated block (15 lines × 2) (lib/asciinema/recordings.ex)
- Duplicated block (5 lines × 2) (lib/asciinema/asciicast/v2.ex)
- Duplicated block (5 lines × 2) (lib/asciinema/recordings/snapshot.ex)
- Duplicated block (5 lines × 2) (lib/asciinema/streaming/parser/asciicast_v2.ex)
- Duplicated block (7 lines × 2) (lib/asciinema/asciicast/v2.ex)
- Duplicated block (7 lines × 2) (lib/asciinema_admin/query_ui.ex)
- Duplicated block (8 lines × 2) (lib/asciinema/asciicast/v2.ex)
- Duplicated block (8 lines × 2) (lib/asciinema/recordings.ex)
- Duplicated block (8 lines × 2) (lib/asciinema/recordings.ex)
- Duplicated block (9 lines × 2) (lib/asciinema/accounts.ex)
- Duplicated block (9 lines × 2) (lib/asciinema_admin/controllers/recording_controller.ex)
- High CVE: [GHSA redacted] (mix.lock)
- …and 30 more
New (104)
- (anonymous) (cognitive 23) (assets/js/app.js)
- (anonymous) (cyclomatic 19) (assets/js/app.js)
- Boundary-crossing change coupling: accounts.ex ↔ cli_controller.ex (lib/asciinema/accounts.ex)
- Change coupling: accounts.ex ↔ user.ex (lib/asciinema/accounts.ex)
- Change coupling: alis_v1.ex ↔ asciicast_v2.ex (lib/asciinema/streaming/parser/alis_v1.ex)
- Change coupling: alis_v1.ex ↔ raw.ex (lib/asciinema/streaming/parser/alis_v1.ex)
- Change coupling: asciicast.ex ↔ stream.ex (lib/asciinema/recordings/asciicast.ex)
- Change coupling: asciicast_v2.ex ↔ raw.ex (lib/asciinema/streaming/parser/asciicast_v2.ex)
- Change coupling: cli_controller.ex ↔ router.ex (lib/asciinema_web/controllers/cli_controller.ex)
- Change coupling: local.ex ↔ s3.ex (lib/asciinema/file_store/local.ex)
- Change coupling: oembed_controller.ex ↔ recording_controller.ex (lib/asciinema_web/controllers/oembed_controller.ex)
- Change coupling: recording_controller.ex ↔ recording_json.ex (lib/asciinema_web/controllers/api/recording_controller.ex)
- Change coupling: router.ex ↔ application_view.ex (lib/asciinema_web/router.ex)
- Change coupling: stream_controller.ex ↔ stream_json.ex (lib/asciinema_web/controllers/api/stream_controller.ex)
- Change coupling: streaming.ex ↔ stream.ex (lib/asciinema/streaming.ex)
- Change coupling: v2.ex ↔ v3.ex (lib/asciinema/asciicast/v2.ex)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (10 lines × 2) (lib/asciinema/accounts.ex)
- Duplicated block (11 lines × 2) (lib/asciinema/asciicast/v2.ex)
- …and 84 more
Changes since last survey
- 33 commits — 33 feature/other, 0 fixes
By area
- lib/asciinema — 12 commits
- (root) — 10 commits
- .github/workflows — 4 commits
- lib/asciinema_web — 4 commits
- lib/asciinema_web.ex — 1 commit
- test/asciinema — 1 commit
- test/asciinema_web — 1 commit
Notable commits
- change: Add Development section to the README
- change: Add a VM check running the OCI image
- change: Clamp consumer event time deltas to be monotonic
- change: Close gracefully on malformed asciicast event payloads
- change: Close gracefully on out-of-order producer commands
- change: Configure Phoenix code reloader listener
- change: Cover the producer socket behavior with tests
- change: Deduplicate the server heartbeat chain with a token
- change: Extract ALIS v1 frame encoding into a codec module
- change: Extract consumer session state machine from the consumer socket
- change: Extract producer session state machine from the producer socket
- change: Gate consumer events again after EOT
- change: Handle deleted stream in the stream status widget
- change: Make ALIS EOT a bare control frame
- change: Make Streaming.Parser the complete parsing interface
- change: Make release attach commands work without explicit cookie config
- change: Move ALIS frame decoding into the Alis.V1 codec
- change: Provide CA certificates at the canonical path in the OCI image
- change: Publish nix-built OCI images from the release workflow
- change: Reframe the nix workflow as the build workflow
- …and 13 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
asciinema/asciinema-server was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 22 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 86adf567b7c6596c8df411123a7dc0476bdda3f7 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-821afab8930d.