Repository navigation
Releases: Xevion/Banner
Releases · Xevion/Banner
Release list
v0.8.4
0.8.4 (2026-09-17)
Features
- admin: Add audit log for admin actions (00d2f82)
- admin: Add retryable error panel, harden instructor query binds (dd1418b)
- instructors: Detect and merge duplicate instructor records (9b5bac7)
- instructors: Let duplicate review dismiss a pair as two people (14482aa)
- instructors: Link between instructor, subject and admin views (d3998e0)
Bug Fixes
- admin-rmp: Make candidate fields non-nullable, switch to query! macro (db488d9)
- bindings: Rename TimeRange to TimelineRange and guard name clashes (424421f)
- e2e: Return the Page envelope from the search stub (d962742)
- instructors: Make instructor merges survive the next scrape (fec3353)
- instructors: Show real source ratings and link names from cards (93be7f8)
- rmp-matching: Close auto-link gaps around placeholder departments and re-links (966c539)
- rmp-matching: Gate auto-linking on confirmed subject evidence (6e5ca17)
- rmp: Stop review fetches from failing on RMP's own data (2263c0d)
- web: Handle the navigations the router abandons (6b95872)
- web: Update the stale search fixtures (e41fb64)
Performance Improvements
- tests: Replace sqlx::test with cloned-template pools (ad760e0)
- tooling: Cut backend check and dev-reload turnaround (1e2a5c8)
Code Refactoring
- admin-scraper: Make schedule state a typed enum end to end (0af262a)
- admin: Return typed errors instead of matching on messages (7e6c67f)
- data: Move the data layer onto compile-time checked queries (fa918fb)
- instructors: Share one card and make name order explicit (cd4b4f9)
- lints: Adopt clippy pedantic with a burn-down allow-list (92b6274)
- lints: Burn down too_many_lines with targeted expects and splits (b7c27e9)
- lints: Enable clippy nursery and collapse table tests with rstest (9eadfcb)
- rmp-matching: Derive instructor match status from a view (828509f)
- rmp-matching: Split the matcher into a directory module (574607e)
- runtime: Rename services module to runtime (ef7bf3b)
- Split the longest functions into named helpers (067986b)
- types: Carry Count and DurationMs through course enrollment and scrape results (69cb3e2)
- types: Let the type system carry what convention was carrying (977f45a)
- web: Fold bespoke shapes into the shared ones (3575268)
- web: Read the router from the router, not from the load payload (2117ab5)
Continuous Integration
- Catch stale sqlx metadata and TypeScript bindings (62e6ff9)
Build System
- docker: Pin CI image builds to a portable target-cpu (8e945d3)
- Pin the Rust toolchain instead of tracking a floating stable (4e77a98)
- tempo: Prepare .sqlx against a migrations-only database (9476b71)
Miscellaneous
v0.8.3
0.8.3 (2026-09-15)
Features
- course-detail: Add enrollment history chart and timeline (7bd44f7)
- course-table: Add enrollment sparklines to the seats column (fba05d3)
- telemetry: Add Grafana overview dashboard (acb32c2)
- telemetry: Add log panels to the dashboard and fix probe user expansion (2539233)
- telemetry: Describe metrics and route exposition through a ClusterIP Service (7d8559a)
- telemetry: Expose Prometheus metrics on a dedicated listener (b5b2054)
- telemetry: Namespace scrape metrics and label fallback responses (e28ea84)
Bug Fixes
- chart: Give postgres a startup probe and graceful shutdown window (31ae36d)
Performance Improvements
- deploy: Ship a production-only SSR install and slim the image (369ad34)
Code Refactoring
- assets: Serve the client build from disk via ServeDir (d878cd6)
Continuous Integration
- docker: Cache the release build in a GHCR registry tag (be3b63c)
- docker: Only export the build cache on master (fd2aac8)
Miscellaneous
- deps: Bump rustls to 0.23.45 (ae3f42f)
v0.8.2
v0.8.1
v0.8.0
0.8.0 (2026-09-11)
Features
- backend: Add multi-layer per-IP rate limiting middleware (a106025)
- backend: Implement rate limit error handling with client-side retry (84bb179)
- bot: Add course watch notifications via Discord DMs (dfd30a1)
- bot: Paginate /search results with embeds and buttons (2523c38)
- course-table: Add a menu for building multi-key sorts (3d70274)
- course-table: Add end-time sort, span untimed rows, align clock parts (b338cec)
- course-table: Redesign columns and add instructor sort cycle (d21e338)
- deploy: Add Helm chart for k3s deployment, drop Railway coupling (a3b2643)
- search: Order results by indexed columns instead of JSONB text (d479da0)
- web: Add DB-backed readiness probe and access log target (7ea8dea)
- web: Redesign schedule/seats cells with a day-track visualization (b1d16e7)
Bug Fixes
- Add package overrides for minimatch and cookie vulnerabilities (9bbc97f)
- backend: Exempt static assets from rate limiting (b34df19)
- ci: Remove deleted scripts/ dependency from security job (cbccebc)
- deploy: Harden Helm chart against replica races and Discord redirect misconfig (2ea094a)
- deps: Patch quinn-proto DoS and devalue prototype pollution (3faa801)
- deps: Suppress transitive advisories and pin trivy-action (0d49c69)
- filter-bar: Make the term and instructor pickers behave for keyboard and screen readers (9d8ca38)
- filter-bar: Stop the term, subject, and search boxes closing on their own (9de99c1)
- scraper: Replace single-page search with paginated search_all in subject job (0f44a82)
- search-autocomplete: Unwrap microfuzz CJS default under rolldown bundling (23b1172)
- security: Update svelte to 5.53.5 to patch XSS vulnerabilities (a5f163c)
- ssr: Stop module-level caches from leaking across server requests (506310e)
- stories: Stop addon-svelte-csf rendering bare components without props (f04bcef)
- tempo: Recurse subdirectories when copying ts-rs bindings (c481aa8)
Performance Improvements
- backend: Deferred sync bot client init, non-blocking schedule cache load (f607403)
- backup: Replace in-memory dump+compress with streaming multipart upload (3b62a51)
- data: Add course_meetings table, eliminate JSONB schedule parsing (145d5f9)
- data: Precompute per-term aggregates and add maintenance jobs (95f9bfd)
Code Refactoring
- Add error context to uncovered db operations and harden stream subscription lookup (4ae1409)
- admin: Give the scraper tables one cell definition each (3050359)
- admin: Share one matching table between bluebook and rmp (b71a6ea)
- autocomplete: Pull the typeahead query and merge logic out of the components (11f2195)
- backend: Cleanup AppState, parallelize startup, move bg tasks, fix layering (708ab81)
- course-table: Key every column table on one ColumnId union (9a6749d)
- course-table: Split cell components and extract shared state helpers (840a5a8)
- data: Derive the sort key list instead of writing it out (288d7b2)
- data: Move the sort layer into its own module (ef5b45f)
- data: Replace fixed-parameter search functions with SearchFilter struct (7d31d0c)
- data: Type JSONB columns and bind pagination parameters (a70c9ac)
- Decompose routes.rs into focused handler modules (e3bd22c)
- Delete dead code and correct stale RUST.md docs (2e6189d)
- Extract database query functions into data layer (a6b00fd)
- Extract reusable table components and deduplicate slow-op logging (8b5d052)
- scraper: Replace immediate retry with jittered backoff, bound SSR client (5907466)
- scripts: Replace bun script suite with tempo CLI (81a6a6b)
- ssr: Replace Bun entrypoint script with Rust-supervised Node SSR (d1df760)
- Standardize data layer signatures to pool-first, use anyhow::Context (a4566cc)
- tempo: Switch to 0.2.0 engine, rework bindings generation, add deploy secret sync tasks (5b2f9b9)
- web: Drop attributeMap from CourseDetailContext, modernize Storybook stories (c2b3928)
- web: Use get_all_terms in search options (6e5e924)
Continuous Integration
- e2e: Keep the artifacts that explain a browser failure (a7e4432)
- Replace the hand-rolled audits with the advisory scanner (d3ede7f)
- Restore gha build cache (5292112)
- Switch docker build cache to GHCR, add mold/clang for faster builds (2c6df24)
Miscellaneous
- deploy: Pin kubectl for direct k3s cluster access (60f9f92)
- deps: Add undici as web dependency (5355461)
- deps: Bump quinn-proto to 0.11.16 (e79ad87)
- deps: Fix frontend security vulnerabilities in web deps (eb17de6)
- deps: Refresh dependencies and bound the cookie override (796ed77)
- deps: Update frontend dependencies ([c53f40e](c53f40e842ebcbaf47beae7c9c20...
v0.7.1
0.7.1 (2026-02-26)
Features
- Add Cache-Control headers, ETags, and dynamic robots.txt (3a39e70)
- Add course/subject detail pages, breadcrumb nav, and cross-linking (6b20697)
- Add PostHog telemetry with type-safe event tracking (a46ade5)
- Add security headers, CSP reporting, and client IP extraction (229e0b2)
- Add Server header with package version (bbed357)
- Add unsigned newtypes (Count, DurationMs) for non-negative DB fields (fa5bfcf)
- Add XML sitemap endpoints with in-memory caching (dde5f8b)
Bug Fixes
- calendar: Resolve term slug to code before DB lookup (91f701e)
- csp: Allow data: URIs in font-src for inline woff2 fonts (136075c)
- env: Propagate proper posthog host keys through Dockerfile for CSP (db7b481)
- Inject x-request-id into request for SSR propagation (2839b75)
- Propagate x-forwarded-for through SSR proxy, fix PostHog distinctId misuse (d901a2d)
- search: Disable part-of-term filter for summer terms, prefer section for course breadcrumb (2537a9c)
v0.7.0
0.7.0 (2026-02-25)
Features
- Accent-insensitive search via PostgreSQL unaccent extension (e6fb3e1)
- Add BlueBook course evaluation scraper and database schema (bd2c3c3)
- Add incremental BlueBook scraping with per-subject intervals (17d205c)
- Add pending status, nickname matching, and review-course scoring to RMP matching (7ccfb06)
- Add public instructor directory and profile pages (eb8c6cb)
- Add RMP review scraping with per-professor scheduling (5e18ecf)
- Add ScoreBar component with layerchart visualization and Storybook decorators (c32970b)
- Add search autocomplete with server-side trigram suggestions (616974f)
- Add section count to instructor suggestions and fix audit sort order (2edfe45)
- admin: Add BlueBook instructor linking admin UI and API (4e1af55)
- admin: Add term column to scraper jobs and audit tables (9964218)
- backend: Add app_kv store to persist scheduler and bot state across restarts (69090d0)
- backend: Add Cache-Control headers to reference and search-options routes (80f5856)
- backend: Spawn background reference cache refresh every 30 minutes (a183776)
- Bayesian instructor scoring combining RMP and BlueBook data (c47bb8c)
- bot: Add subject and term autocomplete to search command (feb0142)
- debug: Add dev auth bypass for local testing (fdea62c)
- Enrich RMP matching with review metadata and unified subject scoring (ddcfcd6)
- Extract SortSelect component with direction toggle (d85206c)
- frontend: Add server-side API proxy and fix SSR compatibility (f562eba)
- frontend: Compress campus filter groups into compact availability URL param (a2e9eb6)
- frontend: Redesign health and admin status pages (843eacc)
- Handle overenrolled sections in seat availability display (5f699cf)
- infra: Add database backup script with R2 upload and Docker support (26b3349)
- Integrate BlueBook scraper into scheduler with admin trigger endpoint (9173aa7)
- log: Enhance tracing formatter with syntax highlighting and smart field grouping (8d58f8a)
- Replace LATERAL RMP subqueries with materialized view (730e75b)
- scraper: Per-term adaptive scheduling with archived term tiers (1491370)
- scripts: Harden db reset with dynamic prompt (b793d82)
- Slug-based instructor filtering with autocomplete (07aa9e5)
- Store instructors without email addresses (d23d554)
- stream: Add ScraperStats, ScraperTimeseries, and ScraperSubjects stream kinds (f32b727)
- Support numeric ID and email-prefix lookup for instructor endpoints (00649fa)
- Surface BlueBook ratings and composite scores across instructor views (57185a8)
- Surface instructor subjects, years, and email in bluebook link review (6913126)
- Switch frontend from SPA (adapter-static) to SSR with Bun (bc5e60c)
- terms: Add multi-term scraping support with database table and admin API (f5d13b0)
- web: Replace TraceLayer with ULID-based request ID middleware (8d2a1cd)
Bug Fixes
- backend: Change valid year range to start in 2001 (e081ace)
- backend: Make hours_week nullable to handle null API responses (ae035ec)
- backend: Make instructional_method option to support older semesters (7d97cc9)
- backend: Make wait_capacity, wait_count, and meeting_type nullable for older courses (5445ba8)
- bluebook: Tolerate mismatched subject prefixes and non-breaking spaces in course parsing (22e85c1)
- ci: Update bytes dependency for security audit fix, add security audits to check script (049938a)
- deps: Force ajv update to satisfy security vulnerability (4626df1)
- deps: Update time to 0.3.47 for RUSTSEC-2026-0009 (1321d1e)
- frontend: Card slide animation null height issues (e78a46c)
- frontend: Include title in teaching history each-block key to prevent duplicates (f2afa8a)
- frontend: Use pointer cursor on instructor link only, ignore link clicks for row expansions (4679320)
- frontend: Use proper theme variables for styling scrollbar handle (516f567)
- Improve search autocomplete popover trigger and z-index handling (bb5aa3d)
- infra: Copy .sqlx cache and set SQLX_OFFLINE in Dockerfile (4014e64)
- infra: Install mold, add nextest, timeouts, and bun ci to CI (9b33205)
- scripts: Guard against re-entrant cleanup and handle SIGINT exit cleanly (7cd4650)
- Widen credit hour columns from INTEGER to DOUBLE PRECISION (3b5184c)
Performance Improvements
- backend: Stream schedule cache loading with SQL-side meeting extraction (0ec9eb7)
- db: Drop redundant/unused indexes, add scrape job index (6663a99)
- scripts: Speed up check script by limiting run build & test scope to lib tests (83e25e5)
Code Refactoring
v0.6.3
0.6.3 (2026-02-03)
Features
- web: Add related sections API and refactor course view (bec81f7)
- web: Add storybook with component stories and vitest integration (5cb3155)
- web: Enable ESLint with TypeScript and Svelte support (87f0808)
Bug Fixes
- Outdated course data queries (bd9a8d3)
- Switch weekdays jsonb query to modern array format (348492f)
- web: Resolve animation rendering issues with fill modes (a71e648)
Code Refactoring
- api: Migrate to typed reference data enums (56fabc2)
- Consolidate course data models into structured types (2157035)
- web: Centralize filter state with context-based store (f4a3c55)
- web: Fix ESLint violations and enhance types (89f3a23)
Miscellaneous
- web: Disable clearScreen for vite dev server (c5fef57)
v0.6.2
0.6.2 (2026-02-01)
Features
- web: Add dynamic range sliders with consolidated search options API (f5a639e)
- web: Batch rapid search query changes into history entries, allow for query history (e920968)
- web: Build responsive layout with mobile card view (bd2acee)
- web: Implement aligned course codes with jetbrains mono (567c4ae)
- web: Implement multi-dimensional course filtering system (106bf23)
- web: Implement smooth view transitions for search results (5729a82)
Bug Fixes
- cli: Add proper flag validation for check script (2acf52a)
- data: Handle alphanumeric course numbers in range filtering (96a8c13)
- Re-add overflow hidden for page transitions, but with negative margin padding to avoid clipping (9e825cd)
- Separate Biome format and lint checks to enable auto-format (ac8dbb2)
- web: Ignore .svelte-kit/generated in vite watcher (b562fe2)
- web: Prevent duplicate searches and background fetching on navigation (5dd35ed)
- web: Prevent interaction blocking during search transitions (7f0f087)
- web: Skip view transitions for same-page navigations (b37604f)
Code Refactoring
- api: Extract toURLSearchParams helper for query param handling (6c15f40)
- api: Rename middleware and enable database query logging (f387401)
- Migrate API responses from manual JSON to type-safe bindings (0ee4e8a)
- Standardize error responses with ApiError and ts-rs bindings (239f7ee)
- web: Consolidate tooltip implementations with shared components (d91f7ab)
- web: Extract FilterPopover component and upgrade range sliders (4e01406)
- web: Replace component tooltips with delegated singleton (d278498)
- web: Split CourseTable into modular component structure (bbff2b7)
- web: Streamline filter ui with simplified removal (4426042)
Miscellaneous
v0.6.1
0.6.1 (2026-01-31)
Features
- build: Auto-regenerate TypeScript bindings on source changes (e203e8e)
- course: Distinguish async from synchronous online courses (8bfc14e)
- scraper: Improve dashboard clarity with stat tooltips (1ad614d)
- scraper: Improve results visibility and loading states (c533768)
Bug Fixes
- Avoid status flickering on subjects table (2689587)
- ci: Add postgres container service for rust tests (ebb7a97)
- ci: Fix rust/frontend/security job failures and expand local checks (dd148e0)
- data: Decode HTML entities in course titles and instructor names (7d2255a)
- metrics: Always emit baseline metrics on initial course insertion (16039e0)
Code Refactoring
- terms: Move term formatting from frontend to backend (cbb0a51)
- Use friendly term codes in URL query parameters (550401b)
Continuous Integration
- Add Release Please automation for changelog and version management (6863ee5)
- Split quality checks into parallel jobs with security scanning (3494341)