A Git-inspired CLI tool for managing Kibana saved objects in version control. Built with Rust for reliability, speed, and modern DevOps workflows.
kibob (Kibana Object Manager) helps you manage Kibana dashboards, visualizations, and other saved objects using a familiar Git-like workflow. Version control your Kibana artifacts alongside your application code, deploy them across environments, and collaborate with your team using standard Git practices.
- Git-like workflow -
pull,push, and version control your Kibana objects - Spaces management - Version control and deploy Kibana spaces alongside objects
- Workflows management - Version control and deploy Kibana workflows
- Environment management - Easy deployment across dev, staging, and production
- Manifest-based tracking - Explicitly define which objects, spaces, and workflows to manage
- Managed vs. unmanaged - Control whether objects can be edited in Kibana UI
- Modern architecture - Built with async Rust, no external dependencies
- Fast and reliable - ETL pipeline design with proper error handling
cargo install kibana-object-managergit clone https://github.com/VimCommando/kibana-object-manager.git
cd kibana-object-manager
cargo build --release
# Binary will be at target/release/kibobbrew install kibob # Coming soon!export KIBANA_URL=http://localhost:5601
export KIBANA_USERNAME=elastic
export KIBANA_PASSWORD=changeme
# OR use API key authentication:
# export KIBANA_APIKEY=your_api_key_herekibob authFirst, export your dashboards from Kibana UI (Stack Management → Saved Objects → Export).
kibob init export.ndjson ./my-dashboards
cd my-dashboardsThis creates:
default/manifest/saved_objects.json- Tracks which objects to managedefault/objects/- Directory with your objects organized by type
Optional: Add spaces management
Create a spaces.yml to also manage Kibana spaces:
spaces:
- id: default
name: Default
- id: marketing
name: Marketing
- id: engineering
name: EngineeringNow pull and push will also manage spaces! Each space's definition will be stored at {space_id}/space.json. See Spaces Guide for details.
Optional: Add workflows management
Create per-space workflow manifests like default/manifest/workflows.yml:
workflows:
- id: workflow-123
name: my-workflow
- id: workflow-456
name: alert-workflow
- id: workflow-789
name: data-pipelineNow pull and push will also manage workflows!
git init
git add .
git commit -m "Initial dashboard import"kibob pull .
git diff # Review changes
git add . && git commit -m "Update from Kibana"# Set production credentials
export KIBANA_URL=https://prod-kibana.example.com
export KIBANA_APIKEY=prod_api_key
# Deploy as managed objects (read-only in Kibana UI)
kibob push . --managed trueTest connection to Kibana with current credentials.
Initialize a new project from a Kibana export file.
Fetch saved objects from Kibana (specified in manifest) and save to local files. Also pulls spaces if spaces.yml exists and workflows if per-space manifest/workflows.yml files exist.
--space <name>: Override the Kibana space (overrides KIBANA_SPACE env var)
Upload local objects to Kibana. Also pushes spaces if spaces.yml exists and workflows if per-space manifest/workflows.yml files exist.
--managed true(default): Objects are read-only in Kibana UI--managed false: Objects can be edited in Kibana UI--space <name>: Override the Kibana space (overrides KIBANA_SPACE env var)
Add items to an existing manifest. Supports: objects, workflows, spaces
For Workflows:
kibob add workflows .- Search and add all workflowskibob add workflows . --query "alert"- Search workflows matching "alert"kibob add workflows . --include "^prod"- Include workflows matching regex "^prod"kibob add workflows . --exclude "test"- Exclude workflows matching regex "test"kibob add workflows . --include "(?i)prod"- Case-insensitive includekibob add workflows . --file export.json- Add from API response filekibob add workflows . --file bundle.ndjson- Add from bundle file
For Spaces:
kibob add spaces .- Fetch and add all spaceskibob add spaces . --include "prod|staging"- Include spaces matching patternkibob add spaces . --exclude "(?i)test"- Exclude test spaces (case-insensitive)kibob add spaces . --file spaces.json- Add from API response filekibob add spaces . --file bundle.ndjson- Add from bundle file
For Objects (legacy):
kibob add objects . --objects "dashboard=abc123,visualization=xyz789"kibob add objects . --file export.ndjson
Regex Filtering:
--includeand--excludeaccept standard Rust regex patterns- Include filter is applied first, then exclude filter
- Use
(?i)prefix for case-insensitive matching - Examples:
^prod,test$,(?i)staging,dev|test
Bundle objects into a distributable bundle/ directory containing NDJSON files:
bundle/{space_id}/saved_objects.ndjson- Per-space saved objectsbundle/spaces.ndjson- Spaces (if spaces.yml exists)bundle/{space_id}/workflows.ndjson- Per-space workflows (if manifest/workflows.yml exists)
The bundle directory can be easily zipped for distribution.
Migrate legacy manifest.json to new manifest/saved_objects.json format.
Back up and version control your dashboards. Easily restore or roll back changes.
Store dashboards in your application's Git repository. Deploy observability alongside code.
Automate dashboard deployments in CI/CD pipelines. Consistent environments from dev to production.
- User Guide - Comprehensive command reference and workflows
- Architecture - Technical deep-dive for contributors
- Examples - Real-world usage scenarios
- Migration Guide - Migrating from legacy format
- Quick Reference - Command cheat sheet
- Contributing - Development guidelines
kibob supports multiple authentication methods:
export KIBANA_USERNAME=elastic
export KIBANA_PASSWORD=changemeexport KIBANA_APIKEY=your_base64_encoded_keykibob uses a modern ETL (Extract-Transform-Load) pipeline architecture:
Pull: Kibana → Extract → Transform → Store Files
Push: Read Files → Transform → Load → Kibana
Built with:
- Rust - Memory-safe, fast, reliable
- Tokio - Async runtime for efficient I/O
- reqwest - HTTP client with connection pooling
- Clap - Modern CLI framework
- serde - Robust JSON serialization
my-dashboards/
├── spaces.yml # Global: managed spaces list
├── default/ # Default space (self-contained)
│ ├── space.json # Space definition
│ ├── manifest/ # Per-space manifests
│ │ ├── saved_objects.json
│ │ ├── workflows.yml
│ │ └── agents.yml
│ ├── objects/ # Saved objects organized by type
│ │ ├── dashboard/
│ │ │ ├── abc-123.json
│ │ │ └── xyz-789.json
│ │ ├── visualization/
│ │ │ └── def-456.json
│ │ └── index-pattern/
│ │ └── logs-*.json
│ ├── workflows/ # Workflow configurations
│ │ ├── my-workflow.json
│ │ └── alert-workflow.json
│ └── agents/ # Agent configurations
│ └── my-agent.json
├── marketing/ # Marketing space (self-contained)
│ ├── space.json
│ ├── manifest/
│ │ └── workflows.yml
│ └── workflows/
│ └── campaign-workflow.json
└── bundle/ # (Generated by 'togo' command)
├── default/
│ ├── saved_objects.ndjson
│ ├── workflows.ndjson
│ └── agents.ndjson
├── marketing/
│ └── workflows.ndjson
└── spaces.ndjson # All space definitions
kibob can also manage Kibana Spaces alongside saved objects. Create a spaces.yml:
spaces:
- id: default
name: Default
- id: marketing
name: Marketing
- id: engineering
name: EngineeringThen use the same workflow:
kibob pull . # Pulls space definitions to {space_id}/space.json
kibob push . # Creates/updates spaces in Kibana
kibob togo . # Bundles to bundle/spaces.ndjsonEach space's definition is stored in its own directory as {space_id}/space.json. For example:
default/space.jsonmarketing/space.jsonengineering/space.json
See the Spaces Guide for complete documentation.
If you have an existing project using the old Bash script:
# The new Rust version uses a different manifest format
kibob migrate ./my-project
# Review the migrated manifest
cat manifest/saved_objects.json
# Test by pulling from Kibana
kibob pull ./my-projectSee Migration Guide for details.
| Variable | Description | Default |
|---|---|---|
KIBANA_URL |
Kibana base URL | Required |
KIBANA_USERNAME |
Basic auth username | Optional |
KIBANA_PASSWORD |
Basic auth password | Optional |
KIBANA_APIKEY |
API key (conflicts with user/pass) | Optional |
- Issues: https://github.com/VimCommando/kibana-object-manager/issues
- Discussions: https://github.com/VimCommando/kibana-object-manager/discussions
Contributions are welcome! See CONTRIBUTING.md for development setup and guidelines.
Licensed under the Apache License, Version 2.0. See LICENSE for details.