skills/(demo-skills)/basic-custom-app-build/SKILL.md
Orchestrates a new Domo custom app build or existing-app takeover from scratch. Loads rules, sequences capability skills, and tracks progress through manifest, data, UI, and publish phases. Use when starting a new Domo app project, taking over an existing app, or normalizing an app to platform best practices.
npx skillsauth add stahura/domo-ai-vibe-rules basic-custom-app-buildInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Copy this checklist and update it as you work
Build Progress:
- [ ] Phase 0: Rules loaded
- [ ] Phase 1: Manifest & contracts
- [ ] Phase 2: App shell (domo.js)
- [ ] Phase 3: Data access
- [ ] Phase 4: App storage (if needed)
- [ ] Phase 5: Toolkit clients (if needed)
- [ ] Phase 6: Feature skills (AI / Code Engine / Workflow — as needed)
- [ ] Phase 7: Performance review
- [ ] Phase 8: Build & publish
- [ ] Phase 9: Verification
Apply before writing any code:
rules/core-custom-apps-rule.mdrules/custom-app-gotchas.mdUse manifest.
Define all external resource mappings first — datasets, collections, workflows, Code Engine packages. Everything else depends on this.
Use alias-safe names only (^[A-Za-z][A-Za-z0-9]*$), no spaces or special characters.
In addition to creation of the manifest.json, check root folder for an existing thumbnail.png to copy into the public folder of the new app.
Existing-app takeover? Audit the current manifest.json against actual code usage before changing anything.
Use domo-js.
Set up the baseline: ryuu.js import, navigation via domo.navigate(), event listeners, environment info.
Advanced users using DA CLI? Ask the agent to also use da-cli for scaffolding and manifest instance workflows. Should not be used unless user explicitly asks agent to use it.
Use dataset-query (primary) and data-api (routing overview).
Build queries with @domoinc/query. Use the Query API for all dataset reads — it respects page filters and does server-side aggregation.
Before writing UI/data-mapping logic, fetch the real schema for every dataset in manifest.json datasetsMapping and create an explicit field map (date field, primary metric(s), dimension fields). Do not rely on guessed names like sales, category, or order date unless confirmed in schema.
If required fields are missing for the requested visualization, fail fast with a clear mapping error instead of rendering zeros.
Need raw SQL? Use sql-query, but know that SQL ignores page filters.
Use appdb and appdb-collection-create when storage must be created.
Skip if the app only reads datasets. Use AppDB when you need to persist app-specific state, user preferences, or document-style data.
If required collections do not exist yet, run appdb-collection-create first to provision datastore+collection before wiring document CRUD.
Use toolkit.
Move to typed @domoinc/toolkit clients where they add value (structured responses, type safety). Not required for simple apps.
Only load the skills your app actually requires (3 examples are listed here but you have access to many more skills):
| Feature needed | Skill |
| ---------------------------------------------- | ----------------------------------------------------------- |
| AI text generation or text-to-SQL | ai-service-layer |
| Server-side functions (secrets, external APIs) | code-engine + code-engine-create + code-engine-update |
| Triggering automation workflows | workflow |
Decision guide: If the user hasn't mentioned AI, Code Engine, or Workflows, skip this phase entirely. Don't add complexity the app doesn't need.
Non-optional trigger for server functions: If app functionality requires server-side behavior (secrets, external API calls, privileged transformations), create or update a Code Engine package first, then sync manifest.json packagesMapping, and only then wire runtime invocation in app code.
Use performance.
Review all queries before finalizing. Check for full-dataset fetches, missing aggregations, and unnecessary columns.
Use publish.
npm run build → cd dist → domo publish. On first publish, copy the generated id back to your source manifest.
After publishing, confirm:
domo.navigate(), not <a href>base: './'.HashRouter unless rewrites are intentionally handled.domo.env.* as convenience only; use verified identity for trust decisions.tools
Step-by-step orchestrator for building Domo App Studio apps with native KPI cards via community-domo-cli. Sequences app creation, pages, theme, hero metrics, native charts, filter cards, layout assembly, and navigation. CLI-first — no raw API calls.
tools
Create, update, and execute Magic ETL dataflows programmatically via API and CLI. Covers DAG-based JSON dataflow definitions, input/transform/output node wiring, join operations, and execution lifecycle.
tools
Magic ETL dataflows via community-domo-cli — list, get-definition, create, update, run, execution status; JSON DAG actions, transforms, joins. Use when automating dataflows with the community Domo CLI end-to-end. For REST/Java-CLI–first flows or mixed API patterns, use magic-etl instead.
development
Clean, professional dashboard theme for Domo custom apps. CSS custom properties, layout patterns, typography, and design polish that feel native to the Domo platform. Includes OKLCH color palette, layered shadows, concentric border radius, tabular numbers, and micro-interaction patterns.