{"id":391421,"date":"2026-11-11T11:57:52","date_gmt":"2026-11-11T11:57:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/axismundi-activities\/"},"modified":"2026-11-11T11:57:33","modified_gmt":"2026-11-11T11:57:33","slug":"axismundi-activities","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/axismundi-activities\/","author":21128503,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.6","stable_tag":"0.1.6","tested":"7.1.4","requires":"6.7","requires_php":"8.1","requires_plugins":null,"header_name":"Axismundi Activities","header_author":"KIM JIWOON","header_description":"ActivityStreams activity ledger and social relationship state for Axismundi. Requires Axismundi Actors and the vocabulary contracts in Axismundi Object Projections. It owns no HTTP inbox, signatures, delivery queue, notifications, or Web Push, and makes no network request of its own.","last_updated":"2026-11-11 11:57:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Jiwoon-Kim\/axismundi\/tree\/main\/products\/wordpress\/plugins\/axismundi-activities","header_author_uri":"https:\/\/designbusan.ai.kr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":99,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.1.6":{"tag":"0.1.6","author":"kimjiwoon","date":"2026-11-11 11:57:33","revision":3796223}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"axismundi\/follow-button":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/follow-button","version":"0.0.30","title":"Follow Button","category":"widgets","icon":"admin-users","description":"Follows the current Actor profile as the active Axismundi Actor.","textdomain":"axismundi-activities","attributes":{"actorUri":{"type":"string","default":""}},"usesContext":["axismundi\/actorId"],"supports":{"html":false,"interactivity":true,"color":{"text":true,"background":true},"spacing":{"margin":true,"padding":true}},"editorScript":"file:.\/edit.js","style":"file:.\/style.css","render":"file:.\/render.php","viewScriptModule":"file:.\/view.js"},"axismundi\/reaction-bar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/reaction-bar","version":"0.1.0","title":"Reaction Bar","category":"widgets","icon":"smiley","description":"The emoji reactions already on the current Object, each with the number of people behind it. Place it above Object Actions; the Reaction Button block adds new ones.","textdomain":"axismundi-activities","attributes":{"objectUri":{"type":"string","default":""}},"usesContext":["postId","postType"],"supports":{"html":false,"anchor":true,"interactivity":true,"align":["wide","full"],"color":{"text":true,"background":true,"__experimentalDefaultControls":{"text":true}},"spacing":{"margin":true,"padding":true,"blockGap":true},"typography":{"fontSize":true,"lineHeight":true,"__experimentalDefaultControls":{"fontSize":true}},"__experimentalBorder":{"radius":true,"color":true,"width":true,"style":true}},"editorScript":"file:.\/edit.js","style":"axismundi-activities-reactions","editorStyle":"axismundi-activities-reactions","render":"file:.\/render.php"},"axismundi\/feed":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed","version":"0.0.37","title":"Feed","category":"theme","icon":"list-view","description":"The Actor feed: it resolves which surface is being read, how it is walked, and hands that to the layouts inside it.","textdomain":"axismundi-activities","supports":{"html":false,"inserter":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"interactivity":true},"style":"file:.\/style.css","editorScript":"file:.\/edit.js","render":"file:.\/render.php","viewScriptModule":"file:.\/view.js"},"axismundi\/interaction":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/interaction","version":"0.0.3","title":"Interaction","category":"widgets","icon":"heart","description":"One control for acting on the current projected object: reply, like, dislike, announce, quote, react or vote.","textdomain":"axismundi-activities","attributes":{"type":{"type":"string","default":"like"},"objectUri":{"type":"string","default":""},"size":{"type":"string","default":"sm"},"showLabel":{"type":"boolean","default":false},"showCount":{"type":"boolean","default":true},"announceMenu":{"type":"boolean","default":false}},"usesContext":["postId","postType"],"supports":{"html":false,"anchor":true,"interactivity":true,"spacing":{"margin":true,"padding":false}},"editorScript":"file:.\/edit.js","style":"file:.\/style.css","editorStyle":"file:.\/style.css","render":"file:.\/render.php"},"axismundi\/feed-tabs":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-tabs","version":"0.1.0","title":"Feed Tabs","category":"theme","icon":"table-row-before","description":"One editable layout per profile surface. The reader sees the tab they are on; an author edits each surface separately.","textdomain":"axismundi-activities","parent":["axismundi\/feed"],"allowedBlocks":["axismundi\/feed-tab"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","render":"file:.\/render.php"},"axismundi\/feed-tab":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-tab","version":"0.1.0","title":"Feed Tab","category":"theme","icon":"index-card","description":"The layout of one profile surface: its filters, its density switch, the cards it repeats and where its pager goes.","textdomain":"axismundi-activities","parent":["axismundi\/feed-tabs"],"attributes":{"surface":{"type":"string","default":"activity"},"navigation":{"type":"string","default":""},"filterStyle":{"type":"string","default":""}},"providesContext":{"axismundi\/feedSurface":"surface","axismundi\/feedNavigation":"navigation","axismundi\/feedFilterStyle":"filterStyle"},"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","render":"file:.\/render.php"},"axismundi\/feed-filters":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-filters","version":"0.1.0","title":"Feed Filters","category":"theme","icon":"filter","description":"Renders the current surface's filters where the template places them.","textdomain":"axismundi-activities","parent":["axismundi\/feed-tab"],"usesContext":["axismundi\/feed","axismundi\/feedFilterStyle","axismundi\/feedSurface"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","style":"file:.\/style.css","render":"file:.\/render.php"},"axismundi\/feed-loop":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-loop","version":"0.1.0","title":"Feed Loop","category":"theme","icon":"layout","description":"Repeats the feed's entries. It holds one item template per density; the first is the default, and a second adds the Card\/Compact switch.","textdomain":"axismundi-activities","parent":["axismundi\/feed-tab"],"allowedBlocks":["axismundi\/feed-item-template"],"usesContext":["axismundi\/feed"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js"},"axismundi\/feed-pagination":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-pagination","version":"0.1.0","title":"Feed Pagination","category":"theme","icon":"arrow-down-alt","description":"Where the timeline continues. A cursor feed has one direction and no page numbers, so this is Load more rather than a numbered pager.","textdomain":"axismundi-activities","parent":["axismundi\/feed-tab"],"usesContext":["axismundi\/feed","axismundi\/feedNavigation"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","style":"file:.\/style.css","render":"file:.\/render.php"},"axismundi\/feed-density-switch":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-density-switch","version":"0.1.0","title":"Feed Density Switch","category":"theme","icon":"grid-view","description":"Where the Card\/Compact control appears. It changes how the same entries are drawn, never which ones.","textdomain":"axismundi-activities","parent":["axismundi\/feed-tab"],"usesContext":["axismundi\/feed"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","style":"file:.\/style.css","render":"file:.\/render.php"},"axismundi\/feed-item-template":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"axismundi\/feed-item-template","version":"0.1.0","title":"Feed Item Template","category":"theme","icon":"layout","description":"The card the feed repeats for every Object it lists. Edited once here; rendered once per Object, including the ones that arrive after Load more.","attributes":{"density":{"type":"string","default":"card"}},"textdomain":"axismundi-activities","parent":["axismundi\/feed-loop"],"supports":{"html":false,"reusable":false,"inserter":false,"interactivity":{"clientNavigation":true}},"editorScript":"file:.\/edit.js","render":"file:.\/render.php"}},"tagged_versions":["0.1.6"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[162216,2513,65034,174],"plugin_category":[56],"plugin_contributors":[270183],"plugin_business_model":[],"class_list":["post-391421","plugin","type-plugin","status-publish","hentry","plugin_tags-activitypub","plugin_tags-activitystreams","plugin_tags-federation","plugin_tags-social","plugin_category-social-and-sharing","plugin_contributors-kimjiwoon","plugin_committers-kimjiwoon"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/axismundi-activities.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Axismundi Activities is the <strong>ledger<\/strong>: an append-only, URI-keyed record of things that\nhappened -- somebody followed somebody, liked something, announced something, replied,\nwithdrew one of those -- and the relationship state derived from reading it back.<\/p>\n\n<p>It is deliberately not the thing that talks to other servers. There is no HTTP inbox here,\nno outbox transport, no signatures, and no delivery queue. Those are somebody else's job,\nwhich is what lets this one be a plain, auditable record: an Activity is written once and\nnever edited, and undoing something is a new Activity rather than a deletion.<\/p>\n\n<h4>What it needs<\/h4>\n\n<ul>\n<li><strong>Axismundi Actors<\/strong> is required. Every Activity names an actor by URI, and that registry\nis the authority for those URIs.<\/li>\n<li><strong>Axismundi Object Projections<\/strong> is required for the shared ActivityStreams vocabulary.\nLedger admission reads registered Activity ancestry and property exclusions instead of\nmaintaining a second type list. It also supplies Object representation and local post\nintegration; Activities retains ownership of ledger storage and action effects.<\/li>\n<li>Axismundi Emoji and Axismundi Dialogs are optional. Emoji reactions and the anonymous\nremote-follow dialog use them where they are present.<\/li>\n<\/ul>\n\n<h4>What this version does<\/h4>\n\n<ul>\n<li>A limited <strong>ActivityPub C2S outbox POST<\/strong> for Like and Undo(Like), authenticated\nusing WordPress REST cookies with a nonce or Application Passwords. Other C2S\nverbs and bare Object creation are not implemented by this slice.<\/li>\n<li><p>An Actor <strong>liked collection<\/strong>, private by default. Account operators can publish\nits URI membership in Actor Profile settings. Publishing includes private-addressed\nLikes; it does not disclose member bodies or grant permission to fetch them.<\/p><\/li>\n<li><p>An <strong>immutable, URI-keyed Activity ledger<\/strong> with a read-only administrator log.<\/p><\/li>\n<li><strong>Follow and Block<\/strong> relation state, for local actors and for cached remote ones, with\nthe accepted inverse edge tracked separately from the outgoing one.<\/li>\n<li><strong>Like, Dislike, emoji reactions, Announce, Reply and votes<\/strong>, each with its Undo, and\neach keyed by the URI of the thing it is about rather than by a local row id.<\/li>\n<li><strong>FEP-044f QuoteRequest<\/strong> decisions, so a quote of somebody's post is something they\nagreed to rather than something that happened to them.<\/li>\n<li><strong>Object lifecycle recording<\/strong>: one Create when a projectable post is first published,\nand a Delete from its stable identity when it goes.<\/li>\n<li><strong>Feed blocks<\/strong> -- feed, loop, item template, tabs, filters, pagination, a density\nswitch -- plus follow, interaction and reaction-bar blocks.<\/li>\n<li>A <strong>public-safe outbox query<\/strong> for representation plugins: the stored payload stays\nlossless while blind recipients and non-public Activities are kept out of anything\npublic.<\/li>\n<\/ul>\n\n<h4>What this version does not do<\/h4>\n\n<p>No HTTP inbox, no S2S delivery transport, no HTTP signatures, no delivery queue, and no scheduled\ntasks of any kind. It also does not own notifications or read state -- who gets told about\nan Activity, and whether they have seen it, belongs elsewhere. Uploading media stays\ndeliberately silent: putting a file in the library is not an announcement.<\/p>\n\n<h4>What is kept, and for how long<\/h4>\n\n<p>The ledger is append-only. An Undo is recorded as its own Activity pointing at the one it\nwithdraws; nothing is rewritten, because a record that can be edited afterwards is not\nevidence of anything. State like \"does A follow B\" is read back from that history rather\nthan stored as a fact that could drift from it.<\/p>\n\n<p>An Activity therefore outlives the actor it names. When an Actor is tombstoned, it stops\nbeing something anybody can follow or react to, and the record that somebody once did stays\nwhere it is -- deleting an identity does not un-happen what it did.<\/p>\n\n<h3>External services<\/h3>\n\n<p><strong>This plugin makes no network request of its own.<\/strong> There is no HTTP client in it at all:\nno inbox to receive from, no outbox to send from, nothing signed, nothing delivered. Where\nAxismundi federates, it is the ActivityPub transport plugin that does it, and that plugin\ndiscloses what it sends.<\/p>\n\n<p>There is exactly one place where using this plugin causes a request to leave your site, and\nit is worth naming because a visitor rather than an administrator sets it off:<\/p>\n\n<ul>\n<li><strong>Following from another server.<\/strong> Somebody who is not a member of your site can press\nFollow on a profile here and type their own Fediverse handle (<code>@you@example.com<\/code>). To\nsend them back to their own server to finish the follow, this asks <strong>Axismundi Actors<\/strong> to\nlook that handle up -- a WebFinger request to the host in the handle they typed, made by\nthat plugin under its own disclosure. What comes back is the address of their server's\nfollow page, which they are then redirected to. The handle is not stored and no account is\ncreated here. To keep the endpoint from being used to make your site probe arbitrary\nhosts, attempts are limited to ten a minute per visitor address; that address is used only\nas the key of a one-minute counter and is not otherwise recorded.<\/li>\n<\/ul>\n\n<p>Nothing else here reaches outside this site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate <strong>Axismundi Actors<\/strong> and <strong>Axismundi Object Projections<\/strong>.<\/li>\n<li>Upload this plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it through\n<strong>Plugins &gt; Add New<\/strong>, then activate it.<\/li>\n<li>Place the follow, interaction, reaction or feed blocks where you want them. There is\nnothing to configure first.<\/li>\n<li>The ledger is readable, read-only, from the administrator log.<\/li>\n<\/ol>\n\n<p>Activation creates this plugin's own database tables. Nothing is contacted on the internet\nduring installation, and no scheduled task is added.<\/p>\n\n<!--section=changelog-->\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Add object-based Sent membership and audience and reply filters independently of Outbox Activity history.<\/li>\n<li>Record Inbox receipt provenance for new deliveries without classifying historical receipts.<\/li>\n<li>Accept C2S submissions at protocol-named Outbox routes while keeping previous POST routes available.<\/li>\n<li>Sanitize named submitted fields and escape helper markup at output with local HTML allowlists.<\/li>\n<li>Preserve Interactivity context through block wrapper attributes instead of unescaped attribute output.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Serve and observe a Person's featured collection, holding an unresolved member's\nposition instead of publishing a partial replacement.<\/li>\n<li>Give a Community its moderators as an observed collection, without turning moderation\ninto a grant over the Group's own account.<\/li>\n<li>Let a Community review what a remote Person submits to it, recording the decision as a\nfurther Activity rather than as an edit.<\/li>\n<li>Record a reply addressed to a Group here rather than in a product plugin, and give a\nCommunity's moderators one screen to work from.<\/li>\n<li>Carry an existing group across to the Community contract only when an administrator\nasks for it, never on activation.<\/li>\n<li>End a Follow by Block without letting the accepted inverse edge return.<\/li>\n<li>Sanitize the publication-selection nonce before verification, and name the escaping\nauthority at every output boundary that defers to core.<\/li>\n<\/ul>\n\n<p>Earlier releases are recorded in changelog.txt.<\/p>","raw_excerpt":"Records ActivityStreams activities and derives social relationship state, without owning network transport or delivery.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/391421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=391421"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kimjiwoon"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=391421"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=391421"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=391421"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=391421"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=391421"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=391421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}