In February 2025, Microsoft made code apps generally available in Power Apps — a new model that lets professional developers build production web applications using standard tools (TypeScript, React, VS Code) while keeping them fully inside the Power Platform ecosystem. This article summarises what is now possible, with a focus on teams of users collaborating through responsive, modern interfaces backed by real business logic.
Power Apps has always offered two flavours: canvas apps (drag-and-drop, formula-driven) and model-driven apps (data-first, Dataverse-native). Code apps are a third, complementary model aimed at professional developers who need:
The feature reached General Availability on 5 February 2025, signalling Microsoft's commitment to it as a supported, production-ready path rather than a preview experiment.
A common real-world scenario: dozens of business users across different roles need to view, create, update, and delete records — think order management, equipment inspection logs, project tracking, or HR workflows. Code apps address this in several ways.
Code apps connect to Microsoft Dataverse (the relational database built into Power Platform) through the standard connector. Dataverse provides:
Beyond Dataverse, code apps can call any of the 1,400+ Power Platform connectors directly from TypeScript. This means a single app can read from SharePoint lists, write to SQL Server, trigger Power Automate flows, or query an external REST API — all with the same OAuth-managed credential model that Power Apps already uses, so users never handle raw secrets.
Because the developer controls all data-fetching code, it is straightforward to implement patterns that would be hard or impossible in canvas apps: lazy loading, pagination, delta syncs, and column-selective queries that fetch only the fields the current view actually needs. This keeps the application fast even when the underlying tables hold millions of rows.
Power Apps code apps inherit the full capability of the modern web. There is no proprietary component model to work around.
The starter template ships with React + TypeScript + Vite, but any framework (Vue, Svelte, SolidJS) or no framework at all is valid. This means developers can adopt whichever component library their team already knows: Fluent UI, Chakra UI, Ant Design, Tailwind CSS, and so on.
Microsoft's own guidance points to Fluent UI React v9 as the natural choice for apps that should look and feel like the rest of Microsoft 365. Fluent UI provides accessible, production-quality controls including data grids with sorting and filtering, date pickers, comboboxes, tab lists, progress indicators, dialogs, and side panels — all responsive and keyboard-navigable by default.
Because the developer writes CSS directly (or uses a utility framework), responsive breakpoints are no different from any other web project. A code app can display a full master-detail grid on a desktop and collapse to a single-column list on a mobile browser without special canvas-app workarounds.
The local dev server uses Hot Module Replacement (HMR): saving a file updates the running app in the browser instantly, without a full reload and without losing the current form state. This dramatically shortens the feedback loop when fine-tuning layout and interaction behaviour.
This is where code apps most clearly surpass canvas apps for complex scenarios.
Any logic that belongs in the presentation layer — field validation, computed values, conditional formatting, multi-step wizards, dependent dropdowns — is written in plain TypeScript. It is testable with standard unit-test tooling (Vitest, Jest) and can be shared across components with normal module imports.
For logic that must run on the server regardless of which client triggers it (data integrity rules, cross-table aggregations, integration events), Dataverse supports:
Because the developer controls the full fetch/mutate cycle, it is practical to implement optimistic updates (show the UI change immediately, reconcile with the server in the background) and even offline queuing, patterns that improve perceived performance for users on slow or intermittent connections.
The local development loop looks familiar to any web developer:
pac powerapps initnpm run dev — a local Vite server starts with HMR enabledpac powerapps push to deploy to the managed hostThe Power Apps CLI (pac) handles packaging and deployment; there is no manual ZIP-and-upload step. Multiple environments (dev, test, production) are managed through Power Platform's standard environment promotion tooling, including the Solution framework for ALM.
localhost. In production it runs on Power Platform's Managed Host — a multi-tenant, globally distributed runtime that Microsoft operates. Developers do not provision or configure any web servers.
Because code apps run inside Power Platform rather than as standalone Azure App Service apps, they inherit the platform's governance controls automatically:
| Control | How it applies to code apps |
|---|---|
| Microsoft Entra ID authentication | Zero-config SSO; users authenticate with their work account, no app registration required from the developer |
| Conditional Access policies | MFA requirements, compliant-device checks, and location policies enforced at login without any code changes |
| Data Loss Prevention (DLP) policies | Connectors classified as Business or Non-Business by the tenant admin; the runtime blocks any connector call that violates policy |
| Connector consent flows | Automated OAuth consent is collected from end-users on first run; no shared service account credentials needed |
| Power Platform Monitor | Built-in diagnostics dashboard for tracing connector calls, errors, and performance without custom logging infrastructure |
| Environment-level isolation | Dev, test, and production are fully isolated Power Platform environments; promoting a solution does not carry raw credentials across |
Code apps require Power Apps Premium licensing for end-users (the same licence tier required for canvas apps that use premium connectors or Dataverse). Developers additionally need:
pac CLI)The pac CLI and the starter template are free and open-source; the official repository is github.com/microsoft/PowerAppsCodeApps.
| Canvas app | Model-driven app | Code app | |
|---|---|---|---|
| Primary author | Power user / citizen developer | Solution architect / admin | Professional developer |
| UI authoring | Drag-and-drop studio | Auto-generated from data model | Full code (HTML/CSS/JS frameworks) |
| Responsive layout | Limited; requires careful container layout | Good for list/form patterns | Full control; any CSS approach |
| Business logic location | Power Fx formulas | Power Fx + server-side plug-ins | TypeScript + server-side plug-ins |
| Testability | Limited (Test Studio) | Limited | Full unit/integration test suites |
| Connector access from UI | Power Fx connectors | Dataverse only (direct) | Direct JavaScript API calls |
| Source control | YAML/JSON export | XML solution export | Native Git; plain source files |
The three models are complementary. A realistic enterprise solution might use a model-driven app for back-office data entry, a canvas app for a simple mobile approval screen, and a code app for a custom, data-dense dashboard that none of the other two can render efficiently.
Published May 2025.