--- name: Upwork Portfolio Item description: Creates portfolio visuals (cover image + demo screenshot) and copy (title, description, skill tags) for adding a shipped project to the Upwork portfolio. Use when the user wants to add a project to Upwork, needs portfolio images, or asks for portfolio copy. --- # Upwork Portfolio Item Produces everything needed to add one finished project to the Upwork portfolio: a cover image, an optional second "proof it works" image, and the title/description/skill-tag copy. ## Images Two images, different jobs: ### 1. Cover image — square, not a crop of a wide banner Upwork's portfolio grid crops the cover into a near-square thumbnail. **Design it square from the start (1200x1200, then downscale to 800x800 final)** — don't reuse a wide 4:1 README-style banner and let Upwork crop it. A wide banner center-cropped to square loses the icon/logo off the edge and leaves the text floating oddly. Composition that works: dark background with subtle grid + radial glow, icon/logo centered near the top, project name below it (large, bold, monospace), one-line subtitle below that, then a small list of key features/tools at the bottom (muted, small monospace). Everything centered, self-contained — assume it might get cropped from any edge. Final size: **800x800px**. Render larger (1200x1200) for crispness, then `sips --resampleHeightWidth 800 800 file.png` to downscale. ### 2. Demo/proof image (optional but strong) — real data, not fabricated A styled "product shot" showing the thing actually working — a chat/terminal-style card with macOS traffic-light window chrome, showing a real user question, a real tool call, and the **actual real output** (copy it from a real test run in the session, don't make up numbers). This is more convincing than a static logo because it proves the software runs. Size to the content — don't guess a big canvas and leave dead space below. Render once, check the screenshot, adjust the HTML `height` to match actual content height, re-render. ## Rendering method **Use headless Chrome, not `qlmanage`.** `qlmanage -t` (macOS Quick Look thumbnails) gives unreliable, inconsistent scaling/padding for SVG. If no `rsvg-convert`/`inkscape`/`cairosvg` is installed, render via headless Chrome instead: 1. Write the visual as an HTML file with inline `