"A powerful, lightweight GUI that lets you explore, edit, and query relational and document databases — all from a single window."
License GitHub Tag GitHub Language Count
- Overview
- Features
- Prerequisites & Installation
- Getting Started
- Interface Guide
- Connection Management
- Architecture
- Contributing
- Roadmap
- License
BaseCrawler is a desktop GUI database management tool built with Python and CustomTkinter. It lets you:
- Connect to and manage multiple PostgreSQL, MySQL, MariaDB, and MongoDB databases simultaneously.
- Browse, create, edit, and delete tables and collections — all without writing SQL by hand.
- View, add, edit, and delete rows from an inline table viewer with persistent column sizing and primary key indicators.
- Run ad-hoc SQL queries against any connected database from a dedicated query window.
- Save connection profiles with optional password storage, and instantly switch between them without losing your place.
BaseCrawler is written in Python 3.10+ and uses CustomTkinter for a native-feeling dark/light mode UI on macOS, Windows, and Linux.
| Category | Feature |
| Connections |
|
| Schema Browser |
|
| Inline Table Viewer |
|
| Query Wizard |
|
| Ribbon Toolbar |
|
| UI & Workspace |
|
Required:
- Python 3.10+
- A
base-crawlerconda environment (recommended) or a plain virtual environment
git clone https://github.com/Netherwarlord/BaseCrawler.git
cd BaseCrawler
conda create -n base-crawler python=3.11
conda activate base-crawler
pip install -r requirements.txtgit clone https://github.com/Netherwarlord/BaseCrawler.git
cd BaseCrawler
python -m venv .venv
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
pip install -r requirements.txtbrew link --force --overwrite python| Package | Purpose |
| customtkinter | Modern themed GUI framework |
| CTkMessagebox | Styled dialog boxes |
| psycopg2 | PostgreSQL driver |
| mysql-connector-python | MySQL / MariaDB driver |
| pymongo | MongoDB driver |
Always activate the conda environment first, then run app.py directly:
conda activate base-crawler
python app.pyTo syntax-check without launching the GUI:
python -m py_compile app.py- Click Manage Connections at the bottom of the left sidebar.
- Click Add Connection and fill in the connection name, database type, host, port, username, password, and database name.
- Click Save Connection. The connection now appears in the sidebar.
- Click a connection name in the sidebar to select it — the right panel shows connection details and a live status indicator.
- Enter your username and password in the credentials panel (check Save password if you want it stored).
- Click Connect. The ribbon toolbar and table list appear automatically.
- Double-click any table in the list to open it inline, or single-click and press ▶ Open in the ribbon.
The narrow bar above the workspace contains three persistent controls:
| Control | Function |
| ◀ Hide Panel / ▶ Show Panel | Collapse or expand the left connection sidebar |
| ⊞ (checkbox) | Toggle alternating row grid lines in the table viewer |
| ✏ (checkbox) | Toggle Edit Mode — when off, structural editing buttons are dimmed |
Visible when browsing the table list. Groups and their icon buttons:
| Group | Buttons |
| View | ▶ Open — open the selected table inline |
| Tables | ✏️ Edit · ➕ Add · 🗑️ Delete |
| Query | ≡ SQL — open the Query Wizard window |
| Connection | ⏻ Disconnect — disconnect and return to the connection info panel |
Visible when a table is open inline. Groups and their icon buttons:
| Group | Buttons |
| Navigate | ◀ Back — return to the table list |
| Rows | ➕ Add · ✏️ Edit · 🗑️ Delete |
| Columns | ➕ Add · 🗑️ Delete |
| Query | ≡ SQL — open the Query Wizard window |
- Drag a column separator in the header to resize. Width is remembered for the rest of the session.
- Double-click a column separator to auto-fit the column to its widest content.
When you select a saved connection (but are not yet connected), the right panel shows:
- Connection name — large, top-left
- Info card — Type, Host, Port, DB, live Status (Online / Offline / Checking…), and Size
- Credentials panel — editable Username and Password fields, pre-filled from saved values
- Save password checkbox — controls whether the password is persisted to
connections.json - Connect button — or press Enter in either credential field
Connections are stored in connections.json in the project root. This file is created automatically the first time you save a connection. Do not commit this file if it contains sensitive credentials.
Click any connection in the sidebar while already connected. BaseCrawler will:
- Save your current workspace state (which table is open, the cached schema).
- Silently reconnect to the new connection.
- Restore your previous workspace for that connection if one exists.
BaseCrawler is three Python files with no web server or external process:
| File | Responsibility |
| connection_manager.py | Pure data layer. Reads/writes connections.json. No UI dependency. Key methods: add_connection, remove_connection, update_connection, reorder_connection. |
| db_connector.py |
One DBConnector base class, three concrete implementations:
PostgreSQLConnector (psycopg2),
MongoDBConnector (pymongo),
MySQLMariaDBConnector (mysql-connector-python).
get_connector(connection_details) is the factory.
All connectors share a common interface: connect, disconnect, fetch_schema, fetch_data, execute_query, insert_data, update_data, delete_data, fetch_column_defaults, fetch_primary_keys, evaluate_expression.
|
| app.py |
All UI. Key classes:
DBManagerApp (main window),
ManageConnectionsWindow,
NewConnectionWindow,
AddEditDataWindow (row-level add/edit form),
AddTableDialog,
EditTableDialog,
AddColumnDialog,
DeleteColumnDialog,
QueryWindow.
All DB calls that run in the background use queue.Queue + after() polling — never updating CTk widgets directly from a background thread.
|
All database calls that run in the background communicate results back to the main thread via queue.Queue + after() polling — UI widgets are never updated from a background thread.
The status poller (_start_status_poller) is a long-lived daemon thread per selected connection, sleeping 30 s between checks. The auto-refresh timer (_start_auto_refresh) fires every 5 seconds via after() on the main thread, refreshing either the schema list or the open table depending on the current view.
We welcome contributions! Whether you have a bug report, a feature request, or just want to improve documentation — open an issue first so we can discuss it before diving into code.
git clone https://github.com/Netherwarlord/BaseCrawler.git
cd BaseCrawler
conda create -n base-crawler python=3.11
conda activate base-crawler
pip install -r requirements.txtPEP 8 compliance — run flake8 locally.
Black formatter — apply with black .
| Version | Description | Release Date |
| v1.0.0 |
Initial Release
|
Coming Soon |
| v0.8.4-alpha | Minor Stability Fixes | 2026-05-04 |
| v0.8.3-alpha |
Major Overhaul
|
2026-05-03 |
| v0.7.51-alpha |
Initial Pre-Release Alpha
|
2026-05-03 |
This project is licensed under the GNU Public License V3 (GPL3). See the LICENSE file for details.