Hi all! I’m setting up a clean workflow for incremental database changes in an Appwrite project. I have experience with Payload CMS, where changing collections/fields auto-generates migration files that we commit and run per environment. I couldn’t find a definitive Appwrite guide for this, so I’d love to hear how you handle it in practice.
Context Environments: dev → staging → prod (separate Appwrite projects). First deploy is easy enough with the CLI. After that, I want a reliable, incremental migration + seed flow.
Questions
Migrations: Do you rely on appwrite push for changes, or do you run code-first scripts with the server SDK (via CI or an admin Function)? Any gotchas with CLI diffs on attributes/indexes?
Promotion: How do you promote the same change through dev (local docker container) → staging (cloud hosted) → prod (tags, versioned scripts, Git-driven CI)?
**Expand/contract changes: **For renames/type changes, do you add new fields, backfill, then drop old later? How do you handle backfills safely at scale?
**Seeding static data: **Do you keep idempotent seed scripts (upserts) you can re-run anytime? Where do you store/run them?
Tracking: Do you keep a “migrations” collection to record which scripts ran, or another pattern?
**Rollbacks & backups: **What’s your rollback story and backup step before running migrations?
**Examples: **Any public repos, gists, or blog posts you recommend?
Thanks! If there’s an established pattern, I’ll summarize it here for others.
Recommended threads
- Bulk API limitations in self-hosted serv...
Environment: Appwrite Selfhost SDK: node-appwrite 28.0 Calling `upsertRows` (also applies to `createRows`/`updateRows`/`deleteRows`) with more than 100 rows fa...
- Self Hosted GitHub connection not adding...
After upgrading to 1.9.6 i noticed that i cannot search for new repositories when trying to add new functions. I removed the existing github connection via Set...
- Android SDK: Kotlin null Value Not Updat...
Hi team, I think you should check the Android SDK implementation once, as it seems to have an issue handling Kotlin **null** values. For example: When I send:...