{"adoption": {"forks": 91, "observed_at": "2026-08-28T04:03:48.457593+00:00", "stars": 1158}, "canonical_url": "https://ross.abutalabs.com/products/microblogpub", "card": {"archived": false, "artifact_type": "application", "description": "A self-hosted, single-user, ActivityPub powered microblog.", "domain": ["self-hosted", "social-media", "web-development", "privacy"], "enriched": true, "function": ["http-server", "auth", "webhook"], "health_score": 20, "homepage": "https://docs.microblog.pub", "language": "Python", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["tsileo/microblog.pub"], "name": "tsileo/microblog.pub", "platform": ["self-hosted", "python"], "pushed_at": "2023-10-17T20:36:33+00:00", "repo": "tsileo/microblog.pub", "stars": 1158, "tags": ["activitypub", "fediverse", "microblog", "indieweb", "indieauth", "micropub", "webmention", "single-user", "mastodon-compatible", "markdown", "rss", "linux", "docker"], "topics": ["microblogpub", "microblog", "microblogging", "activitypub", "indieauth", "micropub"], "urls": [], "use_cases": ["self-host a personal microblog on the fediverse", "run a single-user ActivityPub server on a small VPS", "own my social media data instead of using Mastodon", "publish notes and blog posts that federate with Mastodon", "add IndieWeb support like IndieAuth and Micropub to my personal site", "host a privacy-aware blog that strips EXIF data and proxies media", "back up my entire blog easily from one data directory"], "what_it_is": "microblog.pub is a self-hosted, single-user microblog server that speaks the ActivityPub protocol, letting you federate with Mastodon, Pleroma, PixelFed, and other fediverse servers. It is a lightweight Python/SQLite application with a no-JavaScript HTML/CSS UI, Markdown authoring, and IndieWeb features like IndieAuth, Micropub, Webmentions, and RSS/Atom/JSON feeds.", "when_to_avoid": ["you need multi-user or team accounts", "you want a polished, JavaScript-heavy social UI with rich media features", "you need a general-purpose ActivityPub platform like Mastodon or Pleroma", "you require extensive third-party plugins or a large ecosystem"], "when_to_choose": ["you want a lightweight, single-user fediverse presence on a small VPS", "you prefer a no-JavaScript, Markdown-first publishing UI", "you value IndieWeb interoperability (IndieAuth, Micropub, Webmentions, feeds)", "you want simple backups with everything in one data directory"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/microblogpub", "repo": "tsileo/microblog.pub", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:48.457593+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:31:59.324732+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e129b920bb80b581a7a2d4f52396f4bd1fae8a00b7c3ab224b0aa9083172d876", "fetched_at": "2026-08-28T04:03:48.457593+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tsileo/microblog.pub"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3075, "days_push": 1051, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}