React Hook Dependencies - Generic Fetch Hook

That's because you recreate a new array on each render. In fact the whole dependency makes no sense since you never use it inside the effect.

You could equally rely on the options object, which has changing headers. But since the object also gets recreated on each render you have to memoize it first:

export const GetStuff: () => UseRequestResponse<Stuff[]> & { refresh: () => void } = () => {
    const { appToken } = GetAppToken();
    const [refreshIndex, setRefreshIndex] = useState(0);

    const options = useMemo(() => ({
        method: 'GET',
        headers: {
            'Authorization': `Bearer ${appToken}`
        }
    }), [appToken, refreshIndex])

    return {
        ...UseRequest<Stuff[]>('https://my-domain.api/v1/stuff', options),
        refresh: () => setRefreshIndex(refreshIndex + 1),
    };
};

Then, instead of relying on the refresh index to trigger a refresh you could have the useRequest() hook return a refresh function, which internally also calls that function in the effect (instead of putting the load logic in the effect itself, it just calls that function). This way you follow the rules even better, since the useMemo never actually depends on the refresh index so it shouldn't be in the dependencies.