{"id":33609489,"url":"https://github.com/guidobonerz/go64u","last_synced_at":"2026-04-26T13:04:34.127Z","repository":{"id":326285637,"uuid":"1104914846","full_name":"guidobonerz/go64u","owner":"guidobonerz","description":"Ultimate64 Command CLI","archived":false,"fork":false,"pushed_at":"2026-04-19T16:54:44.000Z","size":31839,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-19T18:37:49.289Z","etag":null,"topics":["c64","cli","commodore-64","ffmpeg-wrapper","ftp","go","rest-api","rtmp","stream","twitch","udp","ultimate64"],"latest_commit_sha":null,"homepage":"","language":"Go","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/guidobonerz.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":"2025-11-26T21:49:56.000Z","updated_at":"2026-04-19T16:54:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/guidobonerz/go64u","commit_stats":null,"previous_names":["guidobonerz/go64u"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/guidobonerz/go64u","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guidobonerz%2Fgo64u","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guidobonerz%2Fgo64u/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guidobonerz%2Fgo64u/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guidobonerz%2Fgo64u/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guidobonerz","download_url":"https://codeload.github.com/guidobonerz/go64u/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guidobonerz%2Fgo64u/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"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":["c64","cli","commodore-64","ffmpeg-wrapper","ftp","go","rest-api","rtmp","stream","twitch","udp","ultimate64"],"created_at":"2025-11-30T19:03:22.958Z","updated_at":"2026-04-26T13:04:34.117Z","avatar_url":"https://github.com/guidobonerz.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# go64u\n\nUltimate64 Remote CLI\n\n**go64u** is a tool for remote interaction with the Ultimate64 computer.\n\n```\ngo64u [command] [flags]\n```\n\n## How to start\n\n### Option 1 - UI Mode\n\n```\ngo64u\n```\n\n### Option 2 - Terminal Mode (REPL)\n\n```\ngo64u --terminal\n```\n\n### Option 3 - CLI Mode\n\n```\ngo64u \u003ccommand\u003e\n```\n\n---\n\n## Global Flags\n\n| Flag | Short | Type | Default | Description |\n|------|-------|------|---------|-------------|\n| `--terminal` | – | bool | `false` | Run the application in terminal (REPL) mode |\n| `--device` | `-d` | string | *(from config)* | Set device. Needed in non-terminal mode |\n\n---\n\n## Machine Commands\n\n### `devices`\nShow device configurations.\n\n### `message [message] [x] [y]`\nWrites a message on screen at a given position.\n\n### `pause`\nPauses the U64 by pulling the DMA line low at a safe moment. This stops the CPU. Note that this does not stop any timers.\n\n### `poweroff`\nShuts down the U64. Note that it is likely that you won't receive a valid response.\n\n### `readmem [address]`\nReads several bytes from memory by a given length.\n\n| Flag | Short | Type | Default | Description |\n|------|-------|------|---------|-------------|\n| `--length` | `-l` | uint16 | `1` | Length of data to read |\n| `--output` | `-o` | string | `output.bin` | Output file name |\n| `--type` | `-t` | string | `file` | Output type: `file` or `bin` |\n\n### `reboot`\nReboots the U64. Re-initializes the cartridge configuration and sends a reset to the machine.\n\n### `reset`\nResets the U64. The current configuration is not changed.\n\n### `resume`\nResumes the U64 after pause. The DMA line is released and the CPU will continue where it left off.\n\n### `togglemenu`\nToggles the on-screen menu. Does the same thing as pressing the Menu button on an 1541 Ultimate cartridge or briefly pressing the Multi Button on the Ultimate 64.\n\n### `writemem [address] [value]`\nSets one byte in memory (POKE). Writes a byte value (00-ff) to a memory address (0-ffff).\n\n---\n\n## Runner Commands\n\n### `crt [file]`\nLoads a cartridge file into the U64 and automatically starts it. The machine resets with the attached cartridge active. It does not alter the configuration of the Ultimate.\n\n### `load [file] [address]`\nLoads a program into the U64. The machine resets and loads the attached program into memory using DMA. It does not automatically run the program.\n\n### `mount [drive] [file]`\nMounts a disk image (d64/g64/d71/g71/d81) on a given drive.\n\n### `run [file] [address]`\nLoads a program into the U64 and automatically starts it. The machine resets, loads the attached program into memory using DMA, then automatically runs the program.\n\n### `unmount [drive]`\nUnmounts a disk image from a given drive.\n\n---\n\n## File Commands\n\n### `ls [path/diskimage]`\nList files of the internal drive (USB Stick, SD Card, Disk Images, etc.).\n\n| Flag | Short | Type | Default | Description |\n|------|-------|------|---------|-------------|\n| `--memaddress` | `-m` | bool | `false` | Display the start address of a program if possible |\n| `--filter` | `-f` | string | *(empty)* | Filter the list by a match pattern like `*.prg` |\n\n---\n\n## Drive Commands\n\n### `drives`\nShow drive info.\n\n---\n\n## Stream Commands\n\n### `audio [command]`\nStarts/Stops the audio stream.\n\n| Command | Description |\n|---------|-------------|\n| `audio start` | Start the audio stream |\n| `audio stop` | Stop the audio stream |\n\n### `debug [command]`\nStarts/Stops the debug stream. Audio and video streams will be stopped.\n\n| Command | Description |\n|---------|-------------|\n| `debug start` | Start the debug stream (audio/video streams will be stopped) |\n| `debug stop` | Stop the debug stream |\n\n### `video [command]`\nStarts/Stops the video stream.\n\n| Command | Description |\n|---------|-------------|\n| `video start` | Start the video stream |\n| `video stop` | Stop the video stream |\n\n---\n\n## VIC Commands\n\n### `screenmem`\nShows the current VIC states of D011/D016/D018 and the memory bank setup.\n\n### `screenshot`\nTakes a screenshot of the current screen.\n\n| Flag | Type | Default | Description |\n|------|------|---------|-------------|\n| `--scale` | int | `100` | Scale factor in percent (%) |\n\n---\n\n## Platform Commands\n\n### `info`\nShow device info.\n\n### `online`\nCheck if the selected device is online (responds to HTTP requests).\n\n---\n\n## Terminal Mode (REPL)\n\nTerminal mode is started with `go64u --terminal`. It provides an interactive REPL where all standard commands are available plus the following **terminal-only commands**:\n\n### `asc`\nInteractive audio stream controller. Lets you select from configured devices, play/stop audio streams, and switch between devices interactively.\n\n### `cd [path/diskimage]`\nChange the folder on the internal drive. Only available in terminal mode because it maintains a persistent working directory across commands.\n\n### `device [device_key]`\nSwitch the active device within the terminal session. Shows the current device if no key is provided.\n\n### `query`\nQuery packages matching a filter. By default the filter is set to the current year and type=d64.\n\n| Flag | Type | Default | Description |\n|------|------|---------|-------------|\n| `--name` | string | *(empty)* | Filter by name |\n| `--group` | string | *(empty)* | Filter by group |\n| `--handle` | string | *(empty)* | Filter by handle |\n| `--category` | string | *(empty)* | Filter by category |\n| `--repo` | string | *(empty)* | Filter by repository |\n| `--subcat` | string | *(empty)* | Filter by subcategory |\n| `--year` | string | *(current year)* | Filter by year |\n| `--rating` | string | *(empty)* | Filter by rating |\n| `--type` | string | *(empty)* | Filter by type |\n| `--latest` | string | *(current month)* | Filter by latest |\n| `--offset` | int | `0` | Result offset |\n| `--limit` | int | `80` | Result limit |\n| `--ignoreDefaults` | bool | `false` | Ignore default filters |\n| `--get` | bool | `false` | Download the files |\n\n### `quit`\nQuit the terminal and exit the application.\n\n### `stream`\nStream to your favourite streaming platform (e.g. Twitch/YouTube). Starts both video and audio streams and pipes them through an RTMP encoder.\n\n| Flag | Type | Default | Description |\n|------|------|---------|-------------|\n| `--target` | string | *(empty)* | Streaming platform (e.g. twitch, youtube) |\n| `--record` | string | *(empty)* | Record locally: `audio`, `video`, or `both` |\n| `--no-overlay` | string | *(empty)* | Disable overlay for: `stream`, `record`, or `both` |\n\n---\n\n### Database Sub-REPL\n\nAfter entering `query` (or its dedicated database mode), the following sub-commands are available within the database REPL:\n\n#### `category`\nShow categories.\n\n#### `filter`\nShow/set active filters.\n\n#### `list`\nList filtered results.\n\n#### `quit`\nLeave the database sub-REPL.\n\n---\n\n## GUI Frontend (Gio UI)\n\nThe graphical interface is launched without the `--terminal` flag and uses the **Gio UI** framework (`gioui.org`). The window has a resolution of 800x680 pixels with a dark Material Design theme.\n\n### Layout\n\nThe layout consists of three areas:\n\n1. **Toolbar** (top) – Control buttons for the selected device\n2. **Main area** – Device cards (left) + Video monitor grid (right)\n3. **Footer** (bottom) – Status line with hover hints\n\n### Toolbar Functions\n\n| Button | Function |\n|--------|----------|\n| Play/Stop | Start/Stop all streams for the selected device |\n| Pause | Pause the U64 (DMA line low) |\n| Audio | Enable/Disable audio monitoring with playback |\n| Video | Enable/Disable video monitoring |\n| Snapshot | Save a screenshot as PNG to the configured folder |\n| Record | Start/Stop MP4 recording (video + audio) |\n| Cast | Start/Stop streaming to a platform (e.g. Twitch) |\n| Overlay | Enable/Disable the stream overlay |\n| CRT | Enable/Disable the CRT scanline effect |\n| Reset | Send a reset to the U64 |\n| Power Off | Shut down the U64 |\n\n### Device Cards\n\nEach configured device is displayed as a card with rounded corners. The card shows:\n\n- Device name and description\n- Online status indicator (green = online, red = offline, gray = unchecked)\n\nThe online check runs automatically every 5 seconds in the background.\n\n### Video Monitor\n\n- Displays active video feeds in a grid layout\n- Supports multiple simultaneous device streams\n- Native resolution: 384x272 pixels (Ultimate64)\n- Scaling with rounded corners\n- Optional CRT scanline effect (sine wave-based brightness modulation)\n\n### Audio Waveform\n\n- Real-time stereo waveform visualization\n- Two channels with visible gap\n- Updated live during audio playback\n\n### Drag \u0026 Drop (Windows)\n\nOn Windows, files can be dragged and dropped onto a device monitor window. The file is automatically routed to the correct device based on the drop position in the grid.\n\n### Recording \u0026 Streaming\n\n- **Recording**: Saves as MP4 to the configured `RecordingFolder`\n- **Casting**: Streams live to configured platforms (e.g. Twitch) via the `StreamingTargets` configuration\n- Both use the `StreamRenderer` for video encoding, audio mixing, and optional overlay compositing\n\n### Audio System\n\n- Framework: `ebitengine/oto/v3`\n- 48 kHz sample rate, stereo, 16-bit signed LE\n- Real-time playback and monitoring\n\n---\n\n## Screenshots\n\n### Folder structure with icons\n![Styled Directory](https://github.com/guidobonerz/go64u/blob/main/doc/list.png)\n\n### Audio Stream Player - Terminal\n![Audio Stream Player](https://github.com/guidobonerz/go64u/blob/main/doc/streamplayer.png)\n\n### Stream Player - Monitor\n![Stream Player Monitor](https://github.com/guidobonerz/go64u/blob/main/doc/gui_streamplayer.png)\n\n---\n\n## Installation\n\nCreate an environment variable **GO64U_CONFIG_PATH** where the **.go64u.yaml** file is located.\n\nThe structure of the file is currently as follows:\n\n```yaml\nLogLevel: quiet\nDevices:\n  DEVICE_NAME[n]:\n    Description: \"Device name\"\n    IsDefault: true\n    IpAddress: \u003cip of device\u003e\n    VideoPort: 11000\n    AudioPort: 11001\n    DebugPort: 11002\nStreamingTargets:\n  \u003cname of the streaming platform, e.g. twitch\u003e: rtmp://live.twitch.tv/app/\u003cstream_key\u003e\n  \u003csecond platform...\u003e: rtmp://\nLogLevel: ffmpeg_loglevel\nDumpFolder: \u003cpath to dump folder\u003e\nRecordingFolder: \u003cpath to recording folder\u003e\nScreenshotFolder: \u003cpath to screenshot folder\u003e\nDownloadFolder: \u003cpath to download folder\u003e\nOverlay:\n    X: 700\n    Y: 200\n    WIDTH: 800\n    HEIGHT: 600\n    ImagePath: \u003cpath to overlay image\u003e\n```\n\n\u003e **Note:** If you have more than one Ultimate64 board, you have to choose different ports for each board.\n\n\u003e **Note:** If you want to stream the U64 stream via RTMP to Twitch, YouTube, etc. you need to install ffmpeg.\n\n---\n\n## Todo\n\n- List and change dir (local and remote)\n- Disassembler with dialect option\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguidobonerz%2Fgo64u","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguidobonerz%2Fgo64u","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguidobonerz%2Fgo64u/lists"}