A small tool to view real-world ActivityPub objects as JSON! Enter a URL
or username from Mastodon or a similar service below, and we'll send a
request with
the right
Accept
header
to the server to view the underlying object.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"ostatus": "http://ostatus.org#",
"atomUri": "ostatus:atomUri",
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
"conversation": "ostatus:conversation",
"sensitive": "as:sensitive",
"toot": "http://joinmastodon.org/ns#",
"votersCount": "toot:votersCount",
"litepub": "http://litepub.social/ns#",
"directMessage": "litepub:directMessage",
"Hashtag": "as:Hashtag"
}
],
"id": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626",
"type": "Question",
"summary": null,
"inReplyTo": null,
"published": "2025-05-12T00:53:00Z",
"url": "https://soc.saiyajin.space/@mai_lapyst/114492124706708626",
"attributedTo": "https://soc.saiyajin.space/users/mai_lapyst",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://soc.saiyajin.space/users/mai_lapyst/followers"
],
"sensitive": false,
"atomUri": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626",
"inReplyToAtomUri": null,
"conversation": "tag:soc.saiyajin.space,2025-05-12:objectId=2763757:objectType=Conversation",
"content": "<p>Working on an mini-oxm (orm and odm in one) in rust and tinkering on the way how entity data should be tunneled back to the caller. Normally this would be done by a simple generic but I want the Driver/Backends to be dyn-compatible so the decision which backend to use can be done at runtime.</p><p>Currently I have two prototyped designs:</p><ul><li>Either a <code>trait Row { fn try_get(&self, idx: &str) -> Result<&Box<dyn Any>, Error>; }</code>, where each driver must encode the data into an custom row type and is thus memory bound, or</li><li>By an provider-consumer approach that uses two concurrent async tasks (<code>tokio::spawn</code>) and communicates by one shared <code>Arc<Mutex<Option<Box<dyn Any>>>></code> slot that is blocked until the consumer has consumed it. This is light on memory but has the burden of requiring async (which is already required so no problem) but also a lot more of syncronsation code (Mutex, CondVar etc.)</li></ul><p>So at the end it's the old problems of memory vs CPU time; choose one or the other, not both.... I could now microbenchmark it but both approaches will perform VERY differently based on context / environment / application, so benchmarking it dosnt give that much insight I think. Sure I could implement both based on an create feature (or directly let people choose via a low-level API) but would that benefit that users?</p><p>What's your opinion?</p><p><a href=\"https://soc.saiyajin.space/tags/rust\" class=\"mention hashtag\" rel=\"tag\">#<span>rust</span></a> <a href=\"https://soc.saiyajin.space/tags/databases\" class=\"mention hashtag\" rel=\"tag\">#<span>databases</span></a> <a href=\"https://soc.saiyajin.space/tags/orm\" class=\"mention hashtag\" rel=\"tag\">#<span>orm</span></a> <a href=\"https://soc.saiyajin.space/tags/odm\" class=\"mention hashtag\" rel=\"tag\">#<span>odm</span></a> <a href=\"https://soc.saiyajin.space/tags/programming\" class=\"mention hashtag\" rel=\"tag\">#<span>programming</span></a> <a href=\"https://soc.saiyajin.space/tags/development\" class=\"mention hashtag\" rel=\"tag\">#<span>development</span></a> <a href=\"https://soc.saiyajin.space/tags/floss\" class=\"mention hashtag\" rel=\"tag\">#<span>floss</span></a> <a href=\"https://soc.saiyajin.space/tags/foss\" class=\"mention hashtag\" rel=\"tag\">#<span>foss</span></a> <a href=\"https://soc.saiyajin.space/tags/oss\" class=\"mention hashtag\" rel=\"tag\">#<span>oss</span></a> <a href=\"https://soc.saiyajin.space/tags/opensource\" class=\"mention hashtag\" rel=\"tag\">#<span>opensource</span></a> <a href=\"https://soc.saiyajin.space/tags/design\" class=\"mention hashtag\" rel=\"tag\">#<span>design</span></a></p>",
"contentMap": {
"en": "<p>Working on an mini-oxm (orm and odm in one) in rust and tinkering on the way how entity data should be tunneled back to the caller. Normally this would be done by a simple generic but I want the Driver/Backends to be dyn-compatible so the decision which backend to use can be done at runtime.</p><p>Currently I have two prototyped designs:</p><ul><li>Either a <code>trait Row { fn try_get(&self, idx: &str) -> Result<&Box<dyn Any>, Error>; }</code>, where each driver must encode the data into an custom row type and is thus memory bound, or</li><li>By an provider-consumer approach that uses two concurrent async tasks (<code>tokio::spawn</code>) and communicates by one shared <code>Arc<Mutex<Option<Box<dyn Any>>>></code> slot that is blocked until the consumer has consumed it. This is light on memory but has the burden of requiring async (which is already required so no problem) but also a lot more of syncronsation code (Mutex, CondVar etc.)</li></ul><p>So at the end it's the old problems of memory vs CPU time; choose one or the other, not both.... I could now microbenchmark it but both approaches will perform VERY differently based on context / environment / application, so benchmarking it dosnt give that much insight I think. Sure I could implement both based on an create feature (or directly let people choose via a low-level API) but would that benefit that users?</p><p>What's your opinion?</p><p><a href=\"https://soc.saiyajin.space/tags/rust\" class=\"mention hashtag\" rel=\"tag\">#<span>rust</span></a> <a href=\"https://soc.saiyajin.space/tags/databases\" class=\"mention hashtag\" rel=\"tag\">#<span>databases</span></a> <a href=\"https://soc.saiyajin.space/tags/orm\" class=\"mention hashtag\" rel=\"tag\">#<span>orm</span></a> <a href=\"https://soc.saiyajin.space/tags/odm\" class=\"mention hashtag\" rel=\"tag\">#<span>odm</span></a> <a href=\"https://soc.saiyajin.space/tags/programming\" class=\"mention hashtag\" rel=\"tag\">#<span>programming</span></a> <a href=\"https://soc.saiyajin.space/tags/development\" class=\"mention hashtag\" rel=\"tag\">#<span>development</span></a> <a href=\"https://soc.saiyajin.space/tags/floss\" class=\"mention hashtag\" rel=\"tag\">#<span>floss</span></a> <a href=\"https://soc.saiyajin.space/tags/foss\" class=\"mention hashtag\" rel=\"tag\">#<span>foss</span></a> <a href=\"https://soc.saiyajin.space/tags/oss\" class=\"mention hashtag\" rel=\"tag\">#<span>oss</span></a> <a href=\"https://soc.saiyajin.space/tags/opensource\" class=\"mention hashtag\" rel=\"tag\">#<span>opensource</span></a> <a href=\"https://soc.saiyajin.space/tags/design\" class=\"mention hashtag\" rel=\"tag\">#<span>design</span></a></p>"
},
"endTime": "2025-05-19T00:53:00Z",
"votersCount": 3,
"attachment": [],
"tag": [
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/rust",
"name": "#rust"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/databases",
"name": "#databases"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/orm",
"name": "#orm"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/odm",
"name": "#odm"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/programming",
"name": "#programming"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/development",
"name": "#development"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/floss",
"name": "#floss"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/foss",
"name": "#foss"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/oss",
"name": "#oss"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/opensource",
"name": "#opensource"
},
{
"type": "Hashtag",
"href": "https://soc.saiyajin.space/tags/design",
"name": "#design"
}
],
"replies": {
"id": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626/replies",
"type": "Collection",
"first": {
"type": "CollectionPage",
"next": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626/replies?only_other_accounts=true&page=true",
"partOf": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626/replies",
"items": []
}
},
"likes": {
"id": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626/likes",
"type": "Collection",
"totalItems": 1
},
"shares": {
"id": "https://soc.saiyajin.space/users/mai_lapyst/statuses/114492124706708626/shares",
"type": "Collection",
"totalItems": 2
},
"oneOf": [
{
"type": "Note",
"name": "classic `Row`",
"replies": {
"type": "Collection",
"totalItems": 3
}
},
{
"type": "Note",
"name": "fancy provider-consumer thingy",
"replies": {
"type": "Collection",
"totalItems": 0
}
},
{
"type": "Note",
"name": "both since I prefer choice and low-level tweaking",
"replies": {
"type": "Collection",
"totalItems": 0
}
}
]
}