[pull] master from open-goal:master#2
Open
pull[bot] wants to merge 1114 commits into
Open
Conversation
After the change to vector ops, subrails was crashing. This fixes the crash by fixing a stack type and also marks those new vector op functions as inline. Co-authored-by: water111 <awaterford1111445@gmail.com>
Ubuntu 20.04 is hitting it's next EOL stage in april https://endoflife.date/ubuntu And it's being removed from github actions in april to go along with that https://github.blog/changelog/2025-01-15-github-actions-ubuntu-20-runner-image-brownout-dates-and-other-breaking-changes/ Getting ahead of this before we have random failures, I'll update the launcher along with this change for this month. On the bright side, we can finally update clang-format!
Used a PR since many things can't be changed using Crowdin, such as timings. Same team as the italian Jak 1 translation. This PR won't include subtitles, which will be included later on in a separate PR, once things will be worked on. Still needs to be revised by the team. --------- Co-authored-by: pex93 <44973506+pex93@users.noreply.github.com> Co-authored-by: Francesco <107510301+XedoIT@users.noreply.github.com> Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
) Bumps [hendrikmuhs/ccache-action](https://github.com/hendrikmuhs/ccache-action) from 1.2.16 to 1.2.17. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/hendrikmuhs/ccache-action/releases">hendrikmuhs/ccache-action's releases</a>.</em></p> <blockquote> <h2>v1.2.17</h2> <h2>What's Changed</h2> <ul> <li>support Ubuntu arm64 runners with sccache variant by <a href="https://github.com/andrurogerz"><code>@andrurogerz</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/280">hendrikmuhs/ccache-action#280</a></li> <li>Bump <code>@types/node</code> from 22.10.5 to 22.10.10 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/282">hendrikmuhs/ccache-action#282</a></li> <li>Bump <code>@types/node</code> from 22.10.10 to 22.13.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/285">hendrikmuhs/ccache-action#285</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/andrurogerz"><code>@andrurogerz</code></a> made their first contribution in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/280">hendrikmuhs/ccache-action#280</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/hendrikmuhs/ccache-action/compare/v1.2.16...v1.2.17">https://github.com/hendrikmuhs/ccache-action/compare/v1.2.16...v1.2.17</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/a1209f81afb8c005c13b4296c32e363431bffea5"><code>a1209f8</code></a> Bump <code>@types/node</code> from 22.10.10 to 22.13.0 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/285">#285</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/a6067e2292150bdcfe1a16a5d8ddcc403109ea40"><code>a6067e2</code></a> Bump <code>@types/node</code> from 22.10.5 to 22.10.10 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/282">#282</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/433beb5b585c67c13415f39d5ba7e485b1920710"><code>433beb5</code></a> support Ubuntu arm64 runners with sccache variant (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/280">#280</a>)</li> <li>See full diff in <a href="https://github.com/hendrikmuhs/ccache-action/compare/v1.2.16...v1.2.17">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Because merc effects for custom models would always have the `envmap-usage` flag set, this would also set the `ignore-alpha` flag, making transparency effects not work. Now the envmap flag is only set when the effect actually has an envmap.
This PR updates to SDL3, and with it, adds a handful of new features. Everything seems to work but I'm going to look over the code once last time before merging, some of the API changes are hard to spot. Fixes #2773 ### Pressure sensitivity support for DS3 Controllers SDL3 adds pressure sensitivity support for DS3 controllers on windows. I have not tested on linux. The option is disabled by default. On windows you will need https://docs.nefarius.at/projects/DsHidMini/ and to be using SXS mode. ### DualSense and Xbox One Trigger Effects If enabled, Jak 2 will have certain trigger effects. They are: - xbox1: - small vibrate when collecting dark eco - big vibrate when changing to dark jak - vibrate when shooting gun, proportional to gun type - ps5: - resistance when changing to dark jak - different gun shooting effects - red (resistance) - yellow (weapon trigger) - blue (vibrates) - purple (less resistance) > **Gun Shooting effects are only enabled if the new "Swap R1 and R2" option is enabled** There are more effects that could be used in `dualsense_effects.cpp`, but I only exposed the ones I needed to OpenGOAL. If a modder wants to use some of the others and wires them up end-to-end, please consider contributing that upstream. ### New ImGUI Menu Added new imgui options for selecting the active controller, for those people that struggle to select the initial controller.  ### Testing The highlights of what I tested successfully: - display - [x] all mode switch permutations - [x] launch with all modes saved - [x] switch monitors / unplug monitor that was active, how does it handle it - [x] load with alternate monitor saved and all modes - [x] allowing hidpi doesnt break macos - controls - [x] keyboard and mouse still work - [x] pressure sensitivity on linux
I fixed this for the only up mod awhile back and forgot to PR it here. Some related discussion [here](https://discord.com/channels/756287461377703987/995787558816595968/1320482071583522878) where we realized Blender automatically "renames" the textures, but then the GLB export doesn't reflect those renames
CI: Periodic Controller Database Update
…dio) (#3882) should make it nice and easy to jump to the `decompiler_out/<game>` folder in the launcher and show the user all their exported things.  also adds a taskfile command for ripping audio. and fixes jak1 collision extract scaling. I [previously fixed this for jak2/3](#3292 (comment)) but never fixed for jak1 apparently before:  after: 
CI: Periodic Controller Database Update
…vels (#3888) Follow-up later on improving the validation of the extractor (that may require testing with all iso versions), but this is just some simple safe-guarding code that will improve the error messaging, instead of just a vague invalid map error. 
Was testing out adding ILs to the speedrun menu and noticed this wasn't working properly (video before the changes) https://github.com/user-attachments/assets/e1e7f443-60d2-4b15-bc27-a20cbe4442d6 Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
This is a successor to #3230 --------- Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
Fixed up a few things for speedrun mode in Jak 1: - Changed autosplitter to start run in line with ruleset (first frame after blackout where jak is touching ground). Also tweaked the verification text in bottom left to show "Run Started: Yes/No" to go with this - Changed speedrun menu button combo to match Jak 2/3 (only need to hold L1+R1 and press Start/Select, no longer need to hold X) - Treat speedrun menu via Select the same as Start (no more potential for funny pause buffer where actors freeze) warp gate example:   already grounded example (run starts once partially out of blackout): 
) Bumps [hendrikmuhs/ccache-action](https://github.com/hendrikmuhs/ccache-action) from 1.2.17 to 1.2.18. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/hendrikmuhs/ccache-action/releases">hendrikmuhs/ccache-action's releases</a>.</em></p> <blockquote> <h2>v1.2.18</h2> <h2>What's Changed</h2> <ul> <li>Bump ts-jest from 29.2.5 to 29.2.6 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/291">hendrikmuhs/ccache-action#291</a></li> <li>Bump typescript from 5.7.3 to 5.8.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/294">hendrikmuhs/ccache-action#294</a></li> <li>Bump <code>@types/node</code> from 22.13.0 to 22.13.9 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/296">hendrikmuhs/ccache-action#296</a></li> <li>set cache to readonly if skipping save by <a href="https://github.com/planetmarshall"><code>@planetmarshall</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/301">hendrikmuhs/ccache-action#301</a></li> <li>Update sccache version to v0.10.0 by <a href="https://github.com/mhegazy"><code>@mhegazy</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/315">hendrikmuhs/ccache-action#315</a></li> <li>Bump <code>@types/node</code> from 22.13.9 to 22.15.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/316">hendrikmuhs/ccache-action#316</a></li> <li>Bump ts-jest from 29.2.6 to 29.3.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/312">hendrikmuhs/ccache-action#312</a></li> <li>Bump typescript from 5.8.2 to 5.8.3 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/311">hendrikmuhs/ccache-action#311</a></li> <li>Bump <code>@actions/cache</code> from 4.0.0 to 4.0.3 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/299">hendrikmuhs/ccache-action#299</a></li> <li>Don't append <code>-</code> when <code>append-timestamp</code> is disabled. by <a href="https://github.com/Naros"><code>@Naros</code></a> in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/306">hendrikmuhs/ccache-action#306</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/mhegazy"><code>@mhegazy</code></a> made their first contribution in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/315">hendrikmuhs/ccache-action#315</a></li> <li><a href="https://github.com/Naros"><code>@Naros</code></a> made their first contribution in <a href="https://redirect.github.com/hendrikmuhs/ccache-action/pull/306">hendrikmuhs/ccache-action#306</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/hendrikmuhs/ccache-action/compare/v1...v1.2.18">https://github.com/hendrikmuhs/ccache-action/compare/v1...v1.2.18</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/63069e3931dedbf3b63792097479563182fe70d1"><code>63069e3</code></a> update code</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/15457da8f7bbf9b2c71f2efebd847c1a84650208"><code>15457da</code></a> Don't append <code>-</code> when <code>append-timestamp</code> is disabled. (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/306">#306</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/25d49ca51adf245e1fc66fbf5485fa70ff353f64"><code>25d49ca</code></a> update code</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/5107eae3c4885a3f516e7b3391c85539abee811c"><code>5107eae</code></a> Bump <code>@actions/cache</code> from 4.0.0 to 4.0.3 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/299">#299</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/0be57ad590dbc0ddc23d1915149acb8d1d035482"><code>0be57ad</code></a> Bump typescript from 5.8.2 to 5.8.3 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/311">#311</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/82ea68836f4698bbc2a53332fb4357aec9fe5a80"><code>82ea688</code></a> Bump ts-jest from 29.2.6 to 29.3.2 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/312">#312</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/1442e5b70da90a19cbbe567fa450d6349b819e41"><code>1442e5b</code></a> Bump ts-jest from 29.2.6 to 29.3.2 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/312">#312</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/e3bfc65f9cf257b6332793c3d965c05100350a6e"><code>e3bfc65</code></a> Bump <code>@types/node</code> from 22.13.9 to 22.15.2 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/316">#316</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/fc9101105b417abd4b0a58457a3d0327aa1fa597"><code>fc91011</code></a> Update sccache version to v0.10.0 (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/315">#315</a>)</li> <li><a href="https://github.com/hendrikmuhs/ccache-action/commit/15fe4dd483de6883ed9b919e77778f61f69fc053"><code>15fe4dd</code></a> set cache to readonly if skipping save (<a href="https://redirect.github.com/hendrikmuhs/ccache-action/issues/301">#301</a>)</li> <li>Additional commits viewable in <a href="https://github.com/hendrikmuhs/ccache-action/compare/v1.2.17...v1.2.18">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
Fixes #3906 Wasn't an issue on Jak 1 because that game had no original subtitles, but jak 2's subtitles still go through their original code, which uses the `*setting-control*` object. This is a regression from when i recently added all languages to the menu options. - Update the setting at runtime - Update the setting at initialization time This may be an issue in Jak 3 as well if the code was copied over. We'll fix it when we get there.  
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
Adds subtitle speaker names to jak2/jak3 cutscenes, as well as the progress menu option <img width="962" height="752" alt="Näyttökuva 2026-04-18 005744" src="https://github.com/user-attachments/assets/66b1cc46-9623-4e43-ad65-df7302a0156d" />
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
Hello guys, I'm new here. To give my contribution I've fully translated the intro sequence for Jak 1, some lines were missing.
Yet another case of the PS2 getting insanely lucky with buggy ND code, the eco vents send an event to Jak to make him go into the powerup state, but do not pass any event arguments which determine what animation to play and at what speed/start frame. For the dark eco vents, PS2 manages to somehow get the correct value of `7`, but we are not so lucky. As a side effect of this fix, we also get the originally intended behavior for the light eco vents of playing the full powerup animation from the start at a slower speed, rather than the much shorter one you see on PS2. Closes #4268
…er (pressure sensitive axii) (#4286) `SDL_EVENT_JOYSTICK_AXIS_MOTION` is an enum with `Value = 1536`, which means the code current acts like: `else if (true && m_has_pressure_sensitive_buttons)`
Another classic case of missing event args, though this one is fatal on PS2 as well.
After spending the last month staring at and comparing Jak 3 and Jak 1 versions of a bunch of `target` code for my jetboard mod, I figured this would be a good opportunity to revive this ancient PR #1714 along with some other small misc fixes/improvements. Instead of directly replacing the old fields, I decided to opt for using overlay fields to maintain backwards compatibility with existing manual patches, files without ref tests and mods that might use these fields.
Inside the build actor tool's dummy `merc-fragment`'s `merc-fp-data`, the `shader-cnt` is set to `1`, which means that `login-adgifs` runs for the fragment and attempts to login the texture. We don't need to do this for custom actors and it can cause crashes during level unloading when textures get unlinked, so we can just set the `shader-cnt` to `0` to prevent this.
In some rare cases, the master art group and model names do not match for some animations (`collectables-ag` is a prime example for Jak 2/3, which contains multiple different models).
…4292) Carrying this over from Jak 2, where it significantly improved the elec gates' look at a distance.
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
Subtitles for ND dev commentary tracks
This also removes the LIBCO_MPROTECT setting, I don't know why I enabled that but it prevented putting the context swap code in the text section.
This adds support for generating pairs with `DataObjectGenerator` and defining your own regions and `actor-group`s in custom levels.
For Steam Controller (2026) support
…rs old (#4285) Once `(-> *display* game-clock frame-counter)` gets too large, in the HUD flashing math the `sin` function breaks down at high values. It's effectively reading the number of ticks (times a multiplier) as degrees, so we can modulo that by 360 to avoid breaking `sin` This applies to both the eco meter and the dark jak icon in jak 2 - the icon stops flashing twice as early because it's multiplied by x4 vs the eco meter x2. example: you can see dark jak icon stops flashing around 2:36:02 https://youtu.be/3V2GneLSY14?t=9362 and dark eco meter stops flashing between 4:30 and 4:37 https://youtu.be/3V2GneLSY14?t=16235 https://youtu.be/3V2GneLSY14?t=16619
Implements the envmap for the ocean generated by `ocean-method-89`/`ocean-method-88`. While the resulting envmap looks accurate compared to PCSX2 in Renderdoc, the end result does not seem 100% identical, but it is a big improvement over the default placeholder texture. Closes #3417
This adds some buttons to the loader debug menu and GOAL functions to allow you to manually force a reload of a level's FR3 data (including the common level), allowing for live texture replacements, model swaps and custom level modifications without requiring a game restart or waiting for the loader to fully discard a level.
When `do_zoom_blur` sets up its draw, it doesn't update the blend settings, so it ends up inheriting the previous values. In retail mode, the previous draw is from a texture animation, which sets up the blend in a specific way that causes it to draw a white texture over the screen. In debug mode, right before the zoom blur is drawn, the debug text is drawn, which modifies the blend settings to something that makes the blur look as it should. Closes #4206
Updating Controller Database Co-authored-by: OpenGOALBot <OpenGOALBot@users.noreply.github.com>
…azily loading texture replacements and serializing level building (#4278) Three changes: 1. Add lazy merging/replacing for texture `rgba_bytes`. 2. Use a single thread when decompiling with texture replacements. 3. Drop textures after serializing and before compression. These changes should enable users to install **massive** texture packs without issue.
This PR provides minor typo fixes and harmonizes the French subtitles with the game's original terminology used in cutscenes and menus. --------- Co-authored-by: Tyler Wilding <xtvaser@gmail.com>
Necessary scaffolding for offline test runner change, moving it off of jenkins.
<img width="2756" height="2066" alt="image" src="https://github.com/user-attachments/assets/88034b10-c502-4df0-b5b8-6d6357eed433" />
previously only showed the distance from `flying-lurker-1`, but any of the 3 getting 500m can cause you to fail, so we should show the max
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot]
Can you help keep this open source service alive? 💖 Please sponsor : )