{"adoption": {"forks": 97, "observed_at": "2026-08-28T04:06:01.583105+00:00", "stars": 1979}, "canonical_url": "https://ross.abutalabs.com/products/blot", "card": {"archived": false, "artifact_type": "application", "description": "Turns a folder into a website", "domain": ["web-development", "cms", "self-hosted", "developer-tools"], "enriched": true, "function": ["static-site-generator", "http-server", "templating", "markdown", "file-upload"], "health_score": 79, "homepage": "https://blot.im", "language": "JavaScript", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["davidmerfield/blot"], "name": "davidmerfield/blot", "platform": ["self-hosted"], "pushed_at": "2026-08-16T08:23:31+00:00", "repo": "davidmerfield/blot", "stars": 1979, "tags": ["file-based-publishing", "blogging", "dropbox-sync", "git-sync", "hosted-service", "expressjs", "agpl", "nodejs", "docker", "web-server", "macos"], "topics": [], "urls": [], "use_cases": ["turn a folder of markdown files into a blog", "publish a website by syncing a dropbox folder", "create a photo gallery or portfolio site from files", "write posts in my favorite text editor and publish automatically", "self-host a file-based publishing platform", "migrate a wordpress blog to a simpler file-based site"], "what_it_is": "Blot is an open-source publishing platform that turns a folder of files into a website, powering the hosted service blot.im. It supports Markdown, Word documents, images, and other formats synced via Dropbox, iCloud, Google Drive, or Git, with no publishing interface beyond drag-and-drop.", "when_to_avoid": ["you need fully supported self-hosting - it is explicitly unsupported", "you need a dynamic web application with databases and user accounts", "you want a free hosting option - the hosted service is paid", "you need multi-user or team publishing workflows"], "when_to_choose": ["you want to publish content by editing files rather than using a CMS interface", "you prefer writing in markdown or plain text with your existing editor", "you want a simple personal blog, portfolio, or photo site", "you want to sync content via Dropbox, iCloud, Google Drive, or Git"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/blot", "repo": "davidmerfield/blot", "role": "main", "score": 76}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "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:06:01.583105+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:01.583105+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:04:41.447364+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3c56d9a034142c360e6036f1057eb299cb3fc12eb1f46a92682544427b87a81", "fetched_at": "2026-08-28T04:06:01.583105+00:00", "kind": "readme", "missing": false, "url": "https://github.com/davidmerfield/blot"}, {"content_hash": "765b2e1d9acc778ad2f0ebaba72d749fdfdaf96b8212828727a1cce25428f6ad", "fetched_at": "2026-08-29T10:44:01.741834+00:00", "kind": "homepage", "missing": false, "url": "https://blot.im"}, {"content_hash": "bb6f7f34c75fda18af0a0bc82b0b1bd0f23380f8cfc1aff43aa9e6e0fb40d17e", "fetched_at": "2026-08-29T10:44:01.755858+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/about"}, {"content_hash": "f05ab1f4736df4e61acf1316f21cd00f9b335bb7b255fa4879c5741d98763f0f", "fetched_at": "2026-08-29T10:44:01.750659+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/how"}, {"content_hash": "225bfa1466e3da92a37d5c6b7c02128318c00b7851c82c5f40d668dc51ca9314", "fetched_at": "2026-08-29T10:44:01.753339+00:00", "kind": "site_page", "missing": false, "url": "https://blot.im/pricing"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "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": 3870, "days_push": 17, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 76, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}