sozercan/kaset
65.5
Adequate · 1 October 2026
109.4k
lines of production code
Swift
primary language
2
measurements over time
What this system is
Kaset is a native macOS client that aggregates YouTube Music and standard YouTube into a unified interface, featuring a dual-source sidebar, a system-wide 6-band equalizer, and synced lyrics. The application supports AI-driven interactions via Apple Intelligence and YouTube's Ask Gemini, while providing deep system integration through AppleScript automation, Now Playing controls, and Last.fm scrobbling. It manages complex playback states across audio and video sources, including floating mini-players and ambient video backdrops, with a robust backend for API caching, account switching, and secure session management.
How it got here
2025 — Kaset initial release and legacy cleanup
15 changes.
The project launched Kaset, a native macOS client for YouTube and YouTube Music, introducing a unified SwiftUI interface, system integration, and a new test suite. Concurrently, the codebase underwent significant restructuring by removing the legacy YouTubeMusic app components, including its WebKit-based player, authentication services, and associated models.
2026 — Native YouTube integration and AI expansion
34 changes.
The project introduced a full native YouTube client with ambient visuals and Gemini AI integration, alongside a system-wide equalizer and Last.fm scrobbling. It overhauled the architecture by migrating to Swift Package Manager, implementing robust API parsing, and expanding AI command parsing for macOS 26.0.
Features
Add Kaset product landing page with GitHub Pages deployment
The website now includes a dedicated landing page for Kaset, featuring a hero section that explains the app's dual nature (YouTube Music on Side A, YouTube on Side B), navigation links, and download buttons that dynamically fetch the latest release version and DMG link from GitHub. The page includes a cassette-themed visual switcher to toggle between Side A and Side B views, along with copy-to-clipboard functionality for installation commands (Homebrew and xattr). It also provides SEO metadata, Open Graph tags, and a favicon.
website · high confidence
Add read-only API discovery and video audit tools to API Explorer
The API Explorer now includes new read-only diagnostic capabilities for YouTube and YouTube Music. Users can run the \discover\ command to inspect and follow navigation paths across endpoints like browse, search, and player, with all sensitive response data automatically redacted to ensure safety. Additionally, the \ask-video-audit\ and related commands allow users to audit the API surfaces for YouTube's Ask Gemini (YouChat) features, comparing request profiles and validating server responses for specific video IDs. These tools provide a safe, read-only way to explore internal API structures and AI feature parity without triggering state changes.
Sources/APIExplorer · high confidence
Expanded language support and AppleScript automation capabilities
Kaset now supports a significantly wider range of languages, with localizations added for Arabic, German, Spanish, French, and English (including specific strings for YouTube Ask Gemini and sign-in states), alongside existing support for Chinese, Japanese, Korean, Indonesian, Italian, and others. Additionally, the app introduces AppleScript automation via a new \Kaset.sdef\ dictionary, enabling external scripts to control playback (play, pause, next/previous, volume, shuffle, repeat, mute), manage the play queue (get queue, play track by index), and interact with content (like/dislike tracks).
Sources/Kaset/Resources · high confidence
Initial project structure for YouTubeMusic macOS app
The Xcode project file has been added, establishing the build configuration for the YouTubeMusic application. This includes the source files for the app entry point, models (Song, Playlist, Album, Artist), services (YTMusicClient, AuthService, PlayerService), view models, and macOS-specific views (HomeView, LibraryView, SearchView, PlayerBar). It also configures the test target and links the necessary frameworks.
YouTubeMusic.xcodeproj · high confidence
Introduce Apple Music-style mini player and floating video window
The app now supports a floating mini player window that can be toggled independently of the main interface, along with a separate floating video window for YouTube playback. These new window controllers manage their own lifecycle, positioning, and state persistence, allowing users to keep audio or video visible while working in other apps or minimizing the main window.
Sources/Kaset · high confidence
Introduce native YouTube client with ambient video backdrop and source toggle
This change adds a full native YouTube client experience behind a new sidebar source toggle, allowing users to switch between YouTube Music and YouTube video modes. The YouTube view includes a home feed with personalized rails (Continue Watching, topics), an explore section, and channel/history pages. A key visual feature is the ambient video backdrop, which renders a drifting aurora glow based on the video thumbnail and, in 'Live' mode, crossfades colors using YouTube's storyboard sprite-sheet cells as playback progresses. The implementation includes a scroll-forwarding web view to enable scrolling over the video surface and a floating 'Ask Gemini' panel for video-specific AI conversations.
Sources/Kaset/Views/YouTube · high confidence
Introduce native YouTube source with home feed, chapter navigation, and Ask Gemini support
This change adds the foundational data models for a new native YouTube source, enabling users to browse a personalized home feed (including 'Continue Watching' and topic-based rails), navigate video chapters, and engage with Ask Gemini conversations. The new models in \Sources/Kaset/Models/YouTube\ define the structure for YouTube videos (including watched progress), channels, playlists, and search results, while \YouTubeAskModels.swift\ introduces the binding and state management for AI-driven video interactions.
Sources/Kaset/Models/YouTube · high confidence
Introduces core parsing and validation logic for YouTube Ask (Gemini) video conversations
This change adds the \YouTubeAskCore\ module, providing the backend infrastructure to parse and validate YouTube's 'Ask Gemini' wire responses. It includes a custom JSON parser with strict duplicate-key and structure-limit validation to prevent silent data loss or crashes, a wire decoder that handles various JSON formats (including length-prefixed and newline-delimited), and request builders for panel bootstrapping and free-text queries. Users gain the ability to interact with YouTube's AI video assistant, with the core handling the complex parsing of assistant messages, follow-up suggestions, and input commands while sanitizing visible text and enforcing size limits.
Sources/YouTubeAskCore · high confidence
Introduces native YouTube client view models
This change adds a comprehensive set of view models for a new native YouTube integration, including dedicated models for the Home feed (with Continue Watching and topic rails), Explore, History, Search, Shorts, Subscriptions, Channels, Playlists, and the Watch page. It also introduces the YouTubeAskViewModel to power Gemini video conversations directly within the watch interface, providing the underlying state management and data-loading logic for these new surfaces.
Sources/Kaset/ViewModels/YouTube · high confidence
Kaset initial release with dual-source playback, native UI, and system integration
Kaset launches as a native macOS client for both YouTube Music and regular YouTube, featuring a unified SwiftUI interface with a sidebar source toggle to switch between the two experiences. The app includes a hidden WebView engine for DRM-protected playback, a native player bar with queue management, and a system-wide 6-band equalizer. Users can browse their YouTube Music library, manage playlists, view synced lyrics, and use Smart Shuffle. It integrates deeply with macOS via Now Playing in Control Center, media keys, Dock menu controls, AppleScript automation, and a custom URL scheme (kaset://). The app supports 18 languages, WebKit extensions (like uBlock Origin Lite), and automatic updates via Sparkle.
(repo-wide) · high confidence
New AI command parsing and analysis models for macOS 26.0
This change introduces a suite of new data models in the AI module to support Apple Intelligence features on macOS 26.0. It adds \CommandBarParseResult\ to classify user commands and extract search modifiers, \MusicIntent\ to represent natural language music requests with detailed query components, and \QueueAnalysisSummary\ to provide AI-generated insights into the current playback queue. Additionally, it includes \LyricsSummary\ for song analysis and \PlaylistChanges\ to handle AI-suggested playlist refinements, all leveraging the \FoundationModels\ framework.
Sources/Kaset/Models/AI · high confidence
New AI tools and extension management infrastructure
The app introduces a new AI tooling layer with \MusicSearchTool\ and \QueueTool\, allowing the language model to search the YouTube Music catalog and inspect the current playback queue to provide grounded, non-hallucinated responses. Additionally, an \ExtensionsManager\ service is added to support user-installed web extensions, handling their persistence, manifest analysis, and security-scoped access. The \FavoritesManager\ is also updated to scope favorites per account and includes logic for migrating legacy favorites data.
Sources/Kaset/Services · high confidence
New API parsers for accounts, artist details, home, library, and lyrics
The app introduces a suite of new parsers in the API layer to support expanded content and account features. AccountsListParser enables the account switcher by parsing multi-page menu responses, including brand account identity tokens and sign-in URLs. ArtistParser now surfaces detailed artist profiles with categorized sections for albums, singles, playlists, and related artists. HomeResponseParser handles home and explore page sections, including carousels and grids. LibraryContentParser adds support for browsing the user's saved albums, artists, and playlists. Additionally, LRCParser and LyricsParser enable synced and static lyrics display, while helper extensions improve playlist item identification and track credit extraction.
Sources/Kaset/Services/API/Parsers · high confidence
New API service layer with caching, session configuration, and mock clients
The app introduces a new API service infrastructure in Sources/Kaset/Services/API, featuring a thread-safe APICache with TTL and LRU eviction to reduce redundant network calls, a dedicated APISessionConfiguration that sets a browser-like User-Agent and tunes timeouts for YouTube Music and YouTube API requests, and helper utilities in InnerTubeSupport for generating authorization hashes and timezone offsets. This location also adds comprehensive mock implementations (MockUITestYTMusicClient and MockUITestYouTubeClient) with default and search fixture data to support deterministic UI testing, alongside new transport and conversation handling code for the YouTube Ask (Gemini) feature.
Sources/Kaset/Services/API · high confidence
New AppleScript commands for playback control and video playback
The scripting service now exposes new AppleScript commands, allowing users to control playback (play, pause, next, previous, toggle shuffle, set volume) and play specific videos by YouTube ID via the \play video\ command. This adds direct automation capabilities for media control and video streaming through AppleScript.
Sources/Kaset/Services/Scripting · high confidence
New Last.fm proxy worker for scrobbling and now-playing updates
A new Cloudflare Worker has been added to proxy Last.fm API requests, enabling the Kaset app to submit scrobbles and update now-playing status without exposing API secrets. The worker handles authentication flows (token, session key) and signs requests using MD5, exposing endpoints for health checks, authentication, now-playing updates, and batch scrobble submissions.
worker · high confidence
New Last.fm scrobbling integration with per-track mix support
The app now supports scrobbling to Last.fm, including detailed per-track scrobbling for long mix videos. This update introduces a new scrobbling service layer that handles authentication via a Cloudflare Worker proxy, stores credentials securely in the Keychain, and manages a persistent queue for offline submissions. For mix videos, the system parses tracklists from YouTube chapters or descriptions to identify individual sub-tracks, ensuring each is scrobbled separately rather than treating the entire mix as a single entry.
Sources/Kaset/Services/Scrobbling · high confidence
New YouTube source with comprehensive API parsing
This change introduces a new YouTube source, adding a suite of parsers in Sources/Kaset/Services/API/Parsers/YouTube to handle YouTube's InnerTube API responses. The new parsers support browsing the home feed (including personalized chips and shelves), searching for videos, channels, and playlists, viewing channel details and subscriptions, parsing watch-next pages with chapter navigation, and loading playlist details. It also includes a robust comments parser that handles both modern entity payloads and legacy renderers, and a unified item parser that supports both legacy renderers and the newer lockup view models to ensure compatibility as YouTube updates its UI.
Sources/Kaset/Services/API/Parsers/YouTube · high confidence
New account management service for brand account switching and session identity verification
The app introduces a new \AccountService\ to manage YouTube Music's primary and brand account switching. This service handles fetching available accounts, persisting the selected account across launches, and verifying the playback session identity to ensure actions like history recording and favorites are scoped to the correct account. It works alongside the updated \AuthService\, which now supports guest mode and manages authentication state transitions, ensuring that account switches and session pins are handled safely without race conditions.
Sources/Kaset/Services/Auth · high confidence
New agent skills for API exploration, automated code review, and development packaging
The \.agents\ directory now includes structured skills that guide AI agents in specific workflows. The \api-exploration\ skill provides instructions for investigating YouTube Music API endpoints using the \api-explorer\ tool before modifying production code. The \autoreview\ skill introduces a structured code review process, including a Python helper script that automatically redacts sensitive data (such as tokens, cookies, and private keys) from review bundles, along with test harnesses to validate the review logic against security fixtures. Additionally, the \dev-loop-packaging\ skill documents the build and packaging scripts for the Kaset application, enabling agents to perform fast compile-checks or full app bundle relaunches during development.
.agents · high confidence
New build, release, and automation scripts for SwiftPM and Sparkle
The project now includes a suite of shell scripts to manage the build pipeline, release process, and external control. \build-app.sh\ and \compile\_and\_run.sh\ handle SwiftPM-based compilation, packaging, and hot-reload development workflows. \sign-update.sh\ and \generate-appcast.sh\ automate the signing of release archives and the generation of Sparkle appcast files for updates. \verify-release-app.sh\ validates that release bundles meet security and distribution requirements, such as correct entitlements and code signing identities. Additionally, \test-applescript.sh\ and \test-applescript.scpt\ provide automated testing for the newly exposed AppleScript interface, while \benchmark-xctest.sh\ supports performance testing of the parser and queue components.
Scripts · high confidence
New data models for account switching, equalizer, and artist details
The app introduces several new data models to support recent feature additions. \AccountsListResponse\ and \UserAccount\ provide the structured data needed for the account switcher UI, allowing users to manage multiple Google accounts. A new equalizer system is defined by \EQBand\, \EQPreset\, and \EQSettings\, introducing a six-band parametric equalizer with Spotify-style presets and auto-trim logic. Artist exploration is enhanced with \Artist\, \ArtistDetail\, and \ArtistEpisode\ models, which surface detailed metadata like albums, singles, episodes, and related artists. Additional models like \LikeStatus\, \Lyrics\, and \MixTracklist\ support real-time like syncing, lyrics display, and per-sub-track scrobbling for long mix videos.
Sources/Kaset/Views · high confidence
New shared UI components and performance-optimized shelf rendering
This update introduces a suite of new shared views to the app's UI layer, including \CarouselShelf\ and \HomeItemCollectionShelf\ for horizontal content browsing, \HomeItemCell\ for native AppKit card rendering, and \FavoritesSection\ for managing pinned items. It also adds reusable visual components such as \EqualizerView\ for audio visualization, \ExplicitBadge\ for content warnings, \ErrorView\ for standard error handling, and \AnimationModifiers\ for staggered and fade-in effects. A key behavioral change is the migration of home and chart shelves to a native \NSCollectionView\-backed implementation (\HomeItemCollectionShelf\), which significantly reduces scrolling hitches and CPU usage compared to the previous SwiftUI-only approach.
Sources/Kaset/Views/SharedViews · high confidence
New utility infrastructure for localization, UI compatibility, and accessibility
The app introduces a suite of new utility modules to support recent feature expansions. AppLocalization enables runtime language switching and ensures navigation titles update dynamically with the selected language, while LiquidGlassCompat provides a compatibility layer that renders native Liquid Glass effects on macOS 26+ and falls back to translucent materials on macOS 15. AccessibilityIdentifiers centralizes UI identifiers to improve test reliability, and PlatformCapabilities gates AI-driven features like the command bar and Apple Intelligence integration to macOS 26+. Additional utilities include AnimationConfiguration for consistent motion design, ColorExtractor for dynamic accent colors, and a robust ImageCache with memory/disk tiers and memory-pressure monitoring to optimize performance.
Sources/Kaset/Utilities · high confidence
New view models for artist details, discography, episodes, charts, explore, history, home, library, and moods
This change introduces a comprehensive set of new view models in the Sources/Kaset/ViewModels directory, establishing the data layer for several key app sections. ArtistDetailViewModel, ArtistDiscographyViewModel, and ArtistEpisodesListViewModel handle artist pages, including subscription toggling, song previews, and discography/episode lists. HomeViewModel, ExploreViewModel, ChartsViewModel, and MoodsAndGenresViewModel manage content loading, continuation (pagination), and refresh logic for their respective main navigation areas, with ExploreViewModel specifically filtering out the Charts section to avoid duplication. HistoryViewModel adds playback-driven auto-refresh and account-switching reset capabilities. LibraryViewModel introduces a LibraryMutationBroadcaster to synchronize library state (playlists, albums) across multiple view instances, ensuring optimistic updates and race-condition handling. CommandBarViewModel implements the AI command bar interface, integrating with FoundationModelsService for command parsing, queue analysis, and prompt versioning.
Sources/Kaset/ViewModels · high confidence
Synced lyrics and non-Latin romanization support
The app now fetches timed (synced) lyrics via LRCLib and YouTube Music providers, displaying per-line timestamps. Additionally, non-Latin lyrics (Japanese, Korean, Chinese, Thai, Bengali, Hindi) are automatically romanized based on user settings, with a fix preventing crashes on mixed-script Bengali text.
Sources/Kaset/Services/Lyrics · high confidence
System-wide 6-band equalizer with real-time DSP
A new system-wide equalizer is available, implemented via a Core Audio process tap that intercepts and processes audio from WebKit-based apps. The feature introduces a 6-band parametric equalizer using cascaded biquad filters (peaking, low-shelf, high-shelf) with per-sample coefficient smoothing to prevent clicks during adjustments. It includes an envelope-follower limiter with stereo linking to manage gain and a wet/dry blend for toggling the effect. The service handles lifecycle management, including automatic retries when playback starts, permission checks for screen/system audio recording, and re-binding when the default output device changes.
Sources/Kaset/Services/Audio · high confidence
Removals
Removal of AuthService implementation
The AuthService class, which previously managed YouTube Music authentication state (logged in, logging in, logged out) and handled login flows via WebKit, has been removed from the codebase. This change eliminates the local service responsible for checking login status via SAPISID cookies, handling session expiration, and managing sign-out actions.
Core/Services/Auth · high confidence
Removal of Now Playing and WebView-based Player Service
The Now Playing integration (remote command center and lock screen info) and the WebView-based playback engine (PlayerService and PlayerWebView) have been removed from the Core/Services/Player module. This eliminates the previous implementation that used a hidden WKWebView for audio playback and updated system Now Playing metadata, indicating a shift away from this specific architecture.
Core/Services/Player · high confidence
Removal of WebKitManager singleton for cookie and session management
The WebKitManager class, which previously handled persistent WebKit data stores, cookie retrieval, and authentication state for YouTube Music, has been removed from the codebase. This eliminates the centralized singleton responsible for managing \WKWebsiteDataStore\ instances and observing cookie changes, indicating a shift away from this specific WebKit-based session management approach.
Core/Services/WebKit · high confidence
Removal of YTMusicClient implementation
The YTMusicClient class, which handled authenticated requests to the YouTube Music internal API, has been removed from the codebase. This eliminates the direct integration logic for fetching home content, search results, and library playlists via the deprecated client.
Core/Services/API · high confidence
Removal of centralized diagnostics logging utility
The centralized logging utility (DiagnosticsLogger) that provided categorized logging for authentication, API, WebKit, player, and UI events has been removed from the application. This change eliminates the specific logging infrastructure previously used to track these operational areas.
Core/Utilities · high confidence
Removal of core music domain models
The \Artist\, \Playlist\, \Song\, and \PlaylistDetail\ model structs have been deleted from the \Core/Models\ directory. This change removes the data structures previously used to represent YouTube Music entities, their parsing logic from API responses, and helper properties like duration formatting and artist display strings.
Core/Models · high confidence
Removal of macOS-specific UI views
The macOS-specific user interface components have been removed from the application. This includes the main window layout (MainWindow), the sidebar navigation (Sidebar), and all primary content views such as Home, Library, Search, and Playlist Detail. Additionally, the macOS login sheet (LoginSheet), the persistent mini-player web view (MiniPlayerWebView), and the bottom player bar (PlayerBar) have been deleted. These files are no longer part of the codebase.
Views · high confidence
Behavioural changes
AI command parsing and error handling overhaul
The AI service now uses a new \CommandExecutor\ and \CommandIntentParser\ to interpret natural language music commands, supporting playback controls, queue management, and search intents with specific handling for mood, genre, and activity contexts. Error reporting is standardized via \AIError\ and \AIErrorHandler\, which map underlying Foundation Models failures (including macOS 27-specific error types) to user-friendly messages and recovery suggestions. Prompt engineering has been updated with version-specific instructions for macOS 26.4 and later, and a new \FoundationModelsPromptBudget\ struct manages token usage to optimize model performance.
Sources/Kaset/Services/AI · high confidence
Expose .agents/skills to Claude Code via symlink
A new symbolic link at .claude/skills now points to ../.agents/skills, allowing Claude Code to access skills defined in the .agents directory.
.claude · high confidence
Improved library content stability and deduplication
The library service now handles YouTube Music's inconsistent ID formats and eventual consistency more robustly. A new identity module normalizes playlist, artist, and album keys to prevent duplicates (e.g., stripping 'VL' prefixes or mapping channel IDs), while a reconciler manages optimistic UI updates for adds/removes, ensuring the library view remains stable even when the backend lags or oscillates after mutations.
Sources/Kaset/Services/Library · high confidence
Kaset cask deprecated with migration instructions
The Homebrew cask for Kaset has been deprecated and will no longer receive updates. Users are now instructed to migrate to the new tap at https://github.com/sozercan/homebrew-repo by running 'brew untap sozercan/kaset' followed by 'brew install sozercan/repo/kaset'. The cask version is set to 0.4.1, requires macOS Tahoe, and includes a postflight step to remove quarantine attributes from the application.
Casks · high confidence
Refactored player service with intent-based ownership and native Now Playing integration
The player service has been restructured to use a strict intent-based ownership model (MusicPlaybackIntent) to prevent race conditions and stale updates during playback transitions. This change introduces a new Now Playing manager that asserts native media claims to ensure system media keys and the Control Center correctly route to Kaset even when the app is paused or loading. Additionally, a Playback Arbiter now coordinates between music and YouTube video sources to ensure only one plays at a time, and album playback actions have been consolidated into a dedicated service for queue management.
Sources/Kaset/Services/Player · high confidence
Removal of legacy Home, Library, Search, and Playlist detail view models
The HomeViewModel, LibraryViewModel, PlaylistDetailViewModel, and SearchViewModel files have been deleted from the Core/ViewModels directory. This removes the previous implementations responsible for loading home sections, managing library playlists and their details, handling search queries with debouncing and filtering, and displaying playlist track lists, indicating a structural shift in how these core app areas are now handled.
Core/ViewModels · high confidence
Removal of macOS app lifecycle and background audio management
The \AppDelegate\ and \YouTubeMusicApp\ entry-point files have been deleted, removing the custom logic that previously kept the application running in the background for audio playback when the main window was closed. This includes the \NSWindowDelegate\ implementation that intercepted window close events to hide rather than quit, the persistent \WKWebView\ setup for background audio, and the SwiftUI app struct that registered the app delegate. Users will no longer have the ability to keep the app running silently in the background via the dock icon after closing the main window.
App · high confidence
Restored KasetUITests project structure and added macOS 15 compatibility
The KasetUITests Xcode project has been regenerated to include the full suite of UI test sources (such as AccountSwitcher, HomeView, and PlayerBar tests) and a new MacOS15FallbackUITests file to ensure compatibility with macOS 15 (Sequoia). This change restores the test bundle configuration and scheme, ensuring that UI tests can be built and executed correctly on the latest macOS version.
KasetUITests.xcodeproj · high confidence
Silent notifications now post on track changes and loading resolution
The app now posts silent local notifications whenever the current track changes or when a track's metadata finishes loading after initially showing 'Loading...'. This replaces the previous polling-based approach with an event-driven observation model using the Observation framework, ensuring notifications are sent only for resolved tracks and preventing duplicates.
Sources/Kaset/Services/Notification · high confidence
Fixes
Improved authentication reliability and WebKit extension support
This update introduces a new WebKit extension host to allow web extensions to interact with playback webviews, and adds a script to suppress WebAuthn passkeys on Google sign-in pages to prevent dead-end errors. It also significantly refactors the authentication cookie lifecycle, introducing a coordinator to serialize clear operations, a stable backup/restore system using the Keychain, and logic to preserve live WebKit login sessions when the archive is unavailable, ensuring more robust session handling across app launches.
Sources/Kaset/Services/WebKit · high confidence
Test coverage
Added UI test coverage for core app features; Added tests for AI error handling, API caching, and account service logic; Added tests for read-only API discovery and mobile profile consistency; Removal of YouTubeMusic test suite.
Dependencies
Migration to Swift Package Manager with macOS 15.4 requirement
The project has migrated from an Xcode project file to Swift Package Manager (Package.swift), establishing Swift 6 as the language mode and enabling strict concurrency checks. The application now requires macOS 15.4 as the minimum deployment target. This change also introduces a new read-only API discovery tool (api-explorer) and integrates the Sparkle framework (v2.8.1) for automatic updates.
(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 67 → 66 (-1.2)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 80 → 78 (-2.5)
- Architecture 97 → 94 (-3.4)
- Maturity 81 → 81 (-0.1)
- Readiness 64 → 63 (-0.5)
- Security 58 → 58 (+0.0)
- Performance 78 (new)
Resolved (52)
- Documentation: no installation or build instructions (README.md)
- Duplicated block (14 lines × 2) (Sources/Kaset/Services/WebKit/WebKitManager+Cookies.swift)
- Duplicated block (14 lines × 5) (Sources/Kaset/Views/ChartsView.swift)
- Duplicated block (16 lines × 4) (Sources/Kaset/Views/ChartsView.swift)
- Duplicated block (2–6 lines × 12) (Sources/Kaset/Services/API/Parsers/AccountsListParser.swift)
- Duplicated block (3–5 lines × 16) (Sources/Kaset/Services/API/Parsers/AccountsListParser.swift)
- Duplicated block (4–6 lines × 9) (Sources/Kaset/Services/API/Parsers/AccountsListParser.swift)
- Duplicated block (5 lines × 4) (Sources/Kaset/Services/API/Parsers/ArtistParser.swift)
- Duplicated block (5 lines × 6) (Sources/Kaset/Services/API/Parsers/ArtistParser.swift)
- Duplicated block (6 lines × 2) (Sources/Kaset/Services/API/Parsers/ArtistParser.swift)
- Duplicated block (7 lines × 2) (Sources/Kaset/Services/API/Parsers/ArtistParser.swift)
- Duplicated block (7 lines × 2) (Sources/Kaset/Views/PlayerBar.swift)
- Duplicated block (7 lines × 3) (Sources/Kaset/Services/API/Parsers/SearchResponseParser.swift)
- Edited copy of a member (17 corresponding lines) (Sources/Kaset/Services/API/YTMusicClient.swift)
- Edited copy of a member (24 corresponding lines) (Sources/Kaset/Services/API/Parsers/YouTube/ChannelPageParser.swift)
- Edited copy of a member (31 corresponding lines) (Sources/APIExplorer/main.swift)
- HomeSectionItemCard.== (cognitive 19) (Sources/Kaset/Views/SharedViews/HomeSectionItemCard.swift)
- HomeSectionItemCard.== (cyclomatic 20) (Sources/Kaset/Views/SharedViews/HomeSectionItemCard.swift)
- Hotspot: Sources/APIExplorer/AskVideoAudit.swift (Sources/APIExplorer/AskVideoAudit.swift)
- Hotspot: Sources/Kaset/Services/AI/ContentSourceResolver.swift (Sources/Kaset/Services/AI/ContentSourceResolver.swift)
- …and 32 more
New (219)
- AskVideoAudit.swift.askPanelSuggestions (cognitive 20) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.askPanelSuggestions (cyclomatic 17) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.askParityServerLoggedOutState (cognitive 20) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.auditAskVideo (cognitive 100) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.auditAskVideo (cyclomatic 43) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.firstAskSchemaValue (cognitive 16) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.liveTestAskVideo (cognitive 21) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.liveTestAskVideo (cyclomatic 17) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.liveTestAskVideoFreeText (cognitive 21) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.liveTestAskVideoFreeText (cyclomatic 17) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.loadAskFreeTextCommand (cognitive 22) (Sources/APIExplorer/AskVideoAudit.swift)
- AskVideoAudit.swift.loadAskFreeTextCommand (cyclomatic 22) (Sources/APIExplorer/AskVideoAudit.swift)
- Change coupling: ExploreView.swift ↔ HomeView.swift (Sources/Kaset/Views/ExploreView.swift)
- Coverage not measured — Swift suite
- Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
- DiscoveryAudit.swift.discoverAPI (cognitive 59) (Sources/APIExplorer/DiscoveryAudit.swift)
- DiscoveryAudit.swift.discoverAPI (cyclomatic 32) (Sources/APIExplorer/DiscoveryAudit.swift)
- DiscoveryNavigation.priority (cognitive 16) (Sources/APIExplorer/DiscoveryAudit.swift)
- Duplicated block (10 lines × 2) (Sources/APIExplorer/main.swift)
- Duplicated block (10 lines × 2) (Sources/APIExplorer/main.swift)
- …and 199 more
Changes since last survey
- 13 commits — 8 feature/other, 5 fixes
By area
- Sources/Kaset — 6 commits
- (root) — 3 commits
- .github/workflows — 3 commits
- website/assets — 1 commit
Notable commits
- fix: fix(auth): keep debug sign-out tombstone separate from release (#516)
- fix: fix(ci): use SHA-pinned upload-artifact in Pages deploy (#519)
- fix: fix(login): add close button and drop passkey note from sign-in sheet (#513)
- fix: fix(release): add missing ja string and serialize release tests (#504)
- fix: fix(release): keep XCTest suites running in the release job (#505)
- change: Update appcast to v0.14.1 (#506)
- change: chore(deps): bump the github-actions group with 3 updates (#522)
- change: docs(readme): clarify installation steps for new users (#510)
- change: docs: add NotchDock to ADOPTERS.md (#521)
- change: feat(localization): add Japanese localization (#503)
- change: feat(website): add landing page and GitHub Pages deploy (#518)
- change: feat(youtube): add setting to show player controls on the video (#515)
- change: perf(home): reduce scrolling hitches with lightweight AppKit cards (#489)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
sozercan/kaset 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 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 61d69f511a4e087bb232765d00b2feb32a1587e7 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.