The App Toolkit
One CLI to scaffold, develop, and deploy apps:
node --version # Need 24+
npx dt-app@latest create --environment-url https://YOUR-ENV.apps.dynatrace.com
Templates
Template What You Get
โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
default Full example with DQL, charts, tables
empty Blank app โ just routing, no content
Project Structure
my-app/
โโโ ui/
โ โโโ app/
โ โ โโโ App.tsx โ Root component + routing
โ โ โโโ pages/ โ Your pages
โ โโโ main.tsx โ Entry point (AppRoot + BrowserRouter)
โโโ api/ โ App Functions (TypeScript files)
โโโ app.config.json โ App metadata + permissions + CSP
โโโ package.json
โโโ tsconfig.json
app.config.json
From the real DOOM app (deployed and running):
{
"environmentUrl": "https://YOUR-ENV.apps.dynatrace.com/",
"app": {
"name": "My App",
"version": "0.0.1",
"description": "A custom Dynatrace app",
"id": "my.custom.app",
"scopes": [
{ "name": "storage:metrics:read", "comment": "Host metrics" },
{ "name": "storage:entities:read", "comment": "Host/service entities" },
{ "name": "storage:logs:read", "comment": "Log analytics" },
{ "name": "storage:events:read", "comment": "Problems and events" }
]
}
}
โ ๏ธ Scopes define what data the app can access. Missing scopes = silent empty results (no error). Always declare every data type the app queries.
Development Workflow
npx dt-app dev # Local dev server with hot reload
npx dt-app build # Build for deployment
npx dt-app deploy # Deploy to your Dynatrace environment
๐ Try it: Run npx dt-app@latest create --environment-url https://YOUR-ENV.apps.dynatrace.com โ name it "my-first-app" โ cd my-first-app && npx dt-app dev. Your app opens in the browser, live-reloading as you edit code.