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:
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.
