Requirements: macOS 14.0+, Xcode 26.0+, XcodeGen. Optional: SwiftLint, SwiftFormat, GitHub CLI (gh).
Fork the repo on GitHub, then:
git clone https://github.com/<your-fork>/TablePro.git && cd TablePro
brew install xcodegen swiftlint swiftformat
scripts/download-libs.sh
scripts/generate-project.shTablePro.xcodeproj is generated from project.yml and is not in git. Re-run
scripts/generate-project.sh whenever you change project.yml or Configs/, and whenever you
add, move, or delete a source file. Never hand-edit the generated project: the next generate
throws the edit away.
Copy the template and fill in your own team. Configs/Secrets.xcconfig is gitignored, so your
signing settings can never reach a commit and they survive regenerating the project.
cp Configs/Secrets.xcconfig.example Configs/Secrets.xcconfigTABLEPRO_DEVELOPMENT_TEAM = YOUR_TEAM_ID
TABLEPRO_APP_BUNDLE_IDENTIFIER = com.<yourhandle>.TablePro
The Debug configuration already uses TablePro/TablePro.Debug.entitlements, which drops iCloud
because free teams don't support it. Sync auto-disables at runtime.
Don't change signing in the Xcode UI: the project is generated, so the next
scripts/generate-project.sh discards it.
To verify: save a connection password, relaunch, reopen. The password should still be there.
Build:
xcodebuild -project TablePro.xcodeproj -scheme TablePro -configuration Debug build -skipPackagePluginValidationTests:
xcodebuild -project TablePro.xcodeproj -scheme TablePro test -skipPackagePluginValidation.swiftlint.yml and .swiftformat are the source of truth. The short version:
- 4-space indent, 120-char lines
- Explicit access control (
private,internal,public) - No force unwraps (
!) or force casts (as!) String(localized:)for user-facing strings- OSLog only, no
print()
Before committing:
swiftlint lint --strict
swiftformat .Conventional Commits, single line, no body.
feat: add CSV export for query results
fix: prevent crash on empty query result
docs: update keyboard shortcuts page
Branch off main:
feat/add-cassandra-supportfix/query-editor-crashdocs/update-keyboard-shortcuts
One logical change per PR. Make sure tests pass and lint is clean.
Checklist:
- Tests added or updated
-
CHANGELOG.mdupdated under[Unreleased](skip for unreleased-only fixes) - Docs updated in
docs/if the change affects user-facing behavior - User-facing strings localized
- No SwiftLint/SwiftFormat violations
project.yml Xcode project definition (XcodeGen); .xcodeproj is generated, not in git
Configs/ Shared build settings (.xcconfig), app version, secrets template
TablePro/ App source (Core/, Views/, Models/, ViewModels/, Extensions/, Theme/)
Plugins/ .tableplugin bundles + TableProPluginKit framework
TableProMobile/ iOS app, widget extension, and its own project.yml
Libs/ Pre-built static libraries (downloaded via script, not in git)
TableProTests/ Tests
docs/ Mintlify docs site
scripts/ Build and release scripts
Drivers are .tableplugin bundles loaded at runtime. Create a new bundle under Plugins/, implement DriverPlugin + PluginDatabaseDriver from TableProPluginKit, and add the target to project.yml.
Full guide: docs/development/plugin-registry
Open a GitHub issue with:
- macOS version
- TablePro version
- Reproduction steps
- Database type and version (for database-specific bugs)
Sign the Contributor License Agreement on your first PR. The CLA bot walks you through it. One-time thing.
Contributions are licensed under AGPLv3.