I designed the login screen as a 390×844 board named "Login – Brew & Co". It sits at x=1200 on Page 1, to the right of the board that was already there, which I left alone. I exported it and checked the image. All elements sit inside the board.
What's on it
- Logo and title: a 72px espresso-brown circle with a "B&" mark. Below it are "Brew & Co" at 36px bold and the subtitle "Sign in to order your coffee" at 16px.
- Form: "Email" and "Password" labels sit above white 52px fields with 12px corners and a 1px border. The placeholders are "[email protected]" and "Enter your password". The password field has a "Show" toggle.
- Forgot password?: an underlined, right-aligned link inside a 44px-tall touch area.
- Sign in: a filled 56px button in dark brown with white 18px bold text. It's the strongest element on the screen.
- Create account: an outlined 56px secondary button, set off by an "or" divider.
Design choices
- Colour: the palette is a cream background (#FAF6F1), espresso brown (#3E2723) and a caramel link colour (#8A4B1F). I estimated the contrast rather than measuring it. I expect the text to clear 4.5:1 and the field borders to clear 3:1.
- Spacing: the layout uses a 24px side margin and mostly 8px-grid spacing.
- Touch targets: the buttons are 56px tall and the fields 52px, which is above the 44px minimum.
Problems I noticed
- Layer order: my first render hid the text behind the rectangles.
insertChildat the end of the children list put new shapes at the bottom of the stack. I fixed it by sending the rectangles to the back, and the second export is correct. An earlier attempt had also failed on a bad property name (textAligninstead ofalign), so I deleted that partial board before rebuilding. - Not interactive or reusable: this is a static layout with no flex layout, components or prototype links. The "Show" toggle and the "Forgot password?" touch area are not wired to anything.
- Missing states: there are no focus, error, filled or loading states. The password field also shows a placeholder, not masked dots.
- Placeholder contrast: the placeholder text (#6F5F57) is only just above the 4.5:1 threshold.
- Logo: the mark is a simple "B&" in a circle, not a real brand asset.
- Layout: there are no status-bar or safe-area elements, and the bottom ~120px of the screen is empty. A "Continue as guest" or terms line could fill it, or the content could shift down a little.
- Fonts: I used Penpot's default font and didn't pick a typeface.
How this was tried: I cloned and started penpot-mcp on the local machine (with ports 4402 and 4403 bound to localhost only), and the reviewer loaded its plugin into a Penpot cloud file. During the run only this skill and Penpot's MCP tools were allowed. The model created a new board in an empty file. I compared the canvas screenshot with the model's description and they match, and I recomputed the contrast ratios myself. The weaknesses the model lists itself (no components, states or interactions) are real.
하는 일
penpot-mcp 서버로 Penpot에서 UI/UX 디자인을 만들도록 모델을 안내합니다. 기존 디자인 시스템이 있는지 먼저 확인하고, 파일 구조를 살피고, 보드·도형·텍스트를 만들고, 플렉스 레이아웃을 적용하고, 새 화면을 겹치지 않게 배치하고, 도형을 내보내 결과를 검증합니다. 기본 간격·타이포그래피·색상 토큰(디자인 시스템이 없을 때만 사용), 자주 쓰는 모바일·데스크톱 레이아웃, 컴포넌트 체크리스트, 접근성 빠른 점검(명도 대비 4.5:1, 터치 영역 44px), Penpot API 주의점이 들어 있습니다. 참고 문서 4개는 컴포넌트, 접근성, 플랫폼 지침, MCP 설치를 다룹니다.
동작 방식
- 모델이 먼저 Penpot MCP 도구를 호출해 보고, 연결되지 않았으면 설치를 설명하기 전에 사용자에게 묻습니다.
- Penpot 플러그인 API로 파일을 읽고 보드와 요소를 만들거나 수정합니다.
- 도형을 내보내 디자인을 확인하며, 선택 영역에서 CSS를 추출할 수도 있습니다.
이런 때 좋습니다
Penpot에서 화면과 디자인 시스템을 설계하거나, 접근성 규칙에 맞춰 디자인을 검토할 때.
중간 위험:Penpot MCP 서버를 통해 열려 있는 Penpot 파일 안에서 JavaScript를 실행하므로 해당 파일의 도형을 만들거나 바꾸거나 지울 수 있습니다. 먼저 파일을 복제하거나 사본에서 작업하세요. 설치에는 서드파티 코드 도입(GitHub에서 `penpot-mcp` 복제, `npm install`, `npm run bootstrap`, Node 22 이상, 로컬 포트 4400~4402)과 localhost에서 플러그인을 불러오는 과정이 필요하니 실행 전에 해당 저장소를 검토하세요. 시험 실행함: penpot-mcp를 로컬에 설치해 Penpot 클라우드 파일에 연결했고, 모델이 이 Skill로 로그인 화면을 만들었습니다. 캔버스에서 설명과 일치함을 확인했고 대비 수치도 다시 계산했습니다. 주의: 코드를 읽어 보니 기본값으로 4402·4403 포트가 로컬 네트워크 전체에 열려 다른 사람이 접속해 코드를 실행할 수 있습니다. 시험에서는 내 기기로만 제한했으니 설치할 때도 똑같이 제한하세요. 이미지 내보내기·가져오기 도구는 지정된 임의의 절대 경로를 읽고 씁니다. 모델이 밝힌 문제: 컴포넌트·상태·상호작용이 없고, 처음에는 레이어 순서가 틀렸습니다.