# Data app > Build internal tools with custom logic, like calculators and what-if views, on governed data that runs with each viewer's permissions. :::info Under development Data apps are under development. Details on this page may change before launch. ::: ## Overview A **data app** is a single HTML file with your own HTML, CSS, and JavaScript, so you can build tools with custom logic: a purchase-planning calculator, a what-if view that recalculates as inputs change, or a guided flow where each answer decides what to show next. Every number in a data app comes from your semantic layer and runs with the viewer's permissions, so the logic is yours but the data stays governed. :::tip Need only a custom layout? Use a [Canvas dashboard](/docs/dashboards) with [HTML layout](/docs/dashboards/html-layout) instead. It comes with drill-down, cross-filtering, and explore built in. Choose a data app when you need custom logic it can't express. ::: :::info Reporting only Data apps are available only in the **Reporting** environment. They aren't tracked or stored in Git. ::: ## How it works A data app runs in a sandbox that blocks it from calling your database or any other service. Libraries and fonts can load only from approved public CDNs. To get data, the app uses a JavaScript SDK provided by Holistics: 1. The app declares its queries, written in [AQL](/as-code/aql) against your [datasets](/docs/datasets), plus any filters, date drills, and cross-filters. 2. Holistics runs each query **as the viewer**, so the viewer's dataset access and [row-level permissions](/docs/access-control/row-level-permission) apply. 3. The app renders the results however its code says: a chart, a table, a form, or a calculated answer. 4. When the viewer changes a filter or input, only the affected queries run again. ## Permissions Data apps use the same permission model as dashboards: - **Create and edit:** Admins and Analysts. - **View:** Analysts can open all data apps by default, but still see only the data their dataset permissions allow. Explorers and Viewers need [permission](/docs/admin/permission-system) to open an app. - **Data:** Each viewer sees only the rows they're allowed to see. If they can't access one of the app's datasets, queries on it return a permission error instead of data. ## How to build a data app You can write the code yourself, ask an AI agent to build the app for you, or import a dashboard you already built in Claude: | Method | Best for | | --- | --- | | [Write the code yourself](#write-the-code-yourself) | Developers who want full control | | [Holistics AI](#with-holistics-ai-coming-soon) (coming soon) | Building from a prompt without leaving Holistics | | [External AI agents](#with-an-external-ai-agent) | Teams already working in Claude, Claude Code, Cursor, or similar | | [Import from Claude](#import-a-claude-dashboard) | Turning an existing Claude dashboard into a governed app | ### Write the code yourself If you prefer full control over your application's design and functionality, you can write the HTML, CSS, and JavaScript directly in Holistics. 1. In **Reporting**, open the folder where you want to keep the app, then click **+** > **New data app**. 2. Click **Edit** to open the data app editor, which shows your code next to a live preview with responsive preview sizes. 3. Write your app in the **Code** tab, click **Update preview** to see it, and click **Save** when it's ready. The editor's **Console** shows the app's errors, and **Inspect** shows each query's AQL, generated SQL, and any error, whether you wrote the code or an agent did. ### With Holistics AI (coming soon) You'll be able to describe the app you want in [Holistics AI](/docs/ai) chat, for example: *"Build a purchase-planning tool for the ops team: pick a product category, enter next month's expected demand, and see the suggested order quantity based on the last 90 days of sales."* Holistics AI will pick the datasets, write the app, and save it to Holistics for you to review. ### With an external AI agent You can also build apps with your own agent: a coding agent such as Claude Code or Cursor, or a chat assistant such as Claude.ai or Claude Desktop. **Set up** (once per agent): 1. [Connect the agent to Holistics MCP](/docs/ai/mcp-server), so it can read your datasets and save apps to Holistics. 2. Install the `holistics-reporting` plugin (see [Skills and plugins](/docs/ai/mcp-server/skills-and-plugins)). Its data app skill teaches the agent the SDK, the sandbox rules, and how to write AQL. **Build an app:** 1. Describe the app to the agent, including who it's for. 2. Confirm the datasets the agent shortlists, and answer its questions about anything that changes the numbers. 3. The agent writes the app, saves it to Holistics, and gives you a link to open it. If your agent can't connect to Holistics MCP, the skill falls back to copy and paste: you run a short script in the app's **Code** tab to share your dataset fields with the agent, then paste the HTML file it writes back into the editor. ### Import a Claude dashboard If you've already built a dashboard in Claude on Holistics data, you can turn it into a data app. See [Import Claude dashboards](/docs/data-apps/import-claude-dashboard).