Changelog
All notable changes to TimeTiles are documented here. Format based on Keep a Changelog .
See the release process for how new versions are cut.
[Unreleased]
Changes landed on main since the last tagged release.
[0.1.0-alpha.9] - 2026-06-30
A large stabilization release. Five multi-agent bug sweeps across correctness, security, privacy, internationalization, and ingest/scraper robustness, plus ICU pluralization and localization of the remaining hardcoded copy. Closes the interpretation follow-ups from alpha.7 and hardens the production image build.
Added
- Background job that reclaims and sweeps orphaned ingest CSV files
timetiles checkverifies cron and systemd path references
Changed
- Count strings use ICU plurals; page metadata, account-deletion copy, and remaining hardcoded strings localized (EN/DE)
- Draft preview restricted to content roles (admin/editor); draft content is no longer served to anonymous visitors
Fixed
- Security and privacy: drop all credential headers on cross-origin redirect; isolate the URL-fetch cache by auth identity; cap quota-remaining to block privileged-account enumeration; close a private-event leak in the H3 cluster branches; pair the pinned SSRF dispatcher with undici fetch (and stop it blocking public
fd*/fc*domains); addX-Frame-Optionsandframe-ancestorsCSP; restrict credential reads and rotate sessions on change - Accounts and auth: allow cancelling a scheduled deletion; defer email swap to verification time to prevent lockout; re-validate deletion eligibility at execution; unbreak email verification and enforce
isActive; stop faking reset-email success - Ingest and schema: make dataset-detection idempotent and
findOrCreateDatasetconcurrency-safe; prevent duplicate data-package activations under concurrency; reuse the latest schema version when unchanged and persist real enum frequencies; fail oversized imports terminally instead of stranding them; fix re-import data loss and progress/review stalls; numerous import-wizard and edit-schedule state fixes - Scrapers: recover stuck and orphaned runs; coerce off-contract runner output; RFC 4180 CSV escaping in the SDK writer; handle webhook-queue failures; make scraper deletion (and account-deletion coverage) work
- Maps, charts, and explore: derive H3 resolution from returned cells; fix histogram tooltip dates, bar clicks, and locale; clamp range-slider bounds and keep drags alive with pointer capture; validate explore URL filter params to prevent crashes; apply range and cluster filters consistently across views
- Quota and events: stop double-releasing event quota; pin the daily reset to a UTC boundary; clear the quota claim after a successful create
- Geocoding: apply provider confidence grades correctly; preserve hemisphere for
-0°DMS coordinates; score by result type and gate bias params - Deploy and build: pin timescrape’s
zodso the production image builds; threadDEFAULT_LOCALEinto image builds; shiphealth-check.shandalert.shas tracked files
[0.1.0-alpha.8] - 2026-06-04
A same-day follow-up to alpha.7: data-package auto-activation in deployed environments and map-rendering fixes.
Added
- Auto-activate the three bundled data packages on staging and production
Fixed
- Preserve antimeridian-crossing map bounds and accept wrapped world-view bounds; use map glyphs that exist
- Unbreak the map CSP (allow the worker
blob:source and the bare VersaTiles host)
[0.1.0-alpha.7] - 2026-06-03
Introduces a unified row-interpretation pipeline (ADR 0040) that fixes silent data misreads — day/month date order, single-column combined coordinates, and locale-aware numbers — plus numeric range filtering on event fields. Includes two large multi-agent bug sweeps.
Added
- Numeric range filtering on event fields, with EU-aware decimal and thousands parsing
- Single-column combined coordinates (e.g.
"52.5, 13.4"in one field), with a review gate for ambiguous axis order - Per-column date day/month order detection with a review gate, fixing a silent DD/MM vs MM/DD misread
- Locale-aware number parsing during record merge
- Best-effort opt-in for ambiguous interpretations (ADR 0040)
Changed
- Row interpretation unified into a single persisted interpretation plan — coordinate, date, and number handling now flow through one path (ADR 0040, Phases 0–4)
- Layered-architecture ESLint boundaries now actually enforce the
lib/layering
Fixed
- Two multi-agent bug sweeps (a 28-bug sweep and a backend correctness/security/rate-limit sweep): event quota charged only for newly-created events, locale-independent sort keys for dedup and cache, committed sub-batches retained on partial bulk-insert failure, import config validation (ID-strategy and mapping vs transforms), and map labels/antimeridian/single-day timezone/virtualization
- Salvage swapped axis order for ambiguous combined coordinates
- Deploy: writable tmpfs for the Next.js
.next/cache; scraper returns 409 before 429 on an in-progress run
[0.1.0-alpha.6] - 2026-05-12
Tightens the authenticated surface: data-packages moved behind the account section, optional public contact email on the disabled-registration screen, and the Payload migration history is reconsolidated so migrate:create stops rediscovering historical changes.
Added
contactEmailfield on the Branding global, rendered as a mailto link on the disabled-registration screen so visitors know how to request an accounttimetiles checkflags drift between deployeddeployment/files and the repository checkout
Changed
/data-packagesis now/account/data-packagesand requires authentication; the link moved from the main menu to the header user dropdown- Snapshot baseline reset migration so
payload migrate:createstarts from the current schema instead of rediscovering changes from earlier hand-written migrations
Removed
- Unused retry-tracking columns (
retry_attempts,last_retry_at,next_retry_at,last_successful_stage) and dependent enums fromingest_jobs/_ingest_jobs_v, catching up a code-vs-schema drift
Fixed
timetiles checkSSL, podman, andrun_checkrobustness; false negatives inverify_ufw,verify_fail2ban, andverify_backup_cron
[0.1.0-alpha.5] - 2026-05-11
First post-funding-period release. Operational hardening for the public launch: deployment robustness, geocoding correctness, CMS bootstrap, and image-supply-chain security.
Added
- Environment banner on non-prod deployments
- Auto-activation of data packages on boot per environment
- Bundled data-package manifests delivered via
git pullon deploy - Auto-bootstrap of free-tier geocoding providers on first boot
- Default CMS content bootstrapped as part of the deploy seed preset
- Demonstrations.org data packages with POST pagination
- UCDP HDX data package and catalog metadata
- NSU Offener Prozess scraper example
- Transactional emails queued via Payload tasks
- Storybook stories for UI primitives, charts, layout/editorial blocks, overlays, navigation, map controls, and form/feedback components
LOGIN_SUCCESS,LOGIN_FAILED, andREGISTEREDaudit events- Points cluster display mode
- Smart groupBy filtering with shared settings panel
- URL-sync for fullscreen state and groupBy UX
- Contextual category filters with cross-filtering
- Multi-column grid layout (renamed from List view)
- Collapsible chart section with unified header
CardToolbarprimitive and “Analyze” chart button- Info popover on catalog group headers
- Split-to-array transform for multi-value CSV fields
E2E_MODEsignal andisE2E()helper- ESLint rule preventing
sql.raw()with dynamic strings - SonarCloud scripts: coverage-per-file, security-hotspot review, quality-gate fetch
Changed
- Wizard store actions renamed to intent-based names
- Trivy scan and
wait_for_healthextracted into reusable CI helpers - Explore view-toggle terminology unified on “List”
editDatasetIdreplaced witheditScheduleDatastate- Documentation
<img>tags converted tonext/image - Favicon metadata and assets refreshed
- Seed bootstrap consolidated into the deploy preset of
SeedManager
Fixed
- Scheduled-ingest retries, quotas, and URL-fetch hardening regressions
- CSV identity values preserved through import
- Map and import flows hardened (replacing fake tests with real assertions)
- Maintenance job task enum values aligned with code
- Numeric strings no longer accepted as inferred dates; trusted HTTP date guard simplified
- Deployment: nginx healthcheck timing, postgres race on first boot, SMTP cert mismatch, container UID for
logs//uploads/,DEPLOYMENT_ENVIRONMENTpropagated to the web container, post-pull re-exec schemaModepropagation in wizard first-run and scraper paths- “Create new catalog/dataset” placed at top of dropdown
- Spreadsheet-prefixed coordinates (e.g.
=52.5, 13.4) now parse correctly during import - Duplicate retry-exhausted notification emails on scheduled ingests
- Array-form callback emitted for pinned undici hostname lookup
Security
- Scheduled ingest validation hardened
- HTTP security headers baseline and SSRF/path-traversal hardening on import
- Critical and high-priority findings from the 2026-04-16 audit closed
- Docker image security scanning hardened (Trivy fails the build on findings)
- Seeded user credentials moved out of
tests/so they no longer ship in production builds
[0.1.0-alpha.4] - 2026-03-31
End-of-funding-period iteration. Final state of the platform on the last day of the Prototype Fund Software Sprint funding period (FKZ 16IS25S03).
Added
- H3 hexagonal grid clustering with expert mode
- Cluster focus mode, H3-based cluster filtering, mini dashboard
- Unique-locations model — separate locations from clusters
- Dataset-centric filter sidebar with multi-catalog support
- Dataset info popover, colored checkboxes, dataset bounds API
- Auto-zoom to data on dataset selection change
- Beeswarm chart type with d3-force layout and server-side temporal clustering
- Grouped charts: groupBy for beeswarm and stacked histogram
- Chart type synced to URL parameter
- Tag field support for multi-value array filtering
- HTML-in-JSON import format with detail-page enrichment
- JSON pre-processing with group-by and date merge
- Embeddable views via
/embedroute - Photon and LocationIQ geocoding providers (weighted distribution)
- Funding logos (Prototype Fund, BMFTR) in docs, web app, and README
Changed
- Tag chips in event detail show field labels
- Filter rows left-aligned; redundant catalog labels removed
- Catalog chart hidden for single-catalog selections
Fixed
cluster_events()location_name cast to text
[0.1.0-alpha.3] - 2026-03-22
Second Second-Stage iteration. Feature work in direct response to feedback from the partner-organisation cooperation: internationalization, scraper sandboxing, JSON API ingestion, full wizard redesign.
Added
- Internationalization with next-intl (English and German locales)
- Translation of all user-facing components and email templates (EN/DE)
- Payload CMS content localization for EN/DE
- Custom scraper system with isolated Podman runner, scraper management UI, and CLI
- Scraper quota enforcement
- Block registry, UI customization, and layout templates
- Branding global wired into emails (siteName and logo)
- API key authentication
- Configurable legal notices on the registration form
- Timezone support for scheduled imports
- JSON API import with pagination and wizard UX
- JSON file upload in the import wizard
- Edit scheduled import via the import wizard
- Multi-stage progress timeline and column-centric mapping in the import wizard
- Multi-worker support with concurrency control for jobs
- Error boundaries on explore and import pages
- React Compiler enabled
Changed
- Renamed service factories to
create*Serviceconvention - Replaced custom fade animations with native View Transitions API
- Migrated all frontend routes to locale-aware
[locale]/(frontend)/structure - Renamed
import→ingestacross the codebase - Schema-detection package consolidated into the app
[0.1.0-alpha.2] - 2026-03-12
First Second-Stage iteration. Code quality, infrastructure hardening, and platform consolidation in preparation for the partner-cooperation work.
Added
- Restic-based backup system with S3 offsite support
- All-in-one Docker image for single-server deployments
- Pre-built GHCR images in docker-compose, pull-based deployment workflow
- Integration tests for nginx routing, backup/restore, and Docker container lifecycle
- Forgot-password and reset-password pages
- Generic audit log with broad codebase coverage (extends the original audit-logging service)
apiRoute()framework with auto-wrapping; all API routes migrated- Zod validation schemas across all API routes
- Encryption of credentials at rest
- Sites collection wired into layouts with data-scope filtering
- Worktree-management script with env-file setup
- 80 additional oxlint native rules
- Shared
ContentStatecomponent for empty/error/no-match states
Changed
- Decomposed large files into focused modules
- Logo and asset reorganisation with new naming and folder structure
Fixed
- Access control hardening (5 audit findings, including a security bug)
- Dataset-schemas access control denormalised for performance
- Constant-time email change, quota caching, env naming
[0.1.0-alpha.1] - 2025-12-02
First feature-complete public alpha at the close of the regular Prototype Fund Software Sprint Phase 1 (June–November 2025, FKZ 16IS25S03). Implements the milestones from the original proposal: design system, geocoding/data ingest, layout components, filters, visualisation, documentation.
Added
- Initial public alpha of TimeTiles
- Interactive geospatial timeline visualization with MapLibre GL JS
- Data import system supporting CSV, Excel, and ODS formats
- Automatic schema detection and field mapping
- Multi-provider geocoding (Nominatim, Google) with database-driven provider configuration and persistent location cache
- Real-time map clustering and timeline scrubbing
- Timeline histogram for event distribution over time
- Dynamic filters by category, date, and location with URL-based state
- Categorical field filters with schema-based enum support
- Map theme toggle and zoom controls
- Adaptive tooltip formatting for histogram chart
- Responsive web interface with light/dark themes
- Mobile navigation drawer and filter sheet
- Import wizard with field-mapping detection and user usage tracking
- Transforms UI and flow editor
- Scheduled URL-based imports with automatic execution and webhook triggers
- Background job runner
- Account management, feature flags, and branding globals (logos, favicons, site name)
- Newsletter signup integrated with Payload CMS in the footer
- Pages collection and MainMenu global for CMS-driven navigation; flexible page builder with block-based content
- Multi-user permission and quota system with trust levels (0–5)
- Owner-based access control for private data
- Comprehensive audit logging service
- Views collection for saved display configurations
- Comprehensive E2E testing with Playwright
- PostgreSQL 17 + PostGIS 3.5 backend
- Next.js 16 frontend with Payload CMS 3 (integrated mode)
- Documentation site (Nextra)
- AGPL-3.0 license
For development changes, see the Git commit history .