ARCHIVED 2026-03-24 — All tasks completed. See
.claude-plans/deep-plan-baserow-post-migration-cleanup-2026-03-24.mdin solanasis-scripts for the execution plan.
Baserow Post-Migration Cleanup & Verification Continuation Prompt
Purpose: Copy-paste this into a new Claude Code session to complete the remaining tasks after the Baserow Cloud-to-Self-Hosted migration.
Created: 2026-03-24 Context: Migration of 6 tables (2,817 rows) from Baserow Cloud (api.baserow.io, DB 387807) to self-hosted (baserow.solanasis.com, DB 54) was completed. All data imported, all script URLs updated, all link_row relationships verified. Two repos have unpushed commits.
The Prompt
We just completed a Baserow Cloud -> Self-Hosted migration. The data migration and script updates are done and committed locally, but there are several remaining tasks to finish.
## Context
### What was done (previous session, 2026-03-24):
1. Exported 6 tables from Baserow Cloud (api.baserow.io, database 387807) to JSON files
2. Imported all 6 tables to self-hosted Baserow (baserow.solanasis.com, database 54, "Solanasis CRM")
3. Verified all row counts match and link_row relationships are intact
4. Updated 8 Python + 2 TypeScript files to read BASEROW_BASE_URL from env (was hardcoded api.baserow.io)
5. Updated FOUNDATION_TABLE_ID from 890586 to 271 in foundation-pipeline/config.py
6. Updated 3 database ID fallbacks from 387807 to 54
7. Added localhost Host header auto-detection for reverse proxy
8. Deleted placeholder table, renamed workspace to "Solanasis", database to "Solanasis CRM"
9. Archived the old migration continuation prompt
10. Prefixed old Baserow Cloud credentials in solanasis-docs/.env with HOLD_DONT_USE_
### Table inventory on self-hosted:
| Table | Rows | Self-Hosted ID |
|-------|------|----------------|
| Tag | 50 | 264 |
| Location | 32 | 265 |
| Organization | 72 | 266 |
| People | 179 | 267 |
| Meeting Notes | 38 | 272 |
| Foundation Prospects | 2446 | 271 |
### Key files:
- Migration script: `_solanasis/solanasis-scripts/scripts/migrate_cloud_to_selfhosted.py`
- Migration data (JSON exports + maps): `_solanasis/solanasis-scripts/scripts/migration-data/`
- Plan: `.claude-plans/deep-plan-baserow-migration-2026-03-24.md`
- Infrastructure docs: `_solanasis/solanasis-docs/operations/infrastructure-setup-plan.md`
- Service inventory: `_solanasis/solanasis-docs/operations/service-inventory.md`
### Credential locations:
- Self-hosted creds: `_solanasis/solanasis-scripts/.env` (BASEROW_DB_TOKEN, BASEROW_EMAIL=ds@solanasis.com)
- Old cloud creds (deprecated): `_solanasis/solanasis-docs/.env` (prefixed HOLD_DONT_USE_BASEROW_CLOUD_*)
## Remaining Tasks
### Task 1: Push both repos to remote
Both repos have unpushed commits on main:
**solanasis-scripts** (2 commits):
- `feat: migrate Baserow from cloud to self-hosted` — 12 files changed
- `fix: update migration script to read HOLD_DONT_USE_ prefixed cloud creds` — 1 file changed
**solanasis-docs** (1 commit):
- `docs: update infrastructure docs for Baserow self-hosted migration` — 3 files changed
Push both to origin/main.
### Task 2: Convert Meeting Notes "Name" field to formula
The "Name" primary field in the Meeting Notes table (ID 272) was imported as a text field with the person's name. In the original cloud Baserow, this was a formula field: `field('Person')`.
**Action:** Try to convert it via the Baserow API:
1. First check if the self-hosted Baserow API supports changing a primary field's type to formula
2. If supported: PATCH the field to type "formula" with formula "field('Person')"
3. If not supported via API: Note that it needs to be done manually in the Baserow UI (click Name column header > Edit field > change type to Formula > enter `field('Person')`)
The field currently works fine as text — this is a nice-to-have for keeping it in sync with Person changes.
### Task 3: Verify self-hosted Baserow is the active instance
Run a quick sanity check to make sure everything is pointed at self-hosted:
1. **Scripts .env check:** Verify `_solanasis/solanasis-scripts/.env` has:
- `BASEROW_BASE_URL=https://baserow.solanasis.com`
- `BASEROW_DB_TOKEN=uJOd16uiYIIMXaSOqrWlk62oVjE4Abd1`
- `BASEROW_EMAIL=ds@solanasis.com`
- `BASEROW_DATABASE_ID=54`
2. **Docs .env check:** Verify `_solanasis/solanasis-docs/.env` has:
- Old Baserow Cloud keys prefixed with `HOLD_DONT_USE_BASEROW_CLOUD_*`
- No active `BASEROW_API_KEY`, `BASEROW_EMAIL`, or `BASEROW_PASSWORD` pointing at cloud
3. **Script grep:** Run `grep -r "api\.baserow\.io" _solanasis/solanasis-scripts/ --include="*.py" --include="*.ts"` to confirm no script code still points at cloud (exceptions: the migration script itself which intentionally talks to cloud, and test fixtures)
4. **API health check:** Hit the self-hosted API to verify it's alive:
curl -s -H “Host: baserow.solanasis.com” -H “Authorization: Token uJOd16uiYIIMXaSOqrWlk62oVjE4Abd1” “http://localhost:8880/api/database/rows/table/264/?size=1&user_field_names=true”
Should return Tag table with count=50.
### Task 4: Clean up migration artifacts
The `_solanasis/solanasis-scripts/scripts/migration-data/` directory contains:
- 6 JSON export files (Tag.json, Location.json, Organization.json, People.json, Meeting_Notes.json, Foundation_Prospects.json)
- progress.json, table_id_map.json
- *_maps.json files (ID mapping files)
**Decision needed:** Ask Dmitri whether to:
- (A) Keep as backup for 1-2 weeks then delete (recommended)
- (B) Delete now — the data is all on self-hosted
- (C) Move to solanasis-data/ as a permanent archive
Either way, add `scripts/migration-data/` to `.gitignore` since these files contain raw CRM data and shouldn't be committed.
### Task 5: Baserow Cloud read-only / decommissioning plan
The Baserow Cloud instance (api.baserow.io, database 387807) still exists with the original data. Plan says to keep it as read-only backup until self-hosted is verified stable.
**Action items:**
1. Check if the cloud instance has any active integrations or webhooks that should be disabled
2. Note: The cloud DB token (HOLD_DONT_USE_BASEROW_CLOUD_API_KEY) still works — if Baserow Cloud has a concept of "read-only" mode or we want to revoke write access, do that
3. Set a reminder to decommission the cloud instance in 2-4 weeks (by 2026-04-14) if self-hosted is stable
4. When decommissioning: revoke/delete the cloud API token, delete the cloud database, and close the cloud account if it was a separate account
### Task 6: Verify README references
Check if any README.md files in solanasis-scripts or solanasis-docs reference `api.baserow.io` and update them to `baserow.solanasis.com`.
Also check the RESUME-PROMPT.md files in the pipeline directories — they may reference the old cloud database ID (387807) or URL:
- `_solanasis/solanasis-scripts/foundation-pipeline/RESUME-PROMPT.md`
- `_solanasis/solanasis-scripts/fcto-pipeline/RESUME-PROMPT.md` (if exists)
- `_solanasis/solanasis-scripts/msp-pipeline/RESUME-PROMPT.md` (if exists)
Update any stale references.
## Priority Order
1. Task 1 (push) — unblocks everything
2. Task 3 (verify) — confirm nothing is broken
3. Task 6 (README/RESUME-PROMPT) — catch stale references
4. Task 2 (formula field) — nice-to-have
5. Task 4 (cleanup) — ask Dmitri
6. Task 5 (cloud decommission) — future task, just note it
Reference: Verified Link Integrity (from migration session)
| Check | Cloud | Self-Hosted | Status |
|---|---|---|---|
| Tag rows | 50 | 50 | Match |
| Location rows | 32 | 32 | Match |
| Organization rows | 72 | 72 | Match |
| People rows | 179 | 179 | Match |
| Meeting Notes rows | 38 | 38 | Match |
| Foundation Prospects rows | 2446 | 2446 | Match |
| Org→Tags links | 15 | 15 | Match |
| Org→Location links | 30 | 30 | Match |
| People→Tags links | 102 | 102 | Match |
| People→Location links | 70 | 70 | Match |
| People→Org links | 16 | 16 | Match |
| People←>Meeting Notes | 35 | 35 | Match |
| Meeting Notes→Person | 37/38 | 37/38 | Match (1 has no person) |
| Pina bidirectional link | Yes | Yes | Match |
| Foundation single_select | Yes | Yes | Match |