No description
  • PHP 51.2%
  • TypeScript 26.2%
  • Vue 21.9%
  • CSS 0.3%
  • JavaScript 0.2%
  • Other 0.2%
Find a file
Phan An b714646fb8
fix: use most recent feed date for podcast sync freshness check (#2407)
* fix: use most recent of pubDate and lastBuildDate for podcast sync

Some podcast feeds have a stale pubDate (set once at creation) while
only updating lastBuildDate. The old code preferred pubDate via null
coalescing, causing syncs to skip when pubDate was older than
last_synced_at — even though lastBuildDate indicated new content.

Fixes #2160

* refactor: use Carbon::parse() for more robust RSS date parsing

* fix: correct malformed link tags in podcast test fixtures
2026-04-20 22:06:08 +02:00
.cursor chore: use mago as PHP CS fixer and linter (#2214) 2026-03-04 08:37:08 +01:00
.github fix: remove duplicate pnpm version in release workflow (#2363) 2026-04-01 23:08:19 +02:00
.junie chore: migrate frontend tooling to Vite+ (#2283) 2026-03-14 03:41:09 +01:00
.vite-hooks chore: migrate frontend tooling to Vite+ (#2283) 2026-03-14 03:41:09 +01:00
.vscode chore: upgrade phanan/poddle (closes #2192) (#2196) 2026-01-11 19:11:28 +01:00
api-docs feat: add and use "last played" timestamp for songs (#1578) 2022-11-08 18:38:28 +01:00
app fix: use most recent feed date for podcast sync freshness check (#2407) 2026-04-20 22:06:08 +02:00
bootstrap feat: revamp role and permission system (#2110) 2025-09-25 11:05:51 +07:00
config fix: add Accept: application/json header to upload XHR (#2353) 2026-03-31 16:02:32 +02:00
database feat: detect and flag duplicate file uploads (#2378) 2026-04-06 23:57:20 +02:00
docs feat: detect and flag duplicate file uploads (#2378) 2026-04-06 23:57:20 +02:00
public chore: update vite to v8 (#2281) 2026-03-13 08:58:12 +01:00
resources feat: auto-hide visualizer controls in fullscreen mode (#2400) 2026-04-10 12:42:51 +02:00
routes feat: detect and flag duplicate file uploads (#2378) 2026-04-06 23:57:20 +02:00
scripts feat: add composer script for koel:init (#2119) 2025-10-06 21:30:17 +02:00
storage fix(tests): broken tests after Saloon migration 2024-07-06 17:44:54 +02:00
tests fix: use most recent feed date for podcast sync freshness check (#2407) 2026-04-20 22:06:08 +02:00
.editorconfig feat: custom profile avatar 2024-07-06 17:44:52 +02:00
.env.example docs: add AI_PROVIDER env var for configuring AI provider (#2270) 2026-03-11 14:35:02 +01:00
.gitignore chore: remove Cypress test suite (#2287) 2026-03-14 08:45:18 +01:00
.htaccess.example fix: .htaccess customizations get overwritten with updates (#1762) 2024-04-24 17:02:05 +02:00
.mcp.json chore: upgrade phanan/poddle (closes #2192) (#2196) 2026-01-11 19:11:28 +01:00
.oxfmtrc.json chore: migrate frontend tooling to Vite+ (#2283) 2026-03-14 03:41:09 +01:00
.version chore(release): bump version to v9.1.1 2026-04-07 22:38:15 +02:00
AGENTS.md feat: detect and flag duplicate file uploads (#2378) 2026-04-06 23:57:20 +02:00
artisan feat: upgrade to Laravel 11 (#1960) 2025-06-18 16:41:04 +02:00
boost.json chore: upgrade phanan/poddle (closes #2192) (#2196) 2026-01-11 19:11:28 +01:00
CLAUDE.md chore: rename CLAUDE.md to AGENTS.md with symlink (#2346) 2026-03-31 01:08:17 +02:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2020-09-14 09:48:41 +02:00
commitlint.config.js build: add pre-commit hook to enforce conventional commits 2024-08-23 11:16:26 +02:00
composer.json Remove redundant paragonie/sodium_compat dependency (#2375) 2026-04-03 13:07:33 +02:00
composer.lock Chore | Upgrade to Saloon v4 (#2334) 2026-03-26 00:02:01 +01:00
LICENSE.md chore: correct license date 2024-07-06 17:44:51 +02:00
mago.toml feat: AI assistant with natural language music control (#2267) 2026-03-11 08:30:33 +01:00
nginx.conf.example feat: add sensitive default upload settings 2023-04-17 00:10:34 +02:00
package.json chore(deps): bump lodash-es from 4.17.23 to 4.18.1 (#2367) 2026-04-04 12:32:50 +02:00
phpstan.neon.dist chore: upgrade to Laravel 12 (#2143) 2025-10-22 15:38:37 +02:00
phpunit.xml.dist fix: use Null broadcaster if no Pusher available (#1993) 2025-07-03 15:53:23 +07:00
pnpm-lock.yaml chore(deps): bump lodash-es from 4.17.23 to 4.18.1 (#2367) 2026-04-04 12:32:50 +02:00
postcss.config.cjs feat(ui): use Tailwind CSS 2024-07-06 17:44:57 +02:00
README.md chore: remove FollowHero as a sponsor 2025-10-27 21:00:02 +01:00
server.php chore: use Laravel' original structure 2020-09-12 17:14:34 +02:00
tailwind.config.js fix: a couple of minor mobile issues (#2147) 2025-10-23 10:37:46 +02:00
vite.config.sw.js chore: migrate frontend tooling to Vite+ (#2283) 2026-03-14 03:41:09 +01:00
vite.config.ts fix: use separate cache directory for test runner to avoid HMR conflicts (#2368) 2026-04-02 12:38:13 +02:00

koel Frontend Unit Tests Code Quality codecov OpenCollective OpenCollective

Showcase

Intro

Koel (also stylized as koel, with a lowercase k) is a simple web-based personal audio streaming service written in Vue on the client side and Laravel on the server side. Targeting web developers, Koel embraces some of the more modern web technologies to do its job.

Install and Upgrade Guide

For system requirements, installation/upgrade guides, troubleshooting etc., head over to the Official Documentation.

Development

See the Development Guide.

Koel Player

Koel Player screenshots

Koel Player is the official mobile app for Koel, which supports both iOS and Android without the limitations of the mobile web version. For more information on the project, visit its repository.

Sponsors and Backers

What The Diff logo DigitalOcean logo Ray logo Follower Börse logo CodeSpect logo

Support me on OpenCollective with a monthly donation and help me continue building Koel.

GitHub Sponsors

OpenCollective

Become a sponsor on OpenCollective and get your logo on this README on Github with a link to your site.