Skip to content

docs site: objectstack.ai becomes the developer site — one-line positioning instead of the duplicated product hero, a "Run it: ObjectOS Community / Cloud / Enterprise" strip, blog posts redirect to www.objectos.ai (maintainer ruling 2026-10-26) #26140

Closed

Description

@objectstack-fleet

Filing gate ③: a maintainer-directed task. Maintainer (Sam, os-zhuang), 2026-10-26: chose 「模型 2:ObjectOS 三版本」 (13:18Z) — ObjectOS is one product in three editions (Community / Cloud / Enterprise), ObjectStack the protocol and SDK; asked 「objectstack.ai 官网和 www.objectos.ai 官网不是很奇怪,区别是什么」 (13:19Z); on the answer (product site vs developer site, one blog, cross-linked navigation) wrote 「同意」 and 「立卡派发」 (13:24Z). Business reason: objectstack.ai and www.objectos.ai open with the same hero and both sell; the developer who lands here needs docs and a start command, the buyer needs the other site. Reader: the devx seat dispatches one dev; file surface apps/docs/app/[lang]/page.tsx (the landing), the docs layout's header / footer navigation, apps/docs/app/[lang]/blog/** and the site's redirects. Dedupe: issue search "docs site homepage hero objectstack.ai landing developer portal" → 5 hits, none open on this: #17351 (closed: count claims dropped from the homepage), #12239 (closed: homepage), #22240 (closed: compare / when-to-use pages — stay, they are developer content). Session session_01FMuBZmssbfQkVrKRtxNvng; siblings: objectstack-ai/www.objectos.ai (the product-site half, filed today), objectstack-ai/docs.objectos.ai#338 (edition model), #26136 (hosted-product name), #26129 (root README).

Roles, as agreed

www.objectos.ai is the product site (hero, editions, pricing, Build & Ask, blog); objectstack.ai is the developer site (protocol, SDK, CLI, docs, "Build with Claude Code"). Precedent: frappeframework.com beside frappe.io.

Scope

  1. Landing (apps/docs/app/[lang]/page.tsx): the hero becomes one line of positioning — "ObjectStack is the open protocol and SDK that ObjectOS is built on: one typed business ontology, and the database, API, Console and MCP tools derive from it." — followed by the start command (npm create objectstack@latest), the docs entry points (Getting started · Concepts · Spec · CLI · Build with Claude Code) and the GitHub link. The current sections "The idea / The loop / The gates / The vocabulary" either shrink to a four-link row into the docs pages that carry them, or move into a docs page; the dev proposes which in the PR.
  2. "Run it" strip: three editions in one row — ObjectOS Community (this repository's runtime image, self-hosted, free), ObjectOS Cloud, ObjectOS Enterprise — linking www.objectos.ai; replaces the footer sentence "Rather build & ask online? Try ObjectOS".
  3. Navigation: header gets "Product → objectos.ai"; the footer labels the two sites by role.
  4. Blog: www.objectos.ai becomes the one blog. Posts under apps/docs/app/[lang]/blog/** (at least "the-ontology-is-the-software") get permanent redirects to their imported counterparts once the www card lands (Blocked-by-style sequencing inside the card: the redirect commit waits for the www PR; the rest does not). Until then the posts stay served.
  5. Not in this card: the docs content itself, the README (docs(readme): slim the root README to a reader's page — contributor detail moves to CONTRIBUTING.md, the stale Console-source and ROADMAP lines go, one architecture figure, LICENSING.md names ui/ as MIT #26129), positioning copy (unchanged: the slogan and the four-verb line live on in the product site and the README).

Premises (re-check before dispatch)

  • P1 — grep -c "ontology is the software" apps/docs/app/[lang]/page.tsx ≥ 1.
  • P2 — ls apps/docs/app/[lang]/blog lists the posts to redirect; curl -s https://objectstack.ai/blog/the-ontology-is-the-software -o /dev/null -w '%{http_code}' → 200.
  • P3 — the header component has no link to objectos.ai besides the footer sentence (grep objectos.ai under apps/docs).

Acceptance

  • pnpm docs:build green; the landing renders the one-line positioning, the start command, the docs entry points and the "Run it" strip; Lighthouse / link check unchanged.
  • No changeset (docs site only).

维护者速读

按你 13:24 的「同意」「立卡派发」:objectstack.ai 改成开发者站。首页不再是和 objectos.ai 相同的营销 hero,而是一行定位 + 开始命令 + 文档入口;加一条「运行它:ObjectOS Community / Cloud / Enterprise」指向 objectos.ai;博客文章在 www 那边导入后做跳转。文档内容本身不动。

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Filing audit · 2026-10-26T13:35Z · session_01FMuBZmssbfQkVrKRtxNvng · ⛔ not a claim, not a dispatch.

    Triage: lands in apps/docs/** (the objectstack.ai site → domain:devx, area:devpath); rationale: filing gate ③, the maintainer's 「同意」 / 「立卡派发」 of 2026-10-26 13:24Z on the product-site / developer-site split quoted in the body; priority:p2 as a maintainer-directed task. Labels at filing are the filer's suggestion; the triage seat grades. The product-site half is objectstack-ai/www.objectos.ai#286; scope item 4 (blog redirects) waits for #286's import, items 1–3 do not. Siblings: objectstack-ai/docs.objectos.ai#338 (edition model), #26136 (hosted-product name + Powered-by mark), #26129 (root README).


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-26T13:57Z
    Session: session_01FMuBZmssbfQkVrKRtxNvng (project thread; maintainer-directed — Sam, 2026-10-26 13:38Z, verbatim 「相关卡片都归你派发处理落地」)
    Account: os-zhuang
    Branch: claude/issue-26140-objectstack-ai-developer-site
    Worktree: objectstack-issue-26140
    Domain: domain:devx
    Seat: maintainer-directed (no lane seat post; seat identity recorded on objectstack#24145)
    File surface: apps/docs/app/[lang]/page.tsx, apps/docs/lib/layout.shared.tsx, apps/docs/lib/site.ts, apps/docs/next.config.* (redirects), apps/docs/messages/** or the i18n file the landing copy lives in, content/blog/*.mdx (the four posts: redirect targets, removal only after the product site serves them) — stop on breach; explain in the report
    Container & model: M, mode:subagent (deviation: os-dev agent type not loaded in this project thread; general-purpose subagent under .claude/agents/os-dev.md verbatim, same session ID, identity by branch), model: default tier (TIER_DEFAULT — dispatch-gates --tier --repo objectstack-ai/objectstack apps/docs/… content/blog/… at d1ea2363: "no path-derived mandate"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6417345842
    Premise: holds (re-read on origin/main d1ea236: apps/docs/app/[lang]/page.tsx carries HOME_TITLE = 'The ontology is the software' and the hero prose, 3 hits; apps/docs/lib/layout.shared.tsx:16 ESSAY_URL = '/blog/the-ontology-is-the-software'; content/blog/ holds 4 posts — context-window-is-the-constraint, metadata-driven-architecture, protocol-first-development, the-ontology-is-the-software; the live sites are unreachable from this container, so the reading is source-level)
    Serial constraints cleared: www.objectos.ai#286 (this session, dispatched in the same round) imports the four posts under their original slugs — the redirects in this card land only after that PR merges (landing order enforced by the seat, not the dev); no open objectstack PR touches apps/docs/** or content/blog/** (36 open PRs read 2026-10-26 13:45Z); PR #26148 (README) is disjoint


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26140,
      "status": "done",
      "branch": "claude/issue-26140-objectstack-ai-developer-site",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26165",
      "session": "session_01FMuBZmssbfQkVrKRtxNvng",
      "premise_still_valid": true,
      "summary": "Premises re-read on origin/main a335f1de (P1: 'ontology is the software' in page.tsx, 3 hits; P2: content/blog holds the four posts and app/[lang]/blog/[[...slug]] renders them, live site unreachable so source-level; P3: the only objectos.ai link under apps/docs was the closing 'Try ObjectOS' sentence). The landing (apps/docs/app/[lang]/page.tsx) now renders the slogan as a kicker, the one positioning line as the heading/title/description/OG/JSON-LD, the start command block (npm create objectstack@latest my-app / cd my-app / npx os dev --ui), five docs entry points (Getting started, Concepts, Spec, CLI, Build with Claude Code), the GitHub link, a four-link row (idea -> /docs/concepts/ontology, loop -> /docs/getting-started/build-with-claude-code, gates -> /docs/getting-started/how-ai-development-works, vocabulary -> /docs/capabilities; all four pages exist, none kept in compact form), the 'Run it' strip (ObjectOS Community -> /docs/deployment/self-hosting; Cloud and Enterprise -> https://www.objectos.ai) and a footer line labelling both sites by role. Header gains 'Product' (external, PRODUCT_SITE_URL); the product-site origin is declared once in redirects.mjs and re-exported. Second commit fb85c546 adds blogRedirects: /blog and /en/blog -> https://www.objectos.ai/en/blog/, each of the four posts at /blog/SLUG and /en/blog/SLUG -> https://www.objectos.ai/en/blog/SLUG/ (308); mdx sources and the blog route stay. The orphaned apps/docs/components/youtube-embed.tsx was removed. Draft PR #26165 opened with assignee os-zhuang and label skip-changeset; its body states the dependency on www.objectos.ai#286 and that the seat sequences the landing.",
      "tests": "Head fb85c546 for every reading. (1) closure build under the lock: `pnpm --filter '@objectstack/docs^...' build` -> `VERDICT command-exit 0 · held the lock 111s`. (2) `pnpm --filter @objectstack/docs typecheck` (fumadocs-mdx && next typegen && tsc --noEmit) under the lock -> `✓ Types generated successfully`, `VERDICT command-exit 0 · held the lock 9s · waited 121s` (first attempt: `VERDICT queue-timeout (exit 99) · never acquired · waited 540s`, holder pid 7892 = the sibling's cli/console closure build; NOT MEASURED on that attempt, resumed under the same slot). (3) `pnpm --filter @objectstack/docs build` (= pnpm docs:build) under the lock -> `✓ Compiled successfully in 3.8min`, `✓ Generating static pages using 2 workers (1287/1287) in 68s`, `VERDICT command-exit 0 · held the lock 435s`; git status clean afterwards. (4) built app via `next start` on port 20378, curl `%{http_code} %{redirect_url}`: /blog -> 308 https://www.objectos.ai/en/blog/; /blog/the-ontology-is-the-software -> 308 https://www.objectos.ai/en/blog/the-ontology-is-the-software/; /en/blog/the-ontology-is-the-software -> same 308 (no proxy 307 hop); the other three posts and /en/blog -> 308 to their counterparts; /blog/not-a-post -> 404; /docs/guides/cheatsheets/quick-reference -> 308 /docs/getting-started/quick-reference (pre-existing). .next/routes-manifest.json: 10 redirects with destination on objectos.ai. Served `/` (50396 bytes): grep -c positioning sentence 10, `npm create objectstack@latest my-app` 3, `npx os dev --ui` 3, `ObjectOS Community`/`Cloud`/`Enterprise` 3 each, `Run it` 2, `Developer docs & protocol` 1, `Product, editions & blog` 1, the Product nav entry text 1, document title `The open protocol and SDK ObjectOS is built on | ObjectStack`. Server stopped by PID (21634, cwd apps/docs); port probe afterwards 000. (5) `npx eslint --no-inline-config` on page.tsx, layout.shared.tsx, redirects.mjs -> exit 0. No unit test suite exists for apps/docs (no `test` script); no behaviour pinned by a test changed, so no ablation.",
      "gates": "Derived: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at fb85c546 -> 31 commands; each run via eval with `status=$?` captured before any pipe into ran.list -> all 31 `exit 0` (check-closing-keyword-parity, check-comment-mask-corpus, check-doc-frontmatter, check-docs-nav-label, check-keyed-text-bounds, check-position-name-fold-loaders, check-registry-log-declared, check-rest-log-spy-declared, check-undeclared-dep-imports each with --self-test; pnpm check:docs-locale-catch-all, check:docs-redirects (`98 entries -- 95 page destination(s) resolved ... 0 outside the /docs route space`), check:driver-memory-census, check:gitlink-declared, check:logger-receiver-detach, check:nul-bytes, check:org-identifier, check:page-declaration-shape, check:published-files, check:published-readme-links (`29 docs-site page(s) resolved (0 via redirect)`), check:refd-timer-probe, check:test-source-alias, check:tier-file-adoption, check:watch-hint-literal). `--ran` reconciliation: `31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN` (exit 0). CI on PR #26165 at report time (check-runs on fb85c546): success — Check Changeset, filter, Part-of PR must not also close its card, No other open PR may claim the same issue, The card this PR closes must claim this branch; in_progress — Build Docs, Test Core, Dogfood Regression Gate, Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI release & engine gates, Lint · PM dispatch-gates, Lint · scoped (3), Type Check · workspace / source gates / consumer gates / debt ledger, Governed Surface Queue Guard, Check PR Size, Check Documentation Links, No other open PR may claim the same single-writer path; skipped — Build Core, Test Core shards, UI lanes, Temporal Conformance, Dogfood Verify CLI (path filters). Not re-run locally: repo-wide `pnpm lint`, Test Core, Build Core, lychee link check, the Build Docs CI job. Local-only families (check:dev-prereqs, check:skill-frame-freshness) not derived and not run: packages/spec build touched only as the docs closure, no four-axis file touched.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub calls; all GitHub reads via curl to api.github.com, all writes via scripts/pm/",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create -> PR #26165, run 40340657259 success, read-back identical 9161/9161 bytes); POST /repos/objectstack-ai/objectstack/issues/26140/comments (this os-dev-report via post-stamped). git push x2 landed (probe + commits; a third attempt was refused locally by the pre-push hook before reaching the remote).",
      "deviations": [
        "Commit trailers: common.md and the harness reminder prescribe a co-author trailer that names the model; os-dev.md (『trailer pair 一律 model-free』) and the pre-push hook `check:commit-card-trailers` require the model-free pair. os-dev.md wins: both commits were reworded to the model-free `Co-authored-by: Claude` + noreply address pair plus the Claude-Session trailer before their first successful push (the refused push never reached the remote; no history rewrite).",
        "PR-body footer: common.md gives the bare `claude.ai/code` form for both surfaces; os-dev.md and AGENTS.md give the session-URL form for PR bodies. os-dev.md wins: the PR body carries `_Generated by [Claude Code](https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng)_`; the comment carries the bare form.",
        "File surface extended by one deletion: apps/docs/components/youtube-embed.tsx (not on the claim's list) — its only consumer was the hero this card retires, so leaving it would land dead code; declared in the PR body.",
        "Verify lock: the first typecheck attempt timed out in the queue (exit 99, waited 540s; holder pid 7892 = the sibling's `turbo run build --filter=@objectstack/cli^... --filter=@object-ui/console^...`); read as NOT MEASURED, resumed under OS_VERIFY_LOCK_SLOT=issue-26140 and measured on the second attempt.",
        "Preview-server teardown: killing the recorded `npx next start` pid left its `next-server` child alive; the child was identified by cwd under /proc (pid 21634, cwd apps/docs of this worktree) and stopped by that PID — no name-based kill; port confirmed closed.",
        "Live sites unreachable from the container: P2's `curl https://objectstack.ai/blog/... -> 200` could not be measured; the blog route and the four sources were verified at source level and in the built app instead."
      ],
      "open_questions": [
        {
          "question": "Should the header keep `Why` (-> /blog/the-ontology-is-the-software) and `Blog` (-> /blog) once both resolve off-site through the new redirects?",
          "options": [
            "A keep both as site-relative links through the redirect until the blog-removal follow-up (as landed in this PR)",
            "B drop `Blog` now and re-point `Why` to the product-site URL directly in this PR"
          ],
          "recommendation": "A, because (实际业务需求) the essay is still the developer's 'why' and the redirect is the measured mechanism that keeps every existing link alive; (长远合理性) the follow-up that deletes the route and sources is the natural place to re-point the nav in one move; (防 AI 犯错) one relative URL constant (ESSAY_URL) with one redirect owner beats two spellings of the destination living in two repos; (创业阶段不扩散) B widens this card into nav redesign the ruling did not ask for."
        }
      ],
      "out_of_scope_findings": [
        "class: none (observation, no card) · reach: n/a · app/sitemap.ts keeps listing /blog and the four posts (derived from the blog loader) — after this PR lands those entries answer 308 to another host; they vanish with the blog-removal follow-up (route + content/blog). carrier: the blog-removal follow-up PR (no card yet; noted in Acceptance notes) · dedupe: sitemap blog redirect objectos follow-up",
        "class: none (dead entry, no card) · reach: n/a · apps/docs/app/[lang]/layout.tsx LANGUAGE_NAMES carries `cn: '中文'` while lib/i18n.ts declares only `en` — unreachable by construction. carrier: none · noted in Acceptance notes only",
        "class: none (follow-up, no card) · the blog-removal follow-up after redirects are measured on production: delete app/[lang]/blog/**, content/blog/*.mdx, the blog loader in lib/source.ts, the sitemap entries, and re-point/drop the `Why`/`Blog` nav entries; check-doc-frontmatter's content/blog high-water mark will need its ledger moved in that PR. carrier: the devx seat · dedupe: blog removal content/blog route sitemap frontmatter high-water"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · 2026-10-27T01:04Z · session_01FMuBZmssbfQkVrKRtxNvng

    Reading Value
    PR #26165 merged: true, merged_at 2026-10-27T01:03:00Z by the merge queue, head fb85c546 (unchanged since the ACCEPT, 6418892176), squash 61c07986. Flipped ready + auto-merge at 2026-10-27T00:48Z (relay fw-20261027T004811Z), added_to_merge_queue at 2026-10-27T00:47:59Z, one queue round, no dequeue. Held until www.objectos.ai#288 merged at 2026-10-27T00:44:05Z, per the ACCEPT's clause 6, so no redirect answers into a 404.
    origin/main 61c07986 "docs(site): objectstack.ai becomes the developer site … (#26165)". On that tree: apps/docs/redirects.mjs exports PRODUCT_SITE_ORIGIN and blogRedirects (/blog and the four moved slugs under both path prefixes → https://www.objectos.ai/en/blog/…/); apps/docs/lib/layout.shared.tsx reads PRODUCT_SITE_URL (2 uses: nav Product entry + export); apps/docs/app/[lang]/page.tsx names ObjectOS Community / Cloud / Enterprise in the "Run it" strip and carries npm create objectstack@latest; apps/docs/components/youtube-embed.tsx is gone.
    Redirect targets content/blog/<slug>/index.mdx for all four slugs is on www.objectos.ai main (657a634d, #288's merge).
    closed_by_pull_requests this card only (Fixes #26140); #26129 (devx seat 2's README card) untouched.

    Status: card closed by Fixes on merge; pm:dispatched removed in this stroke; domain:devx / area:devpath / priority:p2 stay. Delivered: the developer-site landing (one-line positioning, start command, five docs entry points, four-link row, "Run it" strip, two-site footer), the Product nav entry, and the permanent blog redirects to the product site. Remainder and owner: deleting the blog route and sources here (app/[lang]/blog/**, content/blog/*.mdx, the blog loader and its sitemap entries, re-pointing Why) is a devx follow-up card, filed by this seat once the redirects are measured on production; until then the sources stay and the sitemap lists redirecting URLs, as the PR's Acceptance notes record.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:devxpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions