469d782b4f
Deploy / deploy (push) Successful in 6m27s
A grid of twenty projects was twenty near-identical blocks of text. The cards now lead with a still, with the code, client and title set over it. There is no poster column on Project and adding one would mean somebody maintaining it, so the image is chosen from the shots the project already has: a key shot with a still first, then the most recently touched shot with one. Within each, thumbnailUrl beats generatedThumbnailUrl - the same precedence the rest of the app displays shots by, since the reference frame from the brief is a deliberate choice and a promoted render frame is whatever the pipeline landed on. The pick is deterministic rather than random: a card whose image changes between two loads reads as a glitch, and the eye stops using the image to find the project. One DISTINCT ON query covers every project on the page, instead of a query each or dragging back every shot that has a still. Equal heights come from three things: auto-rows-fr on the grid, h-full on the card, and fixed room for the description, which was the only part that varied. A project with no stills gets a placeholder of the same footprint rather than a hole in the row. The whole card is now the link, so the Open button is gone. Also fixes a latent bug: the card read project.deadline, but the column is dueDate, so the due date never rendered. Both are accepted now. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>