Skip to main content
Two files in the repo root outrank these pages. CLAUDE.md holds the architecture invariants and the rules a change has to meet before it merges; CONTRIBUTING.md holds branch names, the commit format, and the pull request checklist. Both are maintained next to the code they describe, and where either disagrees with a page here, it wins. What these pages add is the part neither file carries: the exact commands, the tool versions behind them, and the plugin SDK.

Setup

Clone, download the libraries, generate the project, build.

Architecture

Module layout, plugin system, editor pipeline.

Building

Debug builds, the plugin compile check, tests, pull request CI.

Releasing

Release builds, notarization, DMG, static libraries, the release tag.

Code Style

Lint and format config, naming, the rules CI enforces.

Plugin Development

Write a driver plugin against TableProPluginKit.

Testing a Custom Plugin

Load a locally built plugin in a debug build.

Plugin Registry

Publish and distribute database driver plugins.

Translating the app

Interface strings live in one .xcstrings catalog that interleaves every language inside every key, so a hand edit means working next to languages you do not speak. scripts/localization.py gives one flat JSON file per language instead:
Edit the translation values in the exported file, then import. Add --target ios for the iPhone and iPad app, which has a catalog of its own. Commit the catalog and not the export: Localization/ is gitignored, and a merge rewrites only the strings that changed, so the diff shows the translation and nothing else. Run scripts/localization.py verify after changing the script. It re-reads and rewrites each catalog and checks the result is byte for byte identical.