|
| 1 | +# v0.8.x |
| 2 | + |
| 3 | +## Added |
| 4 | +- 12 shared server utilities (`paths`, `downloadImage`, `parseYear`, `lifespan`, `validation`, `asyncHandler`, `sseHelpers`, `operationTracker`, `resolveCanonical`, `browserConnect`, `applyOverrides`, `batchFetchPersons`) |
| 5 | +- `useBrowserConnection` and `useSSE` client hooks for deduplication |
| 6 | +- Path traversal defense-in-depth across all file-serving endpoints |
| 7 | +- FTS5 query sanitization for search |
| 8 | +- CORS origin restriction via `CORS_ORIGIN` env var |
| 9 | +- Request body whitelisting on provider/browser routes |
| 10 | +- URL validation replacing string `includes()` checks |
| 11 | +- `--dry-run` flag for purge script |
| 12 | +- AbortController cleanup on PersonDetail navigation |
| 13 | +- PWA support: favicon, manifest, apple-touch-icon, theme-color |
| 14 | + |
| 15 | +## Changed |
| 16 | +- CI no longer auto-increments version on push to dev |
| 17 | +- Release workflow no longer bumps version after release (changelog archiving preserved) |
| 18 | +- CI permissions downgraded from `contents: write` to `contents: read` |
| 19 | +- `process.exit(1)` in fetcher replaced with typed error |
| 20 | +- ID mapping cache changed from FIFO to LRU eviction |
| 21 | +- AI discovery runs bounded with MAX_STORED_RUNS limit |
| 22 | +- Path finding guarded against infinite loops |
| 23 | +- Error handler now logs stack traces |
| 24 | +- `requestTimeout` middleware wired up |
| 25 | +- `Person.parents` type corrected to `(string | null)[]` |
| 26 | +- Scripts standardized on `import.meta.dirname` and shared types |
| 27 | + |
| 28 | +## Fixed |
| 29 | +- `person_computed` view multi-row bug in vital event joins |
| 30 | +- `typeof gen !== '?'` bug in logPerson |
| 31 | +- Stale closures in IntegrityPage loader functions |
| 32 | +- D3 zoom cleanup missing in SparseTreePage |
| 33 | +- `useSocket` spread in deps array causing re-renders |
| 34 | +- `useSocketConnection` returning stale snapshot instead of reactive state |
| 35 | +- Dead state (`setScrapedData`, `setImportFile`) removed |
| 36 | +- Safe JSON.parse on localStorage in PersonDetail |
| 37 | +- Purge script whole-token matching (prevents partial ID matches) |
| 38 | +- Migration script wrapped in transaction |
| 39 | + |
| 40 | +## Removed |
| 41 | +- 20+ duplicate `DATA_DIR` declarations across services |
| 42 | +- 3 duplicate `downloadImage` implementations |
| 43 | +- 7 duplicate SSE header setup blocks |
| 44 | +- 15 duplicate ULID validation blocks in person routes |
| 45 | +- 3 duplicate browser connection blocks |
| 46 | +- 3 duplicate operation tracker implementations |
| 47 | +- 6 duplicate photo-serve route handlers |
| 48 | +- Duplicate `BrowserStatus` interface in IndexerPage |
0 commit comments