Interacting with deployed BaseRelayRecipient contract through Metamask

Interacting with a BaseRelayRecipient contract on Rinkeby opened a transaction pop-up and asked me to pay for it instead of just signing it. How exactly is the contract supposed to be written in order to just sign when interacting with it?

Its not the contract: its your provider.
You must make sure your client code uses the RelayProvider that wraps window.ethereum.

Oh, I see. Is there a way to do that when working with Remix?

AFAIK, with remix its Solidity-only, and you can’t control the provider.
GSN is a custom provider, and thus can’t work with Remix
(e.g. for the same reason you can’t use remix with Portis or Fortmatic)