{"id":32402271,"url":"https://github.com/afkcodes/sunoh","last_synced_at":"2026-05-30T23:00:28.536Z","repository":{"id":360785114,"uuid":"1250049424","full_name":"afkcodes/sunoh","owner":"afkcodes","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-27T22:01:29.000Z","size":1053,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T22:21:43.485Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/afkcodes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-26T08:59:52.000Z","updated_at":"2026-05-27T22:01:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/afkcodes/sunoh","commit_stats":null,"previous_names":["afkcodes/sunoh"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/afkcodes/sunoh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afkcodes%2Fsunoh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afkcodes%2Fsunoh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afkcodes%2Fsunoh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afkcodes%2Fsunoh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/afkcodes","download_url":"https://codeload.github.com/afkcodes/sunoh/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afkcodes%2Fsunoh/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33712579,"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-05-30T02:00:06.278Z","response_time":92,"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":[],"created_at":"2025-10-25T10:19:22.429Z","updated_at":"2026-05-30T23:00:28.511Z","avatar_url":"https://github.com/afkcodes.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sunoh.\n\nA quiet, editorial music-streaming app — Flutter implementation of the Claude\nDesign prototype (`sunoh.html`). Streams music, radio, and podcasts with a\npremium, dark-editorial feel.\n\n## What's built\n\nAll screens from the design, reachable from the bottom nav + top tabs:\n\n- **Home** — greeting, `Music / Radio / Podcasts` top tabs, recent grid,\n  editorial picks, daily mixes, new releases, artists, and a \"Tonight\" hero.\n- **Radio** — on-air hero, a draggable FM **dial** (87–108 MHz) with station\n  pins, saved stations, and category tiles.\n- **Podcasts** — continue listening, subscriptions, top-this-week.\n- **Search** — live filtering across songs/artists/albums/podcasts, recent\n  queries, and genre tiles.\n- **Library** — filter chips, sort, list/grid toggle, pinned tiles.\n- **Album / Playlist / Artist / Podcast** detail pages.\n- **Player** — mini player + expanded player with three layouts\n  (`Classic / Minimal / Immersive`), draggable scrubber, pull-to-dismiss.\n- **Queue** (reorderable) and karaoke **Lyrics** (auto-scroll highlight).\n- **Tweaks** sheet (tap the ⚙ on Home): theme mode, accent, tint-from-artwork,\n  player layout, type pairing, density.\n\n## Design system\n\n- **Type**: Geist (UI), Instrument Serif (editorial moments), Geist Mono (data)\n  — loaded at runtime via `google_fonts`, no bundled font files.\n- **Album art**: deterministic, image-free generated covers. Each id hashes\n  into a palette + one of eight shape compositions, painted on a canvas\n  (`lib/widgets/album_art.dart`).\n- **Theme**: dark (default) / light, with a single warm accent and an optional\n  album-tinted background.\n\n## Architecture\n\n- `lib/data/` — models + the fictional catalog.\n- `lib/state/app_state.dart` — a single `ChangeNotifier` (Provider) holding\n  tweaks, navigation, and the player state machine.\n- `lib/theme/tokens.dart` — colors, accents, typography.\n- `lib/widgets/`, `lib/screens/`, `lib/player/`, `lib/overlays/`, `lib/shell/`.\n\n## Run\n\n```sh\nflutter pub get\nflutter run            # any connected device, or:\nflutter run -d chrome  # web\n```\n\nDependencies are unpinned to current majors (`google_fonts`, `provider`); run\n`flutter pub upgrade` to refresh.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafkcodes%2Fsunoh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fafkcodes%2Fsunoh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafkcodes%2Fsunoh/lists"}