{"id":17537719,"url":"https://github.com/bates64/hotload","last_synced_at":"2026-01-04T17:32:52.276Z","repository":{"id":239080799,"uuid":"750305646","full_name":"bates64/hotload","owner":"bates64","description":"Hot reloading for N64 game development using GDB","archived":false,"fork":false,"pushed_at":"2024-05-23T02:25:27.000Z","size":102,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-05-23T03:30:38.737Z","etag":null,"topics":["hot-reloading","n64"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/bates64.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-30T11:46:31.000Z","updated_at":"2024-05-23T02:25:31.000Z","dependencies_parsed_at":"2024-05-09T22:27:59.792Z","dependency_job_id":"95c8b794-713b-4343-9008-b77948cfa3b0","html_url":"https://github.com/bates64/hotload","commit_stats":null,"previous_names":["bates64/hotload"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bates64%2Fhotload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bates64%2Fhotload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bates64%2Fhotload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bates64%2Fhotload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bates64","download_url":"https://codeload.github.com/bates64/hotload/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245018875,"owners_count":20548088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["hot-reloading","n64"],"created_at":"2024-10-20T20:42:35.630Z","updated_at":"2026-01-04T17:32:52.249Z","avatar_url":"https://github.com/bates64.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hotload\n\n[![CI](https://github.com/bates64/hotload/actions/workflows/ci.yml/badge.svg)](https://github.com/bates64/hotload/actions/?workflow=CI)\n[![Releases](https://img.shields.io/github/v/tag/bates64/hotload\u0026label=release)](https://github.com/bates64/hotload/releases)\n[![Nix flake](https://img.shields.io/badge/flake-github%3Abates64%2Fhotload-blue?logo=nixos\u0026labelColor=white)](https://nixos.wiki/wiki/Flakes)\n\n`hotload` implements **function-level** [dynamic software updating](https://wikipedia.org/wiki/Dynamic_software_updating), or \"hot code (re)loading\" for arbitrary programs.\n\n## Use cases\n\n`hotload` allows you to make source code changes and see the results without having to restart the program or lose any state.\n\nThis is useful in cases such as:\n\n- You are developing a cutscene in a game, and you want to see the changes immediately without having to restart the game, navigate to the cutscene, and trigger it.\n- You are developing a server application, and you want to avoid downtime when deploying new code.\n\n`hotload` is not suitable for architectures that do not support code modification at runtime through a debugger. This includes frontend web applications. For this purpose, try [hot module replacement](https://vitejs.dev/guide/api-hmr.html).\n\n## What it does\n\n`hotload` is a command-line tool that:\n\n1. Builds a program (using a user-provided build command such as `make`)\n2. Starts the program\n3. Watches the program's source code for changes, and when it detects a change:\n    1. Rebuilds the program\n    2. Loads the new code into the already-running program\n\nThe focus for `hotload` is the Nintendo 64 target, but its ideas are portable to other targets. If you are developing for another target and would like to see support for it, please [open an issue](https://github.com/bates64/hotload/issues/new). You may want to consider the following alternatives:\n- Dynamic linking, and reloading the library when it changes\n  * This is not possible on embedded systems such as the Nintendo 64.\n- Embed a scripting language such as Lua and develop a system to reload scripts when they change\n- [Use an Erlang VM language such as Elixir](https://www.elixirwiki.com/wiki/Erlang_Hot_Code_Reloading)\n\nAll of the alternatives listed above require changes to the program source code, some more than others. `hotload` requires **no changes to source code**. In fact, it does not require source code at all, although the use cases for this situation are less clear.\n\n## Requirements\n\n- An ELF executable with mips32 or mips64 architecture, unstripped (with symbols).\n- An emulator or game which implements the [GDB Remote Serial Protocol](https://sourceware.org/gdb/current/onlinedocs/gdb.html/Remote-Protocol.html).\n    - The [ares](https://ares-emu.net) emulator supports GDB for Nintendo 64.\n    - Games can implement GDB over flashcart serial ports. [Video tutorial](https://www.youtube.com/watch?v=Fr8rSqsFuWk).\n\n## Usage\n\nWith [nix](https://zero-to-nix.com/),\n\n```shell\nnix run github:bates64/hotload [OPTIONS] --build \u003cBUILD\u003e --elf \u003cELF\u003e --emulator \u003cEMULATOR\u003e\n```\n\n```\nOptions:\n  -b, --build \u003cBUILD\u003e        Build system command to run (e.g. `make`, `ninja`, `libdragon build`)\n  -e, --elf \u003cELF\u003e            ELF file that is output from build command\n  -s, --src \u003cSRC\u003e            Source files and/or directories to recursively watch for changes\n  -x, --emulator \u003cEMULATOR\u003e  Emulator command (e.g. `ares rom.z64`)\n  -h, --help                 Print help\n  -V, --version              Print version\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbates64%2Fhotload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbates64%2Fhotload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbates64%2Fhotload/lists"}