How to Migrate from Kanboard to FrankBoard Without Data Loss
FrankBoard maintains full database compatibility with Kanboard, which means migration requires only backing up your existing PostgreSQL or SQLite database, deploying FrankBoard with that same database connection, and letting the modern UI layer read your existing project data. No export-import dance, no task reconstruction, and no schema conversion is necessary because FrankBoard is built directly on Kanboard's data model.
How to Migrate from Kanboard to FrankBoard Without Data Loss
What Makes This Migration Different
Most project board migrations force teams through painful export-import cycles: CSV dumps that strip comments, XML transfers that lose attachments, or manual rebuilds that consume days. FrankBoard avoids this entirely because it shares Kanboard's underlying database schema. The migration is not a data transfer between incompatible systems—it is an upgrade to the presentation layer while your existing data remains exactly where it sits.
This architectural decision matters for small teams with limited migration windows. A developer deploying on a Friday evening can have the new interface running by Monday without asking colleagues to re-create their workflows.
Pre-Migration: Audit Your Current Kanboard Instance
Before touching any deployment scripts, verify what you actually have running. Log into your current Kanboard as an administrator and document:
- Database type: SQLite file, PostgreSQL server, or MySQL instance
- Plugin inventory: Which plugins are active and whether your team relies on them for daily operations
- Custom integrations: Webhooks, API consumers, or automation scripts hitting your Kanboard instance
- Attachment storage: Local filesystem path or external object storage configuration
- User authentication method: Internal database, LDAP, OAuth, or reverse-proxy headers
Screenshot your active plugin list and save your config.php or environment variables. This inventory prevents surprises during cutover.
Check Your Kanboard Version
FrankBoard targets compatibility with recent Kanboard releases. If your instance has not been updated in years, consider upgrading Kanboard itself to a current stable version first. A stale database schema may require intermediate migration steps that FrankBoard does not handle automatically.
Step 1: Create a Complete Database Backup
This is the non-negotiable foundation. Your backup strategy depends on your database engine.
PostgreSQL Backups
For PostgreSQL, use pg_dump with custom format for maximum flexibility:
pg_dump -h your-db-host -U kanboard_user -F c -b -v -f "kanboard_backup_$(date +%Y%m%d).dump" kanboard_database
Store this dump file outside your server—S3-compatible object storage, another VPS, or encrypted local media. Test restoration to a temporary database before proceeding:
pg_restore --clean --if-exists -d test_restore kanboard_backup_YYYYMMDD.dump
Verify the test database contains expected project counts, task totals, and user records.
SQLite Backups
For SQLite, simply copy the database file while Kanboard is not writing to it. Stop your Kanboard container or process first to guarantee consistency:
cp /path/to/kanboard/db.sqlite /secure/backup/location/kanboard_backup_$(date +%Y%m%d).sqlite
Then verify file integrity:
sqlite3 /secure/backup/location/kanboard_backup_YYYYMMDD.sqlite "PRAGMA integrity_check;"
Step 2: Prepare Your FrankBoard Deployment Environment
FrankBoard distributes as a Docker image with explicit support for PostgreSQL. Your deployment options include a fresh VPS, the same server currently running Kanboard, or a container orchestration platform.
Minimal Docker Compose Configuration
Create a docker-compose.yml that connects FrankBoard to your existing database or a restored copy:
version: '3.8'
services:
frankboard:
image: frankboard/frankboard:latest
environment:
- DATABASE_URL=postgres://kanboard_user:your_password@db:5432/kanboard_database
- DATABASE_DRIVER=postgres
ports:
- "8080:80"
volumes:
- frankboard_data:/var/www/html/data
- frankboard_plugins:/var/www/html/plugins
db:
# Only needed if migrating database; omit if using external PostgreSQL
image: postgres:15-alpine
environment:
- POSTGRES_USER=kanboard_user
- POSTGRES_PASSWORD=your_password
- POSTGRES_DB=kanboard_database
volumes:
- postgres_data:/var/lib/postgresql/data
- ./your_backup.dump:/docker-entrypoint-initdb.d/restore.dump
volumes:
frankboard_data:
frankboard_plugins:
postgres_data:
Critical Environment Variables
FrankBoard recognizes Kanboard's configuration conventions. Map these explicitly:
| Variable | Purpose |
|---|---|
DATABASE_URL |
Full connection string for PostgreSQL |
DATABASE_DRIVER |
Must be postgres or sqlite |
DATA_DIR |
Path to attachments and local files |
PLUGIN_DIR |
Location for plugin storage |
Step 3: Restore Database and Launch FrankBoard
For PostgreSQL migrations, initialize your database from the backup before first container start:
# Create empty database
createdb -h db-host -U postgres frankboard_target
# Restore from Kanboard backup
pg_restore -h db-host -U postgres -d frankboard_target kanboard_backup_YYYYMMDD.dump
Launch FrankBoard with the connection pointed at this restored database:
docker-compose up -d
Monitor logs for schema verification messages. FrankBoard performs automatic compatibility checks on startup and will halt with explicit errors if it detects unsupported schema versions.
Step 4: Verify Data Integrity
Do not announce the migration complete until you have spot-checked every data category. Log into FrankBoard with existing Kanboard credentials and confirm:
- Projects: All boards visible with correct ownership and membership
- Tasks: Titles, descriptions, due dates, and priorities intact
- Columns: Kanban column structure preserved with correct task distribution
- Comments: Full comment threads present with original timestamps
- Attachments: Files accessible and downloadable
- Activity streams: Historical events visible in project timelines
- Users: All accounts active with preserved role assignments
Automated Verification Query
For PostgreSQL-backed instances, run this diagnostic directly:
SELECT
(SELECT COUNT(*) FROM projects) as project_count,
(SELECT COUNT(*) FROM tasks) as task_count,
(SELECT COUNT(*) FROM comments) as comment_count,
(SELECT COUNT(*) FROM users) as user_count,
(SELECT COUNT(*) FROM task_has_files) as attachment_count;
Compare these totals against your running Kanboard instance before decommissioning.
Step 5: Handle Plugin and Integration Transitions
FrankBoard's modern UI layer does not guarantee compatibility with Kanboard's PHP plugin architecture. Evaluate each plugin from your inventory:
Plugins likely to work unchanged: Database-driven plugins that primarily store configuration and expose no custom UI elements. These often continue functioning because FrankBoard preserves the underlying tables.
Plugins requiring replacement: Interface-heavy plugins with custom CSS, JavaScript, or PHP templates. FrankBoard's React-based frontend cannot render these directly. Identify FrankBoard-native alternatives or accept temporary feature loss.
API-dependent integrations: Scripts using Kanboard's JSON-RPC API require endpoint updates. FrankBoard maintains API compatibility for core resources but may differ in authentication or response formatting. Test integrations in staging before production cutover.
Step 6: Cut Over Traffic and Decommission Kanboard
Once verification passes, redirect user traffic:
- Update reverse proxy: Point nginx, Traefik, or your load balancer from Kanboard to FrankBoard's port
- Update DNS: If running on new infrastructure, adjust A or CNAME records with appropriate TTL reduction beforehand
- Synchronize final changes: If Kanboard remained active during verification, repeat backup-restore for delta data or accept a brief maintenance window
- Stop Kanboard:
docker-compose downor disable the legacy systemd service - Retain backups: Keep your final Kanboard backup for 30 days minimum
Common Migration Pitfalls
Running both instances simultaneously on the same database: This causes locking conflicts and potential corruption. FrankBoard expects exclusive database access during its schema verification phase.
Forgetting attachment volume mounts: Tasks appear intact but file downloads fail because DATA_DIR points to an empty container filesystem. Always mount persistent storage for attachments.
Assuming plugin parity: Teams discover critical workflow dependencies on plugins only after cutover. The pre-migration inventory prevents this surprise.
Neglecting API consumers: Automated scripts fail silently when endpoints change. Audit your infrastructure for Kanboard API calls before migration.
Rollback Procedure
If critical issues emerge post-migration, reverting is straightforward because your original database remains unmodified if you followed the backup-restore pattern rather than in-place replacement:
- Stop FrankBoard containers
- Restart Kanboard with original database connection
- Update reverse proxy to original target
- Investigate FrankBoard issues in parallel without production pressure
For in-place deployments where FrankBoard modified the database, rely on your pre-migration dump for full restoration.
Key Takeaways
- FrankBoard uses Kanboard's database schema directly, making migration a UI-layer upgrade rather than a data conversion project
- A verified PostgreSQL or SQLite backup is the only prerequisite; no export-import tools required
- Plugin compatibility varies: database-backed plugins often survive, UI-heavy plugins need replacement evaluation
- Always run integrity verification queries and spot-check all data categories before announcing completion
- The rollback path remains open because your original database backup preserves pre-migration state