# Tracking contact metadata?

**URL:** <https://discourse.imfreedom.org/t/tracking-contact-metadata/411>\
**Category:** Libpurple\
**Tags:** request-for-comments\
**Created:** [July 26, 2026, 7:29am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411 "2026-07-26T07:29:27Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![grim](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/grim/32/4_2.png) [@grim](https://discourse.imfreedom.org/u/grim)\
**Post date:** [July 26, 2026, 7:29am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/1 "2026-07-26T07:29:27Z")

</div>

So I’m thinking of adding a “last-updated” property to a contact to track when it was last updated/refreshed by the protocol and am wondering if it’s useful to others.

I’ve ran into an issue with twitch where I don’t get notification for avatar changes. So to check for an avatar change I need to hit a rest endpoint to get the user data and compare against what I have to detect the change. To avoid constantly spamming, I need to keep track of the last time I did this. I was thinking I could use a tag on the contact to do it, but then I realized other protocols might need this too.

Thoughts?

---

<div class="post-metadata">

**Author:** ![leogrun](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/leogrun/32/67_2.png) [@leogrun](https://discourse.imfreedom.org/u/leogrun)\
**Post date:** [July 27, 2026, 9:04am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/2 "2026-07-27T09:04:30Z")

</div>

It seems like it could be useful and it’s probably better to think-forward instead of wishing you added it later.

---

<div class="post-metadata">

**Author:** ![grim](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/grim/32/4_2.png) [@grim](https://discourse.imfreedom.org/u/grim)\
**Post date:** [July 27, 2026, 4:51pm UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/3 "2026-07-27T16:51:02Z")

</div>

The problem with that is that is much harder to remove api than it is to add it which is precisely why I’m looking for the opinions of other protocol authors.

---

<div class="post-metadata">

**Author:** ![hoehermann](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/hoehermann/32/181_2.png) [@hoehermann](https://discourse.imfreedom.org/u/hoehermann)\
**Post date:** [July 30, 2026, 7:19pm UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/4 "2026-07-30T19:19:43Z")

</div>

WhatsApp uses an arbitrary `id` string for describing the profile picture (avatar) version. If the string changes, the client is inclined to request the current profile picture. WhatsApp employs a standard HTTP CDN for delivering the profile pictures. The default procedure is to request a profile picture with the `If-Modified-Since` header set to the local profile picture date. I think the latter is purely optional. I have never hit any form of rate-limiting.

I do have not looked into how Signal handles profile picture updates.

---

<div class="post-metadata">

**Author:** ![eion](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/eion/32/27_2.png) [@eion](https://discourse.imfreedom.org/u/eion)\
**Post date:** [July 31, 2026, 4:46am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/5 "2026-07-31T04:46:34Z")

</div>

Is there still the ‘checksum’ property on the avatar? I’ve been using that for the last-modified/ETag and/or storing the URL to the image but sometimes need both 🙂

If it’s just the avatar then it could be handy to prevent re-downloads of URLs that we already have the avatar for. If the last-updated is on the contact, that could be handy for not updating names and contact details, and having the display name fighting with the backend 😃

---

<div class="post-metadata">

**Author:** ![grim](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/grim/32/4_2.png) [@grim](https://discourse.imfreedom.org/u/grim)\
**Post date:** [July 31, 2026, 4:48am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/6 "2026-07-31T04:48:07Z")

</div>

So I’m looking at creating a purple wide cache, but right now for twitch I’m just using the cache built in to libsoup which might take care of that for you?

And yeah, the `last-updated` idea was like yeah this is the time i last synced the user with the server, including names, avatars, etc.

---

<div class="post-metadata">

**Author:** ![eion](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/eion/32/27_2.png) [@eion](https://discourse.imfreedom.org/u/eion)\
**Post date:** [July 31, 2026, 4:50am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/7 "2026-07-31T04:50:07Z")

</div>

Would the libsoup cache survive restarts and different frontends (eg, shared .purple on a usb key/distributed file share)? Then that works nicely 🙂

---

<div class="post-metadata">

**Author:** ![grim](https://yyz1.discourse-cdn.com/flex007/user_avatar/discourse.imfreedom.org/grim/32/4_2.png) [@grim](https://discourse.imfreedom.org/u/grim)\
**Post date:** [July 31, 2026, 4:52am UTC](https://discourse.imfreedom.org/t/tracking-contact-metadata/411/8 "2026-07-31T04:52:40Z")

</div>

Yes the cache is persistent. However shared `.purple` isn’t a thing anymore, user interfaces have their own config directory.

For twitch, my soup cache goes into `purple_cache_dir` which is the `XDG_CACHE_DIR` on linux, which is in my dev environment for builds, and looks like the following.

```auto
grim@spectre:~/p/pidgin-clean/build-3rd/cache/pidgin3/purple-spasm$ du -sh
52M	.

```

As for portable builds, yeah should be fine if it’s the same user interface and therefore, same cache directory.
