Changelog¶
Version history and release notes for Dango.
Version Numbering¶
Dango follows Semantic Versioning:
- MAJOR.MINOR.PATCH (e.g., 1.0.0)
- MAJOR: Breaking changes
- MINOR: New features (backwards compatible)
- PATCH: Bug fixes
Current Version¶
v1.0.12¶
Released: October 5, 2026
Status: Stable
Fixed¶
- Projects whose Metabase admin password in
.dango/metabase.ymlhad gone stale no longer fail every start with "Metabase credential migration is incomplete".dango startnow recognises the working credential Dango already stores for the linked admin and adopts it, without changing anything in Metabase. - If every stored copy of the Metabase admin password is lost,
dango startnow restores admin access automatically using Metabase's own offline reset tool. Metabase restarts briefly; dashboards, questions and all other Metabase data are kept.dango metabase repair-adminruns the same repair on demand. - The credential migration messages are now accurate: only problems that can fix themselves say "will retry on the next start", and a rejected credential is no longer retried (and failed) on every start.
- The Metabase admin account's password now has a single owner: user sync and
dango auth metabase-repairno longer rotate it, and no code path stores a Metabase password that was never applied.
Removed¶
- Dango no longer deletes the Metabase Docker volume, and no longer suggests
docker volume rm, when it cannot sign in to an existing Metabase. Nothing is deleted automatically.
v1.0.11¶
Released: October 4, 2026
Status: Stable
Fixed¶
dango startanddango servenow wait for Metabase to be ready before migrating a legacy Metabase admin password and before importing dashboards. In 1.0.10 these steps ran while Metabase was still starting, so on projects created before 1.0.10 the credential migration never completed ("Metabase credential migration is incomplete" on every start, with failed Metabase logins and a failed dashboard import in the output). Upgraded projects now complete the migration on their first start; no data was affected. Restarts with nothing to migrate are unchanged and do not wait.
Security¶
- The legacy Metabase admin password now actually moves out of
.dango/metabase.ymlinto protected storage on the first start after upgrading, as intended in 1.0.10.
v1.0.10¶
Released: October 4, 2026
Status: Stable
Added¶
- MCP server is now workflow-complete: about 50 tools in eight groups let a coding agent set up and operate a project, not just read it. Sources (
get_source_setup_schema,create_sourceincl. importing a local file,update_source,set_source_enabled,remove_sourcewith dry run,validate_source), models (create_model,update_model,validate_model,remove_model), docs (docs_coverage,get_model_docs,get_source_docs,update_source_table_docs,generate_docs), schedules (add/update/enable/remove/reload, reporting whether the running server picked the change up), diagnostics (validate_project,get_logs,get_platform_status,get_warehouse_health), governance (schema drift, PII scan/findings/overrides), and remote tools (remote_status,remote_history,remote_logs,remote_query,remote_sync,remote_push).run_syncandrun_transformnow matchdango syncanddango run - MCP tools never accept credentials: results report what to put in
.env(ordango oauth) and redact anything that is not an environment variable name.querymasks columns flagged as PII by name (a guardrail, not a security boundary).remote_pushdefaults to a dry run and needsdry_run=Falseandconfirm=True. The remote tools are covered by automated tests but have not yet been verified against a live server - The MCP server now sends usage
instructionsto the client, and a stdio integration test in CI guards the JSON-RPC stream against stray output - Per-source
empty_sync_policy(blockorallow, defaultblock) in.dango/sources.yml, adango sync --allow-empty-replace / --block-empty-replaceoverride for one run, a wizard prompt, and the same behavior for the web UI and scheduler dango schedule statusnow shows the real scheduler state (it was blank before)
Fixed¶
- Replace-mode syncs that return no rows no longer lose data: the protection now blocks the write before anything is dropped (previously it reported "data preserved" after the data was already gone), and dbt models are no longer marked stale when a sync was blocked
--full-refreshon merge/append sources no longer drops the destination before extraction; a failed refresh leaves the existing data in placelocal_files/csvsources: a sync no longer empties the table when every source file is missing (it fails with the empty-sync message;--allow-empty-replaceforces it); a file that returns after being removed reloads; two matching files with the same name in different folders are refused with a clear error instead of silently overwriting each other's rows- Google Sheets: an empty or cleared range now follows
empty_sync_policyinstead of crashing the sync - A scheduler job's configured timeout is honored for scheduled scripts; interrupts during native-source syncs are handled the same way as other sources
- Saving schedules no longer wipes webhook settings; removing one source no longer deletes the shared
[sources.<type>]config another source of that type uses; editing a model no longer wipes itsschema.ymltests, andtests/data_testsare never both written to one column dango doctor, the web UI, and MCPrun_doctorcheck each source's own credential variable (no more false "missing" or false "ok");run_doctoris always freshdango remote syncwithout--waitnow actually starts the sync on the server and reports a failed start- PII scanning no longer flags a low-cardinality column (such as a two-value
region) from a single spurious match dango startno longer hangs for up to two minutes, then fails with a timeout, when the Metabase data volume was created by an earlier Dango release (or the project was renamed): Docker Compose's "Recreate (data will be lost)?" prompt can no longer block startup, and your existing Metabase data is keptdango remote upgradeand the Docker rebuild step ofdango remote pushnow run their Docker commands under the server's own Compose project name, so an upgrade can no longer start a second, empty Metabase alongside the real one
Security¶
- Metabase admin credentials are stored outside the project directory: the OS keychain where available, otherwise an owner-only file outside the project's sync and backup tree. Existing projects are migrated safely during
dango upgradeand completed after startup, keeping the legacy copy until the protected one is verified - Backup archives (cloud, scheduled, and local safety archives) no longer contain the Metabase administrator password, and archives from earlier versions are sanitized again on restore
- Sensitive local artifacts are gitignored in new and existing projects (applied during
dango init,dango upgrade, anddango start), and Dango warns about local backup locations that may predate the protected format without opening, logging, or deleting them .envbackups are created owner-only (0600) and covered by.env*.backupin.gitignore- A literal secret pasted into a source's
*_envfield is never echoed indango doctor, validation, or MCP results
Changed¶
local_filesimports through MCP accept~/paths and always land indata/uploads/<source_name>/; the legacycsvsource type is steered tolocal_filesfor new sources (existingcsvsources keep working)- MCP marts model names are free-form (
fct_/dim_is a suggestion), andlist_modelslabels models by their directory
v1.0.9¶
Released: September 25, 2026
Status: Stable
Fixed¶
- Docker project identity upgrades now preserve a pre-1.0.8 project's existing Metabase volume even when its containers were previously stopped or Docker Desktop is temporarily unavailable, preventing an accidental empty replacement Metabase instance
dango startnow recognizes each project's actual Compose-built Metabase image instead of incorrectly reporting every existing project as a first-time build- If Docker Compose times out after services have already started, Dango retains those services instead of immediately tearing them down and shows captured Compose output for actionable diagnosis
- Cloud backup and scheduled backup operations now use the project's persisted Compose identity for Metabase volumes and remote lifecycle commands
v1.0.8¶
Released: September 22, 2026
Status: Stable
Added¶
- Opt-in telemetry controls — anonymous first-run consent,
dango telemetryCLI controls, and a matching/settings/telemetrypage - MCP server — project-aware setup for Claude Code, Cursor, and Windsurf, with 15 tools for reading project state and safely running common mutations
dango initnow creates matchingCLAUDE.mdandAGENTS.mdguidance files for coding agentsdango validatenow flags missing or placeholder model and column descriptions- BYOS/self-hosted deploys now warn when backups are not configured
- Data Pipeline Health dashboard now shows live sync history, dbt test results, and source counts
dango statusnow reports MCP server status;dango source inspect-stateanddango docker-auditadd diagnostics for incremental state and Dango-managed Docker resources
Fixed¶
- Upgraded dbt-core, dbt-duckdb, Metabase, and the Metabase DuckDB JDBC driver to their 1.0.8-supported versions
dango generateavoids unnecessary staging-model rewrites and protects manually customized models unless--forceis supplied- Sync progress now reports when data loading has completed and transforms are starting
- Metabase now consistently respects configured ports, refreshes connections/schema reliably after syncs and restarts, restores current exports, and fixes dashboard/card provisioning
- Docker project identity is now stable across project moves; start/stop commands avoid operating on another project's processes or containers
- CSV/local-files sources reject incompatible column types clearly, handle apostrophes in paths, and recover safely from transient DuckDB locks
- Google Sheets OAuth token refresh and current Google Console setup guidance are corrected
- Source-add prompts handle pasted Sheets URLs, Ctrl+C, skipped OAuth setup, and correct sync-command hints cleanly
- Script timeouts preserve prior output; per-script timeouts are configurable
- MCP transform operations now share the warehouse write lock, preventing concurrent-write corruption
- Telemetry settings no longer create project git diffs and now clearly describe machine-wide versus project scope
Security¶
- Removed guessable fallback credentials from Metabase provisioning
- Updated
postcss-selector-parserto resolve Dependabot alert #7
Changed¶
- MCP setup is now project-scoped for Claude Code and Cursor where supported;
dango mcp removereverses configured integrations - Telemetry prompts and status output now state ongoing-heartbeat and scope behavior plainly
v1.0.7¶
Released: August 27, 2026
Status: Stable
Added¶
dango doctor— credential health check across all configured sources; shows ✓ OK / ✗ Missing / Expired / Unknown at a glance- Model wizard — interactive upstream table selection with CTE scaffold auto-generation; each selected table becomes a named CTE with
{{ ref(...) }} - Schedule wizard — weekday preset (Mon–Fri pre-selected) in
dango schedule add;dango schedule reloadapplies config changes without restart - Service account auth —
dango oauth google_sheetsanddango oauth google_analyticsoffer a choice between browser OAuth and JSON key file, useful for server deployments - Script UI history — scheduled script runs now appear in the Scripts page with last run timestamp, status, and View Log link (previously always showed "not run")
- Script failure history — cancelled, timed-out, and pre-launch-failed script runs write history entries so failures are visible in the UI
- Secrets page partial masking — env var values show the last 4 characters (
****efgh) instead of blanket*** - Metabase Collection hierarchy — nested collections preserved correctly across
dango metabase save/dango metabase loadroundtrips - Column descriptions — default descriptions for columns in 7 high-value sources (Google Ads, GA4, Google Sheets, Stripe, HubSpot, Facebook Ads, BigQuery) visible in the catalog
- Notebook role access — editor role can open notebooks not created by them
- Scripts cloud sync — scripts and
scripts/requirements.txtsynced to remote server ondango remote push; invalid script paths rejected with a clear error
Fixed¶
- Scripts page: scheduled runs no longer permanently show "not run" — history file written after every scheduled execution
- Scripts page: View Log no longer 404s on scheduled runs — log files written to the correct path
- Secrets page: duplicate
/settings/variablespage removed; env vars consolidated into/settings/secrets; old URL redirects (301) automatically - DuckDB lock conflicts on local: syncs now retry up to 5 times with 10s backoff when Metabase holds the DuckDB connection (previously failed immediately)
- Schedule reload: source-list changes now detected and applied; previously
dango schedule reloadonly compared cron triggers - Google Sheets: empty range now raises a clear error instead of silently bypassing empty-replace protection
- Service account validation: no longer returns valid when
google-authpackage is not installed - Model wizard: duplicate CTE alias no longer generated when two upstream table names produce the same identifier
- Sort/filter UI: broken on Schedules, Scripts, and Catalog pages after a JS refactor — now fixed
InquirerPyadded to declared package dependencies —dango oauth google_sheets/dango oauth google_analyticsno longer crash on fresh installs
Security¶
- PostCSS updated 8.5.10 → 8.5.26, resolving path traversal vulnerabilities in the CSS build toolchain (build-time only; not exploitable at runtime)
v1.0.6¶
Released: August 19, 2026
Status: Stable — quality gate round
Added¶
- Script scheduling — cron-based scheduling for Python scripts in
scripts/viadango schedule add - Scripts tab in web UI — list, run, cancel, and view logs for scripts
dango transform seed— runs dbt seeds; seed tables appear in catalog with row counts and profiling- Python 3.13 support
- Schedule-aware staleness detection — sources with a schedule show a yellow "Stale" badge when last sync exceeds 2× the schedule interval
- Per-table empty-replace protection for multi-resource dlt sources
- Source and model row counts in web UI and catalog
- Configurable backup retention, secrets exclusion from backups
- Activity log deduplication and sync history gap prevention
dltupgraded from 1.24.0 to 1.28.1
Fixed¶
- Custom
dlt_nativesources incustom_sources/now auto-discovered without manual config - Sources page crash when a dlt_native source has a
nullincremental capability @dlt.sourcedecorator crash during import inspection- "Incremental" sync mode label now derived from actual write_disposition in DuckDB
- Models page: "Run" button no longer overwrites Schema column
- Models page: "Last Run" column now sortable
- Catalog: tab navigation no longer freezes when viewing tables filtered by source
- Catalog: dbt docs 📖 link opens in new tab
- DbtLock scope narrowed to write phase — long-running API syncs no longer block concurrent sources
- DbtLock unlink race condition fixed
- Metabase kept running during sync extract phase
- Scheduled sync lock timeout aligned with direct sync (60s → 300s)
- Notebook startup hang fixed; admin restart now shows warning modal
- Scheduled sync "Unknown sync completed" toast fixed
- Column alignment and filter inputs improved across Sources, Models, Schedules pages
- DuckDB 1.5.2 → 1.5.4, Metabase JDBC driver 1.5.1.0 → 1.5.3.0, dbt-core 1.10.20 → 1.10.22
v1.0.5¶
Released: June 25, 2026
Added¶
- Sync queue — concurrent syncs wait instead of failing, with queued status in the web UI
- WebSocket sync phase events — UI shows "Processing..." during post-sync hooks
- Structured logging to
.dango/logs/dango.logwith daily rotation and gzip compression dango_versionfield in activity log, audit log, and sync subprocess headers- Schedules page: sources displayed as alphabetically sorted bullet list
- OAuth timeout with 120s limit, retry option, and provider-specific troubleshooting
Fixed¶
- OAuth credentials saved only after token exchange succeeds
- Cross-project port kill —
dango stopscoped to current project - Staging models generate explicit column lists instead of
SELECT * - Sync log filenames include source name and timestamp
- Notebook startup waits indefinitely for marimo to respond
v1.0.4¶
Released: June 15, 2026
Added¶
- Global sync status indicator in UI header
- Activity log entries for CSV uploads, deletes, and manual schedule triggers
- "View in Metabase" link in catalog table detail
- Empty sync protection — replace-mode syncs that return 0 rows preserve existing data
--allow-empty-replaceCLI flag to override empty sync protection
Fixed¶
- OAuth wizard shows success only after actual tokens obtained
- Duplicate
sync_startedevent emission removed
v1.0.3¶
Released: June 2026
Fixed¶
- Metabase session bridging stability improvements
- Schedule execution reliability fixes
- OAuth refresh handling for long-running deployments
v1.0.2¶
Released: June 2026
Fixed¶
- Cloud deployment stability fixes
- Remote backup and restore improvements
- Firewall and domain management fixes
v1.0.1¶
Released: June 2026
Fixed¶
- Background Metabase schema sync on startup
- Port conflict detection improvements
- Initial sync reliability fixes
v1.0.0b4¶
Released: June 2026
Status: Beta 4 — bug fix round
See Upgrade Notes for b4 for breaking changes and upgrade steps.
Breaking Changes¶
- GA4 column names: Type suffixes removed (
sessions_integer→sessions,bounce_rate_float→bounce_rate, etc.). Update custom dbt models referencing old names. - Google Ads / GA4 data types:
datecolumns now DATE (were VARCHAR/TIMESTAMPTZ),clicks/impressionsnow INTEGER (were VARCHAR). Requires--full-refreshper source. - GA4 default queries:
eventsandconversionsnow includelandingPagedimension.
Fixes¶
- Scheduler now loads jobs from
schedules.ymlon startup - Staging YML files (
sources_*.yml) no longer overwritten on sync - Cloud file sync now includes
custom_sources/andseeds/ - Backups now include dbt models, custom sources, and
.env - Metabase dashboard export captures all cards
- Sync failures properly logged as errors with status in sync history
- OAuth wizard error handling improvements
resolve_install_source()correctly detects PyPI installs
v1.0.0¶
Released: June 2026
Status: First major release
This is the v1.0.0 release — a complete rewrite and expansion of the Dango platform, adding authentication, cloud deployment, a web UI, scheduled syncs, data governance, and notebooks.
Highlights¶
- 33 data sources (up from 8 wizard-supported in v0.1.0), with 25 in the interactive wizard
- Authentication — password login, TOTP 2FA, API keys, three roles (admin/editor/viewer)
- Cloud deployment — automated DigitalOcean provisioning and Bring Your Own Server (BYOS) support
- Web UI — 16-page dashboard for monitoring syncs, health, data catalog, schedules, and secrets
- Scheduled syncs — APScheduler-based with cron expressions and webhook notifications
- Data governance — schema drift detection, PII scanning (Presidio), data catalog with column descriptions
- Marimo notebooks — integrated reactive notebooks with DuckDB snapshot isolation
- Monitoring — health metrics, sync history, capacity alerts
dango devworkflow — branch-based dbt development with isolated databases- Snapshots — SCD Type 2 change tracking via dbt snapshots, plus DuckDB point-in-time copies
- Metabase SSO bridge — automatic login through the Web UI
What's New by Area¶
Authentication & Security (Phase 2)
- Password authentication with bcrypt hashing
- TOTP-based two-factor authentication
- API key authentication for programmatic access
- Three user roles: admin, editor, viewer (29 permissions)
- Metabase SSO bridge — seamless login through Web UI
- Audit logging for security events
- Credential encryption for OAuth tokens
Cloud Deployment (Phase 3)
dango deploy— automated DigitalOcean droplet provisioning- BYOS (Bring Your Own Server) — deploy to any Ubuntu 22.04 server via SSH
- Caddy reverse proxy with automatic HTTPS (Let's Encrypt)
- Security hardening: fail2ban, SSH key-only, unattended-upgrades
dango remote push— sync config and dbt models to serverdango remote logs,dango remote status,dango remote history- Deploy journal (append-only JSONL) with git guardrails
Data Governance (Phase 4)
- Schema drift detection — alerts when source schemas change
- PII scanning via Microsoft Presidio (targeted entity types)
- Data catalog — browsable table/column inventory
- Column descriptions (user-editable via Web UI)
- Monitor configuration via CLI and Web UI
Scheduling (Phase 5)
- APScheduler-based sync scheduling with cron expressions
dango schedule add/remove/list/enable/disable- Webhook notifications on sync success, failure, or stale data
- Configurable stale data thresholds
- Misfire grace handling for missed schedules
Notebooks (Phase 6)
- Marimo notebook integration
- Built-in templates (EDA, time series, funnel analysis, cohort analysis)
- DuckDB snapshot isolation — notebooks use read-only copies
- Launch from Web UI or CLI (
dango notebook open)
Web UI (Phase 7)
- 16-page web dashboard at
http://localhost:8800 - Dashboard page — sync status overview, health summary
- Sources page — source list, sync history, run syncs
- Models page — dbt model status, run transformations
- Health & Logs page — system health, disk usage, process status
- Catalog page — data catalog browser with search
- Monitoring page — schema drift, PII results, metrics
- Schedules page — manage sync schedules
- Notebooks page — launch and manage Marimo notebooks
- Secrets & Admin page — credential management, user administration
CLI Additions
dango init— project initialization with admin password setupdango deploy/dango remote push— cloud deploymentdango auth— user management (create, list, delete, reset-password)dango oauth— OAuth provider managementdango schedule— sync schedulingdango monitor— monitoring and governancedango notebook— notebook managementdango dev— branch-based dbt developmentdango snapshot— SCD Type 2 snapshots and DuckDB copiesdango upgrade— in-place version upgrades with migrationsdango schedule webhook— webhook notification managementdango config validate— configuration validation
Infrastructure
- DuckDB version alignment checks (startup + pre-commit hook)
- Process separation — syncs run in subprocesses to prevent lock contention
- Single-worker uvicorn for cloud deployments (WebSocket compatibility)
- Smoke test suite (100+ checks)
Breaking Changes from v0.1.0¶
dango initis now required before first use (sets up auth)- Authentication is enabled by default (use
DANGO_ADMIN_PASSWORDenv var for automation) dango sync --source SOURCEsyntax deprecated — usedango sync SOURCE(positional argument)- Metabase credentials now randomly generated and stored in
.dango/metabase.yml - Project structure uses
.dango/directory for configuration (migrated automatically)
Previous Releases¶
v0.1.0¶
Released: December 17, 2025
Status: MVP Release
- 8 wizard-supported data sources (CSV, Stripe, Google Sheets, GA4, Facebook Ads, Google Ads, REST API, dlt Native)
- 25+ additional sources via dlt native configuration
- Auto-generated dbt staging models
- DuckDB warehouse with incremental loading
- Metabase integration with auto-provisioned dashboards
- Dashboard export/import (
dango metabase save/load) - Web UI for monitoring
- OAuth authentication for Google and Facebook sources
v0.0.5¶
Released: December 8, 2025
dango sync --dry-runto preview without executing- Unreferenced custom sources warning
- Better validation output (database check, model count)
Upgrade Guide¶
Upgrading to v1.0.0¶
After upgrading:
- Set an admin password during
dango init - Review your sources — the config format is unchanged, but new features are available
- Access the Web UI at
http://localhost:8800after runningdango start
General Upgrade¶
Release Process¶
How Releases Work¶
- Features developed on feature branches off
main - Merged to
mainafter review - Tagged releases published to PyPI
- Release notes added to this changelog
Release Cadence¶
- Patch releases: As needed for bug fixes
- Minor releases: As features complete
- Major releases: When breaking changes are necessary
Post-v1 Roadmap¶
Planned for future releases:
- Query performance logging and optimization insights
- Health history — 24h/7d trend dashboards
- Python task scheduler / reverse ETL
- REST API provider presets (Shopify, Stripe templates)
- OAuth callback unification
- DuckLake integration (pending maturity evaluation)
Contributing¶
Want to contribute to the next release?
See the Contributing Guide for details.