{"id":40172672,"url":"https://github.com/chrisgleissner/c64commander","last_synced_at":"2026-04-24T18:07:42.823Z","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-04-18T21:05:22.000Z","size":520129,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-18T22:32:10.146Z","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-04-13T15:28:45.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":71,"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":32234826,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"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-04-24T18:07:42.804Z","avatar_url":"https://github.com/chrisgleissner.png","language":"TypeScript","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- **Dashboard**: Machine controls, Telnet-backed quick actions, drive and printer shortcuts, SID mixer, and streams on a single page.\n- **Configuration**: Browse and edit the full C64 Ultimate configuration tree.\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- **Diagnostics**: Inspect activity logs, traces, latency, and connection health across App, REST, FTP, and Telnet activity.\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### 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.\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=\"Home overview (Light)\" width=\"360\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/01-overview-dark.png\" alt=\"Home overview (Dark)\" width=\"360\"/\u003e\u003c/td\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  \u003c/tr\u003e\n  \u003ctr\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    \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  \u003c/tr\u003e\n  \u003ctr\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    \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  \u003c/tr\u003e\n  \u003ctr\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    \u003ctd\u003e\u003cimg src=\"docs/img/app/home/dialogs/04-restore-confirmation.png\" alt=\"Load RAM restore confirmation\" 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\nAccessible via the C64U connectivity badge in the top-right corner. Provides 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## 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\n## Advanced Topics\n\n### Network Security\n\nThe C64 Ultimate firmware exposes REST over HTTP and files over plain FTP. C64 Commander follows that model and does not add encryption.\n\n- Password authentication is supported.\n- Diagnostics and traces redact sensitive values (including network password headers) before export.\n\nOptional hardening:\n\n1. Run C64 Commander Web behind an HTTPS reverse proxy (Caddy, Nginx).\n2. Keep C64 Ultimate and client devices on an isolated VLAN or dedicated LAN segment.\n3. Do not expose C64 Commander or C64 Ultimate to the public internet.\n\n### Web Server\n\n#### Authentication\n\n- No network password configured: the UI opens directly.\n- Network password configured in **Settings \u003e Device \u003e Network password**: login is required. The server injects the password into proxied C64U requests.\n- The password is persisted in `/config/web-config.json`. Successful login creates an authenticated session cookie (`HttpOnly`, `SameSite=Lax`, optional `Secure`).\n\n#### Security settings\n\n- `Secure` cookies are enabled when `NODE_ENV=production`. Override with `WEB_COOKIE_SECURE=true|false`.\n- FTP host override is disabled by default. Set `WEB_ALLOW_REMOTE_FTP_HOSTS=true` only in trusted setups.\n\n#### Logging\n\nWeb server logs go to container stdout/stderr and are mirrored in the in-app diagnostics overlay.\n\n#### Updating\n\nAfter deploying a new image, open the app once to activate the new service worker. Reload any tabs still holding the old shell.\n\n```bash\ndocker pull ghcr.io/chrisgleissner/c64commander:\u003cversion\u003e\ndocker rm -f c64commander\ndocker run -d --name c64commander -p 8064:8064 -v ./c64commander-config:/config --restart unless-stopped ghcr.io/chrisgleissner/c64commander:\u003cversion\u003e\n```\n\nRollback: redeploy the older image and reload.\n\n#### Linux auto-update\n\nAn updater script is available at [scripts/web-auto-update.sh](scripts/web-auto-update.sh).\n\n- `--track tags` (recommended): tracks GitHub release tags.\n- `--track ref`: tracks a branch/ref and rebuilds from source on update.\n\n\u003e [!IMPORTANT]\n\u003e Use `--track tags` for normal deployments. Use `--track ref` only for development.\n\n```bash\nchmod +x scripts/web-auto-update.sh\nmkdir -p ./c64commander-config\n```\n\nRelease-tag mode:\n\n```bash\n./scripts/web-auto-update.sh \\\n  --track tags \\\n  --interval 300 \\\n  --container-name c64commander \\\n  --config-dir ./c64commander-config\n```\n\nBranch/ref mode:\n\n```bash\n./scripts/web-auto-update.sh \\\n  --track ref \\\n  --ref feat/web \\\n  --interval 120 \\\n  --container-name c64commander-dev \\\n  --config-dir ./c64commander-config-dev\n```\n\nsystemd service:\n\n```bash\nsudo tee /etc/systemd/system/c64commander-updater.service \u003e/dev/null \u003c\u003c'EOF'\n[Unit]\nDescription=C64 Commander Web Auto Updater\nAfter=network-online.target docker.service\nWants=network-online.target\n\n[Service]\nType=simple\nWorkingDirectory=/opt/c64commander\nExecStart=/opt/c64commander/scripts/web-auto-update.sh --track tags --interval 300 --container-name c64commander --config-dir /opt/c64commander/config\nRestart=always\nRestartSec=10\nUser=pi\nGroup=pi\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now c64commander-updater.service\n```\n\nOptional GitHub API token (avoids rate limits):\n\n```bash\nexport GITHUB_TOKEN=\u003cyour-token\u003e\n```\n\n## For Developers\n\n- [Documentation index](docs/index.md)\n- [Developer guide](docs/developer.md)\n- [Chaos/fuzz testing](docs/testing/chaos-fuzz.md)\n\nThird-party notices: `npm run notices:generate` regenerates [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). `npm run build` packages notices into distribution bundles automatically.\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\nThe primary HVSC entry point is now the Add items chooser. If the library is not ready yet, the app prepares it there instead of asking you to run separate manual download and ingest steps from the Play page. The Play page keeps only status, reindex, and reset controls for recovery.\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","funding_links":[],"categories":[],"sub_categories":[],"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"}