{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "HumanDeploy Changelog",
  "home_page_url": "https://humandeploy.ai/changelog/",
  "feed_url": "https://humandeploy.ai/changelog/feed.json",
  "description": "Ship log for HumanDeploy — features, fixes, and infrastructure in the order they land.",
  "icon": "https://humandeploy.ai/favicon.svg",
  "favicon": "https://humandeploy.ai/favicon.svg",
  "language": "en-US",
  "authors": [
    {
      "name": "HumanDeploy",
      "url": "https://humandeploy.ai"
    }
  ],
  "items": [
    {
      "id": "humandeploy:changelog:v0.9.2",
      "url": "https://humandeploy.ai/changelog/#v0-9-2",
      "title": "v0.9.2 — Spaces and realtime threads",
      "summary": "Renamed Areas to Spaces with a spaces_projects join table. Thread orchestration moved from a 5-second poll to Supabase realtime on postgres replication.",
      "content_html": "<p>Renamed <code>Areas</code> to <code>Spaces</code> with a new <code>spaces_projects</code> join table. Projects now live inside a Space with scoped brand and context. Thread orchestration moved off a 5-second poll onto Supabase realtime on postgres replication; Slack mutations land on web surfaces sub-second. Migration ran online behind a feature flag with no downtime.</p>",
      "date_published": "2026-04-16T16:00:00Z",
      "tags": ["Infrastructure", "v0.9.2"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.9.2",
        "state": "live",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.7.0",
      "url": "https://humandeploy.ai/changelog/#v0-7-0",
      "title": "v0.7.0 — Inflow becomes HumanDeploy",
      "summary": "Same codebase, new domain, new name, new story. No data migration.",
      "content_html": "<p>Inflow is now HumanDeploy. Same codebase, new domain (humandeploy.ai), new name, new story. No data migration. Existing tenants kept their workspace, memory, and billing. Founding-tier pricing holds at $2,500/mo.</p>",
      "date_published": "2026-04-10T14:00:00Z",
      "tags": ["Launch", "v0.7.0"],
      "authors": [{ "name": "Steffan Howey" }],
      "_humandeploy": {
        "version": "0.7.0",
        "state": "shipped",
        "signed_by": { "name": "Steffan Howey", "role": "Founder", "kind": "human" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.9.0",
      "url": "https://humandeploy.ai/changelog/#v0-9-0",
      "title": "v0.9.0 — Credit operations",
      "summary": "credit-operations with reserve, consume, release. Each call runs inside a SELECT FOR UPDATE transaction with an idempotency key.",
      "content_html": "<p>Added <code>credit-operations</code> with three primitives: <code>reserve</code>, <code>consume</code>, <code>release</code>. Each call runs inside a <code>SELECT FOR UPDATE</code> transaction with an idempotency key, so a retried network call never double-spends. A scope approval reserves against client balance; delivery consumes; cancellation releases. Failed debits write to a recovery table the admin dashboard reads from. Unlimited-credit allowlist accounts bypass reservation.</p>",
      "date_published": "2026-04-05T15:00:00Z",
      "tags": ["Infrastructure", "v0.9.0"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.9.0",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.8.8",
      "url": "https://humandeploy.ai/changelog/#v0-8-8",
      "title": "v0.8.8 — Expert Slack app",
      "summary": "A second Slack app for experts with separate install, separate OAuth, and shared workspace memory. Unresponded assignments expire after 2h and re-route.",
      "content_html": "<p>Shipped a second Slack app for experts with separate install, separate OAuth, and shared workspace memory. When a handoff moves into <code>assigned</code>, the expert receives a DM with scope, deadline, and a link to the brand profile. Accept flips state to <code>in_progress</code>; decline routes to next-best-fit via the assignment engine. Assignments with no response in 2 hours expire on a cron and re-route to the next expert in rank. Experts see a kanban of the work they own.</p>",
      "date_published": "2026-04-01T14:00:00Z",
      "tags": ["Feature", "v0.8.8"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.8.8",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.8.6",
      "url": "https://humandeploy.ai/changelog/#v0-8-6",
      "title": "v0.8.6 — Integrations framework",
      "summary": "integration-oauth handles the full OAuth lifecycle for any provider in providerConfigs.ts. Tokens AES-encrypted. Rate limiter + circuit breaker on BaseConnector.",
      "content_html": "<p><code>integration-oauth</code> now handles the full OAuth lifecycle for any provider listed in <code>providerConfigs.ts</code>. Tokens are AES-encrypted before persistence. Connectors extend <code>BaseConnector</code> and inherit per-provider rate limiting (10 req/s default) and circuit breaking on every outbound call (opens at 5 failures, cools for 60s). A health runner scans active connections every 15 minutes. Notion and Google Drive are live on the new path; adding the next provider is a pull request against <code>registry.ts</code> plus two env vars. Slack and Stripe remain on legacy.</p>",
      "date_published": "2026-03-30T15:00:00Z",
      "tags": ["Infrastructure", "v0.8.6"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.8.6",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.8.4",
      "url": "https://humandeploy.ai/changelog/#v0-8-4",
      "title": "v0.8.4 — Scope generation",
      "summary": "generate-handoff-scope returns a HandoffScope validated against a Zod schema: deliverables, exclusions, timeline, credit cost.",
      "content_html": "<p>Added <code>generate-handoff-scope</code>. A Slack DM from a client is read alongside the workspace brand guardrails and any prior project context, and returns a <code>HandoffScope</code> validated against a Zod schema: deliverables, exclusions, timeline, credit cost. The scope renders back into the thread via Block Kit with Approve and Adjust actions. Approve writes a row into <code>work_requests</code> on the new <code>slack_conversation</code> intake path and moves the handoff to <code>approved</code>. Adjust opens a modal.</p>",
      "date_published": "2026-03-26T14:00:00Z",
      "tags": ["Feature", "v0.8.4"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.8.4",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.8.2",
      "url": "https://humandeploy.ai/changelog/#v0-8-2",
      "title": "v0.8.2 — Message classifier",
      "summary": "classifyAndRoute runs on every inbound Slack message. Confidence above 0.7 routes; below triggers a clarifying question. Under 400ms p95.",
      "content_html": "<p>Every inbound Slack message now runs through <code>classifyAndRoute()</code> before reaching a handler. It reads thread history and the workspace brand profile, then returns one of eight intent types with a confidence score. Confidence above 0.7 routes to the owning handler; below that triggers a clarifying question. Runs under 400ms p95. Model: GPT-4.1-mini, temperature 0.2, structured JSON output.</p>",
      "date_published": "2026-03-15T15:00:00Z",
      "tags": ["Infrastructure", "v0.8.2"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.8.2",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    },
    {
      "id": "humandeploy:changelog:v0.8.0",
      "url": "https://humandeploy.ai/changelog/#v0-8-0",
      "title": "v0.8.0 — Handoffs table",
      "summary": "handoffs table with eight validated states. A Postgres trigger rejects invalid transitions at the database. Requester vs admin transitions split via RLS.",
      "content_html": "<p>Added the <code>handoffs</code> table with eight states: <code>draft</code>, <code>approved</code>, <code>assigned</code>, <code>in_progress</code>, <code>delivered</code>, <code>revision</code>, <code>complete</code>, <code>cancelled</code>, plus <code>paused</code>. A Postgres trigger validates every transition against an allowed-edges map, so an invalid write fails at the database. Requester-allowed transitions are separated from admin-only ones via RLS. Each state writes its own timestamp column. Downstream surfaces read this row as the source of truth: the client's confirmation, the expert kanban, the admin dashboard.</p>",
      "date_published": "2026-03-03T15:00:00Z",
      "tags": ["Infrastructure", "v0.8.0"],
      "authors": [{ "name": "Noor" }],
      "_humandeploy": {
        "version": "0.8.0",
        "state": "shipped",
        "signed_by": { "name": "Noor", "role": "Engineering", "kind": "agent" }
      }
    }
  ]
}
