<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ptah Database Migrations</title><description>Practical guides to database schema changes with Ptah.</description><link>https://blog.ptah.run/</link><item><title>From Atlas to Ptah: Keep the History, Control the Deployment</title><link>https://blog.ptah.run/posts/from-atlas-to-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/from-atlas-to-ptah/</guid><description>Continue an Atlas migration history with Ptah, catch a changed payment-queue view, and test both CLIs without external network access.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><category>postgres</category><category>migrations</category><category>schema</category></item><item><title>A Supabase Image as the Atlas Dev Database, Grants Included</title><link>https://blog.ptah.run/posts/supabase-dev-image-grants/</link><guid isPermaLink="true">https://blog.ptah.run/posts/supabase-dev-image-grants/</guid><description>Generate migrations against a dev database built from supabase/postgres while Ptah Compat keeps the image&apos;s grants and serial sequences intact.</description><pubDate>Sun, 04 Oct 2026 10:00:00 GMT</pubDate><category>postgres</category><category>migrations</category><category>schema</category><category>atlas drop-in</category></item><item><title>Database Migrations Without Kubernetes: A Ptah CI Pipeline</title><link>https://blog.ptah.run/posts/ci-migrations-without-kubernetes/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ci-migrations-without-kubernetes/</guid><description>Run a dispatch worker only after its migration and schema checks pass, then test drift, SQL failure, retries, and cancellation.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>postgres</category><category>migrations</category><category>ci</category></item><item><title>Transactional SQLite Upgrades and Full-Text Search with Ptah</title><link>https://blog.ptah.run/posts/mailcollector-sqlite-migrations-fts5/</link><guid isPermaLink="true">https://blog.ptah.run/posts/mailcollector-sqlite-migrations-fts5/</guid><description>We tested Ptah in MailCollector to turn repeated startup schema changes into recorded upgrades and add FTS5 search while preserving existing mail.</description><pubDate>Sat, 03 Oct 2026 10:32:32 GMT</pubDate><category>case study</category><category>sqlite</category><category>migrations</category><category>schema</category></item><item><title>Replacing Atlas CE in Scooter to Generate Function and Trigger Migrations</title><link>https://blog.ptah.run/posts/scooter-postgresql-triggers/</link><guid isPermaLink="true">https://blog.ptah.run/posts/scooter-postgresql-triggers/</guid><description>We tested Ptah Compat in Scooter&apos;s existing migration workflow, adding PostgreSQL functions and triggers to desired SQL while preserving Atlas history.</description><pubDate>Sat, 03 Oct 2026 08:36:25 GMT</pubDate><category>case study</category><category>postgres</category><category>migrations</category><category>schema</category><category>atlas drop-in</category></item><item><title>What Migration Linters Catch Before Production</title><link>https://blog.ptah.run/posts/migration-linters-before-production/</link><guid isPermaLink="true">https://blog.ptah.run/posts/migration-linters-before-production/</guid><description>Reproduce lost column values, blocked writers, and a failing NOT NULL change, then compare the database results with Ptah&apos;s warnings and exit codes.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><category>postgres</category><category>migrations</category></item><item><title>Ptah 0.12.0: Conditional PostgreSQL Roles in Desired SQL</title><link>https://blog.ptah.run/posts/ptah-0-12-0/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-0-12-0/</guid><description>Ptah 0.12.0 reads conditional PostgreSQL role declarations. Catch up on SQL preservation, migration loading, and container updates since 0.11.0.</description><pubDate>Fri, 02 Oct 2026 18:30:00 GMT</pubDate><category>releases</category><category>postgres</category><category>migrations</category></item><item><title>Changing Embedding Models: Zengram Before and After Ptah</title><link>https://blog.ptah.run/posts/zengram-embedding-generations/</link><guid isPermaLink="true">https://blog.ptah.run/posts/zengram-embedding-generations/</guid><description>We tested a small Zengram integration that builds replacement embeddings with Ptah while old search keeps serving, then coordinates the final handover.</description><pubDate>Fri, 02 Oct 2026 16:00:00 GMT</pubDate><category>case study</category><category>postgres</category><category>migrations</category></item><item><title>Replacing Atlas with Ptah: Preserve History and Reject Invalid Indexes</title><link>https://blog.ptah.run/posts/akashi-atlas-migration-handover/</link><guid isPermaLink="true">https://blog.ptah.run/posts/akashi-atlas-migration-handover/</guid><description>We tested Akashi&apos;s TimescaleDB migrations with Ptah Compat: the Atlas history stays readable, while an invalid concurrent index blocks migration success.</description><pubDate>Fri, 02 Oct 2026 10:00:00 GMT</pubDate><category>case study</category><category>postgres</category><category>migrations</category><category>schema</category><category>atlas drop-in</category></item><item><title>Atlas CE Doesn&apos;t Manage Postgres RLS. Ptah Does.</title><link>https://blog.ptah.run/posts/tasks-rls-desired-state/</link><guid isPermaLink="true">https://blog.ptah.run/posts/tasks-rls-desired-state/</guid><description>Atlas Community leaves PostgreSQL row-level security outside schema management. We tested Ptah Compat to manage tables, RLS policies, and grants together.</description><pubDate>Fri, 02 Oct 2026 02:00:00 GMT</pubDate><category>case study</category><category>postgres</category><category>schema</category><category>migrations</category><category>atlas drop-in</category></item><item><title>Generating erun&apos;s PostgreSQL Migrations with Ptah Compat</title><link>https://blog.ptah.run/posts/erun-atlas-drop-in/</link><guid isPermaLink="true">https://blog.ptah.run/posts/erun-atlas-drop-in/</guid><description>Keep erun&apos;s Atlas commands and migration history while generating PostgreSQL triggers, RLS policies, grants, and conditional role declarations.</description><pubDate>Fri, 02 Oct 2026 00:35:22 GMT</pubDate><category>case study</category><category>postgres</category><category>migrations</category><category>schema</category><category>atlas drop-in</category></item><item><title>Adding pgvector Search Without Serving Stale Embeddings</title><link>https://blog.ptah.run/posts/pgvector-search-with-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/pgvector-search-with-ptah/</guid><description>Use Ptah and a real local model to add vector search, catch source changes, test retrieval, and refuse a cutover whose evidence is out of date.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><category>postgres</category><category>migrations</category><category>schema</category></item><item><title>Doctrine Models with Ptah: Reviewing SQL Before Deployment</title><link>https://blog.ptah.run/posts/doctrine-models-with-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/doctrine-models-with-ptah/</guid><description>Keep Doctrine entities and queries, use Ptah to review and rehearse SQL migrations, and compare the result with Doctrine&apos;s native migration workflow.</description><pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate><category>orm</category><category>migrations</category><category>postgres</category></item><item><title>Replacing HCI&apos;s Atlas Workaround with Ptah Compat</title><link>https://blog.ptah.run/posts/hci-postgresql-desired-state/</link><guid isPermaLink="true">https://blog.ptah.run/posts/hci-postgresql-desired-state/</guid><description>We replaced HCI&apos;s split Atlas and psql schema deployment with one Ptah Compat desired state, preserving functions, triggers, and pgvector indexes.</description><pubDate>Wed, 30 Sep 2026 06:47:12 GMT</pubDate><category>case study</category><category>postgres</category><category>schema</category><category>migrations</category><category>atlas drop-in</category></item><item><title>Ptah 0.11.0: A Schema Plan Can Span a MySQL Server</title><link>https://blog.ptah.run/posts/ptah-0-11-0/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-0-11-0/</guid><description>Plan several MySQL databases together, defer PostgreSQL constraint validation, and keep index options with Ptah 0.11.0.</description><pubDate>Wed, 30 Sep 2026 00:40:00 GMT</pubDate><category>releases</category><category>migrations</category><category>mysql</category><category>postgres</category></item><item><title>GORM with a Reviewed Ptah Migration</title><link>https://blog.ptah.run/posts/gorm-with-reviewed-migrations/</link><guid isPermaLink="true">https://blog.ptah.run/posts/gorm-with-reviewed-migrations/</guid><description>Move schema changes out of a Go application&apos;s startup, adopt its existing GORM database with Ptah, and deploy a reviewed change before starting the new code.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>orm</category><category>migrations</category><category>postgres</category></item><item><title>SQLAlchemy Models, Ptah Migration Review</title><link>https://blog.ptah.run/posts/sqlalchemy-models-with-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/sqlalchemy-models-with-ptah/</guid><description>Turn an Alembic development schema into a reviewed Ptah migration, then catch a missing database default that successful SQLAlchemy inserts can hide.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>orm</category><category>migrations</category><category>postgres</category></item><item><title>Atlas CE Drop-In Replacement: What ptah-compat Found in wpmgr</title><link>https://blog.ptah.run/posts/atlas-ce-drop-in-replacement/</link><guid isPermaLink="true">https://blog.ptah.run/posts/atlas-ce-drop-in-replacement/</guid><description>We ran ptah-compat, an Atlas CE drop-in replacement, on wpmgr. It wrote an RLS policy migration Atlas CE skipped, and found schema.sql out of date.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>case study</category><category>migrations</category><category>postgres</category><category>schema</category><category>atlas drop-in</category></item><item><title>The Ptah Playground Now Runs PostgreSQL</title><link>https://blog.ptah.run/posts/postgresql-in-the-playground/</link><guid isPermaLink="true">https://blog.ptah.run/posts/postgresql-in-the-playground/</guid><description>play.ptah.run now runs PostgreSQL 18.3 in your browser tab through PGlite. A new scenario queries JSONB, then plans and applies a GIN index with Ptah.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>postgres</category><category>schema</category></item><item><title>Prisma Models, Ptah Deployment Checks</title><link>https://blog.ptah.run/posts/prisma-models-with-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/prisma-models-with-ptah/</guid><description>Keep Prisma models and its typed client, export the desired PostgreSQL schema, and use Ptah to plan, verify, and deploy a new ticket-priority field and index.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>orm</category><category>migrations</category><category>postgres</category></item><item><title>Ptah 0.10.0: A Dev Database Has to Be Empty</title><link>https://blog.ptah.run/posts/ptah-0-10-0/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-0-10-0/</guid><description>Ptah 0.10.0 refuses a dev database that holds anything its reset would drop. This post also covers Ptah 0.9.0, which had no post of its own.</description><pubDate>Sun, 27 Sep 2026 20:30:00 GMT</pubDate><category>releases</category><category>migrations</category><category>postgres</category><category>mysql</category></item><item><title>Moving a Go Service from golang-migrate to Ptah</title><link>https://blog.ptah.run/posts/from-golang-migrate-to-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/from-golang-migrate-to-ptah/</guid><description>Import existing SQL migration pairs, keep the old history table intact, and verify a Go queue worker against the next schema change deployed by Ptah.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>migrations</category><category>postgres</category></item><item><title>From Liquibase to Ptah with a Verified Starting Point</title><link>https://blog.ptah.run/posts/from-liquibase-to-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/from-liquibase-to-ptah/</guid><description>Move a PostgreSQL subscription service from a Liquibase SQL changelog to Ptah, preserving its data and checking the imported rollback before the next change.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>migrations</category><category>postgres</category></item><item><title>Ptah 0.8.1: The Online Migration Takes a Lock Timeout</title><link>https://blog.ptah.run/posts/ptah-0-8-1/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-0-8-1/</guid><description>Ptah 0.8.1 runs the generated online migration under a lock timeout, and ptah-compat now applies and lints an Atlas project on TimescaleDB.</description><pubDate>Fri, 25 Sep 2026 07:00:00 GMT</pubDate><category>releases</category><category>migrations</category><category>postgres</category></item><item><title>From Flyway to Ptah Without Replaying Production</title><link>https://blog.ptah.run/posts/from-flyway-to-ptah/</link><guid isPermaLink="true">https://blog.ptah.run/posts/from-flyway-to-ptah/</guid><description>Import a Flyway history, verify it against an existing PostgreSQL database, and let Ptah apply the next change while preserving the application&apos;s data.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>migrations</category><category>postgres</category></item><item><title>Shipping a Schema Through Harbor by Digest</title><link>https://blog.ptah.run/posts/schema-artifacts-through-harbor/</link><guid isPermaLink="true">https://blog.ptah.run/posts/schema-artifacts-through-harbor/</guid><description>Publish a schema to Harbor with Ptah, promote the same artifact, and prove that a digest-pinned Kubernetes deployment changes only when you select new content.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>oci</category><category>kubernetes</category><category>schema</category></item><item><title>A Big Update to the Ptah Playground</title><link>https://blog.ptah.run/posts/ptah-in-a-browser-tab/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-in-a-browser-tab/</guid><description>The real Ptah CLI in your browser tab, against SQLite. What&apos;s new: guided steps, change marks in the editor, and a layout for phones.</description><pubDate>Wed, 23 Sep 2026 18:37:00 GMT</pubDate><category>schema</category><category>migrations</category></item><item><title>Ptah 0.8.0: Change a Schema, Then Check What It Did</title><link>https://blog.ptah.run/posts/ptah-0-8-0/</link><guid isPermaLink="true">https://blog.ptah.run/posts/ptah-0-8-0/</guid><description>What Ptah 0.8.0 adds for changing a schema under a running application and checking afterwards what the change did, and where each part stops.</description><pubDate>Tue, 22 Sep 2026 22:41:51 GMT</pubDate><category>releases</category><category>migrations</category><category>schema</category><category>postgres</category></item><item><title>Your First Schema Change with the Ptah Kubernetes Operator</title><link>https://blog.ptah.run/posts/first-schema-with-kubernetes-operator/</link><guid isPermaLink="true">https://blog.ptah.run/posts/first-schema-with-kubernetes-operator/</guid><description>Publish a shipment schema with Ptah, inspect the operator&apos;s plan, approve that exact change, and verify the database has converged.</description><pubDate>Tue, 22 Sep 2026 22:06:23 GMT</pubDate><category>kubernetes</category><category>schema</category><category>postgres</category></item><item><title>An AI Agent That Waits for Your Approval</title><link>https://blog.ptah.run/posts/an-agent-that-waits-for-approval/</link><guid isPermaLink="true">https://blog.ptah.run/posts/an-agent-that-waits-for-approval/</guid><description>A screencast of Ptah Assist: a model using Ptah&apos;s own tools to propose a schema change, with every write held until it is approved.</description><pubDate>Tue, 22 Sep 2026 15:33:55 GMT</pubDate><category>schema</category><category>migrations</category></item><item><title>Making Order Currency Required While Checkout Keeps Writing</title><link>https://blog.ptah.run/posts/required-currency-without-stopping-checkout/</link><guid isPermaLink="true">https://blog.ptah.run/posts/required-currency-without-stopping-checkout/</guid><description>Use Ptah to make order currency required while old and new checkout writers run, with a measured PostgreSQL workload and bounded lock waits.</description><pubDate>Mon, 21 Sep 2026 22:14:41 GMT</pubDate><category>postgres</category><category>migrations</category></item><item><title>Same Migrations, Different Schemas: Adopting a Production Hotfix Back into Git</title><link>https://blog.ptah.run/posts/same-migrations-different-schemas/</link><guid isPermaLink="true">https://blog.ptah.run/posts/same-migrations-different-schemas/</guid><description>Detect schema drift with Ptah and adopt a production hotfix into Git while preserving the existing PostgreSQL index.</description><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><category>postgres</category><category>migrations</category><category>schema</category></item></channel></rss>