Changelog.
Every meaningful change shipped to ScreenStack. We collapse related commits into one entry so this reads like a release log, not a git log.
June 2026
12 changes
- feature
Widget captures · SDKs grab a single component, editor floats it
Both SDKs learned to capture a single widget instead of a whole screen. Flutter: set widgetKey: in screenstack.yml; the runner finds find.byKey(ValueKey(...)), walks to the nearest RenderRepaintBoundary and rasterizes with toImage(pixelRatio). JS: kind: widget on a target uses Playwright element.screenshot({ omitBackground: true }) so the PNG is transparent outside the element. The editor gains a first-class widgetCapture element kind with drop-shadow presets (Subtle / Pop / Bold / None), corner radius, and 3D tilt — so a captured card pops out of the device frame underneath, marketing-screenshot style.
- feature
SEO surface · /for/* landing pages, /screenshot-sizes, /faq, /alternatives/*
Shipped keyword-first titles, SoftwareApplication + FAQPage schema, the /screenshot-sizes 2026 reference, an 11-question /faq with grouped categories, and the first two competitor comparisons (/alternatives/fastlane-snapshot, /alternatives/applaunchpad). robots.txt now explicitly allows GPTBot, ClaudeBot, PerplexityBot, and Applebot-Extended.
- feature
Studio Plus tier · ProPlus entitlements wired through webhooks
New SubscriptionTier.ProPlus that grants 100 AI tokens/month + priority capture queue + custom device profiles on top of Studio. Stripe webhook reads the price ID and routes to the right tier automatically. Marketing CTAs now bounce through /app/upgrade?tier=… for end-to-end checkout.
- feature
Real Stripe prices · screenstack_studio_monthly, screenstack_studio_plus_monthly
/pricing was a fiction — Free + Studio $19/mo + Studio Plus $49/mo, but Stripe only had the $49 lifetime price. Created both monthly prices in Stripe, deactivated the lifetime, plumbed tier-aware checkout through the API. The page and the checkout now match reality.
- feature
Light theme · real CSS-var theming, user toggle in /app/settings
Tailwind colors flow through CSS vars now, so adding html.light flips surfaces/text/borders without a codemod. Brand greens + M3 accents stay accent-y. Pre-paint inline script honors ?theme=light → localStorage → prefers-color-scheme to avoid a flash. /app/settings has a System / Dark / Light segmented toggle that persists per-device.
- feature
Admin endpoint · grant org tiers without raw SQL
New /admin/organizations/{orgId}/tier endpoint (PUT/GET) gated by an env-controlled allowlist (ServiceAuth__AdminUserIds). Mirrors the closed-by-default pattern from CiBearerPolicy. Useful for granting Pro to dogfood orgs or comping accounts without round-tripping through Stripe.
- fix
Export limit · batch-size check + per-export accounting
PublishCanvasExports counted a 10-export publish as 1 unit against the monthly cap — orgs could sail past their limit forever. Now: batch rejects if it would exceed remaining quota, and RecordUsageAsync increments by results.Count instead of 1.
- feature
In-app marketplace · /app/org/{orgId}/marketplace + tier-aware checkout
Marketplace was unreachable from inside /app/*. Sidebar gains a Marketplace item; new /app/.../marketplace and /[slug] routes browse + clone templates without leaving the workspace shell. "Use this template" now actually fires the checkout API — free templates clone straight into the editor, paid templates bounce to Stripe.
- fix
Editor safe-area bands · optional via DeviceFrameSvg props
The dark bands originally added to mask captured nav bars now hide perfectly clean empty space when the SDK + .pt-safe cooperation pushes the captured header below the Island zone. DeviceFrameSvg accepts safeAreaTopPct / BottomPct overrides; HeroShotTile passes 0 for both so phones show full captured content instead of giant dark voids.
- feature
Mobile safe-area + UX/SEO sweep
viewport-fit=cover, .pt-safe / .pb-safe utilities, Apple PWA meta. SiteHeader, ToastHost, Modal reserve space for the notch / home indicator. Plus error boundaries, loading skeletons, aria-current navigation, 44 px touch targets, and an Image-format pipeline that emits .webp siblings for every marketing PNG.
- feature
UI component library · Stripe Connect seller UX + marketplace gallery
Shared ui/* primitives (PageShell, Card, Stat, Badge, EmptyState, ErrorPanel, LoadingState, etc) used by every /app/* page. Stripe Connect onboarding flow for sellers. Public /templates gallery with category filters.
- fix
Dogfood pipeline · pricing → /pricing + frame-based safe-area handling
Marketing PNGs in static/marketing/ were sourced from the wrong page. screenstack.yml now points at the real /pricing URL and the SDK respects the frame's safe-area metadata when padding captures.
Want the next release in your inbox?
Watch VooStack/ScreenStack releases on GitHub. Email digest coming soon.