Releases: GilbN/geometrikks
Release list
v0.8.0-dev.2
fix(cli) 51bf8f1: decompress hypertable chunks before backfill-hostname updates
The full-table UPDATEs tripped TimescaleDB's tuple decompression limit
(max_tuples_decompressed_per_dml_transaction, 100k) on compressed
history; Decompress affected chunks first,
same pattern as the url/referrer swap migration, and probe with cheap
EXISTS queries so a rerun with nothing left to change exits before the
expensive decompression.
Full Changelog: v0.8.0-dev.1...v0.8.0-dev.2
v0.8.0-dev.1
What's Changed
- feat: Traefik access log support, multi-source separation, and url/referrer swap fix by @GilbN in #129
Full Changelog: v0.7.1-dev.3...v0.8.0-dev.1
v0.7.1
What's Changed
- build(deps): bump aiohttp from 3.14.1 to 3.14.3 in the uv group across 1 directory by @dependabot[bot] in #118
- build(deps): bump the github-actions group across 1 directory with 5 updates by @dependabot[bot] in #98
- Feat/auth disabled mode by @GilbN in #119
- build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #120
- chore(deps): bump lucide-react from 0.562.0 to 1.27.0 by @dependabot[bot] in #99
- build(deps-dev): bump vite from 7.3.6 to 8.2.0 by @dependabot[bot] in #100
- build(deps-dev): bump @vitejs/plugin-react from 5.2.0 to 6.0.5 by @dependabot[bot] in #101
- build(deps): bump the python-minor-patch group across 1 directory with 3 updates by @dependabot[bot] in #122
- build(deps): bump the frontend-minor-patch group across 1 directory with 9 updates by @dependabot[bot] in #123
- fix: show chart tooltips and summary range in local time by @GilbN in #126
- fix(frontend): keep analytics charts readable on dense and spike-dominated data by @GilbN in #127
- fix(analytics): bucket daily chart data into browser-local days by @GilbN in #128
- Release v0.7.1 by @GilbN in #130
Highlights
Added
- Time-series charts auto-clamp the y-axis when a single traffic burst dwarfs the rest of the range, with a "y-axis clipped" note and true values kept in tooltips.
- Settings > Status Authentication card reporting whether built-in auth is active.
/logoutas a route of its own.
Changed
GET /api/v1/auth/menow reports an auth mode (session/disabled); the auth endpoints answer as mode-appropriate no-ops whenAPP_AUTH_DISABLED=true.- 404/401 responses log a single
client_errorwarning instead of an error-level traceback.
Fixed
- Daily chart buckets are computed as browser-local days, so "Today" no longer renders an extra day.
- Status-classes chart switches to a stacked area past 48 buckets instead of rendering invisible sub-pixel bars.
- Chart tooltips and the Summary date-range badge show browser-local time instead of raw UTC.
- With
APP_AUTH_DISABLED=truethe auth endpoints stay registered, so/api/v1/auth/meno longer 404s on every page load.
Full Changelog: v0.7.0...v0.7.1
v0.7.1-dev.3
What's Changed
- fix: show chart tooltips and summary range in local time by @GilbN in #126
- fix(frontend): keep analytics charts readable on dense and spike-dominated data by @GilbN in #127
- fix(analytics): bucket daily chart data into browser-local days by @GilbN in #128
Full Changelog: v0.7.1-dev.2...v0.7.1-dev.3
v0.7.1-dev.2
What's Changed
- build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #120
- chore(deps): bump lucide-react from 0.562.0 to 1.27.0 by @dependabot[bot] in #99
- build(deps-dev): bump vite from 7.3.6 to 8.2.0 by @dependabot[bot] in #100
- build(deps-dev): bump @vitejs/plugin-react from 5.2.0 to 6.0.5 by @dependabot[bot] in #101
- build(deps): bump the python-minor-patch group across 1 directory with 3 updates by @dependabot[bot] in #122
- build(deps): bump the frontend-minor-patch group across 1 directory with 9 updates by @dependabot[bot] in #123
Full Changelog: v0.7.1-dev.1...v0.7.1-dev.2
v0.7.1-dev.1
What's Changed
- build(deps): bump aiohttp from 3.14.1 to 3.14.3 in the uv group across 1 directory by @dependabot[bot] in #118
- build(deps): bump the github-actions group across 1 directory with 5 updates by @dependabot[bot] in #98
- Feat/auth disabled mode by @GilbN in #119
Full Changelog: v0.7.0...v0.7.1-dev.1
v0.7.0
What's Changed
- GeoMetrikks 0.7 phase 1: warning-free Litestar compatibility by @GilbN in #104
- GeoMetrikks 0.7 phase 2: hermetic composition and testing by @GilbN in #105
- GeoMetrikks 0.7 phase 3: API and service consistency by @GilbN in #106
- GeoMetrikks 0.7: dissolve api/v1 into domain packages by @GilbN in #107
- GeoMetrikks 0.7 phase 4 - versioned /api/v1 router, camelCase wire format, pinned error contract by @GilbN in #108
- GeoMetrikks 0.7 phase 5 - lifespan resource ownership, migration gate, realtime consolidation by @GilbN in #109
- GeoMetrikks 0.7 phase 6 - frontend and deployment hardening by @GilbN in #110
- GeoMetrikks 0.7 phase 7 - pre-checks: Litestar 3 gate status and structlog test isolation by @GilbN in #111
- Fix mobile Settings navigation overflow by @GilbN in #112
- Fix: end the tailer's waits as soon as a stop is requested by @GilbN in #114
Added
GEOMETRIKKS_ENV_FILEenvironment variable to override the.envfile
path; an empty value disables dotenv loading entirely (the test suite uses
this so results never depend on a local.env).DB_MIGRATE_ON_STARTUPsetting (defaulttrue). Set tofalseto run
schema migrations as a separate deployment step with
litestar database upgradeinstead of at every app startup; the app then
fails startup deliberately if the schema was left unusable.docs/deployment.mddocumenting the container runtime model, the
single-worker constraint, migration ownership, shutdown behavior, and
health endpoints.
Fixed
- Fixed horizontal page scrolling on mobile Settings routes and replaced the
overflowing tab row with a compact section selector. docker stopnow shuts the server down gracefully: ingestion drains its
current batch and the scheduler stops before the process exits. The
container previously killed the server without running any teardown
because the CLI wrapper did not forward SIGTERM to Granian; the server
now runs in Granian's direct process mode under a tini init.- Shutdown is no longer delayed when a log file is missing or has not yet
received a parseable line. The tailer's waits now end as soon as a stop is
requested, instead of occupying a worker thread for up to 60 seconds and
leaving the container to be force-killed part-way through teardown. This
was reachable on a fresh install, where nginx has created the access log
but not yet written to it.
Changed
-
Breaking: all REST API JSON fields and query parameters are now
camelCase (totalRequests,startedAt,fromTimestamp,startDate,
comparePrevious, ...); previously the dataclass-backed endpoints
(analytics, system, settings, stats, health, CrowdSec, geo top-IPs/GeoJSON,
log files) used snake_case. Digit-adjacent fields arestatus2xx-style and
requestCount24h. Path segments ({location_id},{job_id}), WebSocket
frame payloads,orderBycolumn values, and the error envelope are
unchanged. External API consumers must rename fields; the bundled frontend
is already migrated. The full policy is documented in
docs/api-conventions.md. -
Errors on API paths that previously returned an empty 404 body (unknown
routes, CrowdSec-disabled lookups) now return the standard
{status_code, detail}JSON envelope; non-API 404s are unchanged. -
All REST endpoints are mounted through a single versioned
/api/v1router;
URLs, operation IDs, and generated client method names are unchanged. -
Application startup and shutdown are now composed of focused lifespan
phases (core state, GeoIP, CrowdSec, database, scheduler, ingestion), each
owning its own cleanup. A failure during startup now stops the services
that had already started instead of leaking them; teardown order and the
DB-degraded and geo-degraded behaviors are unchanged. -
create_app()accepts an explicit settings object and app-level dependency
overrides, and request handlers now receive settings through dependency
injection instead of resolving the process-cached factory inline. The
SQLAlchemy engine, startup migrations, scheduled aggregate jobs, and
trusted-proxy client-IP resolution all bind to the composed settings; the
settingsdependency name is reserved (overriding it would split
configuration between request handlers and the rest of the app). -
The backend test suite runs async tests on AnyIO (pytest-asyncio removed),
is fully isolated from.envand ambient environment values, and gained
WebSocket feed coverage for degraded-mode 1013 closures, overflow/drop
counting, heartbeats, unsubscribe cleanup, cancellation, the session-auth
handshake boundary, and the inbound-frame policy. -
Development now runs on a single origin:
litestar runserves the app,
all Vite assets, and hot-module reload throughhttp://localhost:8000
(the Vite sidecar uses an internal ephemeral port). The standalone Vite
dev server on :5173, its/apiand/wsproxies, and the published 5173
port in the dev compose are gone. -
The production image installs the application as a built wheel instead of
copying the source tree, runs a single explicit Granian worker, and uses
tini as PID 1. litestar-vite upgraded to 0.29 on both the Python and npm
sides. -
The
/health,/health/ready,/api/v1/stats, and/api/v1/logs/tail
responses now have typed OpenAPI schemas (readiness documents its 503
response); payload shapes on the wire are unchanged. -
The geo-locations API is served through a dedicated service layer with
Advanced Alchemy pagination; thecurrentPage/pageSizeparameters and
default page size are unchanged. -
Invalid filter, sort, and ban-duration values are now translated to 400
responses centrally from domain exceptions instead of per-controller HTTP
raises; the{status_code, detail}error envelope is unchanged. -
All API query and path parameters now use Litestar's explicit
QueryParameter/FromPathdeclarations (Litestar 3.0 readiness). Wire
names and validation are unchanged; the OpenAPI schema gains descriptions
for the two/logs/tailquery parameters. -
The
DB_POOL_PRE_PINGsetting is now honored; it was previously declared
but hardcoded to enabled. -
The
VITE_USE_SERVER_LIFESPANandVITE_ENABLE_REACT_HELPERSsettings are
now passed through to the Vite integration; they previously had no effect. -
Litestar is now constrained to the 2.x series (
<3) so the upcoming
Litestar 3.0 release cannot be picked up accidentally before the planned
migration. -
The test suite now fails on new Litestar deprecation warnings and runtime
warnings, with the seven known upstream advanced-alchemy filter-provider
warnings pinned as the only deprecation exemption.
Removed
- The
VITE_HOT_RELOADsetting, which mapped to nothing in the Vite
integration (HMR is always on in dev mode). - Dead internal dependency providers (
transaction, access-log repository)
and the unusedlitestar-mcpdev dependency.
Full Changelog: v0.6.0...v0.7.0
v0.7.0-dev.3
v0.7.0-dev.2
Full Changelog: v0.7.0-dev.2...v0.7.0-dev.3
What's Changed
- Phase 7 pre-checks: Litestar 3 gate status and structlog test isolation by @GilbN in #111
- Fix mobile Settings navigation overflow by @GilbN in #112
chore: update version to 0.7.0 in pyproject.toml, openapi.json, and u…
Full Changelog: v0.7.0-dev.1...v0.7.0-dev.2
v0.7.0-dev.1
What's Changed
- chore(deps): bump oven/bun from
621f249tod56a253by @dependabot[bot] in #71 - chore(deps): bump the python-minor-patch group with 5 updates by @dependabot[bot] in #74
- chore(deps-dev): bump @types/node from 25.0.3 to 26.1.1 by @dependabot[bot] in #79
- chore(deps): bump shadcn from 3.6.2 to 4.16.0 by @dependabot[bot] in #77
- GeoMetrikks 0.7 phase 1: warning-free Litestar compatibility by @GilbN in #104
- GeoMetrikks 0.7 phase 2: hermetic composition and testing by @GilbN in #105
- GeoMetrikks 0.7 phase 3: API and service consistency by @GilbN in #106
- GeoMetrikks 0.7: dissolve api/v1 into domain packages by @GilbN in #107
- feat!: 0.7 phase 4 - versioned /api/v1 router, camelCase wire format, pinned error contract by @GilbN in #108
- feat: 0.7 phase 5 - lifespan resource ownership, migration gate, realtime consolidation by @GilbN in #109
- Phase 6: frontend and deployment hardening by @GilbN in #110
Full Changelog: v0.6.0-dev.6...v0.7.0-dev.1