gitextract__nmkll40/ ├── .credo.exs ├── .dockerignore ├── .ex_dna.exs ├── .formatter.exs ├── .github/ │ ├── dependabot.yml │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .tool-versions ├── AGENTS.md ├── Dockerfile ├── README.md ├── assets/ │ ├── css/ │ │ └── app.css │ ├── js/ │ │ ├── app.js │ │ └── hooks/ │ │ └── local_player.js │ ├── tailwind.config.js │ └── vendor/ │ └── topbar.js ├── config/ │ ├── config.exs │ ├── dev.exs │ ├── prod.exs │ ├── runtime.exs │ └── test.exs ├── coveralls.json ├── docker-compose.yml ├── docs/ │ ├── plans/ │ │ ├── discord-role-gated-access.md │ │ └── discord-role-gated-access.md.tasks.json │ └── specs/ │ ├── discord-role-gated-access.md │ ├── voice-auto-join-idle-leave.md │ └── youtube-playback.md ├── entrypoint.sh ├── lib/ │ ├── soundboard/ │ │ ├── accounts/ │ │ │ ├── api_token.ex │ │ │ ├── api_tokens.ex │ │ │ └── user.ex │ │ ├── accounts.ex │ │ ├── application.ex │ │ ├── audio_player/ │ │ │ ├── notifier.ex │ │ │ ├── playback_engine.ex │ │ │ ├── playback_queue.ex │ │ │ ├── sound_library.ex │ │ │ └── voice_session.ex │ │ ├── audio_player.ex │ │ ├── discord/ │ │ │ ├── bot_identity.ex │ │ │ ├── consumer.ex │ │ │ ├── guild_cache.ex │ │ │ ├── handler/ │ │ │ │ ├── auto_join_policy.ex │ │ │ │ ├── command_handler.ex │ │ │ │ ├── idle_timeout_policy.ex │ │ │ │ ├── sound_effects.ex │ │ │ │ ├── voice_commands.ex │ │ │ │ ├── voice_presence.ex │ │ │ │ └── voice_runtime.ex │ │ │ ├── handler.ex │ │ │ ├── message.ex │ │ │ ├── role_checker.ex │ │ │ ├── runtime_capability.ex │ │ │ └── voice.ex │ │ ├── favorites/ │ │ │ └── favorite.ex │ │ ├── favorites.ex │ │ ├── public_url.ex │ │ ├── pubsub_topics.ex │ │ ├── release.ex │ │ ├── repo.ex │ │ ├── sound.ex │ │ ├── sound_tag.ex │ │ ├── sounds/ │ │ │ ├── management.ex │ │ │ ├── tags.ex │ │ │ ├── uploads/ │ │ │ │ ├── create_request.ex │ │ │ │ ├── creator.ex │ │ │ │ ├── normalizer.ex │ │ │ │ └── source.ex │ │ │ └── uploads.ex │ │ ├── sounds.ex │ │ ├── stats/ │ │ │ └── play.ex │ │ ├── stats.ex │ │ ├── tag.ex │ │ ├── uploads_path.ex │ │ ├── user_sound_setting.ex │ │ └── volume.ex │ ├── soundboard.ex │ ├── soundboard_web/ │ │ ├── components/ │ │ │ ├── core_components.ex │ │ │ ├── flash_component.ex │ │ │ ├── layouts/ │ │ │ │ ├── app.html.heex │ │ │ │ ├── navbar.ex │ │ │ │ └── root.html.heex │ │ │ ├── layouts.ex │ │ │ └── soundboard/ │ │ │ ├── delete_modal.ex │ │ │ ├── edit_modal.ex │ │ │ ├── helpers.ex │ │ │ ├── tag_components.ex │ │ │ ├── upload_modal.ex │ │ │ └── volume_control.ex │ │ ├── controllers/ │ │ │ ├── api/ │ │ │ │ └── sound_controller.ex │ │ │ ├── auth_controller.ex │ │ │ ├── error_html.ex │ │ │ ├── error_json.ex │ │ │ └── upload_controller.ex │ │ ├── endpoint.ex │ │ ├── gettext.ex │ │ ├── live/ │ │ │ ├── favorites_live.ex │ │ │ ├── favorites_live.html.heex │ │ │ ├── settings_live.ex │ │ │ ├── soundboard_live/ │ │ │ │ ├── edit_flow.ex │ │ │ │ └── upload_flow.ex │ │ │ ├── soundboard_live.ex │ │ │ ├── soundboard_live.html.heex │ │ │ ├── stats_live.ex │ │ │ └── support/ │ │ │ ├── flash_helpers.ex │ │ │ ├── live_tags.ex │ │ │ ├── presence_live.ex │ │ │ ├── sound_playback.ex │ │ │ └── tag_form.ex │ │ ├── plugs/ │ │ │ ├── api_auth.ex │ │ │ ├── basic_auth.ex │ │ │ └── role_check.ex │ │ ├── presence.ex │ │ ├── presence_handler.ex │ │ ├── router.ex │ │ ├── sound_helpers.ex │ │ ├── soundboard/ │ │ │ └── sound_filter.ex │ │ └── telemetry.ex │ └── soundboard_web.ex ├── mix.exs ├── priv/ │ ├── gettext/ │ │ ├── en/ │ │ │ └── LC_MESSAGES/ │ │ │ └── errors.po │ │ └── errors.pot │ ├── repo/ │ │ ├── migrations/ │ │ │ ├── .formatter.exs │ │ │ ├── 20250101213201_create_sounds.exs │ │ │ ├── 20250101213717_create_tags.exs │ │ │ ├── 20250101231744_create_users.exs │ │ │ ├── 20250102212120_create_plays.exs │ │ │ ├── 20250102212121_create_favorites.exs │ │ │ ├── 20250102212122_add_user_id_to_sounds.exs │ │ │ ├── 20250102212123_change_favorites_filename_to_sound_id.exs │ │ │ ├── 20250102212124_add_index_to_plays.exs │ │ │ ├── 20250102212125_add_join_leave_flags_to_sounds.exs │ │ │ ├── 20250102212126_add_url_to_sounds.exs │ │ │ ├── 20250218214831_create_user_sound_settings.exs │ │ │ ├── 20250218214832_remove_join_leave_flags_from_sounds.exs │ │ │ ├── 20250218220000_create_api_tokens.exs │ │ │ ├── 20250218223000_add_token_plain_to_api_tokens.exs │ │ │ ├── 20250310120000_add_volume_to_sounds.exs │ │ │ ├── 20260306150000_add_sound_id_to_plays.exs │ │ │ ├── 20260306151000_finalize_favorites_and_sound_tags_migrations.exs │ │ │ └── 20260307211000_rename_sound_name_to_played_filename_in_plays.exs │ │ └── seeds.exs │ └── static/ │ ├── manifest.json │ └── robots.txt └── test/ ├── soundboard/ │ ├── accounts/ │ │ └── api_tokens_test.exs │ ├── accounts_test.exs │ ├── audio_player/ │ │ ├── playback_engine_test.exs │ │ ├── playback_queue_test.exs │ │ └── sound_library_test.exs │ ├── discord/ │ │ ├── bot_identity_test.exs │ │ ├── handler/ │ │ │ ├── auto_join_policy_test.exs │ │ │ ├── command_handler_test.exs │ │ │ ├── idle_timeout_policy_test.exs │ │ │ ├── voice_presence_test.exs │ │ │ └── voice_runtime_test.exs │ │ ├── role_checker_test.exs │ │ ├── runtime_capability_test.exs │ │ └── voice_test.exs │ ├── favorites_test.exs │ ├── migrations/ │ │ └── data_migrations_test.exs │ ├── public_url_test.exs │ ├── pubsub_topics_test.exs │ ├── sound_tag_test.exs │ ├── sound_test.exs │ ├── sounds/ │ │ ├── management_test.exs │ │ ├── sound_settings_test.exs │ │ ├── tags_test.exs │ │ └── uploads_test.exs │ ├── stats_test.exs │ ├── tags/ │ │ └── tag_test.exs │ ├── uploads_path_test.exs │ └── volume_test.exs ├── soundboard_test.exs ├── soundboard_web/ │ ├── audio_player_test.exs │ ├── components/ │ │ ├── layouts/ │ │ │ └── navbar_test.exs │ │ └── soundboard/ │ │ ├── edit_modal_test.exs │ │ └── upload_modal_test.exs │ ├── controllers/ │ │ ├── api/ │ │ │ └── sound_controller_test.exs │ │ ├── auth_controller_test.exs │ │ └── upload_controller_test.exs │ ├── discord_handler_test.exs │ ├── eda_consumer_test.exs │ ├── live/ │ │ ├── favorites_live_test.exs │ │ ├── settings_live_test.exs │ │ ├── soundboard_live/ │ │ │ ├── edit_flow_test.exs │ │ │ └── upload_flow_test.exs │ │ ├── soundboard_live_test.exs │ │ └── stats_live_test.exs │ ├── plugs/ │ │ ├── api_auth_db_token_test.exs │ │ ├── basic_auth_test.exs │ │ └── role_check_test.exs │ ├── presence_handler_test.exs │ ├── sound_helpers_test.exs │ └── soundboard/ │ └── sound_filter_test.exs ├── support/ │ ├── conn_case.ex │ ├── data_case.ex │ └── test_helpers.ex └── test_helper.exs