Signing Key Registration Transaction Without Goal/Node

I’m following the tutorial here to participate in consensus with a ledger, however it requires goal to sign the transaction on my local PC, which I do not have. I have generated the Key Registration Transaction on a cloud server.

Is there any way to sign the Key Registration Transaction (with a ledger) without having a local node?

I’m guessing you’re referring to Participate in Consensus from Ledger Nano S/X | Algorand Developer Portal

You need to ask the Ledger to sign the key registration transaction.

You actually don’t need to run a node that is fully caught up to do that.
You just need to install the Algorand software on your personal (non-cloud) computer.
(You may need to start the node on your computer just to initialize it, but I’m not completely sure if it’s necessary.)

Another option would be to use the Ledger SDK directly. But this is much more cumbersome.
Maybe writing a client for MyAlgoWallet using MyAlgo Connect would work too, but I’ve never tested this option.
In any case, these two later options are much more complex than just installing the Algorand software on your own computer.

Unfortunately I’m only on Windows, so getting the software to sign it with goal is a bit of a pain.

I’ve just been informed there is this website which works with wallets on Algorand, so I’m going to give it a try with that.

The above website worked perfectly. The only issue was with MyAlgo showing the incorrect VoteEndDate, but the actual transaction had the correct date on the Ledger. It should work with MyAlgo/Pera/Algosigner but I haven’t tested Pera or Algosigner.

Doesn’t seem possible to mark offline at the moment, as the wallets don’t support that, but they may in the future.

Change offline is very important in case your node has issues.
What part is blocking?

Normally a change offline is just a key registration with all the fields empty essentially.

MyAlgo just wont sign transactions like so:

const txn = algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject(
  {
    from: address,
    suggestedParams: params,
    nonParticipation: true,
  }
);

With a response of missing required property votekey,missing required property selkey,missing required property votefst,missing required property votelst,missing required property votekd