MOTIR-412Done
6.12.4 Public read-only project view (overview/README landing + board / work items) — internal fields hidden, no edit affordances
Estimate: 65m · Depends on: 6.12.1, 6.12.3
Build the public read-only project view per the 6.12.1 design, over the 6.12.3 access extension. ANYONE — logged out included — opens a public project and sees the board columns + work item list READ-ONLY, with INTERNAL fields hidden and NO edit affordances. The page is server-rendered (no session gate) so it is fully public + crawlable.
- The public PROJECTION (the load-bearing correctness): the read goes through a dedicated public read shape / DTO (per 6.12.2) that NEVER includes the hidden internal fields — assignees, estimates, internal comments are stripped at the read/service layer, not fetched-then-hidden (so nothing internal crosses the wire). What IS returned: work item key / title / kind / status / description, board columns, ordering — the public-safe fields only.
- The OVERVIEW / README landing (the DEFAULT public tab, per the 6.12.1 Panel 1 design): the read-only nav is Overview / Board / Work items / Roadmap, and Overview is the landing. Render the modern intro — a hero (logo + project name + tagline + at-a-glance stats + CTAs) + the authored
publicOverviewMdbody via the shippedMarkdownView+ a links / at-a-glance sidebar. WhenpublicOverviewMdis empty, fall back to a slim auto-intro (name + stats + CTAs, no body) — NEVER a blank page.publicOverviewMdis served via the public projection (public-safe field). - Seed Motir’s OWN overview (canonical copy): the
db:seedloader sets themotirproject’spublicOverviewMdto the canonical README so the live public tenant renders real copy (not the empty fallback). Motir is framed as THREE LAYERS, end to end — NOT "AI project management" (Yue): (1) an AI planner, (2) an AI-native, MCP-native project manager (motir-core), (3) a hosted AI coding agent; that end-to-end loop is the unique part. The headline idea is "vibe project" (by analogy to vibe coding). The exact Markdown (mirrors the 6.12.1 Panel 1 copy 1:1): tagline "Vibe your whole project. Bring an idea — Motir’s three AI layers plan it, track it, and ship it, end to end. You’re looking at Motir, built in Motir."; PART 1 — the self-improving loop: ## You’re looking at Motir, inside Motir (we build Motir with Motir — every feature here started as a work item on this board and shipped by the same coding agent that turns work items into code) + ## A self-improving loop — and you’re in it (the bugs you report + ideas you upvote land in triage, get planned as work items here, and are picked up by Motir to build the next Motir) + the 4-step loop submit → triage → planned as a work item → the coding agent opens a PR → ships as Done; PART 2 — ## Vibe project: you’ve heard of vibe coding (describe what you want, the AI writes the code) — a vibe project takes that to the WHOLE project: not just the code, but the design, marketing, legal, research — everything it takes to ship. You bring the intent, the three layers carry it idea→shipped: an AI planner (chat → a structured plan: epics, stories, and work items of every kind — design / marketing / legal / engineering — with dependencies), an AI-native project manager (boards / sprints / system of record, MCP-native so your own agents and tools read+write Motir directly), a hosted coding agent (picks up the engineering work items and ships the code, no setup); closing "you stay at the level of intent; Motir plans, tracks, and ships the whole thing — code and everything around it. That’s a vibe project."; then ## Contribute (Submit a request — feeds the loop; the PM core is GPL-3.0 on GitHub). This copy is the design’sdesign/public-projects/Panel 1 text 1:1. - The view UI: render the read-only board + work item list with the "public project" framing (banner: "anyone can view — no account needed; sign in to act") and, for the logged-out state, a Sign-in / Start-free CTA in the top bar (NOT a signed-in identity); NO create / move / assign / status / drag affordances anywhere (the public surface is view-only besides the 6.12.6 upvote/comment + 6.12.5 submit entry points, which show a sign-in-to-act prompt when logged out). Paginated / lazy (the at-scale rule — a public board is an unbounded read surface).
- Gating: the route is NOT session-gated — anyone (logged out, crawlers) can READ; access is granted via 6.12.3’s
canBrowse(true, incl. anonymous, for public); a non-public project a user hits stays 404-not-403. (The 6.12.5/6.12.6 WRITES still require sign-in.) - SEO + GEO (per the 6.12.1 Panel 9 design): the view is server-rendered + crawlable — emit head metadata (
title,descriptionfrom the Overview tagline, canonical, OpenGraph + a generatedopengraph-image, Twitter), JSON-LD structured data (SoftwareApplication/CreativeWorkfor the project), semantic HTML (the Overview<h1>+<h2>sections + each work item an<article>), and include the public project URL in the sitemap. The authored Overview/README is the citable GEO description; add an FAQ block.
Stay 4-layer: the route parses + calls one service method returning the public projection; the projection lives in the service/repository read layer so no future read can leak internal fields.
Acceptance criteria
- An ANONYMOUS (logged-out) visitor opens a public project and lands on the OVERVIEW/README tab (hero + the
publicOverviewMdMarkdownViewbody + links/stats sidebar; empty → the slim auto-intro), and can switch to the read-only board + work item list — all rendering the 6.12.1 design with NO session; a non-public project stays 404. - The page is server-rendered with head metadata + JSON-LD + a single
<h1>(SEO/GEO per Panel 9) and the public project URL is in the sitemap. - The public projection strips assignees, estimates, and internal comments at the read layer (verified: the hidden fields are absent from the response payload, not merely hidden in the DOM).
- NO edit affordances render on the public surface (no create / move / assign / status / drag); the view is paginated / lazy.
- Only
--el-*+[data-display-style]tokens + shippedcomponents/ui/*; matches the 6.12.1 design; 4-layer respected (the projection in the service/repository, no raw Prisma in the route).
Context refs
- 6.12.1 (design asset — required), 6.12.3 (the access extension +
canBrowsecross-org + the projection contract). motir-core/lib/services/workItemsService.ts+ the board / work item read paths — the reads the public projection derives from.motir-core/components/ui/*+app/globals.csstoken layers;motir-core/CLAUDE.md§ 4-layer + § colour/shape tokens.