{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "writefreely--writefreely",
    "name": "WriteFreely",
    "tagline": "Minimalist federated blogging server in one Go binary, driven by the official Write.as API and wf CLI.",
    "shortTagline": "Minimalist federated blogging",
    "description": "WriteFreely is a single-binary Go publishing platform for blogs and writing communities, with ActivityPub federation, multiple blogs per account, hashtags, pinned pages, and 20+ locales, configured by a config.ini. The same Builder (Musing Studio) runs Write.as as the hosted edition and documents an API plus the writeas-cli whose wf command targets any WriteFreely instance.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "content-publishing",
    "alternativeTo": [
      "Medium",
      "Substack"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "Go",
        "JavaScript"
      ],
      "frameworks": [],
      "packageManager": "go modules",
      "database": [
        "SQLite",
        "MySQL",
        "MariaDB"
      ],
      "hostingTarget": [
        "static binary",
        "Docker (ghcr.io/writefreely/writefreely)",
        "docker-compose"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/writefreely/writefreely",
        "owner": "writefreely",
        "name": "writefreely",
        "license": "AGPL-3.0",
        "stars": 5240,
        "lastCommit": "2026-09-01"
      },
      {
        "url": "https://github.com/writeas/writeas-cli",
        "owner": "writeas",
        "name": "writeas-cli",
        "license": "GPL-3.0",
        "stars": 122,
        "lastCommit": "2026-07-10"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://developers.write.as/docs/api/",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Publish a post",
        "reachable": true,
        "evidence": "API POST /api/posts and /api/collections/{alias}/posts; wf CLI publishes to any instance"
      },
      {
        "job": "Update and delete posts",
        "reachable": true,
        "evidence": "API update, unpublish, delete post"
      },
      {
        "job": "Create and manage blogs (collections)",
        "reachable": true,
        "evidence": "API collections create, retrieve, update, delete"
      },
      {
        "job": "Pin posts as static pages",
        "reachable": true,
        "evidence": "API pin and unpin posts"
      },
      {
        "job": "Keep drafts",
        "reachable": true,
        "evidence": "writeas-cli: publish anonymous posts or drafts; API posts outside a collection"
      },
      {
        "job": "Move posts between blogs",
        "reachable": true,
        "evidence": "API move posts between collections"
      },
      {
        "job": "Run several blogs from one account",
        "reachable": true,
        "evidence": "API user collections list; max_blogs in config.ini"
      },
      {
        "job": "Federate over ActivityPub",
        "reachable": false,
        "evidence": "federation is a config.ini switch, not an API operation"
      },
      {
        "job": "Invite and manage users",
        "reachable": false,
        "evidence": "not in API; admin UI or config.ini user_invites"
      },
      {
        "job": "Browse the local reader timeline",
        "reachable": false,
        "evidence": "no API endpoint listed; local_timeline is a config switch"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/writefreely/writefreely"
          },
          {
            "kind": "binary",
            "url": "https://github.com/writefreely/writefreely/releases"
          },
          {
            "kind": "container",
            "url": "https://ghcr.io/writefreely/writefreely"
          }
        ]
      },
      {
        "name": "Write.as managed hosting",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://write.as/writefreely"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": {
      "summary": "Everything is config.ini: [server] port, bind, TLS or autocert; [database] SQLite or MySQL; [app] site_name, host, single_user, open_registration, federation, editor, max_blogs, local_timeline, user_invites, default_visibility; [email] SMTP or Mailgun; [oauth.generic] for SSO. Flip single_user for a personal blog or open_registration for a community. Templates can be overridden in the templates directory.",
      "envVars": [],
      "configFiles": [
        "config.ini",
        "docker-compose.yml",
        "templates/"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 3
    },
    "useWhen": [
      "I want a fast, plain blog I own that also shows up in the fediverse",
      "I want my agent to publish posts from my notes to my own instance with a one-line CLI"
    ],
    "accounts": [
      "Mailgun or SMTP (optional, for email features)"
    ],
    "active": true,
    "lastActivity": "2026-09-01",
    "gotchas": [
      "AGPL-3.0 (server); the CLI is GPL-3.0",
      "Read operations on public content need no auth; writes need a token from /api/auth/login with username and password",
      "No env var surface; configuration is the ini file only",
      "Some write.as-only API features are not in WriteFreely; build against the WriteFreely subset"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: deploys as a static binary with built-in SQLite; browser UI",
      "executionModel": "no model at runtime",
      "operability": "developers.write.as/docs/api (Builder domain) plus writeas-cli README: 'publishing to Write.as and any other WriteFreely instance'; wf --version",
      "effort": "writefreely.org/docs/latest/admin/config documents config.ini sections and keys",
      "editions": "README: pre-built binaries, ghcr image, AGPL; Write.as managed hosting from the same team",
      "active": "pushedAt 2026-09-01; 107 open issues; CLI pushed 2026-07-10",
      "provenance": "Musing Studio LLC since 2018; no vibe-coded claim"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.95,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.85,
      "editions": 0.8,
      "provenance": 0.9
    },
    "openQuestions": [
      "Write.as managed WriteFreely hosting price"
    ],
    "sources": [
      {
        "url": "https://github.com/writefreely/writefreely",
        "foundBy": "sourcing:content-publishing:github"
      },
      {
        "url": "https://developers.write.as/docs/api/",
        "foundBy": "analysis:content-publishing"
      },
      {
        "url": "https://writefreely.org/docs/latest/admin/config",
        "foundBy": "analysis:content-publishing"
      },
      {
        "url": "https://github.com/writeas/writeas-cli",
        "foundBy": "analysis:content-publishing"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official API and CLI from the same Builder, confirmed to target self-hosted instances; config.ini is a complete config-only surface. AGPL caps adaptable at 2.",
      "disputed": []
    },
    "url": "apps/writefreely--writefreely.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/writefreely--writefreely.json"
  }
}
