Skip to main content

Import & Export

DotVault supports importing secrets from various sources and exporting to multiple formats, making migration and backup easy.

Supported Import Formats

.env Files

Standard environment variable files:

# Simple format
DATABASE_URL=postgres://localhost:5432/mydb
API_KEY=sk_test_1234567890

# With quotes (for values with spaces)
DESCRIPTION="My production database"

# Multi-line values
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0Z3VS5JJcds3xfn/ygWyF8PbnGy0AHB7MhgwKVPSmwaFkYLv
..."

Import:

# Via CLI
dotvault import my-project --env production --file .env.production

# Via web interface
# Project → Import → Select .env file

JSON

Generic JSON object format:

{
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_test_1234567890",
"DEBUG": "false"
}

Import:

dotvault import my-project --env production --format json --file secrets.json

1Password

Export from 1Password:

  1. Open 1Password
  2. Select items to export
  3. File → Export → JSON
  4. Import to DotVault

Format:

[
{
"title": "Production Database",
"fields": [
{
"label": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb",
"type": "string"
}
],
"tags": ["production", "database"]
}
]

Import:

dotvault import my-project --env production --format 1password --file 1password-export.json

HashiCorp Vault

Export from Vault KV store:

# Export from Vault
vault kv get -format=json secret/myapp > vault-export.json

Format:

{
"data": {
"data": {
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_test_1234567890"
}
}
}

Import:

dotvault import my-project --env production --format vault --file vault-export.json

AWS Secrets Manager

Export from AWS:

# Get secret value
aws secretsmanager get-secret-value \
--secret-id myapp/production \
--query 'SecretString' \
--output text > aws-secret.json

Format:

{
"SecretString": "{\"DATABASE_URL\":\"postgres://...\",\"API_KEY\":\"sk_...\"}"
}

Or plain string:

{
"SecretString": "DATABASE_URL=postgres://...\nAPI_KEY=sk_..."
}

Import:

dotvault import my-project --env production --format aws --file aws-secret.json

Doppler

Export from Doppler:

# Export via CLI
doppler secrets download --format json > doppler-export.json

Format:

[
{
"name": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb"
},
{
"name": "API_KEY",
"value": "sk_test_1234567890"
}
]

Or object format:

{
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_test_1234567890"
}

Import:

dotvault import my-project --env production --format doppler --file doppler-export.json

Vercel

Export from Vercel:

# Export via CLI
vercel env ls --environment=production --format json > vercel-export.json

Format:

[
{
"key": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb",
"target": ["production"],
"type": "plain"
}
]

Import:

dotvault import my-project --env production --format vercel --file vercel-export.json

Netlify

Export from Netlify:

# Export via CLI
netlify env:list --context production --json > netlify-export.json

Format:

[
{
"key": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb"
}
]

Import:

dotvault import my-project --env production --format netlify --file netlify-export.json

Auto-Detection

DotVault automatically detects import format:

# Auto-detect format
dotvault import my-project --env production --file secrets.txt

# Detects based on:
# - File extension (.env, .json)
# - Content structure
# - Known patterns

Import Options

Dry Run

Preview import without applying:

dotvault import my-project --env production --file .env --dry-run

# Output:
# Would import 12 secrets:
# + DATABASE_URL
# + API_KEY
# + DEBUG
# ...
#
# Issues detected:
# ⚠️ DEBUG: Value "true" is a common placeholder

Skip Invalid

Continue import even if some secrets are invalid:

dotvault import my-project --env production --file .env --skip-invalid

# Output:
# Imported 10 secrets
# Skipped 2 invalid secrets:
# - INVALID KEY: Contains spaces
# - ANOTHER_BAD_KEY: Invalid characters

Overwrite Existing

Replace existing environment:

dotvault import my-project --env production --file .env --overwrite

# Warning: This will replace all existing secrets in 'production'
# Previous version will be saved in version history

Add Comment

Document the import:

dotvault import my-project --env production --file .env --comment "Migration from Heroku"

Supported Export Formats

.env

Standard environment file:

# Export
dotvault export my-project --env production --format env --file .env.production

# Output:
DATABASE_URL=postgres://localhost:5432/mydb
API_KEY=sk_test_1234567890
DEBUG=false

JSON

Structured JSON:

dotvault export my-project --env production --format json --file secrets.json

# Output:
{
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_test_1234567890",
"DEBUG": "false"
}

CSV

Spreadsheet-compatible:

dotvault export my-project --env production --format csv --file secrets.csv

# Output:
Key,Value
DATABASE_URL,postgres://localhost:5432/mydb
API_KEY,sk_test_1234567890
DEBUG,false

YAML

YAML format:

dotvault export my-project --env production --format yaml --file secrets.yaml

# Output:
DATABASE_URL: "postgres://localhost:5432/mydb"
API_KEY: "sk_test_1234567890"
DEBUG: "false"

Export Options

Mask Values

Export with masked values:

dotvault export my-project --env production --format env --mask

# Output:
DATABASE_URL=postgres://****:****@****:5432/****
API_KEY=sk_****...****
DEBUG=****

Select Keys

Export only specific keys:

dotvault export my-project --env production --keys DATABASE_URL,API_KEY

Include Metadata

Add metadata to export:

dotvault export my-project --env production --format json --include-metadata

# Output:
{
"_metadata": {
"exportedAt": "2024-01-15T10:30:00Z",
"exportedBy": "john@example.com",
"project": "my-project",
"environment": "production"
},
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_test_1234567890"
}

Migration Workflows

From 1Password to DotVault

# 1. Export from 1Password
# File → Export → Selected Items → JSON

# 2. Import to DotVault
dotvault import my-project --env production --format 1password --file 1password-export.json

# 3. Verify import
dotvault env get my-project --env production

# 4. (Optional) Delete from 1Password

From HashiCorp Vault to DotVault

# 1. Export from Vault
vault kv get -format=json secret/myapp/production > vault-export.json

# 2. Import to DotVault
dotvault import my-project --env production --format vault --file vault-export.json

# 3. Set up rotation (optional)
dotvault rotation enable my-project --env production --key DATABASE_URL --interval 90

# 4. (Optional) Migrate gradually
# Keep Vault as backup during transition

From AWS Secrets Manager to DotVault

# 1. Export from AWS
aws secretsmanager get-secret-value \
--secret-id myapp/production \
> aws-secret.json

# 2. Import to DotVault
dotvault import my-project --env production --format aws --file aws-secret.json

# 3. Update applications to use DotVault
# (Gradual migration recommended)

# 4. (Optional) Set up AWS rotation via DotVault
dotvault rotation enable my-project --env production --key AWS_ACCESS_KEY_ID --provider aws

From Vercel to DotVault

# 1. Export from Vercel
vercel env ls --environment=production --format json > vercel-export.json

# 2. Import to DotVault
dotvault import my-project --env production --format vercel --file vercel-export.json

# 3. Set up GitHub Actions integration
dotvault cicd generate my-project --env production --provider github

# 4. Update Vercel to use DotVault
# (Use dotvault/action in GitHub Actions)

Best Practices

1. Validate Before Import

Always use dry-run first:

dotvault import my-project --env production --file .env --dry-run

2. Document Migrations

Add comments for audit trail:

dotvault import my-project --env production --file .env --comment "Migration from Heroku - Jan 2024"

3. Keep Backups

Export before major changes:

# Backup before import
dotvault export my-project --env production --format json --file backup-$(date +%Y%m%d).json

# Then import
dotvault import my-project --env production --file .env

4. Use Version History

Imports create new versions:

# View version history
dotvault versions list my-project --env production

# Rollback if needed
dotvault versions restore my-project --env production --version 5

5. Secure Exports

Handle exported files carefully:

# Export with restricted permissions
dotvault export my-project --env production --format env --file .env.production
chmod 600 .env.production

# Or use masked export for sharing
dotvault export my-project --env production --format env --mask --file env-structure.env

6. Automate Regular Exports

Schedule backups:

# Add to crontab
0 2 * * * dotvault export my-project --env production --format json --file /backups/secrets-$(date +\%Y\%m\%d).json

API Reference

Import

POST /api/projects/{projectId}/import
{
"label": "production",
"content": "DATABASE_URL=postgres://...\nAPI_KEY=sk_...",
"format": "auto",
"options": {
"skipInvalid": true,
"overwriteExisting": false,
"dryRun": false
}
}

Response:
{
"data": {
"imported": 12,
"skipped": 0,
"errors": [],
"issues": [
{
"key": "DEBUG",
"issue": "Value appears to be a placeholder",
"severity": "warning"
}
]
}
}

Export

GET /api/projects/{projectId}/envs/{envId}/export?format=env&includeValues=true

Response: (file download)
Content-Type: text/plain
Content-Disposition: attachment; filename="production.env"

DATABASE_URL=postgres://...
API_KEY=sk_...

List Supported Formats

GET /api/import/formats

Response:
{
"data": {
"formats": [
{
"id": "env",
"name": ".env File",
"description": "Standard .env file format"
},
{
"id": "json",
"name": "JSON",
"description": "Generic JSON object format"
},
{
"id": "1password",
"name": "1Password",
"description": "1Password export format"
}
]
}
}

Troubleshooting

Import Fails

  1. Check file format matches specified format
  2. Verify file encoding (UTF-8)
  3. Check for special characters
  4. Use dry-run to identify issues

Secrets Not Importing

  1. Check key format (no spaces, valid characters)
  2. Verify values not empty
  3. Check for duplicate keys
  4. Review error messages

Export Empty

  1. Verify environment exists
  2. Check you have access permissions
  3. Ensure environment not empty
  4. Try different format

Encoding Issues

  1. Ensure UTF-8 encoding
  2. Check for BOM (Byte Order Mark)
  3. Handle special characters properly
  4. Use binary mode for CLI

Security

Import Security

  • All imports logged in audit trail
  • Previous versions preserved
  • Validation prevents injection attacks
  • Size limits prevent abuse

Export Security

  • Requires appropriate permissions
  • Can be masked for safe sharing
  • Audit log records exports
  • Automatic cleanup of temporary files

Data Handling

  • Never log secret values
  • Secure temporary storage
  • Memory-only processing
  • Immediate cleanup after import/export

Support