npx skills add https://github.com/axiomhq/skills --skill building-dashboards您设计的仪表板能帮助人们快速做出决策。仪表板是产品:受众、问题和行动比图表数量更重要。
选择您的起点:
| 起点 | 工作流程 |
|---|---|
| 模糊描述 | 需求收集 → 设计蓝图 → 为每个面板编写 APL → 部署 |
| 模板 | 选择模板 → 自定义数据集/服务/环境 → 部署 |
| Splunk 仪表板 | 提取 SPL → 通过 spl-to-apl 转换 → 映射到图表类型 → 部署 |
| 探索 | 使用 axiom-sre 发现数据模式/信号 → 产品化为面板 |
在设计之前,请明确:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
* 值班排查?(快速刷新,关注错误)
* 团队健康状况?(每日趋势,SLO 跟踪)
* 高管报告?(每周摘要,高层概览)
2. 范围
* 服务、环境、区域、集群、端点?
* 单一服务视图还是跨服务视图?
3. 数据集
* 哪些 Axiom 数据集包含所需数据?
* 运行 `getschema` 来发现字段——切勿猜测:
['dataset'] | where _time between (ago(1h) .. now()) | getschema
4. 黄金信号
* 流量:请求数/秒,事件数/分钟
* 错误:错误率,5xx 数量
* 延迟:p50,p95,p99 持续时间
* 饱和度:CPU,内存,队列深度,连接数
5. 下钻维度
* 用户会按什么进行筛选/分组?(服务、路由、状态、Pod、customer_id)
默认使用这个四部分结构:
回答"现在是否出问题了?"的单一数字。
回答"发生了什么变化?"的基于时间的模式。
回答"我应该关注哪里?"的 Top-N 分析。
回答"到底发生了什么?"的原始事件。
控制台使用 react-grid-layout,它要求每个布局条目都有 minH、minW、moved 和 static 属性。如果省略,dashboard-create 和 dashboard-update 脚本会自动填充这些属性,因此布局条目只需要 i、x、y、w、h。
每个图表必须有一个唯一的 id 字段。 每个布局条目的 i 字段必须引用一个图表的 id。缺失或不匹配的 ID 会导致仪表板在 UI 中损坏(空白状态,无法保存/恢复)。
{
"charts": [
{
"id": "error-rate",
"name": "Error Rate",
"type": "Statistic",
"query": { "apl": "..." }
}
],
"layout": [
{"i": "error-rate", "x": 0, "y": 0, "w": 3, "h": 2}
]
}
使用描述性的 kebab-case ID(例如 error-rate、p95-latency、traffic-rps)。dashboard-validate 和部署脚本会自动强制执行此规则。
注意: 仪表板查询从 UI 选择器继承时间范围——不需要显式的 _time 筛选器。
验证: TimeSeries、Statistic、Table、Pie、LogStream、Note、MonitorList 由 dashboard-validate 完全验证。Heatmap、ScatterPlot、SmartFilter 可以工作,但可能会触发警告。
适用场景: 单一 KPI、当前值、阈值比较。
['logs']
| where service == "api"
| summarize
total = count(),
errors = countif(status >= 500)
| extend error_rate = round(100.0 * errors / total, 2)
| project error_rate
常见陷阱: 不要用于时间序列;确保查询返回单行。
适用场景: 随时间变化的趋势、前后对比、速率变化。
// 单一指标 - 使用 bin_auto 进行自动大小调整
['logs']
| summarize ['req/min'] = count() by bin_auto(_time)
// 延迟百分位数 - 使用 percentiles_array 进行正确的叠加显示
['logs']
| summarize percentiles_array(duration_ms, 50, 95, 99) by bin_auto(_time)
最佳实践:
bin_auto(_time) 而不是固定的 bin(_time, 1m) —— 根据时间窗口自动调整percentiles_array() 而不是多个 percentile() 调用 —— 渲染为一个图表top N 或筛选适用场景: Top-N 列表、详细细分、可导出的数据。
['logs']
| where status >= 500
| summarize errors = count() by route, error_message
| top 10 by errors
| project route, error_message, errors
常见陷阱:
top N 以防止结果无界project 来控制列的顺序和名称适用场景: 低基数维度(≤6 个扇区)的份额占比。
['logs']
| summarize count() by status_class = case(
status < 300, "2xx",
status < 400, "3xx",
status < 500, "4xx",
"5xx"
)
常见陷阱:
适用场景: 原始事件检查、调试、证据收集。
['logs']
| where service == "api" and status >= 500
| project-keep _time, trace_id, route, status, error_message, duration_ms
| take 100
常见陷阱:
take N(最多 100-500)project-keep 仅显示相关字段适用场景: 分布可视化、延迟模式、密度分析。
['logs']
| summarize histogram(duration_ms, 15) by bin_auto(_time)
最适合: 延迟分布、响应时间模式、识别异常值。
适用场景: 两个指标之间的相关性、识别模式。
['logs']
| summarize avg(duration_ms), avg(resp_size_bytes) by route
最适合: 响应大小与延迟相关性、资源使用模式。
适用场景: 整个仪表板的交互式筛选。
SmartFilter 是一种图表类型,用于创建下拉/搜索筛选器。需要:
SmartFilter 图表declare query_parameters筛选器类型:
selectType: "apl" —— 来自 APL 查询的动态下拉列表selectType: "list" —— 带有预定义选项的静态下拉列表type: "search" —— 自由文本输入面板查询模式:
declare query_parameters (country_filter:string = "");
['logs'] | where isempty(country_filter) or ['geo.country'] == country_filter
完整的 JSON 结构和级联筛选器示例,请参见 reference/smartfilter.md。
适用场景: 在运维仪表板上显示监控器状态。
无需 APL——从 UI 选择监控器。显示:
适用场景: 上下文、说明、章节标题。
使用 GitHub Flavored Markdown 来:
除了查询之外,图表还支持 JSON 配置选项。完整详情请参见 reference/chart-config.md。
快速参考:
| 图表类型 | 关键选项 |
|---|---|
| Statistic | colorScheme, customUnits, unit, showChart (迷你图), errorThreshold/warningThreshold |
| TimeSeries | aggChartOpts: variant (折线/面积/条形), scaleDistr (线性/对数), displayNull |
| LogStream/Table | tableSettings: columns, fontSize, highlightSeverity, wrapLines |
| Pie | hideHeader |
| Note | text (markdown), variant |
通用选项(所有图表):
overrideDashboardTimeRange: booleanoverrideDashboardCompareAgainst: booleanhideHeader: boolean仪表板面板查询不需要显式的时间筛选器。 仪表板 UI 时间选择器会自动将所有查询限定在选定的时间窗口内。
// 仪表板查询 —— 不需要时间筛选器
['logs']
| where service == "api"
| summarize count() by bin_auto(_time)
临时查询(Axiom Query 标签页、axiom-sre 探索)必须有显式的时间筛选器:
// 临时查询 —— 始终包含时间筛选器
['logs']
| where _time between (ago(1h) .. now())
| where service == "api"
| summarize count() by bin_auto(_time)
优先使用 bin_auto(_time) —— 它会根据仪表板时间窗口自动调整。
手动分箱大小(仅在自动分箱不满足需求时使用):
| 时间窗口 | 分箱大小 |
|---|---|
| 15m | 10s–30s |
| 1h | 1m |
| 6h | 5m |
| 24h | 15m–1h |
| 7d | 1h–6h |
防止查询爆炸:
// 良好:有界
| summarize count() by route | top 10 by count_
// 不良:无界的高基数分组
| summarize count() by user_id // 数百万行
带点的字段需要使用括号表示法:
| where ['kubernetes.pod.name'] == "frontend"
名称中包含点(非层级结构)的字段需要转义:
| where ['kubernetes.labels.app\\.kubernetes\\.io/name'] == "frontend"
流量:
| summarize requests = count() by bin_auto(_time)
错误(作为百分比):
| summarize total = count(), errors = countif(status >= 500) by bin_auto(_time)
| extend error_rate = iff(total > 0, round(100.0 * errors / total, 2), 0.0)
| project _time, error_rate
延迟(使用 percentiles_array 进行正确的图表叠加):
| summarize percentiles_array(duration_ms, 50, 95, 99) by bin_auto(_time)
Row 0-1: [Stat w=3] [Stat w=3] [Stat w=3] [Stat w=3]
Row 2-5: [TimeSeries w=6, h=4] [TimeSeries w=6, h=4]
Row 6-9: [Table w=6, h=4] [Pie w=6, h=4]
Row 10+: [LogStream w=12, h=6]
仪表板按配置的间隔自动刷新。选项:15s, 30s, 1m, 5m 等。
⚠️ 查询成本警告: 短刷新间隔 (15s) + 长时间范围 (90d) = 昂贵的查询持续运行。
建议:
| 使用场景 | 刷新率 |
|---|---|
| 值班/实时监控 | 15s–30s |
| 团队健康状况 | 1m–5m |
| 高管/每周报告 | 5m–15m |
数据可见性仍受数据集权限控制——用户只能看到他们有权访问的数据集中的数据。
?t_qr=24h (快速范围), ?t_ts=...&t_te=... (自定义), ?t_against=-1d (对比)
运行 scripts/setup 以检查要求(curl, jq, ~/.axiom.toml)。
配置位于 ~/.axiom.toml(与 axiom-sre 共享):
[deployments.prod]
url = "https://api.axiom.co"
token = "xaat-your-token"
org_id = "your-org-id"
| 脚本 | 用途 |
|---|---|
scripts/get-user-id <deploy> | 获取您的用户 ID 用于 owner 字段 |
scripts/dashboard-list <deploy> | 列出所有仪表板 |
scripts/dashboard-get <deploy> <id> | 获取仪表板 JSON |
scripts/dashboard-validate <file> | 验证 JSON 结构 |
scripts/dashboard-create <deploy> <file> | 创建仪表板 |
scripts/dashboard-update <deploy> <id> <file> | 更新(需要版本号) |
scripts/dashboard-copy <deploy> <id> | 克隆仪表板 |
scripts/dashboard-link <deploy> <id> | 获取可共享的 URL |
scripts/dashboard-delete <deploy> <id> | 删除(需要确认) |
scripts/axiom-api <deploy> <method> <path> | 底层 API 调用 |
⚠️ 关键:部署前务必验证查询。
dashboard-validate 检查结构dashboard-create 或 dashboard-update 进行部署dashboard-link 获取 URL —— 切勿手动构造 Axiom URL(组织 ID 和基础 URL 因部署而异)spl-to-apl: 将 Splunk SPL 转换为 APL。映射 timechart → TimeSeries, stats → Statistic/Table。参见 reference/splunk-migration.md。
axiom-sre: 使用 getschema 发现数据模式,探索基线,识别维度,然后产品化为面板。
reference/templates/ 中的预构建模板:
| 模板 | 使用场景 |
|---|---|
service-overview.json | 带有热图的单一服务值班仪表板 |
service-overview-with-filters.json | 带有 SmartFilter(路由/状态下拉列表)的相同仪表板 |
api-health.json | 包含流量/错误/延迟的 HTTP API 仪表板 |
blank.json | 最小化骨架 |
占位符: {{owner_id}}, {{service}}, {{dataset}}
用法:
USER_ID=$(scripts/get-user-id prod)
scripts/dashboard-from-template service-overview "my-service" "$USER_ID" "my-dataset" ./dashboard.json
scripts/dashboard-validate ./dashboard.json
scripts/dashboard-create prod ./dashboard.json
⚠️ 模板假设字段名 (service, status, route, duration_ms)。请先探索您的数据模式,并使用 sed 修复不匹配的字段名。
| 问题 | 原因 | 解决方案 |
|---|---|---|
| "unable to find dataset" 错误 | 数据集名称在您的组织中不存在 | 在 Axiom UI 中检查可用数据集 |
| "creating dashboards for other users" 403 | 所有者 ID 与您的令牌不匹配 | 使用 scripts/get-user-id prod 获取您的 UUID |
| 所有面板都显示错误 | 字段名与您的数据模式不匹配 | 先探索数据模式,使用 sed 修复字段名 |
| 仪表板不显示数据 | 服务筛选器限制过严 | 移除或调整 where service == 'x' 筛选器 |
| 查询超时 | 缺少时间筛选器或范围过广 | 仪表板从选择器继承时间;临时查询需要显式时间筛选器 |
| 仪表板 URL 中的组织错误 | 手动构造的 URL | 始终使用 dashboard-link <deploy> <id> —— 切勿猜测组织 ID 或基础 URL |
reference/chart-config.md — 所有图表配置选项 (JSON)reference/smartfilter.md — SmartFilter/FilterBar 完整配置reference/chart-cookbook.md — 按图表类型的 APL 模式reference/layout-recipes.md — 网格布局和章节蓝图reference/splunk-migration.md — Splunk 面板到 Axiom 的映射reference/design-playbook.md — 决策优先的设计原则reference/templates/ — 即用型仪表板 JSON 文件关于 APL 语法:https://axiom.co/docs/apl/introduction
每周安装数
213
代码仓库
GitHub 星标数
2
首次出现
Jan 24, 2026
安全审计
安装于
opencode194
codex192
gemini-cli186
github-copilot180
cursor168
claude-code165
You design dashboards that help humans make decisions quickly. Dashboards are products: audience, questions, and actions matter more than chart count.
Choose your starting point:
| Starting from | Workflow |
|---|---|
| Vague description | Intake → design blueprint → APL per panel → deploy |
| Template | Pick template → customize dataset/service/env → deploy |
| Splunk dashboard | Extract SPL → translate via spl-to-apl → map to chart types → deploy |
| Exploration | Use axiom-sre to discover schema/signals → productize into panels |
Before designing, clarify:
Audience & decision
Scope
Datasets
getschema to discover fields—never guess:['dataset'] | where _time between (ago(1h) .. now()) | getschema
Golden signals
Drilldown dimensions
Use this 4-section structure as the default:
Single numbers that answer "is it broken right now?"
Time-based patterns that answer "what changed?"
Top-N analysis that answers "where should I look?"
Raw events that answer "what exactly happened?"
The console uses react-grid-layout which requires minH, minW, moved, and static on every layout entry. The dashboard-create and dashboard-update scripts auto-fill these if omitted, so layout entries only need i, x, y, w, h.
Every chart MUST have a uniqueid field. Every layout entry's i field MUST reference a chart id. Missing or mismatched IDs will corrupt the dashboard in the UI (blank state, unable to save/revert).
{
"charts": [
{
"id": "error-rate",
"name": "Error Rate",
"type": "Statistic",
"query": { "apl": "..." }
}
],
"layout": [
{"i": "error-rate", "x": 0, "y": 0, "w": 3, "h": 2}
]
}
Use descriptive kebab-case IDs (e.g. error-rate, p95-latency, traffic-rps). The dashboard-validate and deploy scripts enforce this automatically.
Note: Dashboard queries inherit time from the UI picker—no explicit _time filter needed.
Validation: TimeSeries, Statistic, Table, Pie, LogStream, Note, MonitorList are fully validated by dashboard-validate. Heatmap, ScatterPlot, SmartFilter work but may trigger warnings.
When: Single KPI, current value, threshold comparison.
['logs']
| where service == "api"
| summarize
total = count(),
errors = countif(status >= 500)
| extend error_rate = round(100.0 * errors / total, 2)
| project error_rate
Pitfalls: Don't use for time series; ensure query returns single row.
When: Trends over time, before/after comparison, rate changes.
// Single metric - use bin_auto for automatic sizing
['logs']
| summarize ['req/min'] = count() by bin_auto(_time)
// Latency percentiles - use percentiles_array for proper overlay
['logs']
| summarize percentiles_array(duration_ms, 50, 95, 99) by bin_auto(_time)
Best practices:
bin_auto(_time) instead of fixed bin(_time, 1m) — auto-adjusts to time windowpercentiles_array() instead of multiple percentile() calls — renders as one charttop N or filterWhen: Top-N lists, detailed breakdowns, exportable data.
['logs']
| where status >= 500
| summarize errors = count() by route, error_message
| top 10 by errors
| project route, error_message, errors
Pitfalls:
top N to prevent unbounded resultsproject to control column order and namesWhen: Share-of-total for LOW cardinality dimensions (≤6 slices).
['logs']
| summarize count() by status_class = case(
status < 300, "2xx",
status < 400, "3xx",
status < 500, "4xx",
"5xx"
)
Pitfalls:
When: Raw event inspection, debugging, evidence gathering.
['logs']
| where service == "api" and status >= 500
| project-keep _time, trace_id, route, status, error_message, duration_ms
| take 100
Pitfalls:
take N (100-500 max)project-keep to show relevant fields onlyWhen: Distribution visualization, latency patterns, density analysis.
['logs']
| summarize histogram(duration_ms, 15) by bin_auto(_time)
Best for: Latency distributions, response time patterns, identifying outliers.
When: Correlation between two metrics, identifying patterns.
['logs']
| summarize avg(duration_ms), avg(resp_size_bytes) by route
Best for: Response size vs latency correlation, resource usage patterns.
When: Interactive filtering for the entire dashboard.
SmartFilter is a chart type that creates dropdown/search filters. Requires:
SmartFilter chart with filter definitionsdeclare query_parameters in each panel queryFilter types:
selectType: "apl" — Dynamic dropdown from APL queryselectType: "list" — Static dropdown with predefined optionstype: "search" — Free-text inputPanel query pattern:
declare query_parameters (country_filter:string = "");
['logs'] | where isempty(country_filter) or ['geo.country'] == country_filter
See reference/smartfilter.md for full JSON structure and cascading filter examples.
When: Display monitor status on operational dashboards.
No APL needed—select monitors from the UI. Shows:
When: Context, instructions, section headers.
Use GitHub Flavored Markdown for:
Charts support JSON configuration options beyond the query. See reference/chart-config.md for full details.
Quick reference:
| Chart Type | Key Options |
|---|---|
| Statistic | colorScheme, customUnits, unit, showChart (sparkline), errorThreshold/warningThreshold |
| TimeSeries | aggChartOpts: variant (line/area/bars), scaleDistr (linear/log), |
Common options (all charts):
overrideDashboardTimeRange: booleanoverrideDashboardCompareAgainst: booleanhideHeader: booleanDashboard panel queries do NOT need explicit time filters. The dashboard UI time picker automatically scopes all queries to the selected time window.
// DASHBOARD QUERY — no time filter needed
['logs']
| where service == "api"
| summarize count() by bin_auto(_time)
Ad-hoc queries (Axiom Query tab, axiom-sre exploration) MUST have explicit time filters:
// AD-HOC QUERY — always include time filter
['logs']
| where _time between (ago(1h) .. now())
| where service == "api"
| summarize count() by bin_auto(_time)
Preferbin_auto(_time) — it automatically adjusts to the dashboard time window.
Manual bin sizes (only when auto doesn't fit your needs):
| Time window | Bin size |
|---|---|
| 15m | 10s–30s |
| 1h | 1m |
| 6h | 5m |
| 24h | 15m–1h |
| 7d | 1h–6h |
Prevent query explosion:
// GOOD: bounded
| summarize count() by route | top 10 by count_
// BAD: unbounded high-cardinality grouping
| summarize count() by user_id // millions of rows
Fields with dots need bracket notation:
| where ['kubernetes.pod.name'] == "frontend"
Fields with dots IN the name (not hierarchy) need escaping:
| where ['kubernetes.labels.app\\.kubernetes\\.io/name'] == "frontend"
Traffic:
| summarize requests = count() by bin_auto(_time)
Errors (as rate %):
| summarize total = count(), errors = countif(status >= 500) by bin_auto(_time)
| extend error_rate = iff(total > 0, round(100.0 * errors / total, 2), 0.0)
| project _time, error_rate
Latency (use percentiles_array for proper chart overlay):
| summarize percentiles_array(duration_ms, 50, 95, 99) by bin_auto(_time)
Row 0-1: [Stat w=3] [Stat w=3] [Stat w=3] [Stat w=3]
Row 2-5: [TimeSeries w=6, h=4] [TimeSeries w=6, h=4]
Row 6-9: [Table w=6, h=4] [Pie w=6, h=4]
Row 10+: [LogStream w=12, h=6]
Dashboard auto-refreshes at configured interval. Options: 15s, 30s, 1m, 5m, etc.
⚠️ Query cost warning: Short refresh (15s) + long time range (90d) = expensive queries running constantly.
Recommendations:
| Use case | Refresh rate |
|---|---|
| Oncall/real-time | 15s–30s |
| Team health | 1m–5m |
| Executive/weekly | 5m–15m |
Data visibility is still governed by dataset permissions—users only see data from datasets they can access.
?t_qr=24h (quick range), ?t_ts=...&t_te=... (custom), ?t_against=-1d (comparison)
Run scripts/setup to check requirements (curl, jq, ~/.axiom.toml).
Config in ~/.axiom.toml (shared with axiom-sre):
[deployments.prod]
url = "https://api.axiom.co"
token = "xaat-your-token"
org_id = "your-org-id"
| Script | Usage |
|---|---|
scripts/get-user-id <deploy> | Get your user ID for owner field |
scripts/dashboard-list <deploy> | List all dashboards |
scripts/dashboard-get <deploy> <id> | Fetch dashboard JSON |
scripts/dashboard-validate <file> | Validate JSON structure |
scripts/dashboard-create <deploy> <file> | Create dashboard |
⚠️ CRITICAL: Always validate queries BEFORE deploying.
dashboard-validate to check structuredashboard-create or dashboard-update to deploydashboard-link to get URL — NEVER construct Axiom URLs manually (org IDs and base URLs vary per deployment)spl-to-apl: Translate Splunk SPL → APL. Map timechart → TimeSeries, stats → Statistic/Table. See reference/splunk-migration.md.
axiom-sre: Discover schema with getschema, explore baselines, identify dimensions, then productize into panels.
Pre-built templates in reference/templates/:
| Template | Use case |
|---|---|
service-overview.json | Single service oncall dashboard with Heatmap |
service-overview-with-filters.json | Same with SmartFilter (route/status dropdowns) |
api-health.json | HTTP API with traffic/errors/latency |
blank.json | Minimal skeleton |
Placeholders: {{owner_id}}, {{service}}, {{dataset}}
Usage:
USER_ID=$(scripts/get-user-id prod)
scripts/dashboard-from-template service-overview "my-service" "$USER_ID" "my-dataset" ./dashboard.json
scripts/dashboard-validate ./dashboard.json
scripts/dashboard-create prod ./dashboard.json
⚠️ Templates assume field names (service, status, route, duration_ms). Discover your schema first and use sed to fix mismatches.
| Problem | Cause | Solution |
|---|---|---|
| "unable to find dataset" errors | Dataset name doesn't exist in your org | Check available datasets in Axiom UI |
| "creating dashboards for other users" 403 | Owner ID doesn't match your token | Use scripts/get-user-id prod to get your UUID |
| All panels show errors | Field names don't match your schema | Discover schema first, use sed to fix field names |
| Dashboard shows no data | Service filter too restrictive | Remove or adjust where service == 'x' filters |
| Queries time out | Missing time filter or too broad | Dashboard inherits time from picker; ad-hoc queries need explicit time filter |
| Wrong org in dashboard URL | Manually constructed URL | Always use — never guess org IDs or base URLs |
reference/chart-config.md — All chart configuration options (JSON)reference/smartfilter.md — SmartFilter/FilterBar full configurationreference/chart-cookbook.md — APL patterns per chart typereference/layout-recipes.md — Grid layouts and section blueprintsreference/splunk-migration.md — Splunk panel → Axiom mappingreference/design-playbook.md — Decision-first design principlesreference/templates/ — Ready-to-use dashboard JSON filesFor APL syntax: https://axiom.co/docs/apl/introduction
Weekly Installs
213
Repository
GitHub Stars
2
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode194
codex192
gemini-cli186
github-copilot180
cursor168
claude-code165
网站审计工具 - 使用 squirrelscan CLI 全面检测 SEO、性能、安全及技术问题
39,600 周安装
社交媒体内容策略指南:LinkedIn、Twitter、Instagram、TikTok、Facebook平台优化与内容创作模板
303 周安装
data-extractor 数据提取技能:从PDF、Word、Excel等文档自动提取结构化数据
304 周安装
架构决策框架:需求驱动架构设计,ADR记录决策,权衡分析指南
304 周安装
使用reveal.js创建HTML幻灯片 | 交互式演示文稿制作工具 | 代码高亮与动画效果
304 周安装
移动应用发布策略指南:从ASO优化到推广渠道的完整发布计划
304 周安装
计分卡营销系统:四步法生成高转化率潜在客户,互动评估提升线索质量
304 周安装
displayNull| LogStream/Table | tableSettings: columns, fontSize, highlightSeverity, wrapLines |
| Pie | hideHeader |
| Note | text (markdown), variant |
scripts/dashboard-update <deploy> <id> <file> | Update (needs version) |
scripts/dashboard-copy <deploy> <id> | Clone dashboard |
scripts/dashboard-link <deploy> <id> | Get shareable URL |
scripts/dashboard-delete <deploy> <id> | Delete (with confirm) |
scripts/axiom-api <deploy> <method> <path> | Low-level API calls |
dashboard-link <deploy> <id>