> ## Documentation Index
> Fetch the complete documentation index at: https://ngquct-docs-analytics-consent.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Development Overview

> Build TablePro from source, contribute, or write a database driver plugin

Two files in the repo root outrank these pages.
[`CLAUDE.md`](https://github.com/TableProApp/TablePro/blob/main/CLAUDE.md) holds the architecture
invariants and the rules a change has to meet before it merges;
[`CONTRIBUTING.md`](https://github.com/TableProApp/TablePro/blob/main/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.

<CardGroup cols={2}>
  <Card title="Setup" icon="wrench" href="/development/setup">
    Clone, download the libraries, generate the project, build.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/development/architecture">
    Module layout, plugin system, editor pipeline.
  </Card>

  <Card title="Building" icon="hammer" href="/development/building">
    Debug builds, the plugin compile check, tests, pull request CI.
  </Card>

  <Card title="Releasing" icon="ship" href="/development/releasing">
    Release builds, notarization, DMG, static libraries, the release tag.
  </Card>

  <Card title="Code Style" icon="indent" href="/development/code-style">
    Lint and format config, naming, the rules CI enforces.
  </Card>

  <Card title="Plugin Development" icon="puzzle-piece" href="/development/plugin-development">
    Write a driver plugin against TableProPluginKit.
  </Card>

  <Card title="Testing a Custom Plugin" icon="flask" href="/development/testing-plugins">
    Load a locally built plugin in a debug build.
  </Card>

  <Card title="Plugin Registry" icon="box" href="/development/plugin-registry">
    Publish and distribute database driver plugins.
  </Card>
</CardGroup>

## Translating the app

Translate through Xcode's export and import, one XLIFF file per language. Never edit
`Localizable.xcstrings` by hand: Xcode is the only tool that writes it, so a translation diff holds
your language and nothing else.

```bash theme={null}
xcodebuild -exportLocalizations -project TablePro.xcodeproj -scheme TablePro \
    -localizationPath Localization -exportLanguage fr
xcodebuild -importLocalizations -project TablePro.xcodeproj -localizationPath Localization/fr.xcloc
scripts/localization.py status              # coverage, per language
```

Between the two commands, translate `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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.