What's the best way to use a gist index on tsrange to check if a time occurs after the range?
Postgres doesn't support any operators for this. As pointed out by @evan-carroll, it probably could and should.

So, the best solution is

where tsrange(localtimestamp, localtimestamp, '[]') &gt;&gt; tsrange(start_at, events.end_at, '[)')