webgate 0.3.2__tar.gz → 0.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. {webgate-0.3.2 → webgate-0.3.3}/CHANGELOG.md +13 -0
  2. {webgate-0.3.2 → webgate-0.3.3}/PKG-INFO +38 -1
  3. {webgate-0.3.2 → webgate-0.3.3}/README.md +37 -0
  4. webgate-0.3.3/after-reload.yaml +64 -0
  5. webgate-0.3.3/docs/screenshots/v0.3/01-login-demo-banner.png +0 -0
  6. webgate-0.3.3/docs/screenshots/v0.3/02-dashboard-jump-host.png +0 -0
  7. webgate-0.3.3/docs/screenshots/v0.3/03-terminal-snippets-jump.png +0 -0
  8. webgate-0.3.3/docs/screenshots/v0.3/04-snippet-executed.png +0 -0
  9. webgate-0.3.3/docs/screenshots/v0.3/05-sftp-via-jump.png +0 -0
  10. webgate-0.3.3/docs/screenshots/v0.3/06-webhooks-modal.png +0 -0
  11. webgate-0.3.3/docs/screenshots/v0.3/07-webhook-test-fired.png +0 -0
  12. webgate-0.3.3/docs/screenshots/v0.3/08-add-server-jump-via.png +0 -0
  13. {webgate-0.3.2 → webgate-0.3.3}/pyproject.toml +1 -1
  14. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/static/index.html +2 -2
  15. {webgate-0.3.2 → webgate-0.3.3}/.dockerignore +0 -0
  16. {webgate-0.3.2 → webgate-0.3.3}/.github/workflows/docs.yml +0 -0
  17. {webgate-0.3.2 → webgate-0.3.3}/.gitignore +0 -0
  18. {webgate-0.3.2 → webgate-0.3.3}/Dockerfile +0 -0
  19. {webgate-0.3.2 → webgate-0.3.3}/Dockerfile.demo +0 -0
  20. {webgate-0.3.2 → webgate-0.3.3}/Dockerfile.ssh-demo +0 -0
  21. {webgate-0.3.2 → webgate-0.3.3}/LICENSE +0 -0
  22. {webgate-0.3.2 → webgate-0.3.3}/ROADMAP.md +0 -0
  23. {webgate-0.3.2 → webgate-0.3.3}/VERSION +0 -0
  24. {webgate-0.3.2 → webgate-0.3.3}/compose.dev.yml +0 -0
  25. {webgate-0.3.2 → webgate-0.3.3}/compose.yml +0 -0
  26. {webgate-0.3.2 → webgate-0.3.3}/docs/api/auth.md +0 -0
  27. {webgate-0.3.2 → webgate-0.3.3}/docs/api/files.md +0 -0
  28. {webgate-0.3.2 → webgate-0.3.3}/docs/api/servers.md +0 -0
  29. {webgate-0.3.2 → webgate-0.3.3}/docs/api/terminal.md +0 -0
  30. {webgate-0.3.2 → webgate-0.3.3}/docs/changelog.md +0 -0
  31. {webgate-0.3.2 → webgate-0.3.3}/docs/getting-started/installation.md +0 -0
  32. {webgate-0.3.2 → webgate-0.3.3}/docs/getting-started/quickstart.md +0 -0
  33. {webgate-0.3.2 → webgate-0.3.3}/docs/guide/files.md +0 -0
  34. {webgate-0.3.2 → webgate-0.3.3}/docs/guide/servers.md +0 -0
  35. {webgate-0.3.2 → webgate-0.3.3}/docs/guide/split.md +0 -0
  36. {webgate-0.3.2 → webgate-0.3.3}/docs/guide/terminal.md +0 -0
  37. {webgate-0.3.2 → webgate-0.3.3}/docs/guide/users.md +0 -0
  38. {webgate-0.3.2 → webgate-0.3.3}/docs/index.md +0 -0
  39. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/access-control.png +0 -0
  40. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/audit.png +0 -0
  41. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/edit-access-control.png +0 -0
  42. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/editor.png +0 -0
  43. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/light-theme.png +0 -0
  44. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/login.png +0 -0
  45. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/new-server-form.png +0 -0
  46. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/sftp-restricted.png +0 -0
  47. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/sftp.png +0 -0
  48. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/site-manager.png +0 -0
  49. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/split-view.png +0 -0
  50. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/ssh-disabled.png +0 -0
  51. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/terminal.png +0 -0
  52. {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/users.png +0 -0
  53. {webgate-0.3.2 → webgate-0.3.3}/fly.toml +0 -0
  54. {webgate-0.3.2 → webgate-0.3.3}/mkdocs.yml +0 -0
  55. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/__init__.py +0 -0
  56. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/__main__.py +0 -0
  57. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/app.py +0 -0
  58. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/__init__.py +0 -0
  59. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/models.py +0 -0
  60. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/service.py +0 -0
  61. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/__init__.py +0 -0
  62. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/models.py +0 -0
  63. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/routes.py +0 -0
  64. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/service.py +0 -0
  65. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/config.py +0 -0
  66. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/db/__init__.py +0 -0
  67. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/db/engine.py +0 -0
  68. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/demo.py +0 -0
  69. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/__init__.py +0 -0
  70. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/models.py +0 -0
  71. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/pool.py +0 -0
  72. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/routes.py +0 -0
  73. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/sftp_service.py +0 -0
  74. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/__init__.py +0 -0
  75. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/crypto.py +0 -0
  76. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/models.py +0 -0
  77. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/monitor.py +0 -0
  78. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/routes.py +0 -0
  79. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/service.py +0 -0
  80. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/__init__.py +0 -0
  81. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/models.py +0 -0
  82. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/routes.py +0 -0
  83. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/__init__.py +0 -0
  84. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/routes.py +0 -0
  85. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/ssh_session.py +0 -0
  86. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/ws_handler.py +0 -0
  87. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/__init__.py +0 -0
  88. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/dispatcher.py +0 -0
  89. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/models.py +0 -0
  90. {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/routes.py +0 -0
  91. {webgate-0.3.2 → webgate-0.3.3}/tests/__init__.py +0 -0
  92. {webgate-0.3.2 → webgate-0.3.3}/tests/conftest.py +0 -0
  93. {webgate-0.3.2 → webgate-0.3.3}/tests/test_auth.py +0 -0
  94. {webgate-0.3.2 → webgate-0.3.3}/tests/test_files.py +0 -0
  95. {webgate-0.3.2 → webgate-0.3.3}/tests/test_servers.py +0 -0
  96. {webgate-0.3.2 → webgate-0.3.3}/tests/test_terminal.py +0 -0
  97. {webgate-0.3.2 → webgate-0.3.3}/uv.lock +0 -0
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.3.3 (2026-04-15)
4
+
5
+ ### Fixed
6
+
7
+ - Snippets toolbar was empty after a fresh login until the page was reloaded. `loadSnippets()` was only called from `init()` (which only runs when a token is already in localStorage). Now also called after a successful login and after a forced password change.
8
+
9
+ ### Docs
10
+
11
+ - Added end-to-end UI screenshots for v0.3.x features: jump host, snippets toolbar, snippet execution, SFTP browse via jump, webhooks management modal with delivery telemetry, server form with Jump Via dropdown.
12
+ - Browser-tested every UI flow with `playwright-cli` against both the live Fly.io demo and a local container.
13
+
14
+ ---
15
+
3
16
  ## v0.3.2 (2026-04-15)
4
17
 
5
18
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webgate
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Self-hosted web application for remote server management via SSH terminal and SFTP file browser
5
5
  Project-URL: Homepage, https://github.com/kalexnolasco/webgate
6
6
  Project-URL: Documentation, https://kalexnolasco.github.io/webgate/
@@ -242,6 +242,43 @@ flowchart TB
242
242
  ### Light Theme
243
243
  ![Light Theme](docs/screenshots/light-theme.png)
244
244
 
245
+ ### v0.3.x — Operations Pack
246
+
247
+ These screenshots come from the live demo at https://webgate-demo.fly.dev (login `demo` / `demo`).
248
+
249
+ #### Demo banner on login
250
+ ![Demo banner](docs/screenshots/v0.3/01-login-demo-banner.png)
251
+
252
+ #### Site Manager with jump-host indicator
253
+ The `↺` next to `internal-app` means it tunnels through `bastion`.
254
+
255
+ ![Dashboard with jump host](docs/screenshots/v0.3/02-dashboard-jump-host.png)
256
+
257
+ #### Terminal with snippets toolbar
258
+ Click a snippet button to send `command + Enter` to the active session. Right-click to delete, `+` to create.
259
+
260
+ ![Terminal snippets](docs/screenshots/v0.3/03-terminal-snippets-jump.png)
261
+
262
+ #### Snippet executed
263
+ Clicking `ls -lah` sent the command and the output appears in the terminal.
264
+
265
+ ![Snippet executed](docs/screenshots/v0.3/04-snippet-executed.png)
266
+
267
+ #### SFTP via jump host
268
+ Browsing the `internal-app` filesystem — the SFTP connection is also tunneled through the bastion.
269
+
270
+ ![SFTP via jump](docs/screenshots/v0.3/05-sftp-via-jump.png)
271
+
272
+ #### Webhooks management (admin)
273
+ Per-event subscription, optional HMAC signing, last delivery status.
274
+
275
+ ![Webhooks modal](docs/screenshots/v0.3/06-webhooks-modal.png)
276
+
277
+ #### Add Server form with Jump Via dropdown
278
+ Pick any other registered server as the bastion.
279
+
280
+ ![Add Server with Jump Via](docs/screenshots/v0.3/08-add-server-jump-via.png)
281
+
245
282
  ## Quick Start
246
283
 
247
284
  ### Docker (recommended)
@@ -194,6 +194,43 @@ flowchart TB
194
194
  ### Light Theme
195
195
  ![Light Theme](docs/screenshots/light-theme.png)
196
196
 
197
+ ### v0.3.x — Operations Pack
198
+
199
+ These screenshots come from the live demo at https://webgate-demo.fly.dev (login `demo` / `demo`).
200
+
201
+ #### Demo banner on login
202
+ ![Demo banner](docs/screenshots/v0.3/01-login-demo-banner.png)
203
+
204
+ #### Site Manager with jump-host indicator
205
+ The `↺` next to `internal-app` means it tunnels through `bastion`.
206
+
207
+ ![Dashboard with jump host](docs/screenshots/v0.3/02-dashboard-jump-host.png)
208
+
209
+ #### Terminal with snippets toolbar
210
+ Click a snippet button to send `command + Enter` to the active session. Right-click to delete, `+` to create.
211
+
212
+ ![Terminal snippets](docs/screenshots/v0.3/03-terminal-snippets-jump.png)
213
+
214
+ #### Snippet executed
215
+ Clicking `ls -lah` sent the command and the output appears in the terminal.
216
+
217
+ ![Snippet executed](docs/screenshots/v0.3/04-snippet-executed.png)
218
+
219
+ #### SFTP via jump host
220
+ Browsing the `internal-app` filesystem — the SFTP connection is also tunneled through the bastion.
221
+
222
+ ![SFTP via jump](docs/screenshots/v0.3/05-sftp-via-jump.png)
223
+
224
+ #### Webhooks management (admin)
225
+ Per-event subscription, optional HMAC signing, last delivery status.
226
+
227
+ ![Webhooks modal](docs/screenshots/v0.3/06-webhooks-modal.png)
228
+
229
+ #### Add Server form with Jump Via dropdown
230
+ Pick any other registered server as the bastion.
231
+
232
+ ![Add Server with Jump Via](docs/screenshots/v0.3/08-add-server-jump-via.png)
233
+
197
234
  ## Quick Start
198
235
 
199
236
  ### Docker (recommended)
@@ -0,0 +1,64 @@
1
+ - generic [ref=e2]:
2
+ - generic [ref=e3]:
3
+ - text: 🎮
4
+ - strong [ref=e4]: Demo mode
5
+ - text: — login with
6
+ - code [ref=e5]: demo
7
+ - text: /
8
+ - code [ref=e6]: demo
9
+ - text: · read-only (servers cannot be added or modified) · state resets hourly ·
10
+ - link "GitHub" [ref=e7] [cursor=pointer]:
11
+ - /url: https://github.com/kalexnolasco/webgate
12
+ - generic [ref=e8]:
13
+ - generic [ref=e9]:
14
+ - generic [ref=e10]:
15
+ - generic [ref=e11]: webgate
16
+ - button "Site Manager" [ref=e12] [cursor=pointer]
17
+ - button "Keys" [ref=e13] [cursor=pointer]
18
+ - generic [ref=e14]:
19
+ - generic [ref=e15]: demo
20
+ - 'button "2FA: Off" [ref=e16] [cursor=pointer]'
21
+ - button "☀️" [ref=e17] [cursor=pointer]
22
+ - button "Logout" [ref=e18] [cursor=pointer]
23
+ - generic [ref=e19]:
24
+ - generic [ref=e20]: "Host:"
25
+ - textbox "hostname" [ref=e21]
26
+ - generic [ref=e22]: "Username:"
27
+ - textbox "user" [ref=e23]
28
+ - generic [ref=e24]: "Password:"
29
+ - textbox [ref=e25]
30
+ - generic [ref=e26]: "Port:"
31
+ - spinbutton [ref=e27]: "22"
32
+ - button "Quickconnect ▶" [ref=e28] [cursor=pointer]
33
+ - generic [ref=e29]:
34
+ - generic [ref=e51]: 8:17:34 PM Connecting to 127.0.0.1:22...
35
+ - generic [ref=e52]: 8:17:34 PM webgate initialized
36
+ - generic [ref=e53]: "8:17:34 PM Connected: internal-app"
37
+ - generic [ref=e31]:
38
+ - generic [ref=e32] [cursor=pointer]: 💻 Site Manager
39
+ - generic [ref=e54] [cursor=pointer]:
40
+ - generic [ref=e55]: ⌨ internal-app
41
+ - generic [ref=e56]: ×
42
+ - generic [ref=e58]:
43
+ - generic [ref=e59]:
44
+ - generic [ref=e60]: "Snippets:"
45
+ - button "disk usage" [ref=e61] [cursor=pointer]
46
+ - button "ls -lah" [ref=e62] [cursor=pointer]
47
+ - button "top procs" [ref=e63] [cursor=pointer]
48
+ - button "uptime" [ref=e64] [cursor=pointer]
49
+ - button "+" [ref=e65] [cursor=pointer]
50
+ - generic [ref=e69]:
51
+ - textbox "Terminal input" [ref=e70]
52
+ - generic [ref=e71]:
53
+ - generic [ref=e73]: "Linux 1853454a533968 6.12.47-fly #1 SMP PREEMPT_DYNAMIC Wed Mar 25 00:13:15 UTC 2026 x86_64"
54
+ - generic [ref=e76]: The programs included with the Debian GNU/Linux system are free software;
55
+ - generic [ref=e78]: the exact distribution terms for each program are described in the
56
+ - generic [ref=e80]: individual files in /usr/share/doc/*/copyright.
57
+ - generic [ref=e83]: Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
58
+ - generic [ref=e85]: permitted by applicable law.
59
+ - generic [ref=e86]:
60
+ - generic [ref=e87]: demo@1853454a533968
61
+ - generic [ref=e88]: ":"
62
+ - generic [ref=e89]: ~
63
+ - generic [ref=e90]: $
64
+ - generic [ref=e50]: "SSH: internal-app"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "webgate"
3
- version = "0.3.2"
3
+ version = "0.3.3"
4
4
  description = "Self-hosted web application for remote server management via SSH terminal and SFTP file browser"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1012,7 +1012,7 @@ function app() {
1012
1012
  this.totpRequired = false; this.totpCode = ''; this.tempToken = '';
1013
1013
  await this.fetchMe();
1014
1014
  if (this.currentUser?.must_change_password) { this.showChangePassword = true; return; }
1015
- await this.loadServers(); await this.loadGroups();
1015
+ await this.loadServers(); await this.loadGroups(); await this.loadStatuses(); await this.loadSnippets();
1016
1016
  this.username = ''; this.password = '';
1017
1017
  this.log('status', 'Logged in as ' + this.currentUser?.username);
1018
1018
  } catch (e) { this.showToast(e.message, 'error'); }
@@ -1023,7 +1023,7 @@ function app() {
1023
1023
  try {
1024
1024
  await this.apiCall('/api/auth/change-password', { method: 'POST', body: JSON.stringify({ new_password: this.newPassword }) });
1025
1025
  this.showChangePassword = false; this.newPassword = ''; this.confirmPassword = '';
1026
- await this.fetchMe(); await this.loadServers(); await this.loadGroups();
1026
+ await this.fetchMe(); await this.loadServers(); await this.loadGroups(); await this.loadStatuses(); await this.loadSnippets();
1027
1027
  this.username = ''; this.password = '';
1028
1028
  this.showToast('Password changed');
1029
1029
  this.log('status', 'Logged in as ' + this.currentUser?.username);
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes