Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 🀝 Contributing to XenSQL

Thanks for considering contributing to **XenSQL**! πŸŽ‰
We welcome all kinds of contributions - bug reports, feature ideas, documentation, code, translations, and more.
We welcome all kinds of contributions - bug reports, feature ideas, documentation, code, translations and more.

---

Expand All @@ -11,7 +11,7 @@ We welcome all kinds of contributions - bug reports, feature ideas, documentatio
2. Follow the **[Development Setup](#-development-setup)** below
3. Create a branch: `git checkout -b feature/amazing-thing`
4. Make your changes
5. Test thoroughly (especially across SQLite, PostgreSQL, and MySQL)
5. Test thoroughly (especially across SQLite, PostgreSQL and MySQL)
6. Open a **Pull Request** using our [PR template](.github/PULL_REQUEST_TEMPLATE.md)

---
Expand Down Expand Up @@ -62,7 +62,7 @@ task e2e:go:all
task e2e:ui:all
```

CI runs the frontend, API E2E (Go), and Go unit suites on every pull request.
CI runs the frontend, API E2E (Go) and Go unit suites on every pull request.

**Playwright UI tests are not in CI** - run them locally before merging UI-facing
work. See **[TESTING.md](./TESTING.md#ui-end-to-end-tests-playwright)** for details.
14 changes: 7 additions & 7 deletions .github/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,14 @@ Every test runs against all three engines (`postgres`, `mysql`, `mariadb`):
- **Query execution** - DDL / DML / SELECT lifecycle, affected-row counts, empty
result sets, error surfacing, value normalization (bigints past 2⁡³ β†’ string,
`NULL` β†’ nil, binary β†’ hex, timestamps β†’ RFC3339), `RETURNING`
- **Results grid** - browse with pagination, sort, filter, and rejection of
- **Results grid** - browse with pagination, sort, filter and rejection of
injection-style filters
- **Editing data** - `InsertRow` (returns the generated key), `UpdateRow`,
`DeleteRows`, and the no-primary-key safety rule
`DeleteRows` and the no-primary-key safety rule
- **Streaming** - batched row delivery, streaming table browse, multi-statement
scripts (one result set per statement), and stop-on-first-error
scripts (one result set per statement) and stop-on-first-error
- **Transactions** - per-tab begin / commit / rollback, isolation from other
connections, guard rails, and independent concurrent transactions per tab
connections, guard rails and independent concurrent transactions per tab
- **Query history** - success/error recording and clearing
- **Export** - CSV / JSON / Markdown / SQL of live query results

Expand All @@ -143,8 +143,8 @@ Every test runs against all three engines (`postgres`, `mysql`, `mariadb`):
The Playwright suite drives the **real XenSQL UI in a browser** against the
**real Go backend** in Wails v3 server mode (HTTP + WebSocket, no native window).
It lives entirely under [`e2e/`](../e2e/) and covers connections, schema, queries,
transactions, table view, results grid, editor autocomplete, and app-shell toggles
across **PostgreSQL**, **MySQL**, **MariaDB**, and **SQLite**.
transactions, table view, results grid, editor autocomplete and app-shell toggles
across **PostgreSQL**, **MySQL**, **MariaDB** and **SQLite**.

### Requirements

Expand Down Expand Up @@ -213,7 +213,7 @@ the matrix suites replay it on all four drivers.
- **Editor tabs** - open (`+`), switch (`Ctrl+Tab` / `Ctrl+Shift+Tab`), close (`Ctrl+W` / βœ•)
- **Table view (browse)** - browse data; sort; scroll-paginate past the first 100 rows
- **Table view (edit)** - inline edit, set NULL, mark row for delete, Reset / Apply
(verified against the DB), and undo / redo (`Ctrl+Z` / `Ctrl+Shift+Z`)
(verified against the DB) and undo / redo (`Ctrl+Z` / `Ctrl+Shift+Z`)
- **Table view (data ops)** - filter by a condition; add a row via the Add-row dialog
- **Cell viewer** - open a JSON cell with `Shift+Enter`, Beautify / Minify, Set to NULL
- **JSON viewer** - `Ctrl+J` toggle, mirrors the focused row, key filter, JSON nesting
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ jobs:
# single top-level entry, so each archive is named <platform>-<arch> and
# holds exactly one entry: the binary (linux/windows) or XenSQL.app (macOS).
# Plain XenSQL / XenSQL.exe (no platform tokens), distro packages
# (XenSQL.deb, XenSQL.rpm, XenSQL.pkg.tar.zst, xensql-x86_64.AppImage), and
# (XenSQL.deb, XenSQL.rpm, XenSQL.pkg.tar.zst, xensql-x86_64.AppImage) and
# XenSQL-amd64-installer.exe are manual-download only.

- name: Build & package (Linux)
Expand Down
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ wails3 dev

## ⚑ SQL tools are usually overkill. XenSQL isn’t.

Work with **SQLite**, **PostgreSQL**, and **MySQL / MariaDB** in a single fast desktop app that runs entirely on your machine.
Work with **SQLite**, **PostgreSQL** and **MySQL / MariaDB** in a single fast desktop app that runs entirely on your machine.

🧳 Portable
⚑ Fast startup
Expand Down Expand Up @@ -96,7 +96,7 @@ Work with **SQLite**, **PostgreSQL**, and **MySQL / MariaDB** in a single fast d

## ⚑ What XenSQL is

XenSQL is a **desktop SQL client built for developers who want speed, clarity, and control**.
XenSQL is a **desktop SQL client built for developers who want speed, clarity and control**.

It combines:

Expand Down Expand Up @@ -137,7 +137,7 @@ XenSQL focuses on one thing:

## πŸ”Œ Connections

- Create, edit, test, and manage database connections
- Create, edit, test and manage database connections
- Organize into **folders** with drag-and-drop reorder
- Per-connection **tab colors**
- **Read-only mode** with defense-in-depth - blocked at both the Wails layer and inside each driver
Expand All @@ -155,7 +155,7 @@ XenSQL focuses on one thing:
- Driver-correct identifier quoting (PostgreSQL, MySQL, SQLite)
- **Run selection** (`Ctrl+Enter`) / **run all** (`Ctrl+Shift+Enter`) / **stop** long-running queries
- **Streaming results** - rows render as the driver yields them
- **Multi-statement scripts** - run several `;`-separated statements at once; they execute in order on one connection, so temp tables, `SET`, and scripted `BEGIN` / `COMMIT` hold
- **Multi-statement scripts** - run several `;`-separated statements at once; they execute in order on one connection, so temp tables, `SET` and scripted `BEGIN` / `COMMIT` hold
- **Multiple result outputs** - a script or stored procedure that returns several result sets shows each in its own switchable result tab; a failing statement reports its error and stops the run
- **Pinned transactions** per tab - run `BEGIN` / `COMMIT` / `ROLLBACK` as SQL or from the toolbar; queries run inside the open transaction until you commit or roll back
- `UPDATE` / `DELETE` / `INSERT` with **`RETURNING`** flow back to the Results Grid
Expand Down Expand Up @@ -195,15 +195,15 @@ View and modify table data directly in the grid - no hand-written `UPDATE` / `DE
- **Browse** any table's rows (`Ctrl+double-click` a table in the Schema Explorer)
- **Inline edit** cells in place - changes are staged, then applied on demand
- **Insert** new rows and **bulk-delete** selected ones
- Safe by design: edits require a primary key, and **read-only** connections are blocked at both the Wails layer and inside the driver
- Safe by design: edits require a primary key and **read-only** connections are blocked at both the Wails layer and inside the driver
- `INSERT` / `UPDATE` / `DELETE … RETURNING` results flow straight back into the grid

---

## πŸ“š Query Library & History

- **Saved queries** - name, filter, sort, link tabs with dirty-state tracking
- Save, update, rename, and delete from the sidebar or toolbar
- Save, update, rename and delete from the sidebar or toolbar
- **Per-connection query history** with success/error and duration
- Clear history per connection or delete individual entries

Expand All @@ -223,18 +223,18 @@ View and modify table data directly in the grid - no hand-written `UPDATE` / `DE
- Automatically checks for new versions on startup
- Clean modal with changelog highlights
- One-click download and update
- Supports Windows (MSI), macOS, and Linux builds
- Supports Windows (MSI), macOS and Linux builds

---

## 🌍 UX

- **Dark & light** themes
- **English**, **Deutsch**, and **Π‘ΡŠΠ»Π³Π°Ρ€ΡΠΊΠΈ**
- **English**, **Deutsch** and **Π‘ΡŠΠ»Π³Π°Ρ€ΡΠΊΠΈ**
- **Quick Search palette** (`Ctrl+P`) - jump to connections, saved queries, history, tabs
- Custom shortcuts editor + keyboard tips
- Frameless native title bar
- **Window state persistence** - size, position, and maximized state restored between sessions
- **Window state persistence** - size, position and maximized state restored between sessions

---

Expand Down Expand Up @@ -273,7 +273,7 @@ XenSQL-data/
settings.json
```

`settings.json` keeps your UI preferences - theme, language, layout, and keyboard shortcuts.
`settings.json` keeps your UI preferences - theme, language, layout and keyboard shortcuts.

When the app sits somewhere writable, that folder is created **right next to the executable** (beside the `.app` bundle on macOS) - move it to a USB stick, network drive, or another PC and it just works.

Expand Down Expand Up @@ -313,7 +313,7 @@ XenSQL uses **[Wails v3](https://v3.wails.io/)**, which embeds a web UI into a n
```bash
go install github.com/wailsapp/wails/v3/cmd/wails3@latest

# wails3 dev installs frontend deps, generates bindings, and launches the app
# wails3 dev installs frontend deps, generates bindings and launches the app
wails3 dev
```

Expand Down
4 changes: 2 additions & 2 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ tasks:
summary: Run the Playwright UI suite (drives the app in Wails server mode; data dir ./e2e/XenSQL-data)
dir: e2e
cmds:
# e2e/playwright.config.ts builds the frontend, starts the server, and brings the
# database stack up (global-setup) on its own.
# e2e/playwright.config.ts builds the frontend,
# starts the server and brings the database stack up (global-setup) on its own.
- npx playwright test

e2e:ui:all:
Expand Down
4 changes: 2 additions & 2 deletions build/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ version: '3'
info:
companyName: "Bare7a" # The name of the company
productName: "XenSQL" # The name of the application
productIdentifier: "com.bare7a.xensql" # The unique product identifier
productIdentifier: "eu.bare7a.xensql" # The unique product identifier
description: "A fast, native SQL client built with Go, Wails and React." # The application description
copyright: "(c) 2026, Bare7a" # Copyright text
comments: "A fast, native SQL client built with Go, Wails and React." # Comments
version: "1.4.1" # The application version
version: "1.4.2" # The application version
# cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional)
# # Should match the name of your .icon file without the extension
# # If not set and Assets.car exists, defaults to "appicon"
Expand Down
6 changes: 3 additions & 3 deletions build/darwin/Info.dev.plist
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@
<key>CFBundleIconFile</key>
<string>icons</string>
<key>CFBundleIdentifier</key>
<string>com.bare7a.xensql</string>
<string>eu.bare7a.xensql</string>
<key>CFBundleName</key>
<string>XenSQL</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>CFBundleVersion</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>LSMinimumSystemVersion</key>
<string>12.0.0</string>
<key>NSAppTransportSecurity</key>
Expand Down
6 changes: 3 additions & 3 deletions build/darwin/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@
<key>CFBundleIconFile</key>
<string>icons</string>
<key>CFBundleIdentifier</key>
<string>com.bare7a.xensql</string>
<string>eu.bare7a.xensql</string>
<key>CFBundleName</key>
<string>XenSQL</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>CFBundleVersion</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>LSMinimumSystemVersion</key>
<string>12.0.0</string>
<key>NSHighResolutionCapable</key>
Expand Down
6 changes: 3 additions & 3 deletions build/ios/Info.dev.plist
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
<key>CFBundleGetInfoString</key>
<string>A fast, native SQL client built with Go, Wails and React.</string>
<key>CFBundleIdentifier</key>
<string>com.bare7a.xensql.dev</string>
<string>eu.bare7a.xensql.dev</string>
<key>CFBundleName</key>
<string>XenSQL (Dev)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4.1-dev</string>
<string>1.4.2-dev</string>
<key>CFBundleVersion</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MinimumOSVersion</key>
Expand Down
6 changes: 3 additions & 3 deletions build/ios/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
<key>CFBundleGetInfoString</key>
<string>A fast, native SQL client built with Go, Wails and React.</string>
<key>CFBundleIdentifier</key>
<string>com.bare7a.xensql</string>
<string>eu.bare7a.xensql</string>
<key>CFBundleName</key>
<string>XenSQL</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>CFBundleVersion</key>
<string>1.4.1</string>
<string>1.4.2</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MinimumOSVersion</key>
Expand Down
4 changes: 2 additions & 2 deletions build/ios/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ set -e

# Build configuration
APP_NAME="XenSQL"
BUNDLE_ID="com.bare7a.xensql"
BUNDLE_ID="eu.bare7a.xensql"
VERSION="1.2.1"
BUILD_NUMBER="1.2.1"
BUILD_DIR="build/ios"
Expand Down Expand Up @@ -69,4 +69,4 @@ if [ "$TARGET" = "simulator" ]; then
xcrun simctl install booted "$APP_BUNDLE"
xcrun simctl launch booted "$BUNDLE_ID"
echo "App launched on simulator"
fi
fi
4 changes: 2 additions & 2 deletions build/ios/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@
buildSettings = {
INFOPLIST_FILE = main/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bare7a.xensql";
PRODUCT_BUNDLE_IDENTIFIER = "eu.bare7a.xensql";
PRODUCT_NAME = "XenSQL";
CODE_SIGNING_ALLOWED = NO;
SDKROOT = iphoneos;
Expand All @@ -188,7 +188,7 @@
buildSettings = {
INFOPLIST_FILE = main/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bare7a.xensql";
PRODUCT_BUNDLE_IDENTIFIER = "eu.bare7a.xensql";
PRODUCT_NAME = "XenSQL";
CODE_SIGNING_ALLOWED = NO;
SDKROOT = iphoneos;
Expand Down
2 changes: 1 addition & 1 deletion build/linux/nfpm/nfpm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
name: "XenSQL"
arch: ${GOARCH}
platform: "linux"
version: "1.4.1"
version: "1.4.2"
section: "default"
priority: "extra"
maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>
Expand Down
4 changes: 2 additions & 2 deletions build/windows/info.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"fixed": {
"file_version": "1.4.1"
"file_version": "1.4.2"
},
"info": {
"0000": {
"ProductVersion": "1.4.1",
"ProductVersion": "1.4.2",
"CompanyName": "Bare7a",
"FileDescription": "A fast, native SQL client built with Go, Wails and React.",
"LegalCopyright": "(c) 2026, Bare7a",
Expand Down
4 changes: 2 additions & 2 deletions build/windows/msix/app_manifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
IgnorableNamespaces="uap3">

<Identity
Name="com.bare7a.xensql"
Name="eu.bare7a.xensql"
Publisher="CN=Bare7a"
Version="1.1.2.0"
ProcessorArchitecture="x64" />
Expand All @@ -29,7 +29,7 @@
</Resources>

<Applications>
<Application Id="com.bare7a.xensql" Executable="xensql" EntryPoint="Windows.FullTrustApplication">
<Application Id="eu.bare7a.xensql" Executable="xensql" EntryPoint="Windows.FullTrustApplication">
<uap:VisualElements
DisplayName="XenSQL"
Description="A fast, native SQL client built with Go, Wails and React."
Expand Down
2 changes: 1 addition & 1 deletion build/windows/msix/template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</Capabilities>
<Applications>
<Application
Id="com.bare7a.xensql"
Id="eu.bare7a.xensql"
Description="A fast, native SQL client built with Go, Wails and React."
DisplayName="XenSQL"
ExecutableName="xensql"
Expand Down
2 changes: 1 addition & 1 deletion build/windows/nsis/wails_tools.nsh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
!define INFO_PRODUCTNAME "XenSQL"
!endif
!ifndef INFO_PRODUCTVERSION
!define INFO_PRODUCTVERSION "1.4.1"
!define INFO_PRODUCTVERSION "1.4.2"
!endif
!ifndef INFO_COPYRIGHT
!define INFO_COPYRIGHT "(c) 2026, Bare7a"
Expand Down
2 changes: 1 addition & 1 deletion build/windows/wails.exe.manifest
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity type="win32" name="com.bare7a.xensql" version="1.4.1" processorArchitecture="*"/>
<assemblyIdentity type="win32" name="eu.bare7a.xensql" version="1.4.2" processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
Expand Down
2 changes: 1 addition & 1 deletion cmd/bump-version/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ var (
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: go run ./cmd/bump-version [flags] [version]\n\n")
fmt.Fprintf(os.Stderr, "Updates version.go, build/config.yml, and frontend metadata, then runs\n")
fmt.Fprintf(os.Stderr, "Updates version.go, build/config.yml and frontend metadata, then runs\n")
fmt.Fprintf(os.Stderr, "wails3 task common:update:build-assets to refresh everything under build/.\n\n")
fmt.Fprintf(os.Stderr, "Examples:\n")
fmt.Fprintf(os.Stderr, " go run ./cmd/bump-version -minor\n")
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ services:
timeout: 5s
retries: 20
tmpfs:
# Keep the data in RAM: faster, and nothing to clean up between runs.
# Keep the data in RAM: faster and nothing to clean up between runs.
- /var/lib/postgresql/data

mysql:
Expand Down
Empty file added docs/.nojekyll
Empty file.
Loading
Loading