RepoPilot

TableProApp/TablePro

A native database client for developers who use one every day.

Mixed

Single-maintainer risk — review before adopting

ConcernsDependency

copyleft license (AGPL-3.0) — review compatibility; top contributor handles 97% of recent commits

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Small team — 3 contributors active in recent commits
  • Single-maintainer risk — top contributor 97% of recent commits
  • AGPL-3.0 is copyleft — check downstream compatibility
  • Last commit today
  • 3 active contributors
  • AGPL-3.0 licensed
  • CI configured
  • Tests present

What would improve this?

  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/tableproapp/tablepro?axis=fork)](https://repopilot.app/r/tableproapp/tablepro)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/tableproapp/tablepro on X, Slack, or LinkedIn.

Ask AI about TableProApp/TablePro

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: TableProApp/TablePro

Generated by RepoPilot · 2026-06-24 · Source

🎯Verdict

WAIT — Single-maintainer risk — review before adopting

  • Last commit today
  • 3 active contributors
  • AGPL-3.0 licensed
  • CI configured
  • Tests present
  • ⚠ Small team — 3 contributors active in recent commits
  • ⚠ Single-maintainer risk — top contributor 97% of recent commits
  • ⚠ AGPL-3.0 is copyleft — check downstream compatibility

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

TablePro is a native macOS database client written in Swift that connects to 18+ database engines (MySQL, PostgreSQL, SQLite, MongoDB, Redis, etc.) using native drivers instead of JDBC/Electron. It provides SQL editing, data grid visualization, and connection management with startup under 1 second and ~80 MB RAM footprint. Monolithic macOS app structure: main app code in the primary directory with LocalPackages/CodeEditLanguages/ providing syntax highlighting via tree-sitter grammars for SQL and JavaScript. Skills system in .claude/skills/ (add-database-engine, release, write-tests, xcode-mcp) automates common extension tasks. CI/CD via GitHub Actions (build.yml, ios-tests.yml, build-plugin.yml).

👥Who it's for

Database developers and engineers who regularly interact with multiple database systems on macOS and need a lightweight, fast native alternative to Electron-based clients like DBeaver or TablePlus. DevOps engineers and backend developers managing production databases.

🌱Maturity & risk

Production-ready. The project has public releases on GitHub, comprehensive docs at docs.tablepro.app, and a commercial license offering, indicating maturity. Swift-first codebase (10.6M lines) with organized skill modules for database engine addition and releases, suggesting active maintenance and community support (Discord server listed).

Low risk for a single-maintainer project with strong commercial backing. The AGPL v3 license may restrict some use cases. Key risk: adding new database engines requires careful driver integration (see .claude/skills/add-database-engine/), and the 18+ engine support matrix means broad compatibility testing burden.

Active areas of work

Active development indicated by multiple workflow files and skill modules. The .claude/ directory with MCP-based skills (xcode-mcp) suggests integration with AI-assisted development. Release and testing frameworks in place, indicating regular release cycles.

🚀Get running

git clone https://github.com/TableProApp/TablePro.git
cd TablePro
open TablePro.xcodeproj

Then build in Xcode (macOS 14+ required, Apple Silicon or Intel). For Homebrew: brew install --cask tablepro.

Daily commands: Open TablePro.xcodeproj in Xcode and build/run the main scheme. For command-line builds: xcodebuild -scheme TablePro -configuration Release (inferred from build.yml workflow). Tests run via ios-tests.yml workflow.

🗺️Map of the codebase

  • .claude/settings.json — Claude configuration and project settings that define how the AI assistant understands and navigates this codebase
  • LocalPackages/CodeEditSourceEditor/Package.swift — Swift Package Manager manifest for the core source editor component used throughout the TablePro UI
  • LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage.swift — Core abstraction for syntax highlighting and language detection that powers the SQL editor experience
  • .github/workflows/build.yml — Primary CI/CD pipeline defining how the macOS and iOS native apps are built and distributed
  • CONTRIBUTING.md — Essential contributor guide explaining development setup, PR process, and code standards for this native database client
  • .swiftlint.yml — Swift linting rules that enforce code style consistency across the 600-file Swift codebase
  • CHANGELOG.md — Historical record of features, fixes, and database engine support additions that clarifies the project's evolution

🛠️How to make changes

Add a New Database Engine

  1. Read the database engine addition skill to understand the modular pattern (.claude/skills/add-database-engine/SKILL.md)
  2. Create a new database driver module following the existing pattern for MySQL, PostgreSQL, SQLite, etc. (LocalPackages (create new package))
  3. Register the engine in the main connection factory/registry (TablePro main app (location not fully visible in file list))
  4. Add integration tests for connection, query execution, and result parsing (.github/workflows/ios-tests.yml)
  5. Update CHANGELOG.md and documentation to reflect new database support (CHANGELOG.md)

Extend SQL Syntax Highlighting for a New Language

  1. Define the language metadata in CodeLanguage enum (LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage.swift)
  2. Add tree-sitter grammar files (parser.c and scanner.c) for the language (LocalPackages/CodeEditLanguages/Sources/TreeSitterGrammars)
  3. Create highlights.scm query file defining syntax element styling (LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/Resources)
  4. Integrate into CodeEditSourceEditor component and test in example app (LocalPackages/CodeEditSourceEditor/Example/CodeEditSourceEditorExample)

Release a New Version

  1. Review and document all changes since last release (CHANGELOG.md)
  2. Follow the release automation skill guide (.claude/skills/release/SKILL.md)
  3. Trigger the main build workflow which will create macOS and iOS artifacts (.github/workflows/build.yml)
  4. Publish release notes and artifacts to GitHub Releases (.github (releases automation))

🔧Why these technologies

  • Swift (iOS) + SwiftUI — Native performance and tight OS integration for macOS/iPhone database clients; first-class SQLite support
  • Tree-sitter + Grammar files (SQL, JavaScript, Bash) — Language-agnostic, robust syntax parsing that handles complex nested queries and provides accurate highlighting without heavyweight language servers
  • Local Swift Packages (CodeEditSourceEditor, CodeEditLanguages) — Modular architecture allowing the editor component to be reused and versioned independently across iOS and macOS targets
  • GitHub Actions CI/CD — Native macOS and iOS build runners for compiling Swift code, running Xcode tests, and producing signed app artifacts
  • AGPL v3 License — Copyleft open-source model ensuring derivative database clients remain open-source while allowing commercial use of unmodified versions

⚖️Trade-offs already made

  • Modular local packages instead of single monolithic app target

    • Why: Allows reusable editor component (CodeEditSourceEditor) to be maintained independently and published as a library for other macOS/iOS apps
    • Consequence: Increased complexity in dependency management and coordination between packages; requires careful version alignment
  • Multiple database engine drivers as separate concerns (MySQL, PostgreSQL, SQLite, MongoDB, Redis, etc.)

    • Why: Each database has different wire protocols, authentication methods, and query dialects; separating them prevents bloat and allows selective compilation
    • Consequence: Must maintain 15+ driver implementations; breaking protocol changes require coordinated updates across all drivers
  • Tree-sitter grammars compiled to C (parser.c, scanner.c) instead of dynamic loading

    • Why: Eliminates runtime grammar file dependencies and enables static linking for reproducible builds; improves app startup performance
    • Consequence: Syntax grammar updates require recompilation of the entire app; grammar testing must happen in CI before release
  • Native iOS app alongside macOS (not web/Electron)

    • Why: Direct access to Keychain for secure credential storage, native pasteboard integration, and zero licensing costs for distribution
    • Consequence: Must maintain two UI codebases (SwiftUI); platform-specific bugs require dual debugging and testing

🚫Non-goals (don't propose these)

  • Not a web-based database client (see native iOS/macOS apps only)
  • Does not handle user authentication/SSO (credentials managed via system Keychain)
  • Not a real-time collaborative SQL editor (single-user focus)
  • Does not provide cloud sync or offline-first capabilities
  • Not a database server itself—only a client for existing databases

🪤Traps & gotchas

  1. Native driver integration is non-trivial: adding a new database engine requires implementing native client libraries for each architecture (arm64/x86_64) and handling version compatibility. 2. Tree-sitter grammar files (.scm) have strict syntax; invalid queries silently fail without clear error messages. 3. AGPL v3 license requires careful review if you plan to use this in proprietary software. 4. macOS minimum version is 14 (Sonoma), dropping support for older systems abruptly.

🏗️Architecture

💡Concepts to learn

  • Tree-sitter Incremental Parsing — TablePro uses tree-sitter for SQL syntax highlighting; understanding how incremental parsing avoids reparsing entire files on each keystroke is critical for editor performance
  • Native Database Drivers — Core architectural choice: TablePro avoids JDBC and uses native C/Objective-C drivers for each database, directly affecting performance and memory usage
  • Swift Concurrency (async/await) — Modern Swift database queries require async/await patterns; TablePro likely uses Swift Concurrency for non-blocking database operations given its low latency requirements
  • Model Context Protocol (MCP) — TablePro integrates MCP via xcode-mcp skill, enabling AI-assisted development; understanding MCP is crucial for extending the skill system
  • AGPL v3 Copyleft Licensing — Restricts proprietary use: any derivative must remain open-source, affecting how contributions and forks can be deployed commercially
  • SwiftUI View Composition — TablePro is SwiftUI-first; mastering reactive view hierarchies and state binding is essential for UI modifications
  • Query Language Grammar Specifications (.scm files) — Tree-sitter query (.scm) files define syntax highlighting rules for each language; debugging highlighting issues requires understanding S-expression pattern matching
  • dbeaver/dbeaver — Direct competitor: full-featured database client but Electron-based and uses JDBC, lacking TablePro's native performance
  • jqlang/jq — Ecosystem complement: JSON query language that would pair well with TablePro's MongoDB/Redis support
  • sqlparse/sqlparse — Potential dependency candidate for SQL parsing; TablePro likely has similar needs for query validation/formatting
  • tree-sitter/tree-sitter — Core dependency: TablePro uses tree-sitter grammars extensively for syntax highlighting via LocalPackages/CodeEditLanguages
  • CodeEditApp/CodeEdit — Sister project context: CodeEditLanguages package is shared; understanding CodeEdit's editor architecture informs TablePro's SQL editor design

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for TreeSitterLanguage and CodeLanguage detection

The LocalPackages/CodeEditLanguages package contains critical language detection and syntax highlighting logic, but there's a .claude/skills/write-tests/SKILL.md skill file suggesting testing infrastructure exists. The CodeLanguage+DetectLanguage.swift file likely has complex detection logic that needs test coverage for SQL, JavaScript, and Bash grammars to ensure syntax highlighting works reliably across database query editors.

  • [ ] Create Tests/ directory in LocalPackages/CodeEditLanguages/
  • [ ] Add unit tests for CodeLanguage+DetectLanguage.swift covering edge cases (SQL variants, JSX in queries, shell commands)
  • [ ] Add unit tests for TreeSitterLanguage.swift initialization and grammar loading
  • [ ] Verify tests run in ios-tests.yml GitHub workflow
  • [ ] Document test patterns in CONTRIBUTING.md

Implement database-specific syntax highlighting tests in write-tests skill

The repo supports 15+ database engines (MySQL, PostgreSQL, SQLite, MongoDB, Redis mentioned in README) but the .claude/skills/write-tests/SKILL.md and tree-sitter grammar files suggest there's no automated testing for syntax highlighting accuracy per database. New contributors could create a test framework that validates correct highlighting for each supported engine's SQL dialect.

  • [ ] Review and expand .claude/skills/write-tests/SKILL.md with database-specific testing patterns
  • [ ] Create test fixtures in LocalPackages/CodeEditLanguages/Tests/ for each database SQL variant
  • [ ] Add tests validating tree-sitter-sql/highlights.scm correctly handles PostgreSQL extensions, MySQL functions, SQLite pragmas
  • [ ] Integrate tests into build.yml workflow for PR validation
  • [ ] Document expected highlighting behavior in CONTRIBUTING.md for maintainers

Add CI workflow for SwiftFormat and SwiftLint compliance validation

The repo has .swiftformat and .swiftlint.yml configuration files but no visible GitHub workflow in .github/workflows/ (build.yml, ios-tests.yml, build-plugin.yml exist) that enforces linting/formatting on PRs. This prevents code style drift and makes reviews clearer.

  • [ ] Create .github/workflows/lint.yml that runs swiftlint and swiftformat --check on all Swift files
  • [ ] Configure workflow to fail if linting errors found (using swiftlint --strict mode)
  • [ ] Add step to suggest swiftformat fixes as PR comments or annotations
  • [ ] Reference .swiftlint.yml and .swiftformat configuration in workflow
  • [ ] Document linting requirements in CONTRIBUTING.md with local setup commands

🌿Good first issues

  • Add missing syntax highlighting for PostgreSQL PL/pgSQL or MySQL stored procedures by creating new .scm files in LocalPackages/CodeEditLanguages/Resources/ (currently only JavaScript/Bash highlighted)
  • Implement unit tests for CodeLanguage detection logic in LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage+DetectLanguage.swift (no test files visible in LocalPackages)
  • Add documentation for the MCP-based xcode-mcp skill in .claude/skills/xcode-mcp/SKILL.md (currently exists but likely incomplete compared to other skill docs)

Top contributors

Click to expand

📝Recent commits

Click to expand
  • a21022d — feat(ios): Live Activity for running queries and iPad multi-window support (#1182) (datlechin)
  • 55f2850 — polish(ios): empty state actions and VoiceOver custom actions for swipe-only deletes (#1180) (datlechin)
  • 8b17873 — fix(quick-switcher): use queryHistoryManager after queryHistoryStorage was removed from AppServices (#1179) (datlechin)
  • 3ed9a6c — fix(coordinator,sync,plugins): bundled MED bug fixes + dead AppKit import drop (#1177) (datlechin)
  • d9910dc — fix(storage): forward since/until/allowedConnectionIds in QueryHistoryManager.fetchHistory (#1178) (datlechin)
  • ff2b80f — Add Xerimus to README (datlechin)
  • 3539d63 — refactor(storage): hide QueryHistoryStorage and SQLFavoriteStorage behind their manager facades (#1176) (datlechin)
  • 16aca9b — chore(ios): GitHub Actions test workflow and complete Vietnamese localization (#1175) (datlechin)
  • 8011471 — fix(ios): clean up Swift 6 build warnings and actor isolation in driver streaming (#1174) (datlechin)
  • 02a8e3d — test(ios): unit tests for the three extracted iOS view models (#1173) (datlechin)

🔒Security observations

The TablePro codebase demonstrates moderate security maturity for an open-source database client application. Key strengths include use of checksums for dependency verification and established development workflows. Primary concerns center on SQL injection risks inherent to database client functionality, inclusion of generated parser code that requires regular updates, and incomplete security documentation. The application's access to multiple database engines and sensitive data makes security practices critical. Recommendations include implementing strict parameterized queries, establishing a security vulnerability disclosure policy, regular dependency auditing, and input validation throughout the database query pipeline.

  • Medium · Tree-Sitter Parser Generated Code — LocalPackages/CodeEditLanguages/Sources/TreeSitterGrammars/*/parser.c and scanner.c. The codebase includes generated C code from tree-sitter parsers (parser.c, scanner.c files) for bash, javascript, and sql. Generated parser code can be difficult to audit and may contain vulnerabilities. Additionally, the sql parser is particularly sensitive given this is a database client application. Fix: Regularly update tree-sitter dependencies to the latest versions. Consider implementing input validation and sanitization before SQL code is parsed. Add security scanning for C code dependencies in CI/CD pipeline.
  • Medium · SQL Injection Risk in Database Client — Application-wide - database query execution layer (not visible in provided file structure). As a database client that supports multiple database engines (MySQL, PostgreSQL, SQLite, MongoDB, Redis), there is inherent risk of SQL injection if user-supplied queries are not properly parameterized. The presence of tree-sitter-sql grammar suggests raw SQL parsing capabilities. Fix: Implement parameterized queries/prepared statements for all database operations. Use ORM or query builders that enforce parameterization. Implement input validation and sanitization for all user-supplied SQL. Add security testing for SQL injection vectors.
  • Low · AGPL License Compliance Risk — LICENSE, CONTRIBUTING.md. The project uses AGPL v3 license, which has strict copyleft requirements. Any modifications or usage in network services must be distributed under the same license. This could create compliance risks if not properly managed. Fix: Ensure proper license attribution and compliance documentation. Include clear guidelines for contributors regarding license obligations. Consider adding license headers to source files.
  • Low · Missing Security Policy Documentation — Repository root. No SECURITY.md file is visible in the provided file structure, which is a best practice for open-source projects to communicate security reporting procedures. Fix: Create a SECURITY.md file documenting responsible disclosure procedures, security contacts, and how to report vulnerabilities safely.
  • Low · Dependency Management Transparency — Libs/checksums.sha256 and Package management files. The codebase includes a checksums.sha256 file (Libs/checksums.sha256) which is good, but no Package.swift or Package.resolved files were visible in the partial structure. This makes it difficult to verify dependency integrity and versions. Fix: Ensure Package.resolved is committed to version control for reproducible builds. Document dependency update procedures. Consider using dependency scanning tools in CI/CD to identify known vulnerabilities.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/TableProApp/TablePro shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live TableProApp/TablePro repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/TableProApp/TablePro.

What it runs against: a local clone of TableProApp/TablePro — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in TableProApp/TablePro | Confirms the artifact applies here, not a fork | | 2 | License is still AGPL-3.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>TableProApp/TablePro</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of TableProApp/TablePro. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/TableProApp/TablePro.git
#   cd TablePro
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of TableProApp/TablePro and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "TableProApp/TablePro(\\.git)?\\b" \\
  && ok "origin remote is TableProApp/TablePro" \\
  || miss "origin remote is not TableProApp/TablePro (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(AGPL-3\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"AGPL-3\\.0\"" package.json 2>/dev/null) \\
  && ok "license is AGPL-3.0" \\
  || miss "license drift — was AGPL-3.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f ".claude/settings.json" \\
  && ok ".claude/settings.json" \\
  || miss "missing critical file: .claude/settings.json"
test -f "LocalPackages/CodeEditSourceEditor/Package.swift" \\
  && ok "LocalPackages/CodeEditSourceEditor/Package.swift" \\
  || miss "missing critical file: LocalPackages/CodeEditSourceEditor/Package.swift"
test -f "LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage.swift" \\
  && ok "LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage.swift" \\
  || miss "missing critical file: LocalPackages/CodeEditLanguages/Sources/CodeEditLanguages/CodeLanguage.swift"
test -f ".github/workflows/build.yml" \\
  && ok ".github/workflows/build.yml" \\
  || miss "missing critical file: .github/workflows/build.yml"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/TableProApp/TablePro"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/TableProApp/TablePro"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>