gitextract_mp86zz6d/ ├── .cursor/ │ └── rules/ │ └── testing-conventions.mdc ├── .dockerignore ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── pull_request_template.md │ └── workflows/ │ ├── conventional-commit-check.yml │ ├── docker-publish.yml │ ├── lint-and-format.yml │ └── release.yml ├── .gitignore ├── .pylintrc ├── .releaserc.cjs ├── .worktrees/ │ └── .gitignore ├── AGENTS.md ├── Dockerfile ├── LICENCE ├── Pipfile ├── Pipfile.lite ├── README.md ├── SECURITY.md ├── compose.dev.cpu.yml ├── compose.dev.nvidia.yml ├── compose.dev.rocm.yml ├── compose.yml ├── docker-entrypoint.sh ├── docs/ │ ├── contributors.md │ ├── how_to_run_beginners.md │ ├── how_to_run_railway.md │ └── todo.txt ├── frontend/ │ ├── .gitignore │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── postcss.config.js │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── components/ │ │ │ ├── AddFeedForm.tsx │ │ │ ├── AudioPlayer.tsx │ │ │ ├── DiagnosticsModal.tsx │ │ │ ├── DownloadButton.tsx │ │ │ ├── EpisodeProcessingStatus.tsx │ │ │ ├── FeedDetail.tsx │ │ │ ├── FeedList.tsx │ │ │ ├── PlayButton.tsx │ │ │ ├── ProcessingStatsButton.tsx │ │ │ ├── ReprocessButton.tsx │ │ │ └── config/ │ │ │ ├── ConfigContext.tsx │ │ │ ├── ConfigTabs.tsx │ │ │ ├── index.ts │ │ │ ├── sections/ │ │ │ │ ├── AppSection.tsx │ │ │ │ ├── LLMSection.tsx │ │ │ │ ├── OutputSection.tsx │ │ │ │ ├── ProcessingSection.tsx │ │ │ │ ├── WhisperSection.tsx │ │ │ │ └── index.ts │ │ │ ├── shared/ │ │ │ │ ├── ConnectionStatusCard.tsx │ │ │ │ ├── EnvOverrideWarningModal.tsx │ │ │ │ ├── EnvVarHint.tsx │ │ │ │ ├── Field.tsx │ │ │ │ ├── SaveButton.tsx │ │ │ │ ├── Section.tsx │ │ │ │ ├── TestButton.tsx │ │ │ │ ├── constants.ts │ │ │ │ └── index.ts │ │ │ └── tabs/ │ │ │ ├── AdvancedTab.tsx │ │ │ ├── DefaultTab.tsx │ │ │ ├── DiscordTab.tsx │ │ │ ├── UserManagementTab.tsx │ │ │ └── index.ts │ │ ├── contexts/ │ │ │ ├── AudioPlayerContext.tsx │ │ │ ├── AuthContext.tsx │ │ │ └── DiagnosticsContext.tsx │ │ ├── hooks/ │ │ │ ├── useConfigState.ts │ │ │ └── useEpisodeStatus.ts │ │ ├── index.css │ │ ├── main.tsx │ │ ├── pages/ │ │ │ ├── BillingPage.tsx │ │ │ ├── ConfigPage.tsx │ │ │ ├── HomePage.tsx │ │ │ ├── JobsPage.tsx │ │ │ ├── LandingPage.tsx │ │ │ └── LoginPage.tsx │ │ ├── services/ │ │ │ └── api.ts │ │ ├── types/ │ │ │ └── index.ts │ │ ├── utils/ │ │ │ ├── clipboard.ts │ │ │ ├── diagnostics.ts │ │ │ └── httpError.ts │ │ └── vite-env.d.ts │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── pyproject.toml ├── run_podly_docker.sh ├── scripts/ │ ├── ci.sh │ ├── create_migration.sh │ ├── downgrade_db.sh │ ├── generate_lockfiles.sh │ ├── manual_publish.sh │ ├── new_worktree.sh │ ├── start_services.sh │ ├── test_full_workflow.py │ └── upgrade_db.sh ├── src/ │ ├── app/ │ │ ├── __init__.py │ │ ├── auth/ │ │ │ ├── __init__.py │ │ │ ├── bootstrap.py │ │ │ ├── discord_service.py │ │ │ ├── discord_settings.py │ │ │ ├── feed_tokens.py │ │ │ ├── guards.py │ │ │ ├── middleware.py │ │ │ ├── passwords.py │ │ │ ├── rate_limiter.py │ │ │ ├── service.py │ │ │ ├── settings.py │ │ │ └── state.py │ │ ├── background.py │ │ ├── config_store.py │ │ ├── db_commit.py │ │ ├── db_guard.py │ │ ├── extensions.py │ │ ├── feeds.py │ │ ├── ipc.py │ │ ├── job_manager.py │ │ ├── jobs_manager.py │ │ ├── jobs_manager_run_service.py │ │ ├── logger.py │ │ ├── models.py │ │ ├── post_cleanup.py │ │ ├── posts.py │ │ ├── processor.py │ │ ├── routes/ │ │ │ ├── __init__.py │ │ │ ├── auth_routes.py │ │ │ ├── billing_routes.py │ │ │ ├── config_routes.py │ │ │ ├── discord_routes.py │ │ │ ├── feed_routes.py │ │ │ ├── jobs_routes.py │ │ │ ├── main_routes.py │ │ │ ├── post_routes.py │ │ │ └── post_stats_utils.py │ │ ├── runtime_config.py │ │ ├── static/ │ │ │ └── .gitignore │ │ ├── templates/ │ │ │ └── index.html │ │ ├── timeout_decorator.py │ │ └── writer/ │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── actions/ │ │ │ ├── __init__.py │ │ │ ├── cleanup.py │ │ │ ├── feeds.py │ │ │ ├── jobs.py │ │ │ ├── processor.py │ │ │ ├── system.py │ │ │ └── users.py │ │ ├── client.py │ │ ├── executor.py │ │ ├── model_ops.py │ │ ├── protocol.py │ │ └── service.py │ ├── boundary_refinement_prompt.jinja │ ├── main.py │ ├── migrations/ │ │ ├── README │ │ ├── alembic.ini │ │ ├── env.py │ │ ├── script.py.mako │ │ └── versions/ │ │ ├── 0d954a44fa8e_feed_access.py │ │ ├── 16311623dd58_env_hash.py │ │ ├── 185d3448990e_stripe.py │ │ ├── 18c2402c9202_cleanup_retention_days.py │ │ ├── 2e25a15d11de_per_feed_auto_whitelist.py │ │ ├── 31d767deb401_credits.py │ │ ├── 35b12b2d9feb_landing_page.py │ │ ├── 3c7f5f7640e4_add_counters_reset_timestamp.py │ │ ├── 3d232f215842_migration.py │ │ ├── 3eb0a3a0870b_discord.py │ │ ├── 401071604e7b_config_tables.py │ │ ├── 58b4eedd4c61_add_last_active_to_user.py │ │ ├── 5bccc39c9685_zero_initial_allowance.py │ │ ├── 608e0b27fcda_stronger_access_token.py │ │ ├── 611dcb5d7f12_add_image_url_to_post_model_for_episode_.py │ │ ├── 6e0e16299dcb_alternate_feed_id.py │ │ ├── 73a6b9f9b643_allow_null_feed_id_for_aggregate_tokens.py │ │ ├── 770771437280_episode_whitelist.py │ │ ├── 7de4e57ec4bb_discord_settings.py │ │ ├── 802a2365976d_gruanular_credits.py │ │ ├── 82cfcc8e0326_refined_cuts.py │ │ ├── 89d86978f407_limit_users.py │ │ ├── 91ff431c832e_download_count.py │ │ ├── 999b921ffc58_migration.py │ │ ├── a6f5df1a50ac_add_users_table.py │ │ ├── ab643af6472e_add_manual_feed_allowance_to_user.py │ │ ├── b038c2f99086_add_processingjob_table_for_async_.py │ │ ├── b92e47a03bb2_refactor_transcripts_to_db_tables_.py │ │ ├── bae70e584468_.py │ │ ├── c0f8893ce927_add_skipped_jobs_columns.py │ │ ├── ded4b70feadb_add_image_metadata_to_feed.py │ │ ├── e1325294473b_add_autoprocess_on_download.py │ │ ├── eb51923af483_multiple_supporters.py │ │ ├── f6d5fee57cc3_tz_fix.py │ │ ├── f7a4195e0953_add_enable_boundary_refinement_to_llm_.py │ │ └── fa3a95ecd67d_audio_processing_paths.py │ ├── podcast_processor/ │ │ ├── __init__.py │ │ ├── ad_classifier.py │ │ ├── ad_merger.py │ │ ├── audio.py │ │ ├── audio_processor.py │ │ ├── boundary_refiner.py │ │ ├── cue_detector.py │ │ ├── llm_concurrency_limiter.py │ │ ├── llm_error_classifier.py │ │ ├── llm_model_call_utils.py │ │ ├── model_output.py │ │ ├── podcast_downloader.py │ │ ├── podcast_processor.py │ │ ├── processing_status_manager.py │ │ ├── prompt.py │ │ ├── token_rate_limiter.py │ │ ├── transcribe.py │ │ ├── transcription_manager.py │ │ └── word_boundary_refiner.py │ ├── shared/ │ │ ├── __init__.py │ │ ├── config.py │ │ ├── defaults.py │ │ ├── interfaces.py │ │ ├── llm_utils.py │ │ ├── processing_paths.py │ │ └── test_utils.py │ ├── system_prompt.txt │ ├── tests/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_ad_classifier.py │ │ ├── test_ad_classifier_rate_limiting_integration.py │ │ ├── test_aggregate_feed.py │ │ ├── test_audio_processor.py │ │ ├── test_config_error_handling.py │ │ ├── test_feeds.py │ │ ├── test_filenames.py │ │ ├── test_helpers.py │ │ ├── test_llm_concurrency_limiter.py │ │ ├── test_llm_error_classifier.py │ │ ├── test_parse_model_output.py │ │ ├── test_podcast_downloader.py │ │ ├── test_podcast_processor_cleanup.py │ │ ├── test_post_cleanup.py │ │ ├── test_post_routes.py │ │ ├── test_posts.py │ │ ├── test_process_audio.py │ │ ├── test_rate_limiting_config.py │ │ ├── test_rate_limiting_edge_cases.py │ │ ├── test_session_auth.py │ │ ├── test_token_limit_config.py │ │ ├── test_token_rate_limiter.py │ │ ├── test_transcribe.py │ │ └── test_transcription_manager.py │ ├── user_prompt.jinja │ └── word_boundary_refinement_prompt.jinja └── tests/ └── test_cue_detector.py