/* global React, Icon */ const POSTS = [ { id: 'pcf-2026', title: 'How we cut PCF control bundle size by 64%', tag: 'Engineering', date: 'Apr 22, 2026', read: '6 min', excerpt: 'Smart Panel AI used to ship a 412KB bundle. Then we found three things every PCF developer should know about Webpack.', author: 'Shubham Vishwakarma' }, { id: 'azure-openai', title: 'Why we route Azure OpenAI through your tenant, not ours', tag: 'Trust', date: 'Apr 14, 2026', read: '4 min', excerpt: 'It\'s slightly more work for our customers and a lot more peace of mind. Here\'s the architecture, and why we picked it.', author: 'Marcus Tan' }, { id: 'kanban-ga', title: 'Kanban Board hits GA — what\'s new in v1.4', tag: 'Product', date: 'Apr 02, 2026', read: '3 min', excerpt: 'Swimlanes by owner, WIP limits, and a sub-100ms drag handler. Plus three things we deliberately left out.', author: 'Jane Cooper' }, { id: 'mvc-makers', title: 'A field guide for new D365 makers', tag: 'Guide', date: 'Mar 19, 2026', read: '11 min', excerpt: 'If your job description recently grew "and Power Platform" at the end, start here. Eleven things that are non-obvious.', author: 'Shubham Vishwakarma' }, { id: 'gantt-beta', title: 'Gantt Chart enters beta — calling for testers', tag: 'Product', date: 'Mar 04, 2026', read: '2 min', excerpt: 'Drag-resize, weekend-aware dependencies, and a printable view that doesn\'t look like 2008. Sign up to break it.', author: 'Marcus Tan' }, { id: 'video-control', title: 'Embedding training videos directly in D365 forms', tag: 'Product', date: 'Feb 21, 2026', read: '5 min', excerpt: 'New hires close their first ticket 2.4× faster when the training is in the form, not in a separate LMS.', author: 'Jane Cooper' }, ]; const BlogIndexPage = ({ openPost }) => (
Blog

Notes from the toolkit.

Engineering deep-dives, product updates, and field guides from the team building Dynawins.

{/* Featured */} { e.preventDefault(); openPost(POSTS[0].id); }} className="card blog-featured-grid" style={{ display: 'grid', gridTemplateColumns: '1.2fr 1fr', gap: 32, padding: 0, overflow: 'hidden', color: 'inherit', marginBottom: 48 }}>
{POSTS[0].tag}

{POSTS[0].title}

{POSTS[0].excerpt}

{POSTS[0].author} · {POSTS[0].date} · {POSTS[0].read}
Developer working on a laptop with code on screen { e.currentTarget.style.display = 'none'; }} />
{/* Grid */}
{POSTS.slice(1).map((p) => ( { e.preventDefault(); openPost(p.id); }} className="card" style={{ display: 'flex', flexDirection: 'column', gap: 14, color: 'inherit' }}> {p.tag}

{p.title}

{p.excerpt}

{p.date} · {p.read}
))}
); const BlogPostPage = ({ id, back }) => { const post = POSTS.find((p) => p.id === id) || POSTS[0]; return (
{ e.preventDefault(); back(); }} style={{ fontSize: 13, color: 'var(--ink-4)', display: 'inline-flex', alignItems: 'center', gap: 6, marginBottom: 32 }}> Back to blog {post.tag}

{post.title}

{post.author.split(' ').map(n => n[0]).join('')}
{post.author} · {post.date} · {post.read} read

{post.excerpt}

When we shipped Smart Panel AI v1.0, the managed solution clocked in at 412 KB gzipped. That sounds reasonable — until you remember that PCF controls load on every form render, often inside a sub-iframe, and the user is staring at a blank panel until you're done.

1. Stop bundling React.

The PowerApps Component Framework already ships React 16. We were re-bundling 18, all 138 KB of it, for no reason. Marking react and react-dom as externals in webpack.config.js shaved 41% off the bundle in a single commit.

{`module.exports = {
  externals: {
    react: 'React',
    'react-dom': 'ReactDOM'
  }
};`}
            

2. Tree-shake your icon library.

We were importing the entire Lucide library for the four icons we actually use. Switching to per-icon imports + a transformer plugin took us from 38 KB to 1.2 KB of icon code.

3. Lazy-load the AI client.

The Azure OpenAI SDK is heavy and only runs after the user actually asks something. We deferred its import() until the first keystroke in the input box, hiding ~80 KB of cold-load weight behind interaction.

End result: 148 KB gzipped, a 64% drop, and a perceptible reduction in time-to-first-paint inside D365. If you're shipping a PCF control today, do these three things first.

{post.author.split(' ').map(n => n[0]).join('')}
Written by {post.author}
Co-founder, Dynawins. Ships PCF controls so you don't have to.
); }; window.BlogIndexPage = BlogIndexPage; window.BlogPostPage = BlogPostPage;