{"id":51436955,"url":"https://github.com/fezcode/timp","last_synced_at":"2026-07-05T07:30:32.955Z","repository":{"id":366685222,"uuid":"1230296329","full_name":"fezcode/timp","owner":"fezcode","description":"Native cross-platform music player in pure C. INI-based skins, themes, EQ, playlist, Unicode paths, no toolkit.","archived":false,"fork":false,"pushed_at":"2026-07-03T20:35:12.000Z","size":562,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T22:23:38.047Z","etag":null,"topics":["audio-player","c","c11","cross-platform","equalizer","flac","lightweight","linux","macos","miniaudio","mp3","music-player","native","portable","retro","sdl2","skinnable","themes","winamp","windows"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fezcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-05T21:33:03.000Z","updated_at":"2026-07-03T20:35:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fezcode/timp","commit_stats":null,"previous_names":["fezcode/timp"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/fezcode/timp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezcode%2Ftimp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezcode%2Ftimp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezcode%2Ftimp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezcode%2Ftimp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fezcode","download_url":"https://codeload.github.com/fezcode/timp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezcode%2Ftimp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35147199,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-player","c","c11","cross-platform","equalizer","flac","lightweight","linux","macos","miniaudio","mp3","music-player","native","portable","retro","sdl2","skinnable","themes","winamp","windows"],"created_at":"2026-07-05T07:30:32.280Z","updated_at":"2026-07-05T07:30:32.939Z","avatar_url":"https://github.com/fezcode.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Timp\n\nA small, native, album-art-forward music player written in C with\n[raylib](https://www.raylib.com/).\n\nBorderless single window with a Hi-Fi look: large cover art, anti-aliased\ntypography, an accent color sampled from the artwork, a live spectrum, a\n10-band EQ, a slide-out saveable playlist drawer, and synced lyrics. Audio is\ndecoded by [miniaudio](https://miniaud.io/) (MP3 / FLAC / OGG / WAV, Unicode paths).\nNo installer, no runtime, no telemetry — raylib is linked statically, so the\nwhole app is a single `timp.exe`.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"examples/main.png\" alt=\"Timp — now playing\" width=\"360\"/\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Formats** — MP3, FLAC, OGG/Vorbis, WAV (whatever miniaudio decodes)\n- **Unicode paths** — file open and decoding go through the Win32 wide API, so\n  non-ASCII folders and filenames work end to end\n- **Album art** — embedded covers (ID3v2 `APIC`, FLAC `PICTURE`) → a sibling\n  `cover.jpg` / `folder.jpg` → a generated gradient; the **accent color is\n  sampled from the artwork**\n- **Lyrics** — synced `.lrc` (karaoke-style highlight), plain `.txt`, embedded\n  ID3 `USLT` / Vorbis `LYRICS`, and an online **lrclib.net** fallback fetched on\n  a background thread\n- **Visualizers** — click the album art to cycle cover → spectrum bars →\n  waveform; a mini spectrum sits under the title\n- **Playlist drawer** — the queue lives in a panel that **slides out the left or\n  right side** (your choice in Settings), extending the window beside the player.\n  Drag files or a folder in (appends), drag rows to reorder, double-click to play,\n  hover for a remove `×`, or clear it\n- **Saved playlists** — name and **save** the queue as a standard `.m3u8`\n  (UTF-8, absolute paths — so it opens in other players and survives across\n  drives), **reopen** it from an in-app library, and overwrite with a confirm;\n  stored in `%APPDATA%\\Timp\\Playlists\\`\n- **10-band equalizer** — 60 / 170 / 310 / 600 Hz / 1 / 3 / 6 / 12 / 14 / 16 kHz,\n  with `ON` / `FLAT`\n- **Transport** — play/pause, prev/next, **drag-to-scrub** seeking, volume,\n  **fixed-order shuffle** (the whole list is shuffled once; next/prev follow that\n  order), and 3-state repeat (off / one / all)\n- **Tags** — title / artist / album read from ID3v2 and Vorbis comments\n  (UTF-8 / UTF-16, full Latin + Turkish glyph coverage)\n- **System integration** — system-wide media keys, always-on-top, and a\n  procedurally-drawn app/taskbar icon\n- **Persistent settings** — volume, EQ, always-on-top, playlist side, and window\n  position are saved to `%APPDATA%\\Timp\\config.ini`\n- **Polished window** — borderless with anti-aliased, rounded corners (Win11\n  DWM) and no console window\n- **Tiny** — pure C11 + raylib + miniaudio, statically linked into one exe\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"examples/queue.png\" alt=\"Queue\" width=\"300\"/\u003e\u003cbr/\u003e\u003cem\u003eQueue — reorder / remove / clear\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"examples/eq.png\" alt=\"Equalizer\" width=\"300\"/\u003e\u003cbr/\u003e\u003cem\u003e10-band EQ\u003c/em\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"examples/lyrics.png\" alt=\"Lyrics\" width=\"300\"/\u003e\u003cbr/\u003e\u003cem\u003eSynced lyrics\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"examples/settings.png\" alt=\"Settings\" width=\"300\"/\u003e\u003cbr/\u003e\u003cem\u003eSettings\u003c/em\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Building\n\n### Dependencies\n\n- A C11 compiler (MSYS2 MinGW-w64 `gcc`) and `pkg-config`\n- **raylib** (`mingw-w64-x86_64-raylib`)\n- `miniaudio.h` and `stb_image.h` — fetched automatically by `setup.ps1`\n\n### Windows (MSYS2 / MinGW64)\n\n```powershell\npacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-pkgconf mingw-w64-x86_64-raylib\n.\\build.ps1\n.\\build\\timp.exe\n```\n\n`build.ps1` fetches the vendored headers on first run, compiles incrementally,\nembeds the `.exe` icon, and links a standalone `timp.exe` (no DLLs to ship).\n\n\u003e Fonts are currently loaded from `C:\\Windows\\Fonts` (Segoe UI), so the build\n\u003e targets Windows. Bundling an open font would make it cross-platform.\n\nThe build tooling is three small scripts:\n\n| Script | Does |\n| --- | --- |\n| `setup.ps1` | Fetches the vendored headers (`miniaudio.h`, `stb_image.h`) into `vendor/`. Run automatically by `build.ps1`. |\n| `build.ps1` | Compiles `src/*.c` and links the standalone `build\\timp.exe`. |\n| `installer.ps1` | Packages `timp.exe` into a Windows `Setup.exe` via [Forge](../Forge) + `forge.toml` (installs to Program Files with shortcuts). Optional — needs the Forge toolchain. |\n\n## Usage\n\n- **Drop files or a folder** onto the window to enqueue them, or click **`+`**\n  (top-left) for the native open dialog.\n- **Click the album art** to cycle through the cover and the visualizers.\n- Top bar: **`+`** open · **`≡`** playlist drawer · **sliders** EQ · **gear**\n  settings · **`♪`** lyrics.\n- **Playlist drawer** — **`≡`** or `Q` slides it out beside the player.\n  Double-click a row to play, drag rows to reorder, hover for the `×`, **Save**\n  to store the list as a named playlist, or **Open** to load a saved one.\n- **Seek** by dragging the progress bar; **volume** via its slider, the mouse\n  wheel, or `↑` / `↓`.\n\n### Keyboard\n\n| Key | Action |\n| --- | --- |\n| Space | Play / pause |\n| ← / → | Seek −5s / +5s |\n| ↑ / ↓ | Volume up / down |\n| `O` | Open file dialog |\n| `Q` / `E` / `G` / `Y` | Queue / EQ / Settings / Lyrics panel |\n| `S` / `L` | Shuffle / cycle repeat |\n| `T` | Always on top |\n| Media keys | Play/Pause, Stop, Prev, Next (system-wide) |\n\n## Lyrics\n\nFor the playing track, Timp looks for lyrics in this order:\n\n1. a sibling **`.lrc`** file (synced — shows a karaoke-style highlight),\n2. a sibling **`.txt`** file (plain, scrollable),\n3. **embedded** lyrics (ID3v2 `USLT` / Vorbis `LYRICS`),\n4. **lrclib.net** — an online lookup by artist / title / duration, fetched in\n   the background (shows \"Searching lyrics…\" while it runs).\n\n## Configuration\n\n`config.ini` lives in `%APPDATA%\\Timp\\`. Persisted keys:\n\n```ini\nvolume = 0.700\nalways_on_top = 0\neq_enabled = 0\neq0 = 0.00          # … eq9 — per-band gains\nplaylist_side = 0   # 0 = drawer on the right, 1 = on the left\nwin_x = ...\nwin_y = ...\n```\n\nSaved playlists are standard `.m3u8` files in `%APPDATA%\\Timp\\Playlists\\`\n(use **Settings → Open folder** to reveal it).\n\n## Project layout\n\n```\nsrc/\n  rl_main.c      window, event loop, UI, all panels (raylib)\n  audio.c        miniaudio engine — thread-safe decode, Unicode paths\n  art.c          embedded + folder cover-art extraction \u0026 decode\n  tags.c         ID3v2 / Vorbis metadata + embedded lyrics\n  lyrics.c       .lrc / .txt parsing + lrclib.net online fetch (WinHTTP)\n  osdialog.c     native open dialog + DWM rounded corners\n  rlconfig.c     persistent %APPDATA% settings\n  mediakeys.c    system-wide media-key hotkeys\n  eq.c / fft.c   10-band EQ + spectrum FFT\n  playlist.c     queue / index + fixed-order shuffle\n  playlistio.c   save / load / list .m3u8 playlists\n  vendor_ma.c    miniaudio implementation unit\nvendor/          miniaudio.h, stb_image.h (fetched)\nassets/timp.ico  embedded Windows executable icon\nexamples/        screenshots used in this README\n```\n\n## Credits\n\n- **Author** — Şamil Bülbül\n- **raylib** — window, input, rendering (zlib license)\n- **miniaudio** — audio decode + output (public domain / MIT-0)\n- **stb_image** — cover-art decoding (public domain / MIT)\n- **lrclib.net** — community lyrics database\n\nAll code written for this project is released into the public domain.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffezcode%2Ftimp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffezcode%2Ftimp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffezcode%2Ftimp/lists"}