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
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,27 @@ and this project follows versions of format `{year}.{month}.{patch_number}`.

## [Unreleased]

## [0.0.38] - 2026-07-17

### Added

- `qpi-driver`: Added safe-path validation for `--data-dir` and `--ca-file` to prevent writing to unsafe/unauthorized locations.
- `qpi-driver`: Added environment variable defaults for `QPI_DATA_DIR`, `QPI_CA_FILE`, `QPI_QUANTIFY_DEVICE_CONFIG`, and `QPI_QUANTIFY_HARDWARE_CONFIG` to the systemd service installer.
- `qpi-driver`: Added the FluxTunableCoupler as a CompositeSquareEdge for qblox and quantify executors

### Changed

- `docs`: Updated README files to provide detailed instructions for installing the server via pre-compiled binaries, native Linux packages (`.deb`), and using the non-interactive/interactive systemd installation script for the driver.
- `qpi-driver`: Sanitized driver/device names to replace hyphens (`-`) with underscores (`_`) for executor compatibility.
- `qpi-driver`: Added `--prerelease allow` flag to the `uv tool install` command for the `qblox` executor in `install-systemd.sh`.

### Fixed

- `qpi-driver`: Fixed permissions/directory creation bugs and improved `uv` location detection in `install-systemd.sh`.
- `qpi-driver`: Fixed standard Python test output teardown issues by gracefully unregistering the default QCoDeS instrument closing handler from `atexit` and closing them in a test session fixture while logging is still active.
- `qpi-driver`: Ensured the target parent directory for the CA certificate exists before saving the file.
- `qpi-driver`: Fixed minor code linting errors.

## [0.0.37] - 2026-06-29

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.PHONY: all build build-dashboard test lint lint-go lint-py lint-js lint-dashboard lint-go-client lint-py-client format format-go format-py format-js format-dashboard format-go-client format-py-client package package-driver package-js package-py package-go clean venv-check test-e2e-dashboard

VERSION ?= 0.0.37
VERSION ?= 0.0.38
UV := $(shell command -v uv 2> /dev/null || echo "$$HOME/.local/bin/uv")

all: build
Expand Down
81 changes: 64 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,37 +38,84 @@ flowchart LR
Driver2 -->|Control| Hardware2[Simulated QPU]
```

## Quick Start
## Installation & Quick Start

### Prerequisites
* **Go**: `>= 1.25` (tested up to `1.26`)
* **Python**: `~= 3.12`
* **Nodejs**: `>= 20.x` (tested up to `22.x`)
QPI is distributed as pre-compiled binaries and OS-specific packages for the server, and a Python package for the drivers and clients.

### 1. Start the Server
### 1. Install & Start the Server (`qpi`)

Compile and run the PocketBase Go server (this automatically builds the React dashboard if you use `make`):
The server is available as a single executable binary, as well as native OS packages (`.deb`, `.rpm`, `.apk`) for Linux distributions.

#### Standalone Binary (macOS & Linux)
Download the binary for your platform, make it executable, and run:
```bash
make build
./bin/qpi serve
# macOS (replace 0.0.38 with the version you wish to install)
curl -LO https://github.com/sopherapps/qpi/releases/download/v0.0.38/qpi-0.0.38-darwin-amd64
chmod +x qpi-0.0.38-darwin-amd64 && mv qpi-0.0.38-darwin-amd64 qpi

# Linux (standalone binary)
curl -L https://github.com/sopherapps/qpi/releases/download/v0.0.38/qpi-0.0.38-linux-amd64.tar.gz | tar -xz

# Start the server
./qpi serve
```

#### Native Linux Packages (Ubuntu, Debian, Fedora, Alpine)
For Debian/Ubuntu, download and install the `.deb` package:
```bash
wget https://github.com/sopherapps/qpi/releases/download/v0.0.38/qpi_0.0.38_amd64.deb
sudo apt install ./qpi_0.0.38_amd64.deb
```
*(Note: Installing the package automatically registers and starts `qpi.service` under systemd (or OpenRC on Alpine) to run the server in the background on port `8090`)*

#### Windows
Download the `qpi-windows-amd64.zip` from [GitHub Releases](https://github.com/sopherapps/qpi/releases), unzip it, and run `qpi.exe serve`.

*Once the server is running, the web dashboard is available at `http://127.0.0.1:8090/`. You can log in using the PocketBase Admin UI at `http://127.0.0.1:8090/_/` to create your initial superuser account.*

---

### 2. Connect a QPU Driver (`qpi-driver`)

The driver runs alongside the QPU hardware (or simulation backend) to process jobs from the server.

#### systemd Service (Linux - Recommended)
To install the driver as a persistent background systemd service (mimicking Astral's installation workflow), run the interactive script:

```bash
sudo bash -c "$(curl -LsSf https://raw.githubusercontent.com/sopherapps/qpi/main/qpi-driver/install-systemd.sh)"
```
*The dashboard is now available at `http://127.0.0.1:8090/`. You can log in using the PocketBase Admin UI at `http://127.0.0.1:8090/_/` to create your initial superuser account.*

### 2. Connect a QPU Driver
Open a new terminal. In the dashboard, navigate to **QPU Registry** and register a new QPU. You will receive an access token and a `ca-fingerprint`. Use them to start the Python driver (using the `mock` executor for local testing):
Alternatively, you can run the installer non-interactively by specifying the variables directly:
```bash
curl -LsSf https://raw.githubusercontent.com/sopherapps/qpi/main/qpi-driver/install-systemd.sh | sudo \
QPI_TOKEN="<your-qpu-token>" \
QPI_ADDR="http://127.0.0.1:8090" \
CA_FINGERPRINT="<fingerprint>" \
QPU_NAME="qpu-1" \
EXECUTOR="mock" \
bash
```

#### Standalone CLI (macOS, Linux, Windows)
Ensure Python 3.12 is installed, then install using `pip` or `uv`:
```bash
# Install the python driver CLI (using uv for speed)
uv tool install ./qpi-driver[cli]
# Install qpi-driver using uv tool (recommended)
uv tool install "qpi-driver[cli]"

# Start the driver daemon
qpi-driver start --qpi-addr http://127.0.0.1:8090 --token "<YOUR_ACCESS_TOKEN>" --ca-fingerprint "<YOUR_CA_FINGERPRINT>" --name "local_mock_qpu" --executor "mock"
qpi-driver start \
--qpi-addr http://127.0.0.1:8090 \
--token "<YOUR_ACCESS_TOKEN>" \
--ca-fingerprint "<YOUR_CA_FINGERPRINT>" \
--name "qpu-1" \
--executor "mock"
```
*(Note: For production deployments, the dashboard will provide a convenient systemd script to install this driver as a background service.)*

---

### 3. Submit a Job
Users can now submit quantum jobs via the Python client!
Users can submit quantum jobs via the Python client:
```bash
pip install qpi-client
```
Expand Down
4 changes: 2 additions & 2 deletions qpi-client/js/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion qpi-client/js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "qpi-client",
"version": "0.0.37",
"version": "0.0.38",
"description": "JavaScript/TypeScript client SDK for the QPI quantum computing platform",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
2 changes: 1 addition & 1 deletion qpi-client/py/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "qpi-client"
version = "0.0.37"
version = "0.0.38"
description = "Python client SDK for the QPI quantum computing platform"
readme = "README.md"
license = {text = "MIT"}
Expand Down
2 changes: 1 addition & 1 deletion qpi-client/py/qpi_client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
try:
__version__ = importlib.metadata.version("qpi-client")
except importlib.metadata.PackageNotFoundError:
__version__ = "0.0.37"
__version__ = "0.0.38"

from qpi_client.client import QPIClient
from qpi_client.provider import QPIBackend, QPIJob
Expand Down
Loading
Loading