Skip to content

moooon

Motir

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.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-4171Blocked

A project's public overview can no longer be edited from any UI — the in-place editor was deleted with the page and AMENDMENT 3 moved editing to the application, where no surface calls the door

Found while drawing MOTIR-4113 and writing its ## ⚠️ Planning flags, 2026-09-02. Out of MOTIR-3877's scope — that story re-hosts the public page; it does not build an authoring screen on app.motir.co.

The gap, in three shipped facts

  1. The editor was deleted. MOTIR-3951 removed app/(public)/p/, and with it overview-actions.ts — the only caller of publicProjectsService.setPublicOverview. The service method and tests/publicProjects/publicOverviewEdit.test.ts were kept.
  2. AMENDMENT 4 row 7 decided the affordance is ABSENT from motir.co — a cross-origin page cannot know who is looking, and a long-form authoring act belongs where the author already signs in. Editing lives in the application.
  3. MOTIR-4114 built the doorPATCH /api/projects/{key}/public-overview, session-read, canManage-gated through the service, cloud-gated, tested. Nothing calls it.

✅ DECISION — recorded 2026-09-02 by the run that stopped on this card

The overview is edited in the application's project settings, as its own room: Settings › Project › Public page at /settings/project/public. Active-project-scoped like every other settings room; one entry in lib/settings/projectSettingsNav.ts; it saves through PATCH /api/projects/{key}/public-overview with the active project's key, so the one service path and the one gate are unchanged. Rung 1: a public portal served from another host (Canny, Productboard, a Notion publish-to-web page) is authored in the admin application's settings. Rung 2: every authoring surface in app/(authed)/ is an active-project settings room, and the settings area already owns the public concerns. Rejected: a project-keyed authoring route outside settings — no shipped precedent, a second navigation model for one screen. What a manager arriving from motir.co sees: no edit affordance; they sign in to app.motir.co, pick the project, open Settings › Public page — the design's Panel D.

⚠️ RE-SCOPED 2026-09-02 — after the design (MOTIR-4205) landed, this card is the ROOM and only the room

The design's GIVES / TAKES sweep found the card outgrown (5 SP / 90 min against a cloudOnly registry flag, a hero-field read no shipped method returns, a tag-chip control, a THIRD /p/<key> retarget with a host accessor, and the zh half of ~34 keys). Split at the architecture:

  • The three Members-room retargets + the public-host accessor + the sweep test → the sibling bug (The Members room's three public-page links still point at the app host). Not this card's any more.
  • The mount — the registry entry with cloudOnly, page.tsx with its guard and off-cloud 404, the widened read → the sibling task (Mount the Public page room). This card is blocked_by it.
  • This card: the room's client island and its save, built to design/projects/public-page.mock.html Panels B and C.

What to build

The island the mount's page.tsx renders, per the notes' The room and States: one SettingsCard (Hero & README, Globe, the View public page link in the head while the project is public); the tagline Input with the cap as helper; the tags group — neutral Pill chips each with a remove button, the two-state Add tag control (rest: secondary sm button; on click: a small inline input, Enter adds, Esc cancels), an n / 8 count, No tags yet; the shipped MarkdownEditor at size="full" (WYSIWYG — no write/preview toggle); the AI-planning footer save bar. One PATCH with all three fields; the success response is the confirmation (no router.refresh()); the three service errors land on their fields (ProjectTaglineTooLongError → the tagline's box error, ProjectTagsInvalidError → the tags' line, ProjectOverviewTooLongError → the editor); any other failure is the toast, edits kept; the unsaved-changes guard from panel 1d. Caps come from lib/publicProjects/limits.ts, never retyped. The not-yet-public band (--el-tint-sky, Info) when accessLevel !== 'public'. The ~30 publicPage.* keys in en and zh from the notes' catalog.

Acceptance criteria

  • A project admin can edit the public overview — tagline, tags and README body — from Settings › Project › Public page, without a database console.
  • The room matches design/projects/public-page.mock.html Panel B, and every state in Panel C (empty, unsaved changes, saving, per-field errors, saved, not yet public) renders as drawn; a component test drives each.
  • The surface reaches publicProjectsService.setPublicOverview through PATCH /api/projects/{key}/public-overview; no second service path, no second gate.
  • The public page's rendered output is asserted to change after an edit — the seam, not just the write: GET /api/public/p/{identifier} returns the new publicOverviewMd / tagline / tags after the room saves.
  • A test drives the partial-author contract: a cleared tagline arrives as null; the three fields save together.
  • The three service errors map to their fields with the notes' copy; a non-service failure shows the toast and keeps the edits.
  • Navigating away with pending edits asks first (Discard unsaved changes? — Keep editing / Discard).
  • Every rendered string comes from the catalog in en and zh; no visible string reads "tracker", "issue" or "card" for a work item.
  • Its own tests ship with it; no full-suite and no --coverage run locally.

Context refs

  • motir-core/design/projects/public-page.mock.html Panels B + C, design/projects/design-notes.md § Public page — the room in project settings — the design of record (evidence cmtksry1v000bhxphj58nzy4x)
  • motir-core/app/api/projects/[key]/public-overview/route.ts — the door; lib/services/publicProjectsService.ts setPublicOverview (:493)
  • motir-core/lib/publicProjects/limits.ts — the caps
  • motir-core/components/ui/MarkdownEditor.tsx · components/settings/SettingsCard.tsx · app/(authed)/settings/project/ai-planning/_components/AiPlanningSettingsEditor.tsx :449 (the footer grammar) · app/(authed)/settings/project/_components/ProjectDetailsCard.tsx (SaveStatus)
  • motir-core/design/public-projects/public-projects.mock.html panels 1c / 1d — the editor elements, cited
  • motir-core/tests/api/public-overview-write-route.test.ts · tests/publicProjects/publicOverviewEdit.test.ts
  • MOTIR-4205 — the design; the sibling task (the mount) and sibling bug (the retargets) proposed on plan cmtkstbl9000vhxphhlymiw9q