-
NexaPG 0.2.2 - NGINX unprivileged security update
StableAll checks were successfulMigration Safety / Alembic upgrade/downgrade safety (push) Successful in 21sPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m33sreleased this
2026-02-14 16:20:45 +00:00 | 5 commits to main since this releaseChanged
Frontend Runtime Security Hardening
- Switched frontend runtime image to an unprivileged NGINX variant:
- from
nginx:1.29-alpine-slim - to
nginxinc/nginx-unprivileged:stable-alpine
- from
- Set explicit non-root runtime user in frontend container:
USER 101
Frontend Runtime Port Alignment
- Updated NGINX listener in frontend runtime config:
listen 8080;
- Updated frontend container port exposure:
EXPOSE 8080
- Updated Docker Compose frontend mapping:
- from
${FRONTEND_PORT}:80 - to
${FRONTEND_PORT}:8080
- from
Why This Release
- Improves container runtime security posture by running frontend as non-root by default.
- Aligns deployment with Docker Scout best-practice checks (
default non-root user). - Keeps external access unchanged (still via
FRONTEND_PORTon host), while hardening internal container behavior.
Notes
- No database migration required.
- Rebuild and republish frontend image, then redeploy to apply changes.
- If using custom reverse-proxy/container configs, ensure upstream points to frontend container port
8080.
Downloads
- Switched frontend runtime image to an unprivileged NGINX variant:
-
NexaPG 0.2.1 - Alpine image backend update
StableAll checks were successfulMigration Safety / Alembic upgrade/downgrade safety (push) Successful in 28sPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 7sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m51sreleased this
2026-02-14 16:03:00 +00:00 | 8 commits to main since this releaseChanged
Backend Runtime Base Image
- Switched backend container base image to Alpine by default:
- from
python:3.13-slim - to
python:3.13-alpine
- from
- Updated backend Dockerfile to stay cross-compatible for package/user setup logic.
CI
Compatibility Workflow Cleanup
- Removed temporary Alpine-specific backend smoke job after successful validation.
- Kept PostgreSQL compatibility matrix checks (PG14–PG18).
- Kept compatibility checks active on
developmentfor earlier feedback before merge.
Why This Release
- Reduces backend image footprint and package surface.
- Improves security posture potential by minimizing installed base components.
- Simplifies CI while keeping core compatibility safeguards in place.
Notes
- No database migration required.
- Rebuild and redeploy backend image to apply the Alpine base switch.
- Monitor startup/runtime logs after rollout to confirm environment-specific dependency behavior.
Downloads
- Switched backend container base image to Alpine by default:
-
NexaPG 0.2.0 - Reliability hardening milestone update
StableAll checks were successfulMigration Safety / Alembic upgrade/downgrade safety (push) Successful in 19sPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m14sreleased this
2026-02-14 15:32:50 +00:00 | 13 commits to main since this releaseAdded
Reliability and Stability (NX-102)
- Introduced per-target exponential backoff with jitter in the collector for unreachable databases.
- Added stronger per-target log throttling to prevent repeated connection-failure log floods.
- Collector now skips failed targets until their next scheduled retry while continuing to poll healthy targets.
- Added recovery context logging (
after_failures,downtime_seconds) when targets come back online. - Improved collector loop cadence (
poll_interval - elapsed) to reduce timing drift and transient freshness spikes. - Added cleanup of stale collector failure state for removed targets.
Migration Safety CI Gate (NX-104)
- Added dedicated migration safety workflow:
.github/workflows/migration-safety.yml
- CI now validates Alembic roundtrip safety:
upgrade head -> downgrade -1 -> upgrade head
- Added schema consistency validation using
pg_dump --schema-onlybefore/after roundtrip with strict diff. - Normalized dump comparison by filtering dynamic
\restrict/\unrestrictlines to avoid false positives.
Changed
API Error Handling Standardization (NX-101)
- Standardized backend error payloads across API failures to a shared structure:
codemessagedetailsrequest_id
- Added request ID middleware and centralized exception mapping for consistent 4xx/5xx responses.
- Replaced ad-hoc
HTTPException(detail="...")patterns in key routes with structured error objects. - Updated frontend API parsing to reliably consume structured error metadata.
Runtime Connectivity UX (NX-103)
- Connectivity/runtime target failures now surface as explicit, actionable
target_unreachablehandling instead of generic raw failures. - Target detail view now renders a clean Target Offline state with context (
host,port, optionalrequest_id) and guidance.
Security
JWT Library Migration (from 0.1.8 scope)
- Replaced
python-jose[cryptography]withPyJWTfor token handling. - Removed direct
ecdsadependency from backend requirements. - Updated JWT exception handling to
jwt.InvalidTokenErrorin auth/validation paths. - Removed obsolete packages:
python-joseecdsa
- JWT signing/verification behavior remains unchanged (same configured algorithm/secret).
Fixed
- Reduced periodic false-positive collector freshness warnings caused by polling interval drift.
- Eliminated noisy generic user-facing failures for expected target-down/network-refused scenarios.
- Prevented migration CI false negatives caused by dynamic
pg_dumprestrict token lines.
Operational Notes
- No database migration is required specifically for this release content.
- Rebuild and republish images, then redeploy services.
- Recommended: mark migration safety CI as a required branch protection check for
main.
Downloads
-
NexaPG 0.1.8 - Critical Security Update
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 7sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m27sreleased this
2026-02-13 12:24:45 +00:00 | 21 commits to main since this releaseSecurity
JWT Library Migration (CVE Reduction)
- Replaced
python-jose[cryptography]withPyJWTfor token handling. - Removed direct
ecdsadependency from backend requirements. - Updated JWT exception handling to
jwt.InvalidTokenErrorin auth/validation paths.
Dependency Cleanup
- Removed packages no longer required after JWT migration:
python-joseecdsa
Implementation Notes
- JWT signing/verification behavior remains unchanged (same configured algorithm and secret).
- Existing access/refresh token flow and auth guards continue to work as before.
Notes
- No database migration required.
- Rebuild and republish backend image, then redeploy to apply dependency/security changes.
Downloads
- Replaced
-
NexaPG 0.1.7 - Backend Security Update
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m32sreleased this
2026-02-13 12:10:48 +00:00 | 24 commits to main since this releaseSecurity
Backend Dependency Hardening
- Updated backend framework and security-related Python packages:
fastapi->0.129.0starlette->0.52.1(explicitly pinned)cryptography->46.0.5python-multipart->0.0.22ecdsa->0.19.1
Backend Base Image Hardening
- Updated backend runtime base image:
python:3.12-slim->python:3.13-slim
- Added OS package security refresh during image build:
apt-get updateapt-get upgrade -y- cleanup of apt lists to keep image lean
Notes
- No database migration required.
- Rebuild and republish backend image, then redeploy to apply all security updates.
Downloads
- Updated backend framework and security-related Python packages:
-
NexaPG 0.1.6 - Performance & Security Update
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 9sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m24sreleased this
2026-02-13 11:49:53 +00:00 | 27 commits to main since this releaseSecurity
Frontend Runtime Image Hardening
- Updated frontend runtime base image to Docker Hub recommended tag:
nginx:1.29-alpine-slim
- Kept lightweight Alpine-based runtime footprint for reduced package surface.
- Applied runtime package refresh during build:
apk upgrade --no-cache
Healthcheck Hardening
- Frontend container healthcheck now validates Nginx config directly:
nginx -t
- Removed dependency on HTTP fetch tools in healthcheck path.
Notes
- No database migration required.
- Rebuild and republish frontend image, then redeploy to apply security base-image updates.
Downloads
- Updated frontend runtime base image to Docker Hub recommended tag:
-
NexaPG 0.1.5 - Security Update
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 7sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 2m7sreleased this
2026-02-13 10:22:11 +00:00 | 29 commits to main since this releaseSecurity
- Switched frontend image base from Alpine to Debian Bookworm to reduce Alpine-specific CVE exposure in registry scans.
- Updated build stage:
node:22-alpine->node:22-bookworm-slim
- Updated runtime stage:
nginx:1.29-alpine->nginx:1.29-bookworm
- Replaced frontend container healthcheck command:
- removed
wget-based check - now uses
nginx -t, reducing dependency on BusyBox-style tooling
- removed
Notes
- No database migration required.
- Rebuild and republish frontend image (
latestand release tag), then redeploy.
Downloads
-
NexaPG 0.1.4
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 1m13sreleased this
2026-02-13 10:11:10 +00:00 | 31 commits to main since this releaseAdded
- User profile fields:
first_name,last_name. - Admin user creation now supports first and last name.
- Sidebar profile block now shows full name first (if available), with email below.
Changed
- Admin user management UI upgraded with inline editing per user.
- Admins can now update existing users directly from the table:
- first name
- last name
- role
- optional password reset
- User table now includes a dedicated Name column.
Fixed
- Admin user update now validates email uniqueness when changing email.
- Password update handling in admin edit flow is now robust (empty password does not overwrite hash).
Backend / API
- Extended user schemas (
UserOut,UserCreate,UserUpdate) with:first_namelast_name
PUT /api/v1/admin/users/{user_id}supports name/email/role updates plus optional password change.
Database
- Added Alembic migration:
0009_user_profile_fields- adds
users.first_nameandusers.last_name
Notes
- Database migration required for this release (
make migrate). - After migration, a normal redeploy/restart is sufficient.
Downloads
- User profile fields:
-
NexaPG 0.1.3
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 8sDocker Publish (Release) / Build and Push Docker Images (release) Successful in 4m30sreleased this
2026-02-13 09:14:17 +00:00 | 34 commits to main since this releaseFixed
- Query Insights: selected query no longer jumps to another/latest row after background refresh.
- Stabilized selection logic by preserving selected item via queryid across data reloads.
Technical
- Query Insights refresh flow now uses stable references to avoid unintended re-selection on rerender/token refresh.
- Selection fallback now only applies when the previously selected query no longer exists in refreshed data.
Notes
- No database migration required.
- Safe patch release; redeploy/restart is sufficient.
Downloads
-
NexaPG 0.1.2
StableAll checks were successfulPostgreSQL Compatibility Matrix / PG14 smoke (push) Successful in 9sPostgreSQL Compatibility Matrix / PG15 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG16 smoke (push) Successful in 8sPostgreSQL Compatibility Matrix / PG17 smoke (push) Successful in 7sPostgreSQL Compatibility Matrix / PG18 smoke (push) Successful in 7sreleased this
2026-02-13 08:36:24 +00:00 | 39 commits to main since this releaseAdded
- New User Settings entry in the sidebar (above Logout).
- New User Settings page at /user-settings.
- User self-service password change flow:
- current password verification
- new password + confirmation
- minimum length validation
Backend
- Added endpoint:
- POST /api/v1/me/password
- Password change security behavior:
- rejects invalid current password
- rejects reusing the same password
- stores new password hashed (Argon2)
- Added audit log event:
- auth.password_change
- Added request schema:
- UserPasswordChange
Frontend
- New UserSettingsPage with clear error/success feedback.
- New profile action button styling (User Settings) integrated with existing sidebar design.
UX / Service Information Improvements
- Automatic update checks every 30 seconds while logged in.
- Service Information navigation button now highlights (yellow) when an update is available.
- Service Information page visual refresh for clearer update status presentation.
- Removed noisy audit logging for automatic service update checks.
Release / Version Control Policy
- Version display remains maintainer-controlled in code.
- Update checks remain tied to official upstream release source.
Notes
- No DB migration required specifically for the password-change feature.
- If upgrading from 0.1.1, normal redeploy/restart is sufficient.
Downloads