MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-412

6.12.4 Public read-only project view (overview/README landing + board / work items) — internal fields hidden, no edit affordances

Done
Description

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 publicOverviewMd body via the shipped MarkdownView + a links / at-a-glance sidebar. When publicOverviewMd is empty, fall back to a slim auto-intro (name + stats + CTAs, no body) — NEVER a blank page. publicOverviewMd is served via the public projection (public-safe field).
  • Seed Motir’s OWN overview (canonical copy): the db:seed loader sets the motir project’s publicOverviewMd to 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’s design/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, description from the Overview tagline, canonical, OpenGraph + a generated opengraph-image, Twitter), JSON-LD structured data (SoftwareApplication/CreativeWork for 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 publicOverviewMd MarkdownView body + 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 + shipped components/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 + canBrowse cross-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.css token layers; motir-core/CLAUDE.md § 4-layer + § colour/shape tokens.