{"id":16376153,"url":"https://github.com/felixfbecker/merkel","last_synced_at":"2026-03-07T09:31:16.677Z","repository":{"id":38954300,"uuid":"65272029","full_name":"felixfbecker/merkel","owner":"felixfbecker","description":"Handles your database migration crisis 🛄","archived":false,"fork":false,"pushed_at":"2026-02-13T21:41:20.000Z","size":470,"stargazers_count":42,"open_issues_count":40,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-02-14T04:16:16.865Z","etag":null,"topics":["database","database-migrations","git-hooks","migration","nodejs","postgresql","sql"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/felixfbecker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-08-09T07:12:36.000Z","updated_at":"2024-01-08T15:45:33.000Z","dependencies_parsed_at":"2022-08-30T22:30:39.960Z","dependency_job_id":"ff3fee62-e3d1-4376-9192-dddef947bb25","html_url":"https://github.com/felixfbecker/merkel","commit_stats":{"total_commits":218,"total_committers":8,"mean_commits":27.25,"dds":0.4128440366972477,"last_synced_commit":"d798f73a26110773630d0bccb5d36665aec9a679"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/felixfbecker/merkel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixfbecker%2Fmerkel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixfbecker%2Fmerkel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixfbecker%2Fmerkel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixfbecker%2Fmerkel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/felixfbecker","download_url":"https://codeload.github.com/felixfbecker/merkel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixfbecker%2Fmerkel/sbom","scorecard":{"id":396305,"data":{"date":"2025-08-11","repo":{"name":"github.com/felixfbecker/merkel","commit":"d798f73a26110773630d0bccb5d36665aec9a679"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":5,"reason":"Found 4/7 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: ISC License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.3 not signed: https://api.github.com/repos/felixfbecker/merkel/releases/14855302","Warn: release artifact v0.1.3 does not have provenance: https://api.github.com/repos/felixfbecker/merkel/releases/14855302"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"72 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-vfrc-7r7c-w9mx","Warn: Project is vulnerable to: GHSA-7wwv-vh3v-89cq","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-pc5p-h8pf-mvwp","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-675m-85rw-j3w4","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-xf5p-87ch-gxw2","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-fhjf-83wg-r2j9","Warn: Project is vulnerable to: GHSA-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-w7rc-rwvf-8q5r","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-4p35-cfcx-8653","Warn: Project is vulnerable to: GHSA-7f3x-x4pr-wqhj","Warn: Project is vulnerable to: GHSA-jpp7-7chh-cf67","Warn: Project is vulnerable to: GHSA-q6wq-5p59-983w","Warn: Project is vulnerable to: GHSA-j9fq-vwqv-2fm2","Warn: Project is vulnerable to: GHSA-pqw5-jmp5-px4v","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-g6ww-v8xp-vmwg","Warn: Project is vulnerable to: GHSA-r2j6-p67h-q639","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-29xr-v42j-r956","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T19:06:17.381Z","repository_id":38954300,"created_at":"2025-08-18T19:06:17.381Z","updated_at":"2025-08-18T19:06:17.381Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30210829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","database-migrations","git-hooks","migration","nodejs","postgresql","sql"],"created_at":"2024-10-11T03:23:42.491Z","updated_at":"2026-03-07T09:31:16.649Z","avatar_url":"https://github.com/felixfbecker.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# merkel\n\nHandles your database migration crisis\n\n[![npm](https://img.shields.io/npm/v/merkel.svg)](https://www.npmjs.com/package/merkel)\n[![downloads](https://img.shields.io/npm/dt/merkel.svg)](https://www.npmjs.com/package/merkel)\n[![linux build](https://img.shields.io/travis/felixfbecker/merkel/master.svg?label=linux+build)](https://travis-ci.org/felixfbecker/merkel)\n[![windows build](https://img.shields.io/appveyor/ci/felixfbecker/merkel/master.svg?label=windows+build)](https://ci.appveyor.com/project/felixfbecker/merkel/branch/master)\n[![codecov](https://codecov.io/gh/felixfbecker/merkel/branch/master/graph/badge.svg?token=BuoxrgBs54)](https://codecov.io/gh/felixfbecker/merkel)\n[![dependencies Status](https://david-dm.org/felixfbecker/merkel/status.svg)](https://david-dm.org/felixfbecker/merkel)\n![node](https://img.shields.io/node/v/merkel.svg)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)\n[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)\n[![license](https://img.shields.io/npm/l/merkel.svg)](https://github.com/felixfbecker/merkel/blob/master/LICENSE.txt)\n[![chat: on gitter](https://badges.gitter.im/felixfbecker/merkel.svg)](https://gitter.im/felixfbecker/merkel?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge)\n\n`merkel` is a framework-agnostic database migration tool designed to autonomously run in Continuous Deployment,\nwith rollbacks in mind.\n\n## Installation\n\n`npm install --global merkel` or `npm install --save-dev merkel`\n\nRun `merkel init` to initialize a `.merkelrc.json` and install a git hook\n\n\u003e **Is the `.merkelrc.json` required?**  \n\u003e No, but it holds the migration directory, and if you use it, you could change it later\n\u003e because the migration directory at any time is known through git.\n\n\u003e **Is the git hook required?**  \n\u003e No, but it helps you type less. Read on to learn more.\n\n## Workflow\n\n### Make changes to your model files\n\nLet's say you made some changes to your model files that require a database migration.\n\n### Generate a migration file\n\nBefore you commit, create a new migration file by running `merkel generate`.\nThis will generate a new migration file inside your migration directory (default `./migrations`).\nIf a `tsconfig.json` was detected, the migration file will be in TypeScript.\nYou can change the migration directory with `--migration-dir` and provide a custom template with `--template`.\nLike all options, they can also be set in `.merkelrc.json` or passed through environment variables.\nThe name of the migration file can be set with `--name`. By default, a UUID is used.\n\n\u003e **Why UUIDs?**  \n\u003e In opposite to sequential IDs or timestamps, UUIDs allow separate developers to write migration files without any\n\u003e conflicts. There can be migration files introduced in separate git branches or commits with migration files even\n\u003e cherry-picked across repositories, they will not create merge conflicts.\n\u003e This works well with the distributed nature of git.\n\u003e Providing a custom, unique name is equally good.\n\n### Write your migration file\n\nYou migration file exports two functions: `up` and `down`.\nThe `up` function is expected to make all necessary database changes compared to the previous commit.\nThe `down` function should try to reverse as good as possible. Both functions should return a Promise.\nYour migration file can use any dependency you want to execute this task, import a database connection,\nuse a low-level driver or high-level ORM, use the AWS SDK, spawn child processes...\n\nExample:\n\n```js\nconst db = require('../db')\n\nexports.up = function up() {\n  return new Promise((resolve, reject) =\u003e db.connect(err =\u003e (err ? reject(err) : resolve()))).then(() =\u003e\n    db.query('ALTER TABLE order_details RENAME COLUMN notes TO order_notes')\n  )\n}\n\nexports.down = function down() {\n  return new Promise((resolve, reject) =\u003e db.connect(err =\u003e (err ? reject(err) : resolve()))).then(() =\u003e\n    db.query('ALTER TABLE order_details RENAME COLUMN order_notes TO notes')\n  )\n}\n```\n\nWhere `db.js` could look like this:\n\n```js\nconst pg = require('pg')\n\nmodule.exports = new pg.Client(process.env.DB)\n```\n\n### Commit\n\nAdd your model changes and the migration file, and run `git commit`.\nIf you installed the git hook, you will see that merkel detected that you added a migration file and included a\ncommand like this in your commit message:\n\n```\n[merkel up d12f99e4-710d-4d4a-94f8-13d9d121bac5]\n```\n\nThis command will later be parsed by `merkel migrate`.\n\n### Migrate\n\nAfter checking out the new commit in Continuous Deployment or on a coworker's machine, run `merkel migrate`.\nmerkel will query the database's `merkel_meta` table for the last migration run, and what the `HEAD` was when that\nmigration was run.\n\nTo be able to do this, you must provide `merkel` with a database connection URI.\nYou can do this either through the `--db` option or through the `MERKEL_DB` environment variable.\nIt is not recommended to save this in the `.merkelrc.json` file, as connection data differs across environments.\n\nTo query the database, `merkel` needs a database driver.\nThe driver is detected through the protocol part of the connection URI.\nIn order to allow many dialects, it is not a dependency of `merkel`, but instead `require`d from the current working\ndirectory, which means you need one installed in your project (you probably already have). See [supported dialects](#supported-dialects).\n\n`merkel` then asks `git` which commits were made since then the last migration.\nIt then scans the new commits for the `merkel` commands like you saw in the example above.\n\n```\nPending migrations:\n```\n\n\u003e The confirmation prompt will only show up if run in a TTY context and can be disabled with `--confirm=false`.\n\u003e To get only status output, run `merkel status`.\n\n`merkel` will then execute the migrations in that exact order, and log these in the database as they happen.\n\n## But...\n\n### What if a migration fails?\n\nIf a migration fails (throws an exception / returns a rejected promise), the schema your source files expect doesn't\nmatch your database schema anymore. You now have two options:\n\n* Quickly fix the migration file in a separate commit.\n  That commit message should _not_ include any `merkel` command.\n  The next `merkel migrate` execution will then start where it migration chain broke and will still run the migration\n  files in the order they were specified in the commit messages, but with the newest version of the migration file.\n* Completely revert the deployment to the previous state, see reverting migrations\n\n### What if I need to revert a deployment?\n\n#### Reverting a deployment with `git revert`\n\nWhen you do a `git revert`, normally `git` will create a commit that is the exact inverse of the commits you want to\ninvert. This means, if one of the commits added a migration file, it will now be deleted. **This is not desirable**.\nInstead of deleting the migration files, you want to keep them, but let `merkel` migrate them _down_.\n\nTo accomplish this, make sure to run `git revert` with the `--no-commit`/`-n` option.\nThis will not make the commit immediately, but only stage the proposed changes, allowing you to edit them.\n\nRun `git status` to see if any migration files got deleted. If yes, you can unstage the whole migration dir with\n\n    git reset HEAD migrations\n\nAnd then bring them back with\n\n    git checkout -- migrations\n\nNow we only need to tell `merkel` that we want to run down migrations.\nRun `git commit`, and in the commit message, add a `merkel down` command with all the migrations that need to be undone.\nThe command can look like this:\n\n    [merkel down 6e28dcef-16f8-4a81-8783-aedc93043fa4]\n    [merkel down bab251c6-4aee-4137-8a83-6e6fcab29cdf]\n    [merkel down 43b15c65-2f6d-447d-bbcf-0efe3a34fd10]\n\nOr multi-line like this:\n\n    [\n      merkel down\n      6e28dcef-16f8-4a81-8783-aedc93043fa4\n      bab251c6-4aee-4137-8a83-6e6fcab29cdf\n      43b15c65-2f6d-447d-bbcf-0efe3a34fd10\n    ]\n\nThe order is important here!\n\n#### Reverting a deployment with `git reset`\n\nLet's imagine you are using a `production` branch which always points to a specific commit on `master`, and regularly\ngets updated with `git reset` to point to a new or older commit.\nAfter you `git push --force`, the current `HEAD` will suddenly be _behind_ the last migration run in the database.\n`merkel` will detect this automatically, and run the migrations between `HEAD` and the last migrations _down_ and in\nreverse order.\n\n### What if I checkout an older commit on my dev machine?\n\nThe same applies as for Reverting a deployment with git reset.\n\n### What if I want to change the migration directory?\n\nIf you are using a `.merkelrc.json` that has the migration dir specified, `merkel` will use `git show` to get the\nmigration directory at the time the commit was made.\n\nIf not, then this is not possible without using the ability to run old migrations.\n\n## Programmatic usage\n\nYou can use merkel programmatically, for example in your favourite task runner.\nAPI documentation is available [here](http://merkel.surge.sh/).\n\nTypeScript definitions are included.\n\n## Supported dialects\n\nCurrently only PostgreSQL. [pg](https://github.com/brianc/node-postgres) version ^6 must be installed in your project.\n\n---\n\n\u003e _Wir schaffen das._ – Angela Merkel\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixfbecker%2Fmerkel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelixfbecker%2Fmerkel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixfbecker%2Fmerkel/lists"}