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
Translate through Xcode’s export and import, one XLIFF file per language. Never editLocalizable.xcstrings by hand: Xcode is the only tool that writes it, so a translation diff holds
your language and nothing else.
Localization/fr.xcloc in Xcode, or its
Localized Contents/fr.xliff in any XLIFF editor. The export builds the app first. Commit the
catalog and not the export: Localization/ is gitignored. For the iPhone and iPad app, run the same
commands on TableProMobile/TableProMobile.xcodeproj with the TableProMobile scheme.
Plugin and package strings live in the app’s catalog, marked “Managed Manually” so that Xcode keeps
them. Run scripts/localization.py plugins --add after adding a String(localized:) to a plugin or
a package.
