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 · Roadmap

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

Opened by Zhu Yue ·

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

Discussion

No comments yet.

Adding to this discussion signs you in on app.motir.co and brings you back to this request.

Add a comment