Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
88cad7c
fix: repair all CI E2E failures across Linux, macOS and Windows
aks-builds Jun 9, 2026
0418e0a
ci: add auto-approve workflow (mirrors reqweave pattern)
aks-builds Jun 9, 2026
0fd06df
fix: serialize E2E workers and fix assertion-row selectors
aks-builds Jun 9, 2026
eb1bf70
fix: isolate each Electron launch to its own temp user-data-dir
aks-builds Jun 9, 2026
5f32b20
fix: correct all remaining broken test selectors
aks-builds Jun 9, 2026
5b806fe
fix: scope post-import checks to sidebar, close modal for env test, f…
aks-builds Jun 9, 2026
3efca4a
fix: stale-response wait, .env import crash, and increase import time…
aks-builds Jun 9, 2026
7d5fc15
fix(e2e): skip network-dependent suites on CI, fix dirty-indicator ti…
aks-builds Jun 12, 2026
5791488
fix(e2e): replace Escape with ✕ click, increase timeouts for slow CI …
aks-builds Jun 12, 2026
5ae6df0
docs: add Vibrant Studio UI overhaul design spec
aks-builds Jun 22, 2026
cee35e7
docs: add Vibrant Studio UI overhaul implementation plan (17 tasks)
aks-builds Jun 22, 2026
6e92bdd
feat: add perf.ts hardware and motion detection gates
aks-builds Jun 22, 2026
e1e4904
feat: add Vibrant Studio --vs-* token system and protocol colour palette
aks-builds Jun 22, 2026
4d81063
feat: add VirtualList component via TanStack Virtual
aks-builds Jun 22, 2026
a5a5a0b
test: add VirtualList smoke import test to store.test.ts
aks-builds Jun 22, 2026
7bff635
feat: add NumberInput with clamp, blur-snap, and keystroke blocking
aks-builds Jun 22, 2026
7f9fbb7
fix: add uncaughtException handlers and connectionTimeout to all stre…
aks-builds Jun 22, 2026
7fdaef1
fix: clear Promise.race timeout timers on success in kafka and sqs ad…
aks-builds Jun 22, 2026
e550c19
feat: init perf gates on startup, add root ErrorBoundary, wire main:e…
aks-builds Jun 22, 2026
e0fa6b3
fix: register cb directly in preload on/off to fix removeListener ref…
aks-builds Jun 22, 2026
2739876
refactor: simplify Layout to fixed 48px rail, remove sidebar resize s…
aks-builds Jun 22, 2026
e36c53f
feat: implement hover-to-expand icon rail sidebar (SidebarRail + Side…
aks-builds Jun 22, 2026
d9a810f
feat: add protocol-colour accent borders to TabBar tabs
aks-builds Jun 22, 2026
ba6576e
feat: update TitleBar to Vibrant Studio tokens and gradient wordmark
aks-builds Jun 22, 2026
6aaaa05
feat: lazy-load Monaco, update URL bar method badge and Send button t…
aks-builds Jun 22, 2026
7997b32
fix: add VS method badge span and fix send button class conflict in R…
aks-builds Jun 22, 2026
fdb7284
feat: adopt NumberInput in all protocol panels for validated number i…
aks-builds Jun 22, 2026
903e59f
feat: add spring status badge animation and VS accent tab strip to Re…
aks-builds Jun 22, 2026
10583f9
feat: add all 12 Energetic motion interactions to CSS animation system
aks-builds Jun 22, 2026
dd53a4a
test: add E2E suite for sidebar hover-expand, tab colour, and respons…
aks-builds Jun 22, 2026
341e20e
feat: electron-builder hardening (asar, multi-arch, deb) + bump-versi…
aks-builds Jun 22, 2026
8a0ba5c
fix: CI hardening — mock fixture, 60s timeout, replace waitForTimeout…
aks-builds Jun 22, 2026
3efa2f2
fix: wait for import IPC completion before closing modal in Suite 16 …
aks-builds Jun 22, 2026
a210a0a
fix: final review fixes -- CSS motion guards, SidebarPanel try/catch,…
aks-builds Jun 22, 2026
38f53eb
feat: dark mode default, friendly errors, error auto-tab, prominent s…
aks-builds Jun 22, 2026
2876e2a
feat: sidebar rail hover affordance and click-to-pin toggle
aks-builds Jun 22, 2026
9b05a5e
feat: expand MockServerPanel to full centered modal (760×560)
aks-builds Jun 22, 2026
904f8d6
fix: lift MockServerPanel to Layout level to escape sidebar CSS trans…
aks-builds Jun 22, 2026
dceb8e7
fix: add on/off to HitroApi type in window.d.ts
aks-builds Jun 22, 2026
9f86d58
fix: add sidebar rail hover before all panel interactions in E2E tests
aks-builds Jun 22, 2026
e8a153f
fix: add .first() to sidebar text locators, increase hover wait to 50…
aks-builds Jun 22, 2026
e8f386f
fix: resolve all 12 CI E2E failures across macOS/ubuntu/windows
aks-builds Jun 24, 2026
94d85b8
fix: replace sidebar pin approach with CSS injection, revert show:false
aks-builds Jun 24, 2026
4ec71d8
fix: clickSidebarText via React fiber, fix VirtualList height, env in…
aks-builds Jun 24, 2026
0de75cd
fix: replace libasound2 with libasound2t64 for Ubuntu 24.04, add READ…
aks-builds Jun 25, 2026
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 .github/workflows/auto-approve.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Auto-approve

# Calls the reusable workflow in aks-builds/workflows.
# Approves only PRs opened by aks-builds; silently skips all others.

on:
pull_request:
types: [opened, ready_for_review, synchronize, reopened]

# Required: the reusable workflow requests `pull-requests: write` to post the
# approval, and a called workflow can never exceed its caller's token scope.
# Omit this and the run dies at startup with "requesting 'pull-requests: write',
# but is only allowed 'pull-requests: none'".
permissions:
contents: read
pull-requests: write

jobs:
call:
uses: aks-builds/workflows/.github/workflows/auto-approve.yml@main
secrets: inherit
25 changes: 22 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ jobs:
node-version: '20'
cache: 'npm'

- name: Install dependencies
- name: Install dependencies (skip postinstall scripts)
run: npm ci
env:
npm_config_ignore_scripts: true

- name: Rebuild native modules for Electron
run: node_modules/.bin/electron-rebuild -f -w better-sqlite3
Expand Down Expand Up @@ -85,7 +87,7 @@ jobs:
cache: 'npm'

- name: Install system dependencies
run: sudo apt-get install -y libgtk-3-0 libxss1 libnss3 libasound2 libgbm1
run: sudo apt-get install -y libgtk-3-0 libxss1 libnss3 libasound2t64 libgbm1

- name: Install dependencies
run: npm ci
Expand All @@ -105,9 +107,26 @@ jobs:
path: release/*.AppImage
if-no-files-found: error

smoke-test:
name: Pre-release smoke test
needs: [build-windows, build-macos, build-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20', cache: 'npm' }
- run: npm ci
- run: npx playwright install --with-deps chromium
- run: npm run build
- name: Smoke test — app launch suite only
run: xvfb-run --auto-servernum npm run test:e2e -- --grep "App launch"
env:
HITRO_DEV_TOOLS: 0
TEST_MOCK_SERVER: 1

release:
name: Create GitHub Release
needs: [build-windows, build-macos, build-linux]
needs: [build-windows, build-macos, build-linux, smoke-test]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
Expand Down
29 changes: 27 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,19 @@ jobs:
- name: Build main process
run: npm run build

- name: Run E2E tests
- name: Run E2E tests (Linux)
if: matrix.os == 'ubuntu-latest'
run: xvfb-run --auto-servernum npm run test:e2e
env:
HITRO_DEV_TOOLS: 0
TEST_MOCK_SERVER: 1

- name: Run E2E tests (macOS / Windows)
if: matrix.os != 'ubuntu-latest'
run: npm run test:e2e
env:
NEXUS_DEV_TOOLS: 0
HITRO_DEV_TOOLS: 0
TEST_MOCK_SERVER: 1

- name: Upload Playwright report
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -107,3 +116,19 @@ jobs:

- name: Build renderer + main
run: npm run build

test-e2e-network:
name: E2E network tests (main only)
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npx playwright install --with-deps chromium
- run: npm run build
- name: Run network E2E tests
run: xvfb-run --auto-servernum npm run test:e2e -- --grep "live requests"
env:
HITRO_DEV_TOOLS: 0
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- **Mock Server "Add Endpoint" button label** — button inside the new-server draft form was labelled "+ Add"; renamed to "+ Add Endpoint" for clarity.
- **Re-import collection replaces instead of duplicating** — importing a collection whose name already exists now deletes the old one first so the sidebar always shows exactly one entry.
- **Save clears dirty indicator immediately** — clicking Save on an unsaved (uncollected) request now persists the request and clears the dirty dot straight away, then optionally prompts for a collection; previously the prompt blocked the save entirely.
- **Windows file dialog crash** — `BrowserWindow.fromWebContents()` null-fallback + `defaultPath: app.getPath('home')` prevents shell dialog error on Windows.
- **Unicode checkmarks in test output** — `✓` / `✗` were stored as corrupted bytes (`âœ"` / `✗`); now correct UTF-8.
- **Response size always zero** — REST adapter now computes size from `content-length` header or body byte length.
Expand Down
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,37 @@ Hitro is an open-source desktop API client for testing REST, gRPC, GraphQL, WebS
[![TypeScript](https://img.shields.io/badge/TypeScript-5.5-blue)](https://www.typescriptlang.org/)
[![Electron](https://img.shields.io/badge/Electron-31-47848F)](https://www.electronjs.org/)

![Hitro REST workspace](docs/screenshots/01-rest-workspace.png)

---

## In Action

1. **REST workspace** — URL bar, HTTP method selector, multi-tab layout
![REST workspace](docs/screenshots/01-rest-workspace.png)
2. **Query params & headers** — live key-value editor with enable/disable toggles
![Params editor](docs/screenshots/02-rest-params.png)
3. **Request body** — Monaco editor for JSON / XML / text / form-data / urlencoded
![JSON body editor](docs/screenshots/03-rest-body.png)
4. **Authentication** — Bearer, Basic, API Key, OAuth 2.0, Digest, AWS SigV4, mTLS
![Auth tab](docs/screenshots/04-rest-auth.png)
5. **Collections** — Organise requests by project; drag-to-reorder; run all with one click
![Collections sidebar](docs/screenshots/05-collections.png)
6. **Environments** — Named variable sets; activate with one click; `{{varName}}` interpolation
![Environments panel](docs/screenshots/06-environments.png)
7. **GraphQL** — Query + variables editor; introspection-ready
![GraphQL protocol](docs/screenshots/07-graphql.png)
8. **gRPC** — Proto file loading; TLS; service/method selection; metadata
![gRPC protocol](docs/screenshots/08-grpc.png)
9. **WebSocket** — Connect / send / disconnect with real-time event log
![WebSocket protocol](docs/screenshots/09-websocket.png)
10. **Kafka** — Produce & consume; consumer group; fromBeginning; max-message cap
![Kafka protocol](docs/screenshots/10-kafka.png)
11. **MQTT** — Publish & subscribe; QoS 0/1/2; retain flag; broker auth
![MQTT protocol](docs/screenshots/11-mqtt.png)
12. **Assertions** — 16 operators against status, headers, and JSON body paths
![Assertions tab](docs/screenshots/12-assertions.png)

---

## Features
Expand Down
Binary file added docs/screenshots/01-rest-workspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/02-rest-params.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/03-rest-body.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/04-rest-auth.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/05-collections.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/06-environments.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/07-graphql.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/08-grpc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/09-websocket.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/10-kafka.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/11-mqtt.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/12-assertions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading