{"id":48020711,"url":"https://github.com/gwigz/slua-derez-patcher","last_synced_at":"2026-04-04T13:46:52.881Z","repository":{"id":345635526,"uuid":"1186712535","full_name":"gwigz/slua-derez-patcher","owner":"gwigz","description":"Speed up development, with bulk script and inventory updates across objects","archived":false,"fork":false,"pushed_at":"2026-03-20T13:56:21.000Z","size":292,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T16:20:30.740Z","etag":null,"topics":["luau","second-life","secondlife","slua","ts-slua"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gwigz.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T23:06:17.000Z","updated_at":"2026-03-20T13:56:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gwigz/slua-derez-patcher","commit_stats":null,"previous_names":["gwigz/slua-derez-patcher"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/gwigz/slua-derez-patcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwigz%2Fslua-derez-patcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwigz%2Fslua-derez-patcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwigz%2Fslua-derez-patcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwigz%2Fslua-derez-patcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gwigz","download_url":"https://codeload.github.com/gwigz/slua-derez-patcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwigz%2Fslua-derez-patcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31402276,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"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":["luau","second-life","secondlife","slua","ts-slua"],"created_at":"2026-04-04T13:46:51.216Z","updated_at":"2026-04-04T13:46:52.870Z","avatar_url":"https://github.com/gwigz.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SLua Derez Patcher\n\nTired of the rez-edit-take-replace dance every time you update objects your scripts rez?\n\nThrow it all in one prim, child scripts set to not running, and let [`ll.RemoteLoadScriptPin`](https://wiki.secondlife.com/wiki/LlRemoteLoadScriptPin), [`ll.GiveInventory`](https://wiki.secondlife.com/wiki/LlGiveInventory), and [`ll.DerezObject`](https://wiki.secondlife.com/wiki/LlDerezObject) handle the work instead.\n\nBuilt with [TypeScriptToLua](https://typescripttolua.github.io/) and [`@gwigz/slua-tstl-plugin`](https://github.com/gwigz/slua).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/assets/ingame.webp\" alt=\"Web UI and in-world patcher\"\u003e\n\u003c/p\u003e\n\n## Quick Start\n\n1. Drop `dist/patcher.slua` into your main prim\n2. Drop `dist/patcher-bootstrap.slua` into each object you want to patch\n3. Name your scripts, sounds, animations, etc. using the `ObjectName/ItemName` naming convention\n4. Drop those named scripts/items into the same prim as the patcher\n5. The patcher prints an HTTP-in URL to owner chat on start -- open it in a browser\n6. Select objects, click patch, and watch it go\n\n## Scripts\n\n### `dist/patcher.slua` - belongs in your main object\n\nOn script start, requests an HTTP-in URL and prints it to owner chat. Open the URL in a browser to access the web UI dashboard where you can:\n\n- Browse objects and items\n- Select individual items, or use \"Select All\"\n- Patch selected objects or all at once\n- Watch live progress via long polling\n\nChat command `/7 url` prints the HTTP-in URL again if needed.\n\n### `dist/patcher-bootstrap.slua` - add to each rezable object\n\nEnables remote script loading. On rez by the patcher, sets the access pin and signals readiness back when done. Tweak to suit your workflow, i.e. if there's data you need to load from notecards: only state ready once you're actually ready.\n\n### `dist/patcher-worker.slua` - optional, for parallel script loading\n\nPlace copies of this script in the same prim as the patcher, named `patcher-worker[1]`, `patcher-worker[2]`, etc. Each worker calls `ll.RemoteLoadScriptPin` concurrently, reducing total time from ~N\\*3s to ~ceil(N/W)\\*3s. The number in brackets is how the patcher and worker identify each other via linkset messages. Requires `WORKERS_ENABLED = true` in `src/constants.ts`.\n\n## Inventory Layout\n\nItems named `Object Name/Item Name` target that specific object. This works for scripts, notecards, textures, sounds, animations, and any other inventory type. Wrap the prefix in `{...}` for pattern matching.\n\n| Item Name                             | Matches                                  |\n| ------------------------------------- | ---------------------------------------- |\n| `lantern.obj/vfx.slua`                | `lantern.obj` only (script)              |\n| `lantern.obj/config.ini`              | `lantern.obj` only (notecard)            |\n| `{*}/utilities.slua`                  | every object                             |\n| `{fire-*.obj}/embers.slua`            | `fire-pit.obj`, `fire-torch.obj`, etc.   |\n| `{*-light.obj}/dim.slua`              | `desk-light.obj`, `wall-light.obj`, etc. |\n| `{lantern.obj,campfire.obj}/vfx.slua` | `lantern.obj` and `campfire.obj`         |\n\nExtensions and casing are purely convention -- the matching is on the full inventory name before the `/`. Objects and the patcher script itself are always excluded from matching.\n\n## How It Works\n\nFor each selected object, the patcher rezzes it at its own position, waits for the patcher-bootstrap script to set a pin and signal back, pushes any inventory items and scripts, then derezzes it back. The browser gets live progress updates via long polling.\n\nScripts have a ~3 second delay between each load (`ll.RemoteLoadScriptPin` is throttled by the sim), but non-script inventory transfers via `ll.GiveInventory` are instant. With worker scripts enabled, multiple scripts are loaded in parallel across workers, significantly reducing patch time for script-heavy objects.\n\nSee [docs/architecture.md](docs/architecture.md) for protocol diagrams, build pipeline, and project structure.\n\n## Setup\n\n```sh\nbun install\nbun run build\n```\n\n## Development\n\n```sh\nbun run dev        # watch mode\nbun run lint       # lint with oxlint\nbun run lint:fix   # lint and auto-fix\nbun run fmt        # format with oxfmt\nbun run fmt:check  # check formatting\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwigz%2Fslua-derez-patcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgwigz%2Fslua-derez-patcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwigz%2Fslua-derez-patcher/lists"}