Picture Frame — a member's own photos and videos, in a frame they build

Featurekamo-internal
Shipped
August 22, 2026 at 10:04 PM UTC
Author
kamo
Commit
e149aef

The first INSTANCED widget. A member hangs as many frames as they like, each with its own contents, its own moulding and its own place in the grid, all from one registry entry. THE MITRE. A frame is ONE moulding profile repeated on four sides and cut at 45° where they meet, which is how a real frame is made and the reason this model has no "top border" or "left border" — there is nothing to keep in step because there is only one thing. A member designs the cross-section, the four sides fall out of it, and every corner is a 45° line BY CONSTRUCTION rather than by a style anyone can get wrong. Each side is a trapezoid clipped out of a full-size box and painted with a gradient running from the outer edge inward; the sloped ends are the mitre, and four of them tile the border with no overlap and no seam. `border-*` colours would have been free and were the wrong tool: they cannot carry a multi-band profile or a texture, and a member who edited one side would have three more to fix. THE PICTURE. Aspect ratio always kept, frame always filled, overflow cropped. Letterboxing inside a moulding looks like a fault in the frame rather than a property of the photo. Instances travel as `widget:picture-frame#<uuid>` through the layout, the pane store and the show/hide preference, so a frame keeps its own size, colour, logo and position and hiding one leaves its siblings alone. The id vocabulary moved into widgetIds — pure and covered, because those strings are persisted in every member's stored arrangement and their shape is load-bearing. An instance defaults to SHOWN: the member made it, and making it is the decision to have it. The editor at **************** puts the frame at hanging size on the left and everything that changes it on the right. The preview is the SAME component the launchpad renders, not a facsimile — a moulding that looks refined at 90px is a slab at 400, and two renderers would drift with the preview being the one that drifted. Saves are debounced and optimistic: designing a frame is a hundred small changes in a minute, so a save button would mean losing the lot to a mis-click. Every colour in a stored design is pattern-checked before it reaches a gradient. These blobs are member-authored data being interpolated into a style attribute, and the check is what keeps a saved frame from being a way to write arbitrary CSS. Media reorders with arrows rather than by dragging: this grid sits inside a page reachable from a launchpad the member already drags panes around on, and a second differently-behaved drag surface is how people move the wrong thing. Arrows also work on a phone and with a keyboard. Uploads go one at a time — firing twenty concurrent multipart requests at one pod is how a member with a holiday folder takes the service down for everyone else on it.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing