- Add schema-driven S3 preferences and status-only credential controls to unified Settings
- Keep storage preferences persistent while secrets remain in the selected credential backend
- Include storage credentials when browser persistence changes and test session behavior
Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
- Recover the IndexedDB and in-memory document cache behind the storage domain
- Add persistent outbox supersession, cache eviction, import validation, and naming helpers
- Keep the substrate provider-neutral and cover its pure behavior
Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
- Define backend-neutral document storage and provider schema contracts
- Keep provider preferences separate from credential references
- Resolve declared secrets lazily through the shared credential service
- Open one Settings dialog for AI providers, agents, and media credentials
- Resolve secrets only when requests start and keep settings on status-only credential APIs
- Make browser persistence explicit and default fresh web sessions to memory
- Move provider controls into the settings domain and cover setup, reload, and clearing
- Move provider-specific model construction behind typed adapters
- Keep OpenAI- and Anthropic-compatible configuration reusable
- Verify every direct provider is registered while ACP agents stay separate
- Store desktop secrets in native OS credential services through a narrow Tauri bridge
- Provide session-only and encrypted remembered browser stores with explicit switching
- Migrate legacy plaintext keys only after verified writes and cover failure recovery
- Build typed Reka-based dialog and alert-dialog anatomy with shared theme slots
- Migrate variables, asset details, and ACP permissions to the common shell
- Add Storybook coverage for reusable dialog states
- Add a headless PropertyGrid primitive with themed app composition
- Keep composite paint details full-width and show remove actions consistently
- Tighten color picker and Design-panel field sizing without clipping values
- Let nested actions claim tooltip ownership from parent controls
- Keep only one tooltip visible across pointer and keyboard focus
- Cover composite property fields and preserve WebKit behavior
- Route npm-installed ACP and MCP launchers through cmd on Windows
- Preserve inherited agent environment and current MCP transport settings
- Cover Windows process resolution and document the user-facing fix
Co-authored-by: Damián Briones <insertnickname1@gmail.com>
- Match documents by desktop path or File System Access handle
- Share concurrent duplicate loads while allowing unrelated files to load in parallel
- Publish source identity only after successful opens and saves
Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
Enable CanvasKit half-leading for solid and gradient paragraph rendering while preserving the existing font fallback system.\n\nCo-authored-by: jongwong <jongwong@aliyun.com>
- Resolve MCP workspace subpaths during Vite development
- Remove discovery state before shutdown and close upgraded sockets
- Cover discovery cleanup with a connected WebSocket client
Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
- Prefer private Unix sockets with TCP fallback for local MCP clients
- Unify HTTP and WebSocket lifecycle, authentication, and cleanup
- Discover transport details from an owner-only runtime file
Roll back the Pulse music-app demo to the prior standalone showcase
(Components / App Preview / Effects) which cleanly demonstrates gradients,
drop/inner shadows, blend modes, masks, and corner smoothing. Also removed the
Pulse JSX showcase file and restored the matching demo test.
<svg> icons always rendered at the 24px default because the size fell back
to 24 even when w/h were given. Prefer explicit w/h over the default so icon
content scales to fit its frame.
- Populate requested pages for scoped reads and all pages for document-wide operations
- Export whole FIG documents by default while keeping explicit page exports partial
Fill the three biggest gaps that blocked authoring real designs in JSX:
- mask prop on any node: <Ellipse mask> / mask="luminance" / mask="vector"
sets isMask + maskType so sibling content clips (Figma's mask model)
- <svg> element rendering inline SVG markup into vector nodes, reusing the
iconify path pipeline (extractPaths + parseSVGPath + scalePathInfos)
- Instance overrides: <Instance of="X" overrides={{ 'childName:prop': v }} />
applies child overrides by name and records them so component sync keeps them
Adds gap tests and the shared scalePathInfos/finishIconRender helpers to
avoid duplicating the iconify pipeline.
Rebuild the demo as a cohesive product showcase:
- Component Library: Button/Badge/Avatar/Nav/Toggle as real components
- App — Analytics: a modern dashboard assembled from instances with real
auto-layout and semantic variables, teaching the OpenPencil workflow
- Correct stat badge tones and component captions
Apply success/accent/danger tones to the stat badges after layout with the
label fill recorded as an override, so component sync preserves them.
Badges now read +14% green, +8% blue, -3% red.
- Remap descendant clone sources when instance branches are repopulated
- Keep same-name component-property siblings distinct
- Name swapped variants after their component sets
Replace the grab-bag demo (3 disconnected feature boxes) with a real product
screen that teaches the OpenPencil workflow by example:
- Component Library: Button (primary/secondary), Badge, Avatar, Nav item,
Toggle as actual COMPONENTs
- App — Analytics: a modern dashboard assembled from INSTANCEs of those
components, laid out with real auto-layout (sidebar, stat row, chart,
callout), themed via bound semantic variables
- Single restrained palette (one accent + surfaces/text/semantic tones)
- Instance text set with recorded overrides so component sync keeps labels
Editing a variable re-themes the screen; resizing frames demonstrates live
auto-layout reflow.
- Reuse imported collection, mode, and variable GUIDs when safe
- Keep raw paint asset refs instead of promoting incomplete library bindings
- Retain GUID conversion only for effect aliases required by Kiwi
- Import and round-trip per-node variable mode overrides
- Resolve fill and stroke aliases through the nearest mode scope
- Preserve mode maps across cloning and instance synchronization
- Section titles are no longer collapsible triggers — they render as static
text like Figma, so clicking a section header no longer collapses it
- Drop the 'Font features' group title; ligature/kerning toggles sit
directly in the Typography flow
- Update panel specs and snapshots for always-expanded sections