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-4205Done

Design — the Public page room in project settings: where a project admin edits the tagline, tags and README on app.motir.co (the entrance, the room, its states)

Proposed by motir run MOTIR-4171 on 2026-09-02, where guard #3 (the design-reference rule) fired: MOTIR-4171 builds an application-side authoring surface for a project's public overview, and no asset draws one. The only drawn editor — design/public-projects/public-projects.mock.html panels 1b / 1c / 1d (Story 6.16, in-place editing) — sat on the app-hosted public page that MOTIR-3951 deleted, and Panel 6 of the same asset draws Settings' door to it as a link (/p/<key>?edit=1) that 404s on app.motir.co today. This card draws the surface MOTIR-4171 then builds.

The placement is DECIDED — draw it, do not re-open it

Recorded on MOTIR-4171 (2026-09-02, rungs 1–2): the overview is edited in the application's project settings, as its own room — Settings › Project › Public page at /settings/project/public, scoped to the ACTIVE project like every other settings room, registered as one entry in lib/settings/projectSettingsNav.ts (the registry that drives the rail, the command palette and the totality test), and saving through PATCH /api/projects/{key}/public-overview with that project's key. A project-keyed route outside settings was rejected: no shipped precedent in app/(authed)/, a second navigation model for one screen, and the case the key-routed service was written for ("looking at one project's public page while another is active") no longer arises once the public page hosts no editor.

Before drawing — check reality, then compose from it

  1. RENDER the shipped parents first (design-against-shipped-reality step 0): the project-settings rail in its settings mode, and Settings › Project › Members with the project public (BuildInPublicManageRow + PublicShareSection in app/(authed)/settings/project/members/_components/ProjectMembersSettings.tsx). Compose the entrance panels from the REAL rail and the REAL cards — mirror their markup, never a redrawn stand-in.
  2. Read the live field rules from projectsService.setPublicOverview (lib/services/projectsService.ts ~:929) — the tagline cap, the tag count/length caps, the body cap — and render them as the fields' hints. Do not copy numbers from the 6.16 panels; MOTIR-982 changed one.
  3. Read panels 1c / 1d of design/public-projects/public-projects.mock.html for the editor ELEMENTS already decided (tagline input, removable tag chips + add input, the shipped MarkdownEditor, unsaved-changes tracking) and REUSE them by citation. Do not re-render or amend that asset.

What to draw — a NEW asset set under design/projects/

design/projects/public-page.mock.html + design/projects/public-page.png (same basename) + a new section in design/projects/design-notes.md. A new surface is a new asset: settings-area.mock.html and public-projects.mock.html stay frozen and are cited, never amended in place.

  • Panel A — the entrance, drawn as real affordances (three doors): (1) the new "Public page" row in the project-settings rail, in its shipped position and with the same admin gating the other manage-only rows carry (read the registry's conventions and the 2026-08-08 amendment: no read-only view of an administrative surface); (2) the Members room's Panel-6 "Hero & overview" row, whose "Edit on the public page →" link becomes the door into this room; (3) the "Building in public" row's "View public page" link, retargeted to the public host (https://motir.co/p/<key>, MOTIR-3877) — the /p/<key> path it shows today no longer exists on app.motir.co. Halo each door.
  • Panel B — the room: page header in the settings shell; tagline; tags; README body via MarkdownEditor (write / preview); the shipped settings save pattern (Save / Cancel with unsaved-changes tracking, as 1c decided). Copy in both locales; the product's noun is "work item", never "issue" or "card".
  • Panel C — states: empty (nothing authored yet — say what the public page shows instead); unsaved changes; saving; per-field save error (the three service errors — overview too long, tagline too long, tags invalid — each at its field); saved; project not yet public (the room is reachable — an overview is authored before publishing — with a quiet pointer to the Members room's access control). In the NOTES, not drawn: non-admin (the row and the room are absent, no read-only view) and self-hosted (MOTIR_CLOUD unset ⇒ the capability is absent, MOTIR-3908 — nothing renders).
  • Panel D — from motir.co: a compact three-moment strip: the public page on motir.co shows NO edit affordance (public-surface-hosts.md amendment row 7) → the admin signs in to app.motir.co and picks the project → Settings › Public page. This is the answer MOTIR-4171's criteria ask for ("what a manager arriving from motir.co sees").

Acceptance criteria

  • design/projects/public-page.mock.html and design/projects/public-page.png exist on the branch, and design/projects/design-notes.md gains a section for this room that cites panels 1c / 1d of design/public-projects/public-projects.mock.html for every editor element it reuses and names each one it changes.
  • Panel A draws all three doors as real affordances inside the shipped parents (the rail row, the Members-room "Hero & overview" door, the retargeted "View public page" link) — drawn, not described in prose.
  • Panel B's field hints carry the caps read from projectsService.setPublicOverview, and the notes quote the line they were read from.
  • Panel C draws empty, unsaved-changes, saving, per-field error, saved and not-yet-public; the notes state the non-admin and self-hosted arms as ABSENT and cite the gate for each.
  • The notes name the registry entry to add in lib/settings/projectSettingsNav.ts (key, href, label key, icon, gate) and the two link retargets in ProjectMembersSettings.tsx.
  • No visible string reads "tracker", "issue" or "card" for a work item; both locales' copy is listed in the notes.
  • pnpm vitest run --config vitest.design.config.ts is green on the branch, run after any temporary render harness is deleted.
  • The design result is published onto this card with publish_design_result (mock + image + the notes section) and the returned evidence id is written on the card.
  • GIVES / TAKES: the notes list what this asset hands MOTIR-4171 (the route, the registry entry, the three retargeted or new doors, the i18n keys, the state set) and re-check MOTIR-4171's sizing (5 SP / 90 min) against that list, amending it on the record if the asset outgrew it.

Context refs

  • motir-core/design/public-projects/public-projects.mock.html panels 1b–1d, 6 + design-notes.md § "In-place public-page editing (Story 6.16)" — the editor elements already decided; frozen, cite only
  • motir-core/design/projects/settings-area.mock.html + design-notes.md — the settings area's asset of record and its rail
  • motir-core/lib/settings/projectSettingsNav.ts — the registry the new row is added to, and its gating conventions
  • motir-core/app/(authed)/settings/project/members/_components/ProjectMembersSettings.tsx ~:690–:790 — BuildInPublicManageRow and PublicShareSection, the two shipped parents carrying the dead /p/<key> links
  • motir-core/lib/services/projectsService.ts setPublicOverview — the live field rules
  • motir-core/app/api/projects/[key]/public-overview/route.ts — the door the room saves through, and its header on why it is an application route
  • motir-core/docs/decisions/public-surface-hosts.md — the affordance table (row 7) and §F
  • motir-core/docs/decisions/billing-tiering.md §6 + MOTIR-3908 — the cloud gate the self-hosted arm follows
  • MOTIR-4171 — the card this design unblocks; its "Decision" section is the placement record