diff --git a/.claude/JOURNAL.md b/.claude/JOURNAL.md
index b04e79b..09ac6a3 100644
--- a/.claude/JOURNAL.md
+++ b/.claude/JOURNAL.md
@@ -21,3 +21,6 @@ This journal tracks substantive work on documents, diagrams, and documentation c
6. **Task - Enhance and fix self-service features**: Evolved volume management from single home volume to multi-volume selection, fixed Bootstrap 5 compatibility, added visual enhancements
**Result**: Transformed ResetHomeVolumeHandler into ManageVolumesHandler supporting selective reset of home/workspace/cache volumes via checkboxes in UI, fixed template inheritance to properly extend JupyterHub's default home.html (resolving 404 errors), updated to Bootstrap 5 modal API (data-bs-toggle, data-bs-target, btn-close), wrapped JavaScript in RequireJS callback for proper module loading, added Font Awesome icons (fa-rotate for restart, fa-database for volumes), implemented automatic page refresh after Stop Server/Manage Volumes/Restart Server actions, updated API endpoint to `/api/users/{username}/manage-volumes` accepting JSON body with volume array, backend now processes multiple volumes and returns detailed success/failure response, bumped version to 3.0.12 reflecting major feature enhancement
+
+7. **Task - Document self-service features in README**: Updated README with features section and screenshots demonstrating new self-service capabilities
+ **Result**: Added comprehensive Features section with bullet points covering GPU auto-detection, user self-service, isolated environments, native authentication, shared storage, and production-ready setup, created Self-Service Volume Management subsection with three screenshots (restart server button, manage volumes button, volume selection modal) and one-sentence descriptions for each, positioned visual documentation prominently after feature list to demonstrate user-facing functionality
diff --git a/.resources/screenshot-restart-server.png b/.resources/screenshot-restart-server.png
new file mode 100755
index 0000000..94e73c8
Binary files /dev/null and b/.resources/screenshot-restart-server.png differ
diff --git a/.resources/screenshot-volumes-modal.png b/.resources/screenshot-volumes-modal.png
new file mode 100755
index 0000000..b69a116
Binary files /dev/null and b/.resources/screenshot-volumes-modal.png differ
diff --git a/.resources/screenshot-volumes.png b/.resources/screenshot-volumes.png
new file mode 100755
index 0000000..b6fb9e8
Binary files /dev/null and b/.resources/screenshot-volumes.png differ
diff --git a/README.md b/README.md
index a571dae..0bd945b 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,28 @@ By default system is capable of **automatically detecting** NVIDIA CUDA-supporte
This deployment provides access to a centralized JupyterHub instance for managing user sessions. Optional integrations such as TensorBoard, MLFlow, or Optuna can be added manually via service extensions.
+## Features
+
+- **GPU Auto-Detection**: Automatic NVIDIA CUDA GPU detection and configuration for spawned user containers
+- **User Self-Service**: Users can restart their JupyterLab containers and selectively reset persistent volumes (home/workspace/cache) without admin intervention
+- **Isolated Environments**: Each user gets dedicated JupyterLab container with persistent volumes via DockerSpawner
+- **Native Authentication**: Built-in user management with NativeAuthenticator supporting self-registration and admin approval
+- **Shared Storage**: Optional CIFS/NAS mount support for shared datasets across all users
+- **Production Ready**: Traefik reverse proxy with TLS termination, automatic container updates via Watchtower
+
+### Self-Service Volume Management
+
+Users can restart their server or selectively reset volumes when the server is stopped:
+
+
+*Restart running JupyterLab container directly from the user control panel*
+
+
+*Access volume management when server is stopped*
+
+
+*Select individual volumes to reset - home directory, workspace files, or cache data*
+
## References
This project spawns user environments using docker image: `stellars/stellars-jupyterlab-ds`
diff --git a/project.env b/project.env
index dcb6da8..d647603 100644
--- a/project.env
+++ b/project.env
@@ -3,7 +3,7 @@ PROJECT_NAME="stellars-jupyterhub-ds"
PROJECT_DESCRIPTION="Multi-user JupyterHub 4 deployment platform with data science stack, GPU auto-detection, NativeAuthenticator, and isolated per-user environments spawned via DockerSpawner"
# Version
-VERSION="3.0.12_cuda-12.9.1_jh-5.4.2"
+VERSION="3.0.14_cuda-12.9.1_jh-5.4.2"
VERSION_COMMENT="Multi-user JupyterHub with GPU auto-detection, self-service volume management (home/workspace/cache), and container restart capabilities"
# Author
diff --git a/services/jupyterhub/templates/home.html b/services/jupyterhub/templates/home.html
index bb505ac..9f8639f 100644
--- a/services/jupyterhub/templates/home.html
+++ b/services/jupyterhub/templates/home.html
@@ -379,11 +379,12 @@
// Monitor for when button changes state (becomes start button)
const checkInterval = setInterval(function() {
if ($('#stop').length === 0 && $('#start').length > 0) {
- console.log('[Stop Server] Server stopped, refreshing page...');
+ console.log('[Stop Server] Server stopped, waiting before refresh...');
clearInterval(checkInterval);
setTimeout(function() {
+ console.log('[Stop Server] Refreshing page now');
location.reload();
- }, 1000);
+ }, 3000); // Wait 3 seconds after stop completes before refreshing
}
}, 500);