{"id":373005,"date":"2026-09-25T20:57:47","date_gmt":"2026-09-25T20:57:47","guid":{"rendered":"https:\/\/it.wordpress.org\/plugins\/eg-social-timeline\/"},"modified":"2026-09-25T20:57:32","modified_gmt":"2026-09-25T20:57:32","slug":"eg-social-timeline","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/eg-social-timeline\/","author":23569476,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.15.9","stable_tag":"1.15.9","tested":"7.1.2","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"EG Social Timeline","header_author":"Emanuele Gori","header_description":"Unified chronological timeline of your public activity from Mastodon, Bluesky, Pixelfed, PeerTube, Forgejo, Lemmy, ListenBrainz and any RSS or Atom feed. Zero JavaScript, zero tracking.","assets_banners_color":"12131b","last_updated":"2026-09-25 20:57:32","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/emanuelegori.uno\/en\/donate\/","header_plugin_uri":"https:\/\/emanuelegori.uno\/en\/plugins\/eg-social-timeline\/","header_author_uri":"https:\/\/emanuelegori.uno","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.15.9":{"tag":"1.15.9","author":"emanuelegori","date":"2026-09-25 20:57:32","revision":3713572}},"upgrade_notice":{"1.15.9":"<p>Corrects the &quot;tested up to&quot; header, which must carry the major version only. No functional change.<\/p>","1.15.8":"<p>Three cache keys now carry the plugin&#039;s full prefix, and the bundled Italian translation moves to translate.wordpress.org. No setting is affected.<\/p>","1.15.7":"<p>Fixes a real default: on a fresh install, boosts and image previews were switched off although they are documented as on. Existing installs are not affected.<\/p>","1.15.6":"<p>Documentation only: dead and placeholder links in the readme have been corrected, and the plugin is now tested up to WordPress 7.1.2.<\/p>","1.15.5":"<p>The compatibility header now declares the current WordPress release, so the &quot;not tested with your version&quot; warning goes away. No functional change.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3713572,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3713572,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3713572,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3713572,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.15.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3713572,"resolution":"1","location":"assets","locale":"","width":975,"height":975},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3713572,"resolution":"2","location":"assets","locale":"","width":948,"height":948},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3713572,"resolution":"3","location":"assets","locale":"","width":924,"height":924},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3713572,"resolution":"4","location":"assets","locale":"","width":1462,"height":958}},"screenshots":{"1":"The timeline on the site: one chronological feed from every source, with the compact filter bar on top.","2":"Cards carry image previews and interaction counts where the source provides them.","3":"Settings: one box per platform, with the fields and the display options that apply to it.","4":"Settings: how many posts reach the page, how long they stay cached, and the colours of the timeline."}},"plugin_section":[],"plugin_tags":[223781,282745,282744,139106,5575],"plugin_category":[],"plugin_contributors":[282746],"plugin_business_model":[],"class_list":["post-373005","plugin","type-plugin","status-publish","hentry","plugin_tags-bluesky","plugin_tags-forgejo","plugin_tags-lemmy","plugin_tags-mastodon","plugin_tags-timeline","plugin_contributors-emanuelegori","plugin_committers-emanuelegori"],"banners":{"banner":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/banner-772x250.png?rev=3713572","banner_2x":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/banner-1544x500.png?rev=3713572","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/icon-128x128.png?rev=3713572","icon_2x":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/icon-256x256.png?rev=3713572","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/screenshot-1.png?rev=3713572","caption":"The timeline on the site: one chronological feed from every source, with the compact filter bar on top."},{"src":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/screenshot-2.png?rev=3713572","caption":"Cards carry image previews and interaction counts where the source provides them."},{"src":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/screenshot-3.png?rev=3713572","caption":"Settings: one box per platform, with the fields and the display options that apply to it."},{"src":"https:\/\/ps.w.org\/eg-social-timeline\/assets\/screenshot-4.png?rev=3713572","caption":"Settings: how many posts reach the page, how long they stay cached, and the colours of the timeline."}],"raw_content":"<!--section=description-->\n<p>EG Social Timeline aggregates in chronological order your public posts from eight sources and displays them in a single timeline via shortcode.<\/p>\n\n<h4>Supported platforms<\/h4>\n\n<ul>\n<li>Mastodon, and the Mastodon-compatible Pleroma and Akkoma (public accounts API, no authentication)<\/li>\n<li>Bluesky (public API, no authentication required)<\/li>\n<li>Pixelfed (public Atom feed: photos and captions, no interaction counts)<\/li>\n<li>PeerTube (public REST API, videos from an account or from a channel)<\/li>\n<li>Forgejo and Gitea (commits from your public repositories)<\/li>\n<li>Lemmy, on any instance (public user RSS feed)<\/li>\n<li>ListenBrainz (public API, no token: what you have been listening to)<\/li>\n<li>Any RSS 2.0 or Atom feed: a blog, a newsletter, a podcast<\/li>\n<\/ul>\n\n<p>Every platform is configured the same way: the instance URL plus your username. Bluesky is the exception, because its public API lives at a single address for everyone.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>Interactive per-platform filters, no JavaScript required<\/li>\n<li>Image previews wherever the source carries one: Mastodon, Bluesky, Pixelfed, PeerTube thumbnails and images found in a feed (optional, per source)<\/li>\n<li>Per-platform configurable limits for a balanced mix<\/li>\n<li>Interaction stats: likes, boosts, comments<\/li>\n<li>Configurable cache (30 minutes - 24 hours)<\/li>\n<li>Timeline and card backgrounds configurable independently, each with its own color<\/li>\n<li>Text, borders and icons derived from the contrast of the color you pick, so they stay readable<\/li>\n<li>Responsive design<\/li>\n<li>Shortcode with optional limit parameter<\/li>\n<li>Modular and customizable SVG icons<\/li>\n<li>Privacy-friendly: public data only, no trackers<\/li>\n<\/ul>\n\n<h4>Usage<\/h4>\n\n<p>Configure the profiles in the settings, then insert the shortcode:<\/p>\n\n<pre><code>[eg_social_timeline]\n<\/code><\/pre>\n\n<p>With a custom limit:<\/p>\n\n<pre><code>[eg_social_timeline limit=\"20\"]\n<\/code><\/pre>\n\n<h4>Privacy<\/h4>\n\n<ul>\n<li>Retrieves only public posts from the configured platforms<\/li>\n<li>No user tracking<\/li>\n<li>No data sent to third parties<\/li>\n<li>Local cache in the WordPress database<\/li>\n<li>No cookies set by the plugin<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects only to the platforms and feeds the administrator explicitly configures in the settings, one section per source below. No external service is contacted until at least one source has been filled in. All requests are HTTP GET requests for public content; no user credentials are ever sent.<\/p>\n\n<p>Contacted services are cached locally for a configurable duration (30 minutes to 24 hours, default value depends on the admin setting) to minimize external traffic.<\/p>\n\n<h4>Mastodon<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the Mastodon, Pleroma or Akkoma instance whose URL the user enters in the settings (e.g. <code>https:\/\/mastodon.uno<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered.<\/li>\n<li><strong>Endpoints<\/strong>: <code>GET \/.well-known\/nodeinfo<\/code> and the linked nodeinfo document (to read which software the instance runs, cached 7 days), <code>GET \/api\/v1\/accounts\/lookup<\/code> (account ID lookup, cached 30 days) and <code>GET \/api\/v1\/accounts\/{id}\/statuses<\/code> (public statuses).<\/li>\n<li><strong>Data sent<\/strong>: only the public username\/handle entered in the settings, as a URL parameter.<\/li>\n<li><strong>Data received and stored<\/strong>: public post metadata (text, date, link, media preview URL and alt text if image previews are enabled, like\/boost\/reply counts). Cached locally as a WordPress transient.<\/li>\n<li>Mastodon is decentralized: terms of service and privacy policy depend on the specific instance the user chooses and are available on that instance.<\/li>\n<\/ul>\n\n<h4>Bluesky<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the Bluesky public API at <code>https:\/\/public.api.bsky.app<\/code>.<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered.<\/li>\n<li><strong>Endpoint<\/strong>: <code>GET https:\/\/public.api.bsky.app\/xrpc\/app.bsky.feed.getAuthorFeed?actor={handle}<\/code>.<\/li>\n<li><strong>Data sent<\/strong>: only the public handle entered in the settings (e.g. <code>username.bsky.social<\/code>).<\/li>\n<li><strong>Data received and stored<\/strong>: public post metadata (text, date, link, image preview URL and alt text if image previews are enabled, like\/repost\/reply counts). Cached locally as a WordPress transient.<\/li>\n<li>Terms of service: https:\/\/bsky.social\/about\/support\/tos<\/li>\n<li>Privacy policy: https:\/\/bsky.social\/about\/support\/privacy-policy<\/li>\n<\/ul>\n\n<h4>PeerTube<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the PeerTube instance the user enters in the settings (e.g. <code>https:\/\/peertube.uno<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered.<\/li>\n<li><strong>Endpoints<\/strong>: <code>GET \/api\/v1\/accounts\/{account}\/videos<\/code> and <code>GET \/api\/v1\/video-channels\/{channel}\/videos<\/code> for the public videos of an account or of a channel.<\/li>\n<li><strong>Data sent<\/strong>: only the public account name entered in the settings, as part of the URL path.<\/li>\n<li><strong>Data received and stored<\/strong>: public video metadata (title, description, date, link, thumbnail URL and like count). Cached locally as a WordPress transient.<\/li>\n<li>PeerTube is decentralized federated video hosting: terms of service and privacy policy depend on the specific instance the user chooses and are available on that instance.<\/li>\n<\/ul>\n\n<h4>Forgejo \/ Gitea<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the Forgejo or Gitea instance the user enters in the settings (e.g. <code>https:\/\/git.example.com<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered.<\/li>\n<li><strong>Endpoints<\/strong>: <code>GET \/api\/v1\/users\/{username}\/repos<\/code> and <code>GET \/api\/v1\/repos\/{owner}\/{repo}\/commits<\/code> for the user's public repositories.<\/li>\n<li><strong>Data sent<\/strong>: only the public username entered in the settings, as a URL parameter.<\/li>\n<li><strong>Data received and stored<\/strong>: public commit metadata (message, date, repository name, commit hash and link). Cached locally as a WordPress transient.<\/li>\n<li>Forgejo and Gitea are open-source git hosting platforms. Their terms of service and privacy policy depend on the specific instance the user chooses and are available on that instance.<\/li>\n<\/ul>\n\n<h4>Pixelfed<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the Pixelfed instance the user enters in the settings (e.g. <code>https:\/\/pixelfed.uno<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered, plus once when the settings are saved or the \"Verify profiles\" button is used.<\/li>\n<li><strong>Endpoint<\/strong>: <code>GET \/users\/{username}.atom<\/code>, the public Atom feed of the profile.<\/li>\n<li><strong>Data sent<\/strong>: only the public username entered in the settings, as part of the URL path.<\/li>\n<li><strong>Data received and stored<\/strong>: public post metadata (caption, date, link, photo URL and alt text if image previews are enabled) parsed from the public Atom feed. Cached locally as a WordPress transient.<\/li>\n<li>Pixelfed is decentralized: terms of service and privacy policy depend on the specific instance the user chooses and are available on that instance.<\/li>\n<\/ul>\n\n<h4>ListenBrainz<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the ListenBrainz API the user enters in the settings (by default <code>https:\/\/api.listenbrainz.org<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered, plus once when the settings are saved or the \"Verify profiles\" button is used.<\/li>\n<li><strong>Endpoint<\/strong>: <code>GET \/1\/user\/{username}\/listens<\/code>, the public listens of the account. No token is sent.<\/li>\n<li><strong>Data sent<\/strong>: only the public username entered in the settings, as part of the URL path.<\/li>\n<li><strong>Data received and stored<\/strong>: artist, track, album, listen timestamp and the recording identifier when present, used to link the track page on ListenBrainz. Cached locally as a WordPress transient.<\/li>\n<li>Privacy policy: https:\/\/metabrainz.org\/privacy \u2014 terms: https:\/\/metabrainz.org\/social-contract<\/li>\n<\/ul>\n\n<h4>RSS or Atom feed<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the feed address the user enters in the settings; it can be any site.<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered, plus once when the settings are saved or the \"Verify profiles\" button is used.<\/li>\n<li><strong>Endpoint<\/strong>: a <code>GET<\/code> request to the address itself.<\/li>\n<li><strong>Data sent<\/strong>: nothing beyond the request for the feed.<\/li>\n<li><strong>Data received and stored<\/strong>: title, link, summary, date and, when present, the item's image. Cached locally as a WordPress transient.<\/li>\n<li>Terms and privacy policy depend on the site the user chooses.<\/li>\n<\/ul>\n\n<h4>Lemmy<\/h4>\n\n<ul>\n<li><strong>What<\/strong>: the Lemmy instance the user enters in the settings (e.g. <code>https:\/\/diggita.com<\/code>).<\/li>\n<li><strong>When<\/strong>: each time the timeline cache expires and a page containing the shortcode is rendered.<\/li>\n<li><strong>Endpoint<\/strong>: <code>GET \/feeds\/u\/{username}.xml<\/code>, the public user RSS feed. It exists only on the instance where the account is registered.<\/li>\n<li><strong>Data sent<\/strong>: only the public username entered in the settings, as part of the URL path.<\/li>\n<li><strong>Data received and stored<\/strong>: public post metadata (title, link, date, vote and comment counts) parsed from the public RSS feed. Cached locally as a WordPress transient.<\/li>\n<li>Lemmy is decentralized: terms of service and privacy policy depend on the specific instance the user chooses and are published by that instance.<\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>EG Social Timeline retrieves only public content from the configured platforms. It does not track site visitors, does not send data to third-party services, and does not set cookies. The cache is local to the WordPress database.<\/p>\n\n<h3>Support<\/h3>\n\n<ul>\n<li>Repository: https:\/\/git.emanuelegori.uno\/emanuelegori\/eg-social-timeline<\/li>\n<li>Issues: https:\/\/git.emanuelegori.uno\/emanuelegori\/eg-social-timeline\/issues<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>In WordPress go to Plugins \u2192 Add New and search for \"EG Social Timeline\"<\/li>\n<li>Click Install Now, then Activate<\/li>\n<li>Go to Settings \u2192 EG Social Timeline<\/li>\n<li>Configure at least one social profile<\/li>\n<li>Insert <code>[eg_social_timeline]<\/code> into the desired page or post<\/li>\n<\/ol>\n\n<h4>Installing from a ZIP<\/h4>\n\n<p>The source code lives at https:\/\/git.emanuelegori.uno\/emanuelegori\/eg-social-timeline. Download a release, then go to Plugins \u2192 Add New \u2192 Upload Plugin and select the file.<\/p>\n\n<h4>Minimum configuration<\/h4>\n\n<ul>\n<li>Mastodon, Pleroma or Akkoma: instance URL + username (e.g. https:\/\/mastodon.uno + username)<\/li>\n<li>OR Lemmy: instance URL + username (e.g. https:\/\/diggita.com + username)<\/li>\n<li>OR Pixelfed: instance URL + username (e.g. https:\/\/pixelfed.uno + yourname)<\/li>\n<li>OR PeerTube: instance URL + account or channel (e.g. https:\/\/peertube.uno + yourname)<\/li>\n<li>OR Forgejo\/Gitea: instance URL + username<\/li>\n<li>OR Bluesky: handle alone (e.g. emanuele.bsky.social)<\/li>\n<li>OR ListenBrainz: username (the API URL is already filled in)<\/li>\n<li>OR an RSS\/Atom feed: the feed address, with an optional label<\/li>\n<\/ul>\n\n<p>You can also paste the full profile address into either field and the plugin splits it: <code>https:\/\/lemmy.example\/u\/username<\/code>, <code>https:\/\/mastodon.example\/@name<\/code>, <code>https:\/\/peertube.example\/c\/name@host.example\/videos<\/code>, <code>https:\/\/bsky.app\/profile\/name.bsky.social<\/code>.<\/p>\n\n<h4>Advanced configuration<\/h4>\n\n<ul>\n<li>Per-platform post limits (avoids one platform monopolizing the timeline)<\/li>\n<li>Image previews where the source carries one: Mastodon, Bluesky, Pixelfed, PeerTube thumbnails and images found in a feed<\/li>\n<li>Text length for each post (50-600 characters, 0 = full text)<\/li>\n<li>Include or exclude boosts and reposts<\/li>\n<li>Show or hide interaction stats<\/li>\n<li>Cache duration from 30 minutes to 24 hours<\/li>\n<li>Timeline background: transparent (default), neutral preset, follow the visitor browser, or a custom color<\/li>\n<li>Card background: neutral preset (default), transparent, follow the visitor browser, or a custom color<\/li>\n<li>Platform icon style: platform colors, or a single color taken from the post text<\/li>\n<li>Filter bar style: full (icon, name and count) or compact (icons only, name and count in the tooltip)<\/li>\n<li>Per-source display options: boosts, statistics, image previews and text length are set inside each platform's own box, and only where they have an effect<\/li>\n<li>Text, borders, badges, links and icons are not configured: they are derived from the contrast of the background you choose, and switch to their light variants on a dark surface<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20platforms%20are%20supported%3F\"><h3>Which platforms are supported?<\/h3><\/dt>\n<dd><p>Mastodon, Pleroma, Akkoma, Bluesky, Pixelfed, PeerTube, Forgejo\/Gitea, Lemmy (any instance), ListenBrainz, and any RSS or Atom feed.<\/p><\/dd>\n<dt id=\"my%20peertube%20videos%20are%20not%20showing%20up.\"><h3>My PeerTube videos are not showing up.<\/h3><\/dt>\n<dd><p>On PeerTube videos almost always live in a <strong>channel<\/strong>, not directly in the account, and the two use different API endpoints. Paste the full address of your channel and the plugin sorts it out: <code>\/c\/name<\/code> is a channel, <code>\/a\/name<\/code> an account. If you only type a name, both are tried and the answer is remembered.<\/p>\n\n<p>A second detail: a channel belongs to the instance that hosts it. An address like <code>https:\/\/peertube.example\/c\/name@origin.example\/videos<\/code> means the channel lives on <code>origin.example<\/code> and <code>peertube.example<\/code> only federates it \u2014 the plugin then queries the origin, which does not depend on the state of federation.<\/p><\/dd>\n<dt id=\"can%20i%20add%20a%20source%20that%20is%20not%20a%20social%20platform%3F\"><h3>Can I add a source that is not a social platform?<\/h3><\/dt>\n<dd><p>Yes. The \"RSS or Atom feed\" fields take the address of any feed \u2014 your blog, a newsletter, a podcast \u2014 and its items join the timeline like any other source, with their own filter. The label you give it is the name shown on the cards; left empty, the feed's own title is used.<\/p><\/dd>\n<dt id=\"what%20does%20the%20listenbrainz%20source%20show%3F\"><h3>What does the ListenBrainz source show?<\/h3><\/dt>\n<dd><p>Your recent listens: artist and track, with the date. The public API needs no token. Each card links to the recording on MusicBrainz when the identifier is available, otherwise to your ListenBrainz profile. No interaction counts, because listens do not have any.<\/p><\/dd>\n<dt id=\"why%20does%20pixelfed%20show%20no%20likes%20or%20comments%3F\"><h3>Why does Pixelfed show no likes or comments?<\/h3><\/dt>\n<dd><p>Because its public Atom feed does not carry them. Pixelfed answers the Mastodon-compatible account lookup but redirects the statuses endpoint to its login page, so the feed is the only way to read a profile without credentials: it gives photos, captions, dates and links, and no counts.<\/p><\/dd>\n<dt id=\"does%20the%20mastodon%20field%20work%20with%20every%20fediverse%20server%3F\"><h3>Does the Mastodon field work with every fediverse server?<\/h3><\/dt>\n<dd><p>No, and it is worth knowing why. The plugin reads the public accounts API (<code>\/api\/v1\/accounts\/lookup<\/code> and <code>\/api\/v1\/accounts\/{id}\/statuses<\/code>), which Mastodon, Pleroma and Akkoma serve without authentication. GoToSocial and Friendica answer those endpoints with HTTP 401, Misskey and Sharkey use a different API, and Pixelfed answers the lookup but redirects the statuses endpoint to its login page. When you save an instance running one of those, the settings page says so instead of leaving you with a platform that never appears.<\/p><\/dd>\n<dt id=\"a%20platform%20i%20configured%20does%20not%20show%20up.%20where%20do%20i%20look%3F\"><h3>A platform I configured does not show up. Where do I look?<\/h3><\/dt>\n<dd><p>The settings page, in the \"Configured profiles\" table. It shows what the plugin sees for each platform \u2014 instance, software, account or channel \u2014 and what the last fetch returned, with the reason when a platform came back empty: an instance requiring authentication, an account not found, a Lemmy feed requested where that account is not registered. The checks run when you save the settings and can be repeated with the \"Verify profiles\" button; the page itself never queries the instances while loading.<\/p><\/dd>\n<dt id=\"do%20the%20platform%20filters%20require%20javascript%3F\"><h3>Do the platform filters require JavaScript?<\/h3><\/dt>\n<dd><p>No. They use only CSS with the checkbox\/label pattern and work even with JavaScript disabled in the browser.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20plugin%20with%20a%20single%20platform%3F\"><h3>Can I use the plugin with a single platform?<\/h3><\/dt>\n<dd><p>Yes. Just configure at least one profile. Unconfigured platforms are simply ignored.<\/p><\/dd>\n<dt id=\"how%20do%20the%20per-platform%20limits%20work%3F\"><h3>How do the per-platform limits work?<\/h3><\/dt>\n<dd><p>Each platform has a configurable limit on the number of posts included in the timeline. This prevents a very active platform (e.g. Forgejo with many commits) from filling all available slots, ensuring a balanced mix.<\/p><\/dd>\n<dt id=\"is%20data%20private%3F\"><h3>Is data private?<\/h3><\/dt>\n<dd><p>The plugin retrieves only public content. It does not track site visitors and does not send data to third-party services.<\/p><\/dd>\n<dt id=\"how%20does%20the%20cache%20work%3F\"><h3>How does the cache work?<\/h3><\/dt>\n<dd><p>Posts are temporarily stored to reduce calls to the external APIs. You can configure the duration from 30 minutes to 24 hours. The cache is automatically cleared when settings are saved.<\/p><\/dd>\n<dt id=\"why%20does%20the%20timeline%20look%20dark%20on%20my%20light%20theme%3F\"><h3>Why does the timeline look dark on my light theme?<\/h3><\/dt>\n<dd><p>Up to version 1.7.2 the timeline always followed the <code>prefers-color-scheme<\/code> setting of the visitor browser, so it turned dark even on a light theme. Since 1.8.1 the stylesheet carries no <code>prefers-color-scheme<\/code> rule at all: the timeline goes dark only if you set a background to \"Follow the visitor browser\", or if both backgrounds are transparent and there is no color to measure.<\/p><\/dd>\n<dt id=\"i%20picked%20a%20dark%20card%20background%20but%20the%20text%20stayed%20dark.\"><h3>I picked a dark card background but the text stayed dark.<\/h3><\/dt>\n<dd><p>That was a bug in 1.8.0, fixed in 1.8.1: contrast was inferred from a global color scheme instead of being measured on the color of the surface. Text, borders, badges, links and icons now follow the background you actually chose.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20style%3F\"><h3>Can I customize the style?<\/h3><\/dt>\n<dd><p>Yes. Settings \u2192 EG Social Timeline \u2192 Appearance covers the two backgrounds and the icon style. Every color in the stylesheet comes from a custom property declared on the <code>.eg-social-timeline<\/code> container: two source palettes (<code>--egst-light-*<\/code> and <code>--egst-dark-*<\/code>) and the active tokens that read from them (<code>--egst-text<\/code>, <code>--egst-card-bg<\/code>, <code>--egst-chip-bg<\/code>, \u2026), so a few lines of theme CSS are enough to retheme the whole timeline. The icons are SVG files you can replace in the <code>social-icons\/<\/code> folder.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.15.9 - 2026-09-24<\/h4>\n\n<ul>\n<li>Fixed: the \"tested up to\" header carried a point release, which the plugin directory rejects: that field takes the major version only. It is back to 7.1.<\/li>\n<\/ul>\n\n<h4>1.15.8 - 2026-09-24<\/h4>\n\n<ul>\n<li>Changed: three cache keys used a short identifier (<code>eg_st_<\/code>, <code>eg_mastodon_<\/code>) and now carry the plugin's full prefix, like every other name in the plugin. They are transients, so they simply rebuild themselves on the next fetch; no setting is affected.<\/li>\n<li>Changed: the Italian translation is no longer shipped inside the package. Translations for plugins hosted on WordPress.org are generated and delivered by translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.15.7 - 2026-09-23<\/h4>\n\n<ul>\n<li>Fixed: on a fresh install, boosts and image previews started switched off although the plugin documented every display option as enabled. The old global switches were still listed among the registered defaults, and the per-source lookup found them before reaching its own default. Existing installs keep the choices they saved.<\/li>\n<li>Fixed: the description said the plugin aggregates five sources when it aggregates eight, the FAQ listed eight of them and left out ListenBrainz and feeds, and image previews were credited to three sources instead of five.<\/li>\n<li>Fixed: the external services section no longer opens with a list of sources that had to be kept in step with the sections below it.<\/li>\n<\/ul>\n\n<h4>1.15.6 - 2026-09-23<\/h4>\n\n<ul>\n<li>Fixed: two links in the Lemmy section pointed at pages that no longer exist. Terms and privacy policy on Lemmy are published by the instance the user chooses, so the readme now says that instead of naming one.<\/li>\n<li>Fixed: the example addresses that show which profile formats the plugin accepts used real instances with placeholder usernames, so they resolved to missing pages. They now use reserved example domains.<\/li>\n<li>Changed: tested up to WordPress 7.1.2.<\/li>\n<\/ul>\n\n<h4>1.15.5 - 2026-09-21<\/h4>\n\n<ul>\n<li>Fixed: the compatibility header declared WordPress 7.1 while the current release is 7.1.1, so WordPress warned that the plugin had not been tested with the version people are actually running.<\/li>\n<li>Changed: the upgrade notice carries the two most recent releases, as it was meant to from 1.15.3 onwards.<\/li>\n<\/ul>\n\n<h4>1.15.4 - 2026-09-20<\/h4>\n\n<ul>\n<li>Changed: the installation instructions now start from the WordPress plugin directory, which is where the plugin is distributed. The release ZIP and the source repository are still documented.<\/li>\n<li>Removed: the section recommending a third-party updater to receive releases from outside the plugin directory.<\/li>\n<li>Fixed: the screenshots in README.md are referenced by absolute address, so they show up outside the repository too, and all four are listed instead of three.<\/li>\n<li>Changed: the Lemmy example address no longer names a real account.<\/li>\n<\/ul>\n\n<h4>1.15.3 - 2026-09-20<\/h4>\n\n<ul>\n<li>Changed: this readme now carries the changelog of the current 1.15 line only. Every earlier entry moved to changelog.txt, which ships with the plugin, as the plugin directory asks.<\/li>\n<li>Changed: the upgrade notice keeps the two most recent releases instead of every version ever published.<\/li>\n<\/ul>\n\n<h4>1.15.2 - 2026-09-20<\/h4>\n\n<ul>\n<li>Fixed: eight field descriptions still quoted the defaults from before 1.14.1. They now match what the plugin actually does: five items per source, fifty posts on the page, thirty minutes of cache.<\/li>\n<li>Fixed: the screenshot list is now in the format the plugin directory reads, so the screenshots appear on the plugin page.<\/li>\n<li>Changed: the plugin directory assets (screenshots, banner, icon) are no longer shipped inside the plugin package.<\/li>\n<\/ul>\n\n<h4>1.15.1 - 2026-09-20<\/h4>\n\n<ul>\n<li>Changed: the footer links now follow the language of the person reading them. The project page and the support page are translatable strings, so a translation can point them at its own localised pages, and a language without one simply stays on English. Nothing in the code tests for a specific locale.<\/li>\n<\/ul>\n\n<h4>1.15.0 - 2026-09-20<\/h4>\n\n<ul>\n<li>Added: the settings page now has a proper footer, built on the WordPress footer slots. On the left, who develops the plugin and the links that matter: documentation, repository, and a way to support the work. On the right, version and licence, where administrators already look for them.<\/li>\n<li>Added: a donate link on the plugin directory page, pointing at the project's support page.<\/li>\n<li>Changed: the plugin homepage now opens the project page instead of the code repository, so anyone clicking it lands on documentation rather than on a Git tree.<\/li>\n<li>Fixed: the repository link in the footer was missing <code>rel=\"noopener noreferrer\"<\/code>, unlike the developer one.<\/li>\n<\/ul>","raw_excerpt":"Chronological timeline of your public activity across the fediverse, Bluesky, ListenBrainz and any RSS feed. Zero JavaScript, zero tracking.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/373005","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=373005"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/emanuelegori"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=373005"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=373005"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=373005"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=373005"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=373005"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=373005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}