{"id":40172672,"url":"https://github.com/chrisgleissner/c64commander","last_synced_at":"2026-05-23T12:00:50.993Z","repository":{"id":333354709,"uuid":"1136887008","full_name":"chrisgleissner/c64commander","owner":"chrisgleissner","description":"Cross-platform app (Android/iOS/web) for managing and controlling a Commodore 64 Ultimate over your local network.","archived":false,"fork":false,"pushed_at":"2026-05-18T17:57:20.000Z","size":599388,"stargazers_count":7,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-18T18:35:38.015Z","etag":null,"topics":["android","c64","c64u","commodore","commodore-64","rest-api","retro","retrocomputing","retrogaming","ultimate64"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chrisgleissner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-18T14:42:41.000Z","updated_at":"2026-05-18T16:40:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chrisgleissner/c64commander","commit_stats":null,"previous_names":["chrisgleissner/c64commander"],"tags_count":79,"template":false,"template_full_name":null,"purl":"pkg:github/chrisgleissner/c64commander","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgleissner%2Fc64commander","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgleissner%2Fc64commander/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgleissner%2Fc64commander/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgleissner%2Fc64commander/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chrisgleissner","download_url":"https://codeload.github.com/chrisgleissner/c64commander/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chrisgleissner%2Fc64commander/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33394672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["android","c64","c64u","commodore","commodore-64","rest-api","retro","retrocomputing","retrogaming","ultimate64"],"created_at":"2026-01-19T17:10:50.920Z","updated_at":"2026-05-23T12:00:50.986Z","avatar_url":"https://github.com/chrisgleissner.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# C64 Commander\n\n[![Build](https://github.com/chrisgleissner/c64commander/actions/workflows/android.yaml/badge.svg?branch=main)](https://github.com/chrisgleissner/c64commander/actions/workflows/android.yaml)\n[![codecov](https://codecov.io/gh/chrisgleissner/c64commander/graph/badge.svg?token=hGEe09SZch)](https://codecov.io/gh/chrisgleissner/c64commander)\n[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html)\n[![Platform](https://img.shields.io/badge/platforms-Android%20%7C%20iOS%20%7C%20Web-blue)](https://github.com/chrisgleissner/c64commander/releases)\n\nControl and manage a C64 Ultimate from Android, iOS, or a self-hosted web deployment on your local network.\n\n\u003cimg src=\"./docs/site/play-store/feature-graphic-1024x500.png\" alt=\"C64 Commander\" width=\"600\"/\u003e\n\n## Features\n\n- **Cross-platform**: Native Android and iOS apps, plus a Docker-based web interface for macOS, Windows, or Linux.\n- **Cross-device**: Supports Commodore 64 Ultimate (all editions), Ultimate 64, Ultimate 64 Elite, and Ultimate 64 Elite II.\n- **Dashboard**: Machine controls, Quick actions, drive and printer shortcuts, SID mixer, and streams on a single page.\n- **Playlists**: Build playlists from local files, C64U storage, the High Voltage SID Collection (HVSC), or CommoServe search results. Autoplay, shuffle, and subsong selection.\n- **Disk management**: Mount, unmount, and rotate multi-disk groups across drives.\n- **Configuration**: Browse and edit the full C64 Ultimate configuration tree.\n- **Diagnostics**: Inspect activity logs, traces, latency, and connection health across App, REST, FTP, and Telnet activity.\n- **Device Switcher**: Switch between devices and run parallel health checks.\n\n## Quick Start\n\n### Android\n\n1. Download the latest APK from [Releases](https://github.com/chrisgleissner/c64commander/releases).\n2. Open the APK and allow installs from unknown sources if prompted.\n3. Tap **Install**.\n\n### iOS\n\n1. Set up [SideStore](https://docs.sidestore.io/).\n2. Download the latest IPA from [Releases](https://github.com/chrisgleissner/c64commander/releases).\n3. In **SideStore \u003e My Apps**, tap **+** and select the IPA.\n\nSideStore refreshes the app signature automatically every 7 days.\n\n### Web (Docker)\n\nThe web version is self-hosted for LAN use. Requirements: Docker on Windows, macOS, or Linux. A Raspberry Pi Zero 2W or 4B with 512 MiB RAM or more is sufficient.\n\nInstall Docker: [Docker Desktop](https://docs.docker.com/desktop/) (Windows/macOS) or [Docker Engine](https://docs.docker.com/engine/install/) (Linux). The image supports `linux/amd64` and `linux/arm64`.\n\n```bash\nmkdir -p ./c64commander-config \u0026\u0026 chmod 0777 ./c64commander-config\n\ndocker run -d --name c64commander -p 8064:8064 \\\n  -v ./c64commander-config:/config --restart unless-stopped \\\n  ghcr.io/chrisgleissner/c64commander:\u003cversion\u003e\n```\n\nOpen `http://\u003chost-ip\u003e:8064` in a browser.\n\nIf a network password is configured in **Settings \u003e Device \u003e Network password**, the web interface requires login with the same password.\n\n### Variant Selection\n\nVariant metadata is authored once in `variants/variants.yaml` and generated into web, Android, iOS, and workflow inputs by `npm run variant:generate`.\n\n- Android workflows intentionally support both `c64commander` and `c64u-controller`.\n- iOS and web workflows build and publish only the default `c64commander` variant in this repository.\n- Set `APP_VARIANT=c64u-controller` before `npm run cap:build` or `npm run variant:generate` when you want to generate the Android controller variant locally.\n- Local side-by-side web testing can still build different variants, but it relies on distinct origins such as different `localhost` ports rather than runtime storage partitioning.\n\nExamples:\n\n```bash\nAPP_VARIANT=c64u-controller npm run cap:build\nAPP_VARIANT=c64u-controller npm run variant:generate\n```\n\n### First Connection\n\nEnsure the C64 Ultimate is on your local network with required services enabled:\n\n![Network services \u0026 timezone menu](docs/img/setup/enable_services.png)\n\nOn the C64 Ultimate:\n\n1. Press **CBM+Restore** and open **Network services \u0026 timezone**.\n2. Enable:\n   - **Web Remote Control Service** - REST API used for most control and status operations\n   - **FTP File Service** - required for browsing and transferring files for playlists and disk collections\n   - **Telnet Remote Menu Service** - used for a small set of advanced operations not available via REST, such as power cycle\n3. Note the IP address from **Wired Network Setup** or **WI-FI Network Setup**.\n\nIn C64 Commander:\n\n1. Open **Settings \u003e Device \u003e Connection**.\n2. Enter the C64 Ultimate IP address or hostname.\n   - **On Android**, the IP address is recommended. Bare hostnames such as\n     `u64` or `c64u` rely on mDNS, which is not always reliable on home\n     networks. The app will attempt mDNS resolution before falling back to\n     system DNS, and surface a clear \"Cannot resolve …\" error if both\n     fail.\n3. A green health indicator at the top right confirms the successful connection:\n\n![Connected C64U badge](docs/img/app/home/02-connection-status-popover.png)\n\n## Pages\n\n### Home\n\nOperational dashboard: machine controls, quick actions, light effects, drives, printer, SID mixer, streams, and configuration snapshots.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/00-overview-light.png\" alt=\"C64 Commander intro\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/sections/01-system-info-to-cpu-ram.png\" alt=\"Home top row and quick actions (Light)\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/01-overview-dark.png\" alt=\"Home top row and quick actions (Dark)\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/sections/02-quick-config-to-keyboard-light.png\" alt=\"Home sections from quick config through keyboard light\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/sections/03-quick-config-to-printers.png\" alt=\"Home sections from quick config through printers\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/sections/04-printers-to-sid.png\" alt=\"Home sections from printers through SID\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/sections/05-sid-to-config.png\" alt=\"Home sections from SID through config\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/dialogs/05-lighting-studio-medium.png\" alt=\"Lighting Studio bottom sheet\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/03-demo-mode-interstitial.png\" alt=\"Demo Mode interstitial\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/dialogs/01-save-ram-dialog.png\" alt=\"Save RAM type selection\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/dialogs/02-save-ram-custom-range.png\" alt=\"Save RAM custom ranges\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/dialogs/03-snapshot-manager.png\" alt=\"Load RAM snapshot manager\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Play\n\nBuild playlists for programs and songs sourced from the local device, C64U storage, HVSC, or CommoServe. Supports autoplay, shuffle, repeat, subsong selection, and automatic song length discovery.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/01-overview.png\" alt=\"Play overview\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/sections/02-playlist.png\" alt=\"Play playlist\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/playlist/01-view-all.png\" alt=\"Play playlist view all\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Browse \u0026 Import\n\nChoose an import source, browse its contents, then add files to your playlist or disk collection.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/01-import-interstitial.png\" alt=\"Import source chooser\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/03-local-file-picker.png\" alt=\"Local file browser\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/02-c64u-file-picker.png\" alt=\"C64U file browser\" width=\"360\"/\u003e\u003c/td\u003e\n\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/08-hvsc-browser.png\" alt=\"HVSC browser after preparation\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/04-commoserve-search.png\" alt=\"CommoServe search form\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/play/import/05-commoserve-results-selected.png\" alt=\"CommoServe results with selection\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Disks\n\nView drive state, mount and eject images, and manage disk collections with multi-disk group rotation.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/disks/01-overview.png\" alt=\"Disks overview\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/disks/sections/02-disks.png\" alt=\"Disks collection\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/disks/collection/01-view-all.png\" alt=\"Disks collection\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Configuration\n\nBrowse and edit the full C64 Ultimate configuration: categories, items, sliders, toggles, and per-item refresh.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/config/01-categories.png\" alt=\"Configuration categories\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/config/sections/05-u64-specific-settings.png\" alt=\"Configuration U64 specific\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/config/sections/06-c64-and-cartridge-settings.png\" alt=\"Configuration C64 and cartridge settings\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Settings\n\nConnection, appearance, diagnostics, playback defaults, HVSC integration, and device-safety controls.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/01-appearance.png\" alt=\"Settings appearance\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/02-connection.png\" alt=\"Settings connection\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/03-diagnostics.png\" alt=\"Settings diagnostics\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/04-play-and-disk.png\" alt=\"Settings play and disk\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/05-config.png\" alt=\"Settings configuration\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/settings/sections/07-device-safety.png\" alt=\"Settings device safety\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Docs\n\nBuilt-in guides for setup, workflows, and day-to-day usage.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/docs/01-overview.png\" alt=\"Docs overview\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/docs/sections/01-getting-started.png\" alt=\"Docs getting started\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/docs/sections/05-swapping-disks.png\" alt=\"Docs swapping disks\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Diagnostics\n\nTap the top-right status badge to open diagnostics.\n\nProvides health checks, activity logs, trace inspection, filter editor, and latency analysis across App, REST, FTP, and Telnet contributors.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/tools/01-menu.png\" alt=\"Diagnostics overview\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/activity/07-problems-only.png\" alt=\"Diagnostics activity list\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/filters/02-editor.png\" alt=\"Diagnostics filter editor\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### Switch Device\n\nLong-press the top-right status badge to open the device switcher.\n\nThe switcher shows all configured devices with real-time health status, allowing instant switching and quick identification of connectivity or device issues.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/switch-device/profiles/medium/01-picker.png\" alt=\"Switcher (Connecting)\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/switch-device/profiles/medium/03-picker-all-healthy.png\" alt=\"Switcher (All Healthy)\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/diagnostics/switch-device/profiles/medium/04-picker-one-unhealthy.png\" alt=\"Switcher (One Unhealthy)\" width=\"360\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Display Profiles\n\nThe layout adapts automatically based on viewport width: Small (phones), Standard (large phones and small tablets), and Large (tablets and desktops). Override in **Settings \u003e Display Profile**.\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"left\"\u003eSmall display\u003c/th\u003e\n      \u003cth align=\"left\"\u003eStandard display\u003c/th\u003e\n      \u003cth align=\"left\"\u003eLarge display\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg\n          src=\"docs/img/app/home/profiles/compact/01-overview.png\"\n          alt=\"Home page in the Small display profile\"\n        /\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg\n          src=\"docs/img/app/home/profiles/medium/01-overview.png\"\n          alt=\"Home page in the Standard display profile\"\n        /\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg\n          src=\"docs/img/app/home/profiles/expanded/01-overview.png\"\n          alt=\"Home page in the Large display profile\"\n        /\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Troubleshooting\n\n### Can't reach the device\n\n- Confirm the C64 Ultimate and your device are on the same network.\n- Verify the IP address or hostname in **Settings \u003e Device \u003e Connection**.\n\n### Device becomes unresponsive\n\nC64 Commander includes **Device Safety** controls under **Settings \u003e Device Safety** to throttle REST and FTP traffic. REST mutations use a single in-flight lane; presets and advanced controls tune FTP concurrency and backoff behavior.\n\n- **Presets**: Relaxed, Balanced (default), Conservative.\n- **Advanced controls**: FTP concurrency, read coalescing, cooldowns, backoff strategy, circuit-breaker thresholds, discovery probe interval.\n- The Relaxed preset can overwhelm some setups. Start with Balanced or Conservative.\n\n### iOS specifics\n\n- **App expired**: SideStore refreshes every 7 days automatically.\n- **Account/App ID limits**: Remove unused sideloaded apps and retry.\n- **Install/signing errors**: Re-download the IPA and verify its checksum.\n- **Telnet-backed controls**: Power Cycle, Clear Flash, and other Telnet-only actions use the native socket bridge on iOS and Android. Support is discovered from the connected device's live Telnet menu graph, so device-specific gaps stay visible as disabled controls with inline explanation instead of disappearing.\n\n## For Developers\n\n- [Documentation index](docs/index.md)\n- [DeepWiki architecture and design guide](https://deepwiki.com/chrisgleissner/c64commander)\n- [Developer guide](docs/developer.md)\n- [Chaos/fuzz testing](docs/testing/chaos-fuzz.md)\n\n## Advanced Topics\n\nNetwork security, web server configuration, authentication, and Linux auto-update are covered in [docs/advanced.md](docs/advanced.md).\n\n## Acknowledgments\n\n### High Voltage SID Collection (HVSC)\n\nThe [High Voltage SID Collection](https://hvsc.c64.org) is an archive of C64 SID music. C64 Commander integrates HVSC for browsing, searching, and playing SID tunes with metadata and song-length support.\n\n### Commodore and the C64 Ultimate\n\nThanks to [Commodore](https://commodore.net) for creating the Commodore 64 and to the creators of the C64 Ultimate for extending the platform with modern hardware.\n\n### Third-Party Libraries\n\nC64 Commander uses many open-source libraries. Notices are generated via `scripts/generate-third-party-notices.mjs` and published as [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n\n## License\n\nGPL v3. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisgleissner%2Fc64commander","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchrisgleissner%2Fc64commander","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchrisgleissner%2Fc64commander/lists"}