A lexicon for game activity sharing

@trezy.codes & @lemmaeof.gay I think the additional timestamps are for tracking particular events from within the game/session (a thing Discord does).

I’m not very familiar with where this is used, but I’d expect this could be the start & end times of a match from within the session (eg. this round in a Mortal Kombat type game). Please correct me if I’m wrong there @lemmaeof.gay !

In which case, I think I prefer grouping the timestamps in with the details of the event being described (as timestamps is a little generic, it’s easy to not know that it’s meant to be associated with the event, not with the record).

What do you think of this?

state: "Sudden death championship"
details:
  event: "Round III"
  startedAt: 2026-08-31T21:00:00Z
  endsAt: 2026-08-31T21:30:00Z


# When the gaming session started
createdAt: 2026-08-31T20:28:00Z

# When this record will be considered stale
staleAt: 2026-08-31T21:15:00Z

The implicit thing here: we’re allowing the game info to be stored on watchers’ records as well as players’. I think this makes sense; an app may want to show that JP is watching this specific esport round (rather than just linking to it).

3 Likes

Yeah, that’s generally how it works! I think wrapping it in with details is a good shout, with all the details subfields being kept optional.

2 Likes

Damn @byjp.me, you work FAST. :joy:

To be sure we understand, sync.atplay.games runs persistently once linked and then can just handle those updates as freely as the activity status changes? If so, that’s amazing!

2 Likes

Jesus gang, I’ve been gone for a day and all this happened?! I’ll need to properly check out @byjp.me’s work tomorrow.

As for the namespace discussion, I’ll leave this to y’all. I’m happy with everything else so far, the rest seems like WG issues. I’m happy to give my perspective on anything, but I think this is best left to you :smiley:

1 Like

That’s correct! Once you’ve linked it’ll listen to any games you start on Discord and/or Steam (depending on your choices) and make the records for you as we’ve outlined here :slight_smile: (I left the $type on games.atmosphere.status as I misunderstood the chat above — happy to switch it based on the outcome of the namespace conversation!)

The lexicon I’m working to is here, the code’s also in that repo (you can self-host!), but beware that code isn’t “prod ready” — there be dragons :dragon::sweat_smile:

1 Like

Here’s a peek for those passing through:

I’ve actually got Terraria open on Steam here, but it doesn’t have a push channel for ‘now playing’ updates, so Discord gets updated immediately, but Steam has to wait for the next poll, which is every 1 minute at its fastest.

Here it is a moment later, with the Steam row being ignored (amber light), cos Discord’s status of the same game takes precedent (it’s been dragged above).

2 Likes

This is really really cool. Well done!

Are you able to keep the OAuth persistent through the server?

Could we close the browser and have it keep doing its thing?

Then, it pulls from the Steam title / cover art and (eventually) print the .status?

Gonna have to dig into this and learn how this works.

2 Likes

Yes indeed! I’m using the “BFF” pattern. When you sign in you’re allowing my backend to hold a refresh token which can (indefinitely) be renewed and used to make changes to your PDS (within the specified scope: ie. just creating/updating/deleting the .status records)

No need to pull the Steam title/cover art, it just collects the Steam ID (from Steam or Discord, both provide it) and look that up directly with g5 (thanks to Trezy’s fine query lexicon!)

Edit: the repo now has a little arch diagram too!

1 Like

Very fun!

You’re a maniac for doing all that so quickly.

2 Likes

Haha; I’m on parental leave :sweat_smile: the “looking after and playing with my new daughter” bits are just wonderful and gloriously fulfilling — the rest isn’t (yet!) filled with work, so I have space for atproto fun! :grinning_face_with_smiling_eyes:

3 Likes